tgsi: Emit ureg HW_ATOMIC decls in range order.
authorEmma Anholt <emma@anholt.net>
Wed, 29 Dec 2021 22:55:24 +0000 (14:55 -0800)
committerMarge Bot <emma+marge@anholt.net>
Tue, 19 Apr 2022 20:05:41 +0000 (20:05 +0000)
It turns out r600 has a dependency on it.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16043>

src/gallium/auxiliary/tgsi/tgsi_ureg.c

index 207fcc4..76c1bd9 100644 (file)
@@ -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,