From ff2d490dc120708a2fcb6eea5880a6b7c6586a4b Mon Sep 17 00:00:00 2001 From: Dietrich Geisler Date: Mon, 17 Aug 2020 12:50:44 -0400 Subject: GPU Foreach Loop (#1498) * GPU Foreach Loop This PR introduces the completed GPU foreach loop and updates the heterogeneous-hello-world example to use it. This PR builds on the previous introduction of the GPU Foreach loop parsing and semantic checking PR (#1482) by introducing IR lowering and emmitting. THe new feature can be used by having a GPU_Foreach loop interacting with a named non-CPP entry point, and using the -heterogeneous flag. * Fix to path Co-authored-by: Tim Foley --- source/slang/slang-emit-cpp.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'source/slang/slang-emit-cpp.cpp') diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index ebb6bda2d..0c2b4cd93 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -2277,8 +2277,8 @@ void CPPSourceEmitter::emitPreprocessorDirectivesImpl() { // Put all into an anonymous namespace // This includes any generated types, and generated intrinsics - - m_writer->emit("namespace { // anonymous \n\n"); + if (!m_compileRequest->getLinkage()->m_heterogeneous) + m_writer->emit("namespace { // anonymous \n\n"); m_writer->emit("#ifdef SLANG_PRELUDE_NAMESPACE\n"); m_writer->emit("using namespace SLANG_PRELUDE_NAMESPACE;\n"); m_writer->emit("#endif\n\n"); @@ -2556,11 +2556,11 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module) continue; if (auto entryPointDecoration = func->findDecoration()) { - String someName = entryPointDecoration->getName()->getStringSlice(); + String entryPointName = entryPointDecoration->getName()->getStringSlice(); for (int index = 0; index < program->getEntryPointCount(); index++) { auto entryPoint = program->getEntryPoint(index); - if (someName == entryPoint->getName()->text) + if (entryPointName == entryPoint->getName()->text) { for (auto targetRequest : linkage->targets) { @@ -2586,13 +2586,13 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module) auto ptr = (const unsigned char*)blob->getBufferPointer(); m_writer->emit("size_t __"); - m_writer->emit(someName); + m_writer->emit(entryPointName ); m_writer->emit("Size = "); m_writer->emitInt64(blob->getBufferSize()); m_writer->emit(";\n"); m_writer->emit("unsigned char __"); - m_writer->emit(someName); + m_writer->emit(entryPointName ); m_writer->emit("[] = {"); for (unsigned int i = 0; i < blob->getBufferSize() - 1; i++) { m_writer->emitUInt64(ptr[i]); @@ -2602,6 +2602,26 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module) m_writer->emit("};\n"); } } + // Emit a wrapper function for calling the shader blob + m_writer->emit("void "); + m_writer->emit(entryPointName); + m_writer->emit("_wrapper(gfx_Renderer_0* renderer, Vector gridDims, \n"); + m_writer->emit("\tRWStructuredBuffer buffer)\n{"); + m_writer->emit("\n\tgfx_ShaderProgram_0* shaderProgram = loadShaderProgram_0(renderer, __"); + m_writer->emit(entryPointName); + m_writer->emit(", __"); + m_writer->emit(entryPointName); + m_writer->emit("Size);"); + m_writer->emit("\n\tgfx_DescriptorSetLayout_0* setLayout = buildDescriptorSetLayout_0(renderer);"); + m_writer->emit("\n\tgfx_PipelineLayout_0* pipelineLayout = buildPipeline_0(renderer, setLayout);"); + m_writer->emit("\n\tgfx_DescriptorSet_0* descriptorSet = "); + m_writer->emit("buildDescriptorSet_0(renderer, setLayout, unconvertBuffer_0(buffer));"); + m_writer->emit("\n\tgfx_PipelineState_0* pipelineState = "); + m_writer->emit("buildPipelineState_0(shaderProgram, renderer, pipelineLayout);"); + + m_writer->emit("\n\tdispatchComputation_0(renderer, pipelineState, pipelineLayout, "); + m_writer->emit("descriptorSet, gridDims.x, gridDims.y, gridDims.z);"); + m_writer->emit("\n}\n"); } } } @@ -2645,8 +2665,8 @@ void CPPSourceEmitter::emitModuleImpl(IRModule* module) if (m_target == CodeGenTarget::CPPSource) { // Need to close the anonymous namespace when outputting for C++ - - m_writer->emit("} // anonymous\n\n"); + if (!linkage->m_heterogeneous) + m_writer->emit("} // anonymous\n\n"); } // Finally we need to output dll entry points -- cgit v1.2.3