Skip to content

Commit 3b67c81

Browse files
Inject aux GLSL code only when corresponding function calls are present
1 parent 50d85ea commit 3b67c81

File tree

1 file changed

+73
-70
lines changed

1 file changed

+73
-70
lines changed

lvk/vulkan/VulkanClasses.cpp

Lines changed: 73 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -5721,85 +5721,88 @@ lvk::ShaderModuleState lvk::VulkanContext::createShaderModuleFromGLSL(ShaderStag
57215721
return {};
57225722
}
57235723

5724+
auto addCode = [source, &sourcePatched](const char* substr, const char* code) -> void {
5725+
if (strstr(source, substr)) {
5726+
sourcePatched.append(code);
5727+
}
5728+
};
5729+
57245730
if (strstr(source, "#version ") == nullptr) {
57255731
if (vkStage == VK_SHADER_STAGE_TASK_BIT_EXT || vkStage == VK_SHADER_STAGE_MESH_BIT_EXT) {
5726-
sourcePatched += R"(
5727-
#version 460
5728-
#extension GL_EXT_buffer_reference : require
5729-
#extension GL_EXT_buffer_reference_uvec2 : require
5730-
#extension GL_EXT_debug_printf : enable
5731-
#extension GL_EXT_nonuniform_qualifier : require
5732-
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
5733-
#extension GL_EXT_mesh_shader : require
5734-
)";
5732+
sourcePatched +=
5733+
"#version 460\n"
5734+
"#extension GL_EXT_buffer_reference : require\n"
5735+
"#extension GL_EXT_buffer_reference_uvec2 : require\n"
5736+
"#extension GL_EXT_debug_printf : enable\n"
5737+
"#extension GL_EXT_nonuniform_qualifier : require\n"
5738+
"#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require\n"
5739+
"#extension GL_EXT_mesh_shader : require\n";
57355740
}
57365741
if (vkStage == VK_SHADER_STAGE_VERTEX_BIT || vkStage == VK_SHADER_STAGE_COMPUTE_BIT ||
57375742
vkStage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || vkStage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) {
5738-
sourcePatched += R"(
5739-
#version 460
5740-
#extension GL_EXT_buffer_reference : require
5741-
#extension GL_EXT_buffer_reference_uvec2 : require
5742-
#extension GL_EXT_debug_printf : enable
5743-
#extension GL_EXT_nonuniform_qualifier : require
5744-
#extension GL_EXT_samplerless_texture_functions : require
5745-
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
5746-
)";
5743+
sourcePatched +=
5744+
"#version 460\n"
5745+
"#extension GL_EXT_buffer_reference : require\n"
5746+
"#extension GL_EXT_buffer_reference_uvec2 : require\n"
5747+
"#extension GL_EXT_debug_printf : enable\n"
5748+
"#extension GL_EXT_nonuniform_qualifier : require\n"
5749+
"#extension GL_EXT_samplerless_texture_functions : require\n"
5750+
"#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require\n";
57475751
}
57485752
if (vkStage == VK_SHADER_STAGE_FRAGMENT_BIT) {
5749-
const bool bInjectTLAS = strstr(source, "kTLAS[") != nullptr;
57505753
// Note how nonuniformEXT() should be used:
57515754
// https://github.com/KhronosGroup/Vulkan-Samples/blob/main/shaders/descriptor_indexing/nonuniform-quads.frag#L33-L39
5752-
sourcePatched += R"(
5753-
#version 460
5754-
#extension GL_EXT_buffer_reference_uvec2 : require
5755-
#extension GL_EXT_debug_printf : enable
5756-
#extension GL_EXT_nonuniform_qualifier : require
5757-
#extension GL_EXT_samplerless_texture_functions : require
5758-
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require
5759-
)";
5760-
if (bInjectTLAS) {
5761-
sourcePatched += R"(
5762-
#extension GL_EXT_buffer_reference : require
5763-
#extension GL_EXT_ray_query : require
5764-
5765-
layout(set = 0, binding = 4) uniform accelerationStructureEXT kTLAS[];
5766-
)";
5767-
}
5768-
sourcePatched += R"(
5769-
layout (set = 0, binding = 0) uniform texture2D kTextures2D[];
5770-
layout (set = 1, binding = 0) uniform texture3D kTextures3D[];
5771-
layout (set = 2, binding = 0) uniform textureCube kTexturesCube[];
5772-
layout (set = 3, binding = 0) uniform texture2D kTextures2DShadow[];
5773-
layout (set = 0, binding = 1) uniform sampler kSamplers[];
5774-
layout (set = 3, binding = 1) uniform samplerShadow kSamplersShadow[];
5775-
5776-
layout (set = 0, binding = 3) uniform sampler2D kSamplerYUV[];
5777-
5778-
vec4 textureBindless2D(uint textureid, uint samplerid, vec2 uv) {
5779-
return texture(nonuniformEXT(sampler2D(kTextures2D[textureid], kSamplers[samplerid])), uv);
5780-
}
5781-
vec4 textureBindless2DLod(uint textureid, uint samplerid, vec2 uv, float lod) {
5782-
return textureLod(nonuniformEXT(sampler2D(kTextures2D[textureid], kSamplers[samplerid])), uv, lod);
5783-
}
5784-
float textureBindless2DShadow(uint textureid, uint samplerid, vec3 uvw) {
5785-
return texture(nonuniformEXT(sampler2DShadow(kTextures2DShadow[textureid], kSamplersShadow[samplerid])), uvw);
5786-
}
5787-
ivec2 textureBindlessSize2D(uint textureid) {
5788-
return textureSize(nonuniformEXT(kTextures2D[textureid]), 0);
5789-
}
5790-
vec4 textureBindlessCube(uint textureid, uint samplerid, vec3 uvw) {
5791-
return texture(nonuniformEXT(samplerCube(kTexturesCube[textureid], kSamplers[samplerid])), uvw);
5792-
}
5793-
vec4 textureBindlessCubeLod(uint textureid, uint samplerid, vec3 uvw, float lod) {
5794-
return textureLod(nonuniformEXT(samplerCube(kTexturesCube[textureid], kSamplers[samplerid])), uvw, lod);
5795-
}
5796-
int textureBindlessQueryLevels2D(uint textureid) {
5797-
return textureQueryLevels(nonuniformEXT(kTextures2D[textureid]));
5798-
}
5799-
int textureBindlessQueryLevelsCube(uint textureid) {
5800-
return textureQueryLevels(nonuniformEXT(kTexturesCube[textureid]));
5801-
}
5802-
)";
5755+
sourcePatched +=
5756+
"#version 460\n"
5757+
"#extension GL_EXT_buffer_reference_uvec2 : require\n"
5758+
"#extension GL_EXT_debug_printf : enable\n"
5759+
"#extension GL_EXT_nonuniform_qualifier : require\n"
5760+
"#extension GL_EXT_samplerless_texture_functions : require\n"
5761+
"#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require\n";
5762+
addCode("kTLAS[",
5763+
"#extension GL_EXT_buffer_reference : require\n"
5764+
"#extension GL_EXT_ray_query : require\n"
5765+
"layout(set = 0, binding = 4) uniform accelerationStructureEXT kTLAS[];\n");
5766+
sourcePatched +=
5767+
"layout (set = 0, binding = 0) uniform texture2D kTextures2D[];\n"
5768+
"layout (set = 1, binding = 0) uniform texture3D kTextures3D[];\n"
5769+
"layout (set = 2, binding = 0) uniform textureCube kTexturesCube[];\n"
5770+
"layout (set = 3, binding = 0) uniform texture2D kTextures2DShadow[];\n"
5771+
"layout (set = 0, binding = 1) uniform sampler kSamplers[];\n"
5772+
"layout (set = 3, binding = 1) uniform samplerShadow kSamplersShadow[];\n"
5773+
"layout (set = 0, binding = 3) uniform sampler2D kSamplerYUV[];\n";
5774+
addCode("textureBindless2D(",
5775+
"vec4 textureBindless2D(uint textureid, uint samplerid, vec2 uv) {\n"
5776+
" return texture(nonuniformEXT(sampler2D(kTextures2D[textureid], kSamplers[samplerid])), uv);\n"
5777+
"}\n");
5778+
addCode("textureBindless2DLod(",
5779+
"vec4 textureBindless2DLod(uint textureid, uint samplerid, vec2 uv, float lod) {\n"
5780+
" return textureLod(nonuniformEXT(sampler2D(kTextures2D[textureid], kSamplers[samplerid])), uv, lod);\n"
5781+
"}\n");
5782+
addCode("textureBindless2DShadow(",
5783+
"float textureBindless2DShadow(uint textureid, uint samplerid, vec3 uvw) {"
5784+
" return texture(nonuniformEXT(sampler2DShadow(kTextures2DShadow[textureid], kSamplersShadow[samplerid])), uvw);\n"
5785+
"}\n");
5786+
addCode("textureBindlessSize2D(",
5787+
"ivec2 textureBindlessSize2D(uint textureid) {\n"
5788+
" return textureSize(nonuniformEXT(kTextures2D[textureid]), 0);\n"
5789+
"}\n");
5790+
addCode("textureBindlessCube(",
5791+
"vec4 textureBindlessCube(uint textureid, uint samplerid, vec3 uvw) {\n"
5792+
" return texture(nonuniformEXT(samplerCube(kTexturesCube[textureid], kSamplers[samplerid])), uvw);\n"
5793+
"}\n");
5794+
addCode("textureBindlessCubeLod(",
5795+
"vec4 textureBindlessCubeLod(uint textureid, uint samplerid, vec3 uvw, float lod) {\n"
5796+
" return textureLod(nonuniformEXT(samplerCube(kTexturesCube[textureid], kSamplers[samplerid])), uvw, lod);\n"
5797+
"}\n");
5798+
addCode("textureBindlessQueryLevels2D(",
5799+
"int textureBindlessQueryLevels2D(uint textureid) {\n"
5800+
" return textureQueryLevels(nonuniformEXT(kTextures2D[textureid]));\n"
5801+
"}\n");
5802+
addCode("textureBindlessQueryLevelsCube(",
5803+
"int textureBindlessQueryLevelsCube(uint textureid) {\n"
5804+
" return textureQueryLevels(nonuniformEXT(kTexturesCube[textureid]));\n"
5805+
"}\n");
58035806
}
58045807
sourcePatched += source;
58055808
source = sourcePatched.c_str();

0 commit comments

Comments
 (0)