Added KRShaderManager::Includer

Now able to include shaders from other shaders with GL_GOOGLE_include_directive.
Added vulkan_test_include.glsl and included it from vulkan_test.vert.
This commit is contained in:
2022-08-15 19:48:59 -07:00
parent 7433d54c16
commit 2085908017
5 changed files with 61 additions and 2 deletions

View File

@@ -38,6 +38,7 @@
KRShaderManager::KRShaderManager(KRContext& context) : KRResourceManager(context) KRShaderManager::KRShaderManager(KRContext& context) : KRResourceManager(context)
, m_initializedGlslang(false) , m_initializedGlslang(false)
, m_includer(&context)
{ {
} }
@@ -288,7 +289,7 @@ bool KRShaderManager::compileAll(KRBundle* outputBundle, KRUnknown* logResource)
shader.setStringsWithLengthsAndNames(sourceText, sourceLen, sourceNameStr, 1); shader.setStringsWithLengthsAndNames(sourceText, sourceLen, sourceNameStr, 1);
//shader.setStrings(&sourceStr, 1); //shader.setStrings(&sourceStr, 1);
if (shader.parse(&resources, defaultVersion, false, messages)) { if (shader.parse(&resources, defaultVersion, false, messages, m_includer)) {
program.addShader(&shader); program.addShader(&shader);
} else { } else {
const char* log = shader.getInfoLog(); const char* log = shader.getInfoLog();
@@ -358,3 +359,38 @@ bool KRShaderManager::compileAll(KRBundle* outputBundle, KRUnknown* logResource)
return success; 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<const char*>(data->getStart());
return new IncludeResult(std::string(headerName), sourceString, data->getSize(), static_cast<void*>(data));
}
void KRShaderManager::Includer::releaseInclude(IncludeResult* includeResult)
{
KRDataBlock* data = static_cast<KRDataBlock*>(includeResult->userData);
data->unlock();
}

View File

@@ -61,7 +61,24 @@ public:
unordered_map<std::string, unordered_map<std::string, KRShader*> >& getShaders(); unordered_map<std::string, unordered_map<std::string, KRShader*> >& 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: private:
unordered_map<std::string, unordered_map<std::string, KRShader*> > m_shaders; unordered_map<std::string, unordered_map<std::string, KRShader*> > m_shaders;
bool m_initializedGlslang; bool m_initializedGlslang;
Includer m_includer;
}; };

View File

@@ -7,3 +7,4 @@ add_standard_asset(vulkan_test.vert)
add_standard_asset(vulkan_test.frag) add_standard_asset(vulkan_test.frag)
add_standard_asset(debug_font.vert) add_standard_asset(debug_font.vert)
add_standard_asset(debug_font.frag) add_standard_asset(debug_font.frag)
add_standard_asset(vulkan_test_include.glsl)

View File

@@ -1,4 +1,7 @@
#version 450 #version 450
#extension GL_GOOGLE_include_directive : enable
#include "vulkan_test_include.glsl"
// Temporary test shader for vulkan bringup... // Temporary test shader for vulkan bringup...
// See https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Shader_modules // See https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Shader_modules
@@ -17,5 +20,5 @@ layout( push_constant ) uniform constants
void main() { void main() {
gl_Position = vec4(vertex_position * 0.5, 1.0); 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;
} }

View File

@@ -0,0 +1,2 @@
#define VULKAN_TEST_BRIGHTNESS 0.25