diff options
Diffstat (limited to 'tools/gfx')
| -rw-r--r-- | tools/gfx/renderer-shared.cpp | 10 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-device.h | 3 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-shader-program.cpp | 16 |
3 files changed, 22 insertions, 7 deletions
diff --git a/tools/gfx/renderer-shared.cpp b/tools/gfx/renderer-shared.cpp index ae4ea3eef..edd271ecb 100644 --- a/tools/gfx/renderer-shared.cpp +++ b/tools/gfx/renderer-shared.cpp @@ -1133,11 +1133,13 @@ Result ShaderProgramBase::compileShaders(RendererBase* device) kernelCodes.add(downstreamIR); } - // If target precompilation was used, kernelCode may only represent the - // glue code holding together the bits of precompiled target IR. - // Collect those dependency target IRs too. + // If target precompilation with deferred downstream linking is enabled, + // kernelCode may only represent the glue code holding together the + // bits of precompiled target IR. It's the application's job to pull it + // together. Collect those dependency target IRs too. ComPtr<slang::IModulePrecompileService_Experimental> componentPrecompileService; - if (entryPointComponent->queryInterface( + if (this->desc.downstreamLinkMode == DownstreamLinkMode::Deferred && + entryPointComponent->queryInterface( slang::IModulePrecompileService_Experimental::getTypeGuid(), (void**)componentPrecompileService.writeRef()) == SLANG_OK) { diff --git a/tools/gfx/vulkan/vk-device.h b/tools/gfx/vulkan/vk-device.h index 27cc4c3ce..06e19ad7e 100644 --- a/tools/gfx/vulkan/vk-device.h +++ b/tools/gfx/vulkan/vk-device.h @@ -223,6 +223,9 @@ public: VkSampler m_defaultSampler; RefPtr<FramebufferImpl> m_emptyFramebuffer; + + // If true, slang will skip downstream linking, so we need to do it ourselves + bool m_skipsDownstreamLinking = false; }; } // namespace vk diff --git a/tools/gfx/vulkan/vk-shader-program.cpp b/tools/gfx/vulkan/vk-shader-program.cpp index 1627c95a7..2dd9b0326 100644 --- a/tools/gfx/vulkan/vk-shader-program.cpp +++ b/tools/gfx/vulkan/vk-shader-program.cpp @@ -74,10 +74,20 @@ Result ShaderProgramImpl::createShaderModule( slang::EntryPointReflection* entryPointInfo, List<ComPtr<ISlangBlob>>& kernelCodes) { - ComPtr<ISlangBlob> linkedKernel = m_device->m_glslang.linkSPIRV(kernelCodes); - if (!linkedKernel) + ComPtr<ISlangBlob> linkedKernel; + ComPtr<slang::ISession> slangSession; + m_device->getSlangSession(slangSession.writeRef()); + if (kernelCodes.getCount() == 1) { - return SLANG_FAIL; + linkedKernel = kernelCodes[0]; + } + else + { + linkedKernel = m_device->m_glslang.linkSPIRV(kernelCodes); + if (!linkedKernel) + { + return SLANG_FAIL; + } } m_codeBlobs.add(linkedKernel); |
