Skip to content

Commit d25be96

Browse files
committed
Add unit test for entry point lookup bug
See issue #4760.
1 parent f90a763 commit d25be96

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include "../../source/core/slang-io.h"
2+
#include "../../source/core/slang-process.h"
3+
#include "slang-com-ptr.h"
4+
#include "slang.h"
5+
#include "unit-test/slang-unit-test.h"
6+
7+
#include <stdio.h>
8+
#include <stdlib.h>
9+
10+
using namespace Slang;
11+
12+
// Make sure that we can look up entry points that are not explicitly marked out using
13+
// [shader("fragment")], but rather specified as entry points via the
14+
// CompilerOptionName::EntryPointName API option.
15+
16+
SLANG_UNIT_TEST(entryPointOptions)
17+
{
18+
19+
char const* const sourceString =
20+
R"(
21+
float4 vertexMain() : SV_Position
22+
{
23+
return float4(0,0,0,1);
24+
}
25+
26+
float4 fragmentMain() : SV_Target
27+
{
28+
return float4(1,1,1,1);
29+
})";
30+
Slang::String source(sourceString);
31+
32+
ComPtr<slang::IGlobalSession> globalSession;
33+
SlangResult res = slang::createGlobalSession(globalSession.writeRef());
34+
SLANG_CHECK(SLANG_SUCCEEDED(res));
35+
36+
slang::TargetDesc targetDesc = {};
37+
targetDesc.format = SlangCompileTarget::SLANG_HLSL;
38+
slang::SessionDesc sessionDesc = {};
39+
sessionDesc.targetCount = 1;
40+
sessionDesc.targets = &targetDesc;
41+
List<slang::CompilerOptionEntry> sessionOptionEntries;
42+
const char* entryPointNames[] = {"vertexMain", "fragmentMain"};
43+
for (const char* name : entryPointNames)
44+
{
45+
slang::CompilerOptionEntry entry;
46+
entry.name = slang::CompilerOptionName::EntryPointName;
47+
entry.value.kind = slang::CompilerOptionValueKind::String;
48+
entry.value.stringValue0 = name;
49+
sessionOptionEntries.add(entry);
50+
}
51+
sessionDesc.compilerOptionEntries = sessionOptionEntries.getBuffer();
52+
sessionDesc.compilerOptionEntryCount = sessionOptionEntries.getCount();
53+
ComPtr<slang::ISession> session;
54+
res = globalSession->createSession(sessionDesc, session.writeRef());
55+
SLANG_CHECK(SLANG_SUCCEEDED(res));
56+
ComPtr<slang::IBlob> diagnostics;
57+
ComPtr<slang::IModule> module(session->loadModuleFromSourceString(
58+
"main",
59+
"main.slang",
60+
source.getBuffer(),
61+
diagnostics.writeRef()));
62+
SLANG_CHECK(module != nullptr);
63+
64+
for (const char* name : entryPointNames)
65+
{
66+
ComPtr<slang::IEntryPoint> entryPoint;
67+
res = module->findEntryPointByName(name, entryPoint.writeRef());
68+
SLANG_CHECK(SLANG_SUCCEEDED(res));
69+
SLANG_CHECK(entryPoint != nullptr);
70+
}
71+
}

0 commit comments

Comments
 (0)