diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/nir/nir_gather_xfb_info.c | 19 |
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}; |