From 30daa7d6d8b6f47f5d1bb9e73c157ef8e314f33e Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 29 Dec 2021 14:55:24 -0800 Subject: [PATCH] tgsi: Emit ureg HW_ATOMIC decls in range order. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It turns out r600 has a dependency on it. Reviewed-by: Marek Olšák Part-of: --- src/gallium/auxiliary/tgsi/tgsi_ureg.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 207fcc45bc6..76c1bd9f47f 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -98,7 +98,7 @@ struct const_decl { }; struct hw_atomic_decl { - struct { + struct hw_atomic_decl_range { unsigned first; unsigned last; unsigned array_id; @@ -1831,6 +1831,14 @@ output_sort(const void *in_a, const void *in_b) return a->first - b->first; } +static int +atomic_decl_range_sort(const void *in_a, const void *in_b) +{ + const struct hw_atomic_decl_range *a = in_a, *b = in_b; + + return a->first - b->first; +} + static void emit_decls( struct ureg_program *ureg ) { unsigned i,j; @@ -2014,6 +2022,11 @@ static void emit_decls( struct ureg_program *ureg ) if (decl->nr_hw_atomic_ranges) { uint j; + /* GLSL-to-TGSI generated HW atomic counters in order, and r600 depends + * on it. + */ + qsort(decl->hw_atomic_range, decl->nr_hw_atomic_ranges, sizeof(struct hw_atomic_decl_range), atomic_decl_range_sort); + for (j = 0; j < decl->nr_hw_atomic_ranges; j++) { emit_decl_atomic_2d(ureg, decl->hw_atomic_range[j].first,