forked from shader-slang/slang
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Extend the COM-based API to support whole program compilation. (shade…
- Loading branch information
Showing
14 changed files
with
215 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
|