diff options
| author | Dietrich Geisler <dag368@cornell.edu> | 2020-08-17 12:50:44 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-17 09:50:44 -0700 |
| commit | ff2d490dc120708a2fcb6eea5880a6b7c6586a4b (patch) | |
| tree | 4bab7a7353ed5e9149510a48227da029d40d9d97 /source/slang/slang-emit-cpp.cpp | |
| parent | 0640a10ab85f8be3c3c925cb70711560265e6548 (diff) | |
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 <tfoleyNV@users.noreply.github.com>
Diffstat (limited to 'source/slang/slang-emit-cpp.cpp')
| -rw-r--r-- | source/slang/slang-emit-cpp.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
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<IREntryPointDecoration>()) { - 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<uint32_t, 3> gridDims, \n"); + m_writer->emit("\tRWStructuredBuffer<float> 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 |
