// unit-test-module-ptr.cpp #include "core/slang-memory-file-system.h" #include "slang-com-ptr.h" #include "slang.h" #include "unit-test/slang-unit-test.h" #include #include using namespace Slang; SLANG_UNIT_TEST(modulePtr) { const char* testModuleSource = R"( module test_module; public void atomicFunc(__ref Atomic ptr) { ptr.add(1); } )"; const char* testSource = R"( import "test_module"; RWStructuredBuffer> input0; [shader("compute")] [numthreads(1,1,1)] void computeMain(uint3 workGroup : SV_GroupID) { atomicFunc(input0[0]); } )"; ComPtr memoryFileSystem = ComPtr(new Slang::MemoryFileSystem()); ComPtr globalSession; SLANG_CHECK(slang_createGlobalSession(SLANG_API_VERSION, globalSession.writeRef()) == SLANG_OK); slang::TargetDesc targetDesc = {}; targetDesc.format = SLANG_SPIRV; targetDesc.profile = globalSession->findProfile("spirv_1_5"); slang::SessionDesc sessionDesc = {}; sessionDesc.targetCount = 1; sessionDesc.targets = &targetDesc; sessionDesc.compilerOptionEntryCount = 0; sessionDesc.fileSystem = memoryFileSystem; // Precompile test_module to file. { ComPtr session; SLANG_CHECK(globalSession->createSession(sessionDesc, session.writeRef()) == SLANG_OK); ComPtr diagnosticBlob; auto module = session->loadModuleFromSourceString( "test_module", "test_module.slang", testModuleSource, diagnosticBlob.writeRef()); SLANG_CHECK(module != nullptr); ComPtr moduleBlob; module->serialize(moduleBlob.writeRef()); memoryFileSystem->saveFile( "test_module.slang-module", moduleBlob->getBufferPointer(), moduleBlob->getBufferSize()); } // compile test. { ComPtr session; SLANG_CHECK(globalSession->createSession(sessionDesc, session.writeRef()) == SLANG_OK); ComPtr diagnosticBlob; auto module = session->loadModuleFromSourceString( "test", "test.slang", testSource, diagnosticBlob.writeRef()); SLANG_CHECK(module != nullptr); ComPtr linkedProgram; module->link(linkedProgram.writeRef()); ComPtr code; linkedProgram->getTargetCode(0, code.writeRef(), diagnosticBlob.writeRef()); SLANG_CHECK(code->getBufferSize() > 0); } }