summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/glsl/glsl_emit_context.cpp7
-rw-r--r--src/shader_recompiler/backend/spirv/spirv_emit_context.cpp7
2 files changed, 8 insertions, 6 deletions
diff --git a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp
index bb7f1a0fd..e816a93ec 100644
--- a/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp
+++ b/src/shader_recompiler/backend/glsl/glsl_emit_context.cpp
@@ -458,9 +458,10 @@ void EmitContext::DefineGenericOutput(size_t index, u32 invocations) {
458 std::string definition{fmt::format("layout(location={}", index)}; 458 std::string definition{fmt::format("layout(location={}", index)};
459 const u32 remainder{4 - element}; 459 const u32 remainder{4 - element};
460 const TransformFeedbackVarying* xfb_varying{}; 460 const TransformFeedbackVarying* xfb_varying{};
461 if (!runtime_info.xfb_varyings.empty()) { 461 const size_t xfb_varying_index{base_index + element};
462 xfb_varying = &runtime_info.xfb_varyings[base_index + element]; 462 if (xfb_varying_index < runtime_info.xfb_varyings.size()) {
463 xfb_varying = xfb_varying && xfb_varying->components > 0 ? xfb_varying : nullptr; 463 xfb_varying = &runtime_info.xfb_varyings[xfb_varying_index];
464 xfb_varying = xfb_varying->components > 0 ? xfb_varying : nullptr;
464 } 465 }
465 const u32 num_components{xfb_varying ? xfb_varying->components : remainder}; 466 const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
466 if (element > 0) { 467 if (element > 0) {
diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
index d3ba66569..cd90c084a 100644
--- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
+++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp
@@ -164,9 +164,10 @@ void DefineGenericOutput(EmitContext& ctx, size_t index, std::optional<u32> invo
164 while (element < 4) { 164 while (element < 4) {
165 const u32 remainder{4 - element}; 165 const u32 remainder{4 - element};
166 const TransformFeedbackVarying* xfb_varying{}; 166 const TransformFeedbackVarying* xfb_varying{};
167 if (!ctx.runtime_info.xfb_varyings.empty()) { 167 const size_t xfb_varying_index{base_attr_index + element};
168 xfb_varying = &ctx.runtime_info.xfb_varyings[base_attr_index + element]; 168 if (xfb_varying_index < ctx.runtime_info.xfb_varyings.size()) {
169 xfb_varying = xfb_varying && xfb_varying->components > 0 ? xfb_varying : nullptr; 169 xfb_varying = &ctx.runtime_info.xfb_varyings[xfb_varying_index];
170 xfb_varying = xfb_varying->components > 0 ? xfb_varying : nullptr;
170 } 171 }
171 const u32 num_components{xfb_varying ? xfb_varying->components : remainder}; 172 const u32 num_components{xfb_varying ? xfb_varying->components : remainder};
172 173