@@ -5827,6 +5827,39 @@ lvk::ShaderModuleState lvk::VulkanContext::createShaderModuleFromSlang(ShaderSta
58275827 const char * source,
58285828 const char * debugName,
58295829 Result* outResult) const {
5830+ std::string sourcePatched;
5831+
5832+ if (!source || !*source) {
5833+ Result::setResult (outResult, Result::Code::ArgumentOutOfRange, " Shader source is empty" );
5834+ return {};
5835+ }
5836+
5837+ auto addCode = [source, &sourcePatched](const char * substr, const char * code) -> void {
5838+ if (strstr (source, substr)) {
5839+ sourcePatched.append (code);
5840+ }
5841+ };
5842+
5843+ // bindless texture and sampler arrays
5844+ sourcePatched +=
5845+ " [[vk::binding(0, 0)]] Texture2D kTextures2D[];\n "
5846+ " [[vk::binding(0, 1)]] Texture3D kTextures3D[];\n "
5847+ " [[vk::binding(0, 2)]] TextureCube kTexturesCube[];\n "
5848+ " [[vk::binding(1, 0)]] SamplerState kSamplers[];\n " ;
5849+ addCode (" textureBindless2D(" ,
5850+ " float4 textureBindless2D(uint textureid, uint samplerid, float2 uv) {\n "
5851+ " return kTextures2D[NonUniformResourceIndex(textureid)].Sample(\n "
5852+ " kSamplers[NonUniformResourceIndex(samplerid)], uv);\n "
5853+ " }\n " );
5854+ addCode (" textureBindlessCube(" ,
5855+ " float4 textureBindlessCube(uint textureid, uint samplerid, float3 dir) {\n "
5856+ " return kTexturesCube[NonUniformResourceIndex(textureid)].Sample(\n "
5857+ " kSamplers[NonUniformResourceIndex(samplerid)], dir);\n "
5858+ " }\n " );
5859+
5860+ sourcePatched += source;
5861+ source = sourcePatched.c_str ();
5862+
58305863 std::vector<uint8_t > spirv;
58315864 lvk::Result::setResult (outResult, lvk::compileShaderSlang (stage, source, &spirv));
58325865
0 commit comments