diff --git a/kraken/KRShaderManager.cpp b/kraken/KRShaderManager.cpp index 2fb29dd..a916d1f 100644 --- a/kraken/KRShaderManager.cpp +++ b/kraken/KRShaderManager.cpp @@ -38,6 +38,7 @@ KRShaderManager::KRShaderManager(KRContext& context) : KRResourceManager(context) , m_initializedGlslang(false) +, m_includer(&context) { } @@ -288,7 +289,7 @@ bool KRShaderManager::compileAll(KRBundle* outputBundle, KRUnknown* logResource) shader.setStringsWithLengthsAndNames(sourceText, sourceLen, sourceNameStr, 1); //shader.setStrings(&sourceStr, 1); - if (shader.parse(&resources, defaultVersion, false, messages)) { + if (shader.parse(&resources, defaultVersion, false, messages, m_includer)) { program.addShader(&shader); } else { const char* log = shader.getInfoLog(); @@ -358,3 +359,38 @@ bool KRShaderManager::compileAll(KRBundle* outputBundle, KRUnknown* logResource) return success; } + +KRShaderManager::Includer::Includer(KRContext* context) + : m_context(context) +{} + +glslang::TShader::Includer::IncludeResult* KRShaderManager::Includer::includeSystem( + const char* headerName, + const char* includerName, + size_t inclusionDepth) +{ + fprintf(stderr, "includeSystem(%s, %s, %llu)\n", headerName, includerName, inclusionDepth); + return nullptr; +} +glslang::TShader::Includer::IncludeResult* KRShaderManager::Includer::includeLocal( + const char* headerName, + const char* includerName, + size_t inclusionDepth) +{ + std::string name = KRResource::GetFileBase(headerName); + std::string extension = KRResource::GetFileExtension(headerName); + KRSource* source = m_context->getSourceManager()->get(name, extension); + if (!source) { + return nullptr; + } + KRDataBlock* data = source->getData(); + data->lock(); + const char* sourceString = static_cast(data->getStart()); + return new IncludeResult(std::string(headerName), sourceString, data->getSize(), static_cast(data)); +} + +void KRShaderManager::Includer::releaseInclude(IncludeResult* includeResult) +{ + KRDataBlock* data = static_cast(includeResult->userData); + data->unlock(); +} diff --git a/kraken/KRShaderManager.h b/kraken/KRShaderManager.h index 5339b6e..dd8e15b 100644 --- a/kraken/KRShaderManager.h +++ b/kraken/KRShaderManager.h @@ -61,7 +61,24 @@ public: unordered_map >& getShaders(); + class Includer : public glslang::TShader::Includer + { + public: + Includer() = delete; + Includer(KRContext* context); + IncludeResult* includeSystem(const char* headerName, + const char* includerName, + size_t inclusionDepth) override; + IncludeResult* includeLocal(const char* headerName, + const char* includerName, + size_t inclusionDepth) override; + void releaseInclude(IncludeResult* includeResult) override; + private: + KRContext* m_context; + }; + private: unordered_map > m_shaders; bool m_initializedGlslang; + Includer m_includer; }; diff --git a/standard_assets/shaders/CMakeLists.txt b/standard_assets/shaders/CMakeLists.txt index b84ae0e..311589e 100644 --- a/standard_assets/shaders/CMakeLists.txt +++ b/standard_assets/shaders/CMakeLists.txt @@ -7,3 +7,4 @@ add_standard_asset(vulkan_test.vert) add_standard_asset(vulkan_test.frag) add_standard_asset(debug_font.vert) add_standard_asset(debug_font.frag) +add_standard_asset(vulkan_test_include.glsl) diff --git a/standard_assets/shaders/vulkan_test.vert b/standard_assets/shaders/vulkan_test.vert index c26d016..fe543c9 100644 --- a/standard_assets/shaders/vulkan_test.vert +++ b/standard_assets/shaders/vulkan_test.vert @@ -1,4 +1,7 @@ #version 450 +#extension GL_GOOGLE_include_directive : enable + +#include "vulkan_test_include.glsl" // Temporary test shader for vulkan bringup... // See https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Shader_modules @@ -17,5 +20,5 @@ layout( push_constant ) uniform constants void main() { gl_Position = vec4(vertex_position * 0.5, 1.0); - fragColor = vertex_normal * 0.25 + vec3(0.5, 0.5, 0.5); + fragColor = vertex_normal * 0.25 + vec3(0.5, 0.5, 0.5) * VULKAN_TEST_BRIGHTNESS; } diff --git a/standard_assets/shaders/vulkan_test_include.glsl b/standard_assets/shaders/vulkan_test_include.glsl new file mode 100644 index 0000000..2661c45 --- /dev/null +++ b/standard_assets/shaders/vulkan_test_include.glsl @@ -0,0 +1,2 @@ + +#define VULKAN_TEST_BRIGHTNESS 0.25