Skip to content

Commit eebe849

Browse files
authored
Distribute slang-glsl-module.bin in release packages. (shader-slang#6233)
* Distribute slang-glsl-module.bin in release packages. * Fix. * fix2. * Build glsl modlue into a dll.
1 parent ae778e3 commit eebe849

File tree

8 files changed

+117
-11
lines changed

8 files changed

+117
-11
lines changed

CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ add_subdirectory(source/slang-glslang)
334334
add_subdirectory(tools)
335335
add_subdirectory(prelude)
336336
add_subdirectory(source/slang-core-module)
337+
add_subdirectory(source/slang-glsl-module)
337338
add_subdirectory(source/slang)
338339
add_subdirectory(source/slangc)
339340
add_subdirectory(examples)
@@ -360,7 +361,6 @@ install(
360361
DESTINATION .
361362
PATTERN ".*" EXCLUDE
362363
)
363-
364364
include(CPack)
365365

366366
# Write basic package config version file using standard CMakePackageConfigHelpers utility

include/slang.h

+1
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,7 @@ typedef uint32_t SlangSizeT;
10071007
EmitSpirvMethod, // enum SlangEmitSpirvMethod
10081008

10091009
EmitReflectionJSON, // bool
1010+
SaveGLSLModuleBinSource,
10101011
CountOf,
10111012
};
10121013

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#
2+
# Generate an embeddable glsl module
3+
#
4+
5+
set(glsl_module_generated_header_dir ${CMAKE_CURRENT_BINARY_DIR})
6+
set(glsl_module_generated_header
7+
${glsl_module_generated_header_dir}/slang-glsl-module-generated.h
8+
)
9+
add_custom_command(
10+
OUTPUT ${glsl_module_generated_header}
11+
COMMAND
12+
slang-bootstrap -archive-type riff-lz4 -save-glsl-module-bin-source
13+
${glsl_module_generated_header}
14+
DEPENDS slang-bootstrap
15+
VERBATIM
16+
)
17+
18+
set(glsl_module_common_args
19+
.
20+
MODULE
21+
FOLDER
22+
generated
23+
LINK_WITH_PRIVATE
24+
core
25+
USE_EXTRA_WARNINGS
26+
EXPLICIT_SOURCE
27+
./slang-embedded-glsl-module.cpp
28+
)
29+
30+
slang_add_target(
31+
${glsl_module_common_args}
32+
TARGET_NAME slang-glsl-module
33+
EXCLUDE_FROM_ALL
34+
EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_SHARED_LIBRARY_TOOL
35+
EXPORT_SET_NAME SlangTargets
36+
EXPLICIT_SOURCE ${glsl_module_generated_header}
37+
INCLUDE_DIRECTORIES_PRIVATE ${glsl_module_generated_header_dir}
38+
INSTALL
39+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include "../core/slang-array-view.h"
2+
#include "../core/slang-basic.h"
3+
#include "../core/slang-blob.h"
4+
5+
static const uint8_t g_glslModule[] = {
6+
#include "slang-glsl-module-generated.h"
7+
};
8+
9+
static Slang::StaticBlob g_glslModuleBlob((const void*)g_glslModule, sizeof(g_glslModule));
10+
11+
extern "C"
12+
{
13+
SLANG_DLL_EXPORT ISlangBlob* slang_getEmbeddedModule()
14+
{
15+
return &g_glslModuleBlob;
16+
}
17+
}

source/slang-record-replay/util/emum-to-string.h

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ static Slang::String CompilerOptionNameToString(const slang::CompilerOptionName
226226
CASE(ReferenceModule);
227227
CASE(SaveCoreModule);
228228
CASE(SaveCoreModuleBinSource);
229+
CASE(SaveGLSLModuleBinSource);
229230
CASE(TrackLiveness);
230231
CASE(LoopInversion);
231232
CASE(CountOfParsableOptions);

source/slang/slang-api.cpp

+39-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// slang-api.cpp
22

33
#include "../core/slang-performance-profiler.h"
4+
#include "../core/slang-platform.h"
45
#include "../core/slang-rtti-info.h"
56
#include "../core/slang-shared-library.h"
67
#include "../core/slang-signal.h"
@@ -63,6 +64,32 @@ SlangResult tryLoadBuiltinModuleFromCache(
6364
return SLANG_OK;
6465
}
6566

67+
// Attempt to load a precompiled builtin module from slang-xxx-module.dll.
68+
SlangResult tryLoadBuiltinModuleFromDLL(
69+
slang::IGlobalSession* globalSession,
70+
slang::BuiltinModuleName builtinModuleName)
71+
{
72+
Slang::String moduleFileName =
73+
Slang::String("slang-") + Slang::getBuiltinModuleNameStr(builtinModuleName) + "-module";
74+
75+
Slang::SharedLibrary::Handle libHandle = nullptr;
76+
77+
SLANG_RETURN_ON_FAIL(Slang::SharedLibrary::load(moduleFileName.getBuffer(), libHandle));
78+
if (!libHandle)
79+
return SLANG_FAIL;
80+
void* ptr = Slang::SharedLibrary::findSymbolAddressByName(libHandle, "slang_getEmbeddedModule");
81+
if (!ptr)
82+
return SLANG_FAIL;
83+
typedef ISlangBlob*(GetEmbeddedModuleFunc)();
84+
auto getEmbeddedModule = (GetEmbeddedModuleFunc*)ptr;
85+
auto blob = getEmbeddedModule();
86+
SLANG_RETURN_ON_FAIL(globalSession->loadBuiltinModule(
87+
builtinModuleName,
88+
(uint8_t*)blob->getBufferPointer(),
89+
blob->getBufferSize()));
90+
return SLANG_OK;
91+
}
92+
6693
SlangResult trySaveBuiltinModuleToCache(
6794
slang::IGlobalSession* globalSession,
6895
slang::BuiltinModuleName builtinModuleName,
@@ -155,11 +182,18 @@ SLANG_API SlangResult slang_createGlobalSession2(
155182
{
156183
Slang::String cacheFilename;
157184
uint64_t dllTimestamp = 0;
158-
if (tryLoadBuiltinModuleFromCache(
159-
globalSession,
160-
slang::BuiltinModuleName::GLSL,
161-
cacheFilename,
162-
dllTimestamp) != SLANG_OK)
185+
if (SLANG_SUCCEEDED(
186+
tryLoadBuiltinModuleFromDLL(globalSession, slang::BuiltinModuleName::GLSL)))
187+
{
188+
}
189+
else if (SLANG_SUCCEEDED(tryLoadBuiltinModuleFromCache(
190+
globalSession,
191+
slang::BuiltinModuleName::GLSL,
192+
cacheFilename,
193+
dllTimestamp)))
194+
{
195+
}
196+
else
163197
{
164198
SLANG_RETURN_ON_FAIL(
165199
globalSession->compileBuiltinModule(slang::BuiltinModuleName::GLSL, 0));

source/slang/slang-options.cpp

+18-5
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,11 @@ void initCommandOptions(CommandOptions& options)
888888
"-save-core-module-bin-source <filename>",
889889
"Same as -save-core-module but output "
890890
"the data as a C array.\n"},
891+
{OptionKind::SaveGLSLModuleBinSource,
892+
"-save-glsl-module-bin-source",
893+
"-save-glsl-module-bin-source <filename>",
894+
"Save the serialized glsl module "
895+
"as a C array.\n"},
891896
{OptionKind::TrackLiveness,
892897
"-track-liveness",
893898
nullptr,
@@ -2203,14 +2208,24 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv)
22032208
break;
22042209
}
22052210
case OptionKind::SaveCoreModuleBinSource:
2211+
case OptionKind::SaveGLSLModuleBinSource:
22062212
{
22072213
CommandLineArg fileName;
22082214
SLANG_RETURN_ON_FAIL(m_reader.expectArg(fileName));
22092215

22102216
ComPtr<ISlangBlob> blob;
22112217

2212-
SLANG_RETURN_ON_FAIL(m_session->saveCoreModule(m_archiveType, blob.writeRef()));
2213-
2218+
if (optionKind == OptionKind::SaveCoreModuleBinSource)
2219+
{
2220+
SLANG_RETURN_ON_FAIL(m_session->saveCoreModule(m_archiveType, blob.writeRef()));
2221+
}
2222+
else
2223+
{
2224+
SLANG_RETURN_ON_FAIL(m_session->saveBuiltinModule(
2225+
slang::BuiltinModuleName::GLSL,
2226+
m_archiveType,
2227+
blob.writeRef()));
2228+
}
22142229
StringBuilder builder;
22152230
StringWriter writer(&builder, 0);
22162231

@@ -2763,9 +2778,7 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv)
27632778
case OptionKind::Help:
27642779
{
27652780
SLANG_RETURN_ON_FAIL(_parseHelp(arg));
2766-
2767-
// We retun an error so after this has successfully passed, we quit
2768-
return SLANG_FAIL;
2781+
return SLANG_OK;
27692782
}
27702783
case OptionKind::EmitSpirvViaGLSL:
27712784
case OptionKind::EmitSpirvDirectly:

source/slangc/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ if(SLANG_ENABLE_SLANGC)
55
USE_FEWER_WARNINGS
66
DEBUG_DIR ${slang_SOURCE_DIR}
77
LINK_WITH_PRIVATE core slang Threads::Threads
8+
REQUIRES slang-glsl-module
89
INSTALL
910
EXPORT_SET_NAME SlangTargets
1011
)

0 commit comments

Comments
 (0)