diff options
| author | Yong He <yonghe@outlook.com> | 2024-06-12 09:45:50 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-12 09:45:50 -0700 |
| commit | ccc26c2d22d471ae649bf16f37ed1cd6cfbddd1b (patch) | |
| tree | f1b84f6c30d2f8aa5014587ef1b7995ae51996e4 /tools | |
| parent | 318adcc27b8d89ec1d47c445a93239dd81be0b31 (diff) | |
Extend the COM-based API to support whole program compilation. (#4355)
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/slang-unit-test/unit-test-get-target-code.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tools/slang-unit-test/unit-test-get-target-code.cpp b/tools/slang-unit-test/unit-test-get-target-code.cpp new file mode 100644 index 000000000..a98510fd5 --- /dev/null +++ b/tools/slang-unit-test/unit-test-get-target-code.cpp @@ -0,0 +1,69 @@ +// unit-test-translation-unit-import.cpp + +#include "../../slang.h" + +#include <stdio.h> +#include <stdlib.h> + +#include "tools/unit-test/slang-unit-test.h" +#include "../../slang-com-ptr.h" +#include "../../source/core/slang-io.h" +#include "../../source/core/slang-process.h" + +using namespace Slang; + +// Test that the IComponentType::getTargetCode API supports +// compiling a program with multiple entrypoints and retrieving a single +// compiled module that contains all the entrypoints. +// +SLANG_UNIT_TEST(getTargetCode) +{ + // Source for a module that contains an undecorated entrypoint. + const char* userSourceBody = R"( + [shader("fragment")] + float4 fragMain(float4 pos:SV_Position) : SV_Target + { + return pos; + } + [shader("vertex")] + float4 vertMain(float4 pos) : SV_Position + { + return pos; + } + )"; + + String userSource = userSourceBody; + ComPtr<slang::IGlobalSession> globalSession; + SLANG_CHECK(slang_createGlobalSession(SLANG_API_VERSION, globalSession.writeRef()) == SLANG_OK); + slang::TargetDesc targetDesc = {}; + // Request SPIR-V disassembly so we can check the content. + targetDesc.format = SLANG_SPIRV_ASM; + targetDesc.profile = globalSession->findProfile("sm_5_0"); + slang::SessionDesc sessionDesc = {}; + sessionDesc.targetCount = 1; + sessionDesc.targets = &targetDesc; + + ComPtr<slang::ISession> session; + SLANG_CHECK(globalSession->createSession(sessionDesc, session.writeRef()) == SLANG_OK); + + ComPtr<slang::IBlob> diagnosticBlob; + auto module = session->loadModuleFromSourceString("m", "m.slang", userSourceBody, diagnosticBlob.writeRef()); + SLANG_CHECK(module != nullptr); + + ComPtr<slang::IComponentType> linkedProgram; + module->link(linkedProgram.writeRef(), diagnosticBlob.writeRef()); + SLANG_CHECK(linkedProgram != nullptr); + + ComPtr<slang::IBlob> code; + linkedProgram->getTargetCode(0, code.writeRef(), diagnosticBlob.writeRef()); + SLANG_CHECK(code != nullptr); + + SLANG_CHECK(code->getBufferSize() != 0); + + UnownedStringSlice resultStr = UnownedStringSlice((char*)code->getBufferPointer()); + + // Make sure the spirv disassembly contains both entrypoint names. + SLANG_CHECK(resultStr.indexOf(toSlice("fragMain")) != -1); + SLANG_CHECK(resultStr.indexOf(toSlice("vertMain")) != -1); +} + |
