[Mesa-dev] [PATCH 6/6] glsl/linker: check for xfb_offset aliasing
Andres Gomez
agomez at igalia.com
Fri Feb 1 18:05:57 UTC 2019
>From page 76 (page 80 of the PDF) of the GLSL 4.60 v.5 spec:
" No aliasing in output buffers is allowed: It is a compile-time or
link-time error to specify variables with overlapping transform
feedback offsets."
Currently, this is expected to fail, but it succeeds:
"
...
layout (xfb_offset = 0) out vec2 a;
layout (xfb_offset = 0) out vec4 b;
...
"
Cc: Timothy Arceri <tarceri at itsqueeze.com>
Signed-off-by: Andres Gomez <agomez at igalia.com>
---
src/compiler/glsl/link_varyings.cpp | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
index ab66ceb0d00..28e47f15733 100644
--- a/src/compiler/glsl/link_varyings.cpp
+++ b/src/compiler/glsl/link_varyings.cpp
@@ -1173,6 +1173,29 @@ tfeedback_decl::store(struct gl_context *ctx, struct gl_shader_program *prog,
unsigned location = this->location;
unsigned location_frac = this->location_frac;
unsigned num_components = this->num_components();
+
+ /* From the OpenGL 4.60.5 spec, section 4.4.2. Output Layout Qualifiers,
+ * Page 76, (Transform Feedback Layout Qualifiers):
+ *
+ * "No aliasing in output buffers is allowed: It is a compile-time or
+ * link-time error to specify variables with overlapping transform
+ * feedback offsets."
+ */
+ for (unsigned i = 0; i < info->NumOutputs; i++) {
+ const struct gl_transform_feedback_output &output = info->Outputs[i];
+
+ if (output.OutputBuffer != buffer)
+ continue;
+
+ if ((output.DstOffset < xfb_offset + num_components) &&
+ (output.DstOffset + output.NumComponents > xfb_offset)) {
+ linker_error(prog,
+ "variable '%s', xfb_offset (%d) is causing aliasing.",
+ this->orig_name, xfb_offset * 4);
+ return false;
+ }
+ }
+
while (num_components > 0) {
unsigned output_size = MIN2(num_components, 4 - location_frac);
assert((info->NumOutputs == 0 && max_outputs == 0) ||
--
2.20.1
More information about the mesa-dev
mailing list