Skip to content

Commit e685359

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

File tree

1 file changed

+102
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)