@@ -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