diff options
author | Liam <byteslice@airmail.cc> | 2022-04-01 17:08:40 -0400 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-04-01 17:08:40 -0400 |
commit | 7d5a38ea6cb692cdeb5565b36b283d1a34d5d27f (patch) | |
tree | a443cd005e62a7563fd9c8c7c9a199668774a769 /src/shader_recompiler/backend/glsl/glsl_emit_context.cpp | |
parent | a45baa0e786148f41394fc819108649d8eb6ba3a (diff) |
shader_compiler: support const buffer indirect addressing in GLSL
Diffstat (limited to 'src/shader_recompiler/backend/glsl/glsl_emit_context.cpp')
-rw-r--r-- | src/shader_recompiler/backend/glsl/glsl_emit_context.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp index e816a93ecb..17266f40d3 100644 --- a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp +++ b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp @@ -359,6 +359,7 @@ EmitContext::EmitContext(IR::Program& program, Bindings& bindings, const Profile header += "layout(location=0) uniform vec4 scaling;"; } DefineConstantBuffers(bindings); + DefineConstantBufferIndirect(); DefineStorageBuffers(bindings); SetupImages(bindings); SetupTextures(bindings); @@ -436,6 +437,24 @@ void EmitContext::DefineConstantBuffers(Bindings& bindings) { } } +void EmitContext::DefineConstantBufferIndirect() { + if (!info.uses_cbuf_indirect) { + return; + } + + header += profile.has_gl_cbuf_ftou_bug ? "uvec4 " : "vec4 "; + header += "GetCbufIndirect(uint binding, uint offset){" + "switch(binding){" + "default:"; + + for (const auto& desc : info.constant_buffer_descriptors) { + header += + fmt::format("case {}:return {}_cbuf{}[offset];", desc.index, stage_name, desc.index); + } + + header += "}}"; +} + void EmitContext::DefineStorageBuffers(Bindings& bindings) { if (info.storage_buffers_descriptors.empty()) { return; |