summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_gather_xfb_info.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/compiler/nir/nir_gather_xfb_info.c b/src/compiler/nir/nir_gather_xfb_info.c
index 12c5d4507e3..40cd6f93a9a 100644
--- a/src/compiler/nir/nir_gather_xfb_info.c
+++ b/src/compiler/nir/nir_gather_xfb_info.c
@@ -123,9 +123,21 @@ add_var_xfb_outputs(nir_xfb_info *xfb,
}
static int
+compare_xfb_varying_offsets(const void *_a, const void *_b)
+{
+ const nir_xfb_varying_info *a = _a, *b = _b;
+
+ if (a->buffer != b->buffer)
+ return a->buffer - b->buffer;
+
+ return a->offset - b->offset;
+}
+
+static int
compare_xfb_output_offsets(const void *_a, const void *_b)
{
const nir_xfb_output_info *a = _a, *b = _b;
+
return a->offset - b->offset;
}
@@ -199,12 +211,15 @@ nir_gather_xfb_info(const nir_shader *shader, void *mem_ctx)
}
}
- /* Everything is easier in the state setup code if the list is sorted in
- * order of output offset.
+ /* Everything is easier in the state setup code if outputs and varyings are
+ * sorted in order of output offset (and buffer for varyings).
*/
qsort(xfb->outputs, xfb->output_count, sizeof(xfb->outputs[0]),
compare_xfb_output_offsets);
+ qsort(xfb->varyings, xfb->varying_count, sizeof(xfb->varyings[0]),
+ compare_xfb_varying_offsets);
+
#ifndef NDEBUG
/* Finally, do a sanity check */
unsigned max_offset[NIR_MAX_XFB_BUFFERS] = {0};