summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorAntia Puentes <[email protected]>2018-12-22 18:40:29 +0100
committerAlejandro Piñeiro <[email protected]>2019-03-08 15:00:50 +0100
commitde31fb2f4f75b253e7d9e4617da6c1d04ae18df9 (patch)
tree7f79f141e685fbef55e38d12b8f5fd5d8fca9158 /src/compiler
parent7c0f411c27d57861be07add717b8e9bda86569e4 (diff)
nir/linker: Fix TRANSFORM_FEEDBACK_BUFFER_INDEX
From the ARB_enhanced_layouts specification: "For the property TRANSFORM_FEEDBACK_BUFFER_INDEX, a single integer identifying the index of the active transform feedback buffer associated with an active variable is written to <params>. For variables corresponding to the special names "gl_NextBuffer", "gl_SkipComponents1", "gl_SkipComponents2", "gl_SkipComponents3", and "gl_SkipComponents4", -1 is written to <params>." We were storing the xfb_buffer value, instead of the value corresponding to GL_TRANSFORM_FEEDBACK_BUFFER_INDEX. Note that the implementation assumes that varyings would be sorted by offset and buffer. Signed-off-by: Antia Puentes <[email protected]> Signed-off-by: Alejandro Piñeiro <[email protected]> Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/gl_nir_link_xfb.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/compiler/glsl/gl_nir_link_xfb.c b/src/compiler/glsl/gl_nir_link_xfb.c
index bd40ce0efdd..587d65bfb37 100644
--- a/src/compiler/glsl/gl_nir_link_xfb.c
+++ b/src/compiler/glsl/gl_nir_link_xfb.c
@@ -110,6 +110,11 @@ gl_nir_link_assign_xfb_resources(struct gl_context *ctx,
xfb_info->varying_count);
linked_xfb->NumVarying = xfb_info->varying_count;
+ int buffer_index = 0; /* Corresponds to GL_TRANSFORM_FEEDBACK_BUFFER_INDEX */
+ int xfb_buffer =
+ (xfb_info->varying_count > 0) ?
+ xfb_info->outputs[0].buffer : 0;
+
for (unsigned i = 0; i < xfb_info->varying_count; i++) {
nir_xfb_varying_info *xfb_varying = &xfb_info->varyings[i];
@@ -139,13 +144,18 @@ gl_nir_link_assign_xfb_resources(struct gl_context *ctx,
*/
prog->TransformFeedback.VaryingNames[i] = NULL;
+ if (xfb_buffer != xfb_varying->buffer) {
+ buffer_index++;
+ xfb_buffer = xfb_varying->buffer;
+ }
+
struct gl_transform_feedback_varying_info *varying =
linked_xfb->Varyings + i;
/* ARB_gl_spirv: see above. */
varying->Name = NULL;
varying->Type = glsl_get_gl_type(xfb_varying->type);
- varying->BufferIndex = xfb_varying->buffer;
+ varying->BufferIndex = buffer_index;
varying->Size = glsl_get_length(xfb_varying->type);
varying->Offset = xfb_varying->offset;
}