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)
|
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();
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
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