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 <apuentes@igalia.com> Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com> Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:

committed by
Alejandro Piñeiro

parent
7c0f411c27
commit
de31fb2f4f
@@ -110,6 +110,11 @@ gl_nir_link_assign_xfb_resources(struct gl_context *ctx,
|
|||||||
xfb_info->varying_count);
|
xfb_info->varying_count);
|
||||||
linked_xfb->NumVarying = 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++) {
|
for (unsigned i = 0; i < xfb_info->varying_count; i++) {
|
||||||
nir_xfb_varying_info *xfb_varying = &xfb_info->varyings[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;
|
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 =
|
struct gl_transform_feedback_varying_info *varying =
|
||||||
linked_xfb->Varyings + i;
|
linked_xfb->Varyings + i;
|
||||||
|
|
||||||
/* ARB_gl_spirv: see above. */
|
/* ARB_gl_spirv: see above. */
|
||||||
varying->Name = NULL;
|
varying->Name = NULL;
|
||||||
varying->Type = glsl_get_gl_type(xfb_varying->type);
|
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->Size = glsl_get_length(xfb_varying->type);
|
||||||
varying->Offset = xfb_varying->offset;
|
varying->Offset = xfb_varying->offset;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user