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:
@@ -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<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();
|
||||
}
|
||||
|
||||
@@ -61,7 +61,24 @@ public:
|
||||
|
||||
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:
|
||||
unordered_map<std::string, unordered_map<std::string, KRShader*> > m_shaders;
|
||||
bool m_initializedGlslang;
|
||||
Includer m_includer;
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
2
standard_assets/shaders/vulkan_test_include.glsl
Normal file
2
standard_assets/shaders/vulkan_test_include.glsl
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
#define VULKAN_TEST_BRIGHTNESS 0.25
|
||||
Reference in New Issue
Block a user