nir/linker: Fix TRANSFORM_FEEDBACK_BUFFER_INDEX
authorAntia Puentes <apuentes@igalia.com>
Sat, 22 Dec 2018 17:40:29 +0000 (18:40 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Fri, 8 Mar 2019 14:00:50 +0000 (15:00 +0100)
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 <apuentes@igalia.com>
Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/glsl/gl_nir_link_xfb.c

index bd40ce0efddf204d4cd61b44b766a47d87a9716e..587d65bfb3750616462f0b8adecd2154f99ec42d 100644 (file)
@@ -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;
    }