diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | include/slang.h | 1 | ||||
| -rw-r--r-- | source/slang-glsl-module/CMakeLists.txt | 39 | ||||
| -rw-r--r-- | source/slang-glsl-module/slang-embedded-glsl-module.cpp | 17 | ||||
| -rw-r--r-- | source/slang-record-replay/util/emum-to-string.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-api.cpp | 44 | ||||
| -rw-r--r-- | source/slang/slang-options.cpp | 23 | ||||
| -rw-r--r-- | source/slangc/CMakeLists.txt | 1 |
8 files changed, 117 insertions, 11 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cad7dd5f..df06300d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -334,6 +334,7 @@ add_subdirectory(source/slang-glslang) add_subdirectory(tools) add_subdirectory(prelude) add_subdirectory(source/slang-core-module) +add_subdirectory(source/slang-glsl-module) add_subdirectory(source/slang) add_subdirectory(source/slangc) add_subdirectory(examples) @@ -360,7 +361,6 @@ install( DESTINATION . PATTERN ".*" EXCLUDE ) - include(CPack) # Write basic package config version file using standard CMakePackageConfigHelpers utility diff --git a/include/slang.h b/include/slang.h index 333028a69..af635e3c4 100644 --- a/include/slang.h +++ b/include/slang.h @@ -1007,6 +1007,7 @@ typedef uint32_t SlangSizeT; EmitSpirvMethod, // enum SlangEmitSpirvMethod EmitReflectionJSON, // bool + SaveGLSLModuleBinSource, CountOf, }; diff --git a/source/slang-glsl-module/CMakeLists.txt b/source/slang-glsl-module/CMakeLists.txt new file mode 100644 index 000000000..d42b31ee6 --- /dev/null +++ b/source/slang-glsl-module/CMakeLists.txt @@ -0,0 +1,39 @@ +# +# Generate an embeddable glsl module +# + +set(glsl_module_generated_header_dir ${CMAKE_CURRENT_BINARY_DIR}) +set(glsl_module_generated_header + ${glsl_module_generated_header_dir}/slang-glsl-module-generated.h +) +add_custom_command( + OUTPUT ${glsl_module_generated_header} + COMMAND + slang-bootstrap -archive-type riff-lz4 -save-glsl-module-bin-source + ${glsl_module_generated_header} + DEPENDS slang-bootstrap + VERBATIM +) + +set(glsl_module_common_args + . + MODULE + FOLDER + generated + LINK_WITH_PRIVATE + core + USE_EXTRA_WARNINGS + EXPLICIT_SOURCE + ./slang-embedded-glsl-module.cpp +) + +slang_add_target( + ${glsl_module_common_args} + TARGET_NAME slang-glsl-module + EXCLUDE_FROM_ALL + EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_SHARED_LIBRARY_TOOL + EXPORT_SET_NAME SlangTargets + EXPLICIT_SOURCE ${glsl_module_generated_header} + INCLUDE_DIRECTORIES_PRIVATE ${glsl_module_generated_header_dir} + INSTALL +) diff --git a/source/slang-glsl-module/slang-embedded-glsl-module.cpp b/source/slang-glsl-module/slang-embedded-glsl-module.cpp new file mode 100644 index 000000000..7435f1edb --- /dev/null +++ b/source/slang-glsl-module/slang-embedded-glsl-module.cpp @@ -0,0 +1,17 @@ +#include "../core/slang-array-view.h" +#include "../core/slang-basic.h" +#include "../core/slang-blob.h" + +static const uint8_t g_glslModule[] = { +#include "slang-glsl-module-generated.h" +}; + +static Slang::StaticBlob g_glslModuleBlob((const void*)g_glslModule, sizeof(g_glslModule)); + +extern "C" +{ + SLANG_DLL_EXPORT ISlangBlob* slang_getEmbeddedModule() + { + return &g_glslModuleBlob; + } +} diff --git a/source/slang-record-replay/util/emum-to-string.h b/source/slang-record-replay/util/emum-to-string.h index b19782126..1647ab24b 100644 --- a/source/slang-record-replay/util/emum-to-string.h +++ b/source/slang-record-replay/util/emum-to-string.h @@ -226,6 +226,7 @@ static Slang::String CompilerOptionNameToString(const slang::CompilerOptionName CASE(ReferenceModule); CASE(SaveCoreModule); CASE(SaveCoreModuleBinSource); + CASE(SaveGLSLModuleBinSource); CASE(TrackLiveness); CASE(LoopInversion); CASE(CountOfParsableOptions); diff --git a/source/slang/slang-api.cpp b/source/slang/slang-api.cpp index 16d6a07f1..701f49355 100644 --- a/source/slang/slang-api.cpp +++ b/source/slang/slang-api.cpp @@ -1,6 +1,7 @@ // slang-api.cpp #include "../core/slang-performance-profiler.h" +#include "../core/slang-platform.h" #include "../core/slang-rtti-info.h" #include "../core/slang-shared-library.h" #include "../core/slang-signal.h" @@ -63,6 +64,32 @@ SlangResult tryLoadBuiltinModuleFromCache( return SLANG_OK; } +// Attempt to load a precompiled builtin module from slang-xxx-module.dll. +SlangResult tryLoadBuiltinModuleFromDLL( + slang::IGlobalSession* globalSession, + slang::BuiltinModuleName builtinModuleName) +{ + Slang::String moduleFileName = + Slang::String("slang-") + Slang::getBuiltinModuleNameStr(builtinModuleName) + "-module"; + + Slang::SharedLibrary::Handle libHandle = nullptr; + + SLANG_RETURN_ON_FAIL(Slang::SharedLibrary::load(moduleFileName.getBuffer(), libHandle)); + if (!libHandle) + return SLANG_FAIL; + void* ptr = Slang::SharedLibrary::findSymbolAddressByName(libHandle, "slang_getEmbeddedModule"); + if (!ptr) + return SLANG_FAIL; + typedef ISlangBlob*(GetEmbeddedModuleFunc)(); + auto getEmbeddedModule = (GetEmbeddedModuleFunc*)ptr; + auto blob = getEmbeddedModule(); + SLANG_RETURN_ON_FAIL(globalSession->loadBuiltinModule( + builtinModuleName, + (uint8_t*)blob->getBufferPointer(), + blob->getBufferSize())); + return SLANG_OK; +} + SlangResult trySaveBuiltinModuleToCache( slang::IGlobalSession* globalSession, slang::BuiltinModuleName builtinModuleName, @@ -155,11 +182,18 @@ SLANG_API SlangResult slang_createGlobalSession2( { Slang::String cacheFilename; uint64_t dllTimestamp = 0; - if (tryLoadBuiltinModuleFromCache( - globalSession, - slang::BuiltinModuleName::GLSL, - cacheFilename, - dllTimestamp) != SLANG_OK) + if (SLANG_SUCCEEDED( + tryLoadBuiltinModuleFromDLL(globalSession, slang::BuiltinModuleName::GLSL))) + { + } + else if (SLANG_SUCCEEDED(tryLoadBuiltinModuleFromCache( + globalSession, + slang::BuiltinModuleName::GLSL, + cacheFilename, + dllTimestamp))) + { + } + else { SLANG_RETURN_ON_FAIL( globalSession->compileBuiltinModule(slang::BuiltinModuleName::GLSL, 0)); diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index a0e8515eb..2b4d64cd9 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -888,6 +888,11 @@ void initCommandOptions(CommandOptions& options) "-save-core-module-bin-source <filename>", "Same as -save-core-module but output " "the data as a C array.\n"}, + {OptionKind::SaveGLSLModuleBinSource, + "-save-glsl-module-bin-source", + "-save-glsl-module-bin-source <filename>", + "Save the serialized glsl module " + "as a C array.\n"}, {OptionKind::TrackLiveness, "-track-liveness", nullptr, @@ -2203,14 +2208,24 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv) break; } case OptionKind::SaveCoreModuleBinSource: + case OptionKind::SaveGLSLModuleBinSource: { CommandLineArg fileName; SLANG_RETURN_ON_FAIL(m_reader.expectArg(fileName)); ComPtr<ISlangBlob> blob; - SLANG_RETURN_ON_FAIL(m_session->saveCoreModule(m_archiveType, blob.writeRef())); - + if (optionKind == OptionKind::SaveCoreModuleBinSource) + { + SLANG_RETURN_ON_FAIL(m_session->saveCoreModule(m_archiveType, blob.writeRef())); + } + else + { + SLANG_RETURN_ON_FAIL(m_session->saveBuiltinModule( + slang::BuiltinModuleName::GLSL, + m_archiveType, + blob.writeRef())); + } StringBuilder builder; StringWriter writer(&builder, 0); @@ -2763,9 +2778,7 @@ SlangResult OptionsParser::_parse(int argc, char const* const* argv) case OptionKind::Help: { SLANG_RETURN_ON_FAIL(_parseHelp(arg)); - - // We retun an error so after this has successfully passed, we quit - return SLANG_FAIL; + return SLANG_OK; } case OptionKind::EmitSpirvViaGLSL: case OptionKind::EmitSpirvDirectly: diff --git a/source/slangc/CMakeLists.txt b/source/slangc/CMakeLists.txt index 59d691bf4..32ad02541 100644 --- a/source/slangc/CMakeLists.txt +++ b/source/slangc/CMakeLists.txt @@ -5,6 +5,7 @@ if(SLANG_ENABLE_SLANGC) USE_FEWER_WARNINGS DEBUG_DIR ${slang_SOURCE_DIR} LINK_WITH_PRIVATE core slang Threads::Threads + REQUIRES slang-glsl-module INSTALL EXPORT_SET_NAME SlangTargets ) |
