From 5a623ec227726ad1d988a5d91f55f19b62a98e03 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 15 Feb 2024 00:05:51 -0800 Subject: Support loading serialized modules. (#3588) * Support loading serialized modules. * Fix. * Fix vs solution files * Fix glsl module loading. * C++ fix. * Fix. * Try fix c++ error. * Try fix. * Fix. * Fix. --- tools/gfx-unit-test/gfx-test-util.cpp | 62 ++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) (limited to 'tools/gfx-unit-test/gfx-test-util.cpp') diff --git a/tools/gfx-unit-test/gfx-test-util.cpp b/tools/gfx-unit-test/gfx-test-util.cpp index 298283a4a..748ced5eb 100644 --- a/tools/gfx-unit-test/gfx-test-util.cpp +++ b/tools/gfx-unit-test/gfx-test-util.cpp @@ -71,6 +71,54 @@ namespace gfx_test return SLANG_OK; } + Slang::Result loadComputeProgram( + gfx::IDevice* device, + slang::ISession* slangSession, + Slang::ComPtr& outShaderProgram, + const char* shaderModuleName, + const char* entryPointName, + slang::ProgramLayout*& slangReflection) + { + Slang::ComPtr diagnosticsBlob; + slang::IModule* module = slangSession->loadModule(shaderModuleName, diagnosticsBlob.writeRef()); + diagnoseIfNeeded(diagnosticsBlob); + if (!module) + return SLANG_FAIL; + + ComPtr computeEntryPoint; + SLANG_RETURN_ON_FAIL( + module->findEntryPointByName(entryPointName, computeEntryPoint.writeRef())); + + Slang::List componentTypes; + componentTypes.add(module); + componentTypes.add(computeEntryPoint); + + Slang::ComPtr composedProgram; + SlangResult result = slangSession->createCompositeComponentType( + componentTypes.getBuffer(), + componentTypes.getCount(), + composedProgram.writeRef(), + diagnosticsBlob.writeRef()); + diagnoseIfNeeded(diagnosticsBlob); + SLANG_RETURN_ON_FAIL(result); + + ComPtr linkedProgram; + result = composedProgram->link(linkedProgram.writeRef(), diagnosticsBlob.writeRef()); + diagnoseIfNeeded(diagnosticsBlob); + SLANG_RETURN_ON_FAIL(result); + + composedProgram = linkedProgram; + slangReflection = composedProgram->getLayout(); + + gfx::IShaderProgram::Desc programDesc = {}; + programDesc.slangGlobalScope = composedProgram.get(); + + auto shaderProgram = device->createProgram(programDesc); + + outShaderProgram = shaderProgram; + return SLANG_OK; + } + Slang::Result loadComputeProgramFromSource( gfx::IDevice* device, Slang::ComPtr& outShaderProgram, @@ -222,10 +270,7 @@ namespace gfx_test SLANG_IGNORE_TEST } deviceDesc.slang.slangGlobalSession = context->slangGlobalSession; - Slang::List searchPaths; - searchPaths.add(""); - searchPaths.add("../../tools/gfx-unit-test"); - searchPaths.add("tools/gfx-unit-test"); + Slang::List searchPaths = getSlangSearchPaths(); searchPaths.addRange(additionalSearchPaths); deviceDesc.slang.searchPaths = searchPaths.getBuffer(); deviceDesc.slang.searchPathCount = (gfx::GfxCount)searchPaths.getCount(); @@ -253,6 +298,15 @@ namespace gfx_test return device; } + Slang::List getSlangSearchPaths() + { + Slang::List searchPaths; + searchPaths.add(""); + searchPaths.add("../../tools/gfx-unit-test"); + searchPaths.add("tools/gfx-unit-test"); + return searchPaths; + } + #if GFX_ENABLE_RENDERDOC_INTEGRATION RENDERDOC_API_1_1_2* rdoc_api = NULL; void initializeRenderDoc() -- cgit v1.2.3