Mesa (main): freedreno: Fix constant-index assumptions in IBO loads.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 10 18:09:05 UTC 2021


Module: Mesa
Branch: main
Commit: 549924d53e359c04d7c14b12990178c86d3aad2d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=549924d53e359c04d7c14b12990178c86d3aad2d

Author: Emma Anholt <emma at anholt.net>
Date:   Fri Oct 29 13:41:16 2021 -0700

freedreno: Fix constant-index assumptions in IBO loads.

The encoder already sets up our IBO accesses as potentially nonuniform, so
we just need to be careful to not try to force the IBO index into an
immediate.

Fixes assertion failures in piglit arb_shader_image_load_store-invalid
(intermittent due to
https://gitlab.freedesktop.org/mesa/piglit/-/merge_requests/597), which
had some interesting actual failures hidden behind it.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13601>

---

 src/freedreno/ci/freedreno-a630-fails.txt  |  8 --------
 src/freedreno/ci/freedreno-a630-flakes.txt |  4 ----
 src/freedreno/ir3/ir3_compiler_nir.c       | 10 ++++++++++
 src/freedreno/ir3/ir3_image.c              | 23 ++++++++++++++---------
 4 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/freedreno/ci/freedreno-a630-fails.txt b/src/freedreno/ci/freedreno-a630-fails.txt
index 5d2353269e1..2844043fc8b 100644
--- a/src/freedreno/ci/freedreno-a630-fails.txt
+++ b/src/freedreno/ci/freedreno-a630-fails.txt
@@ -77,11 +77,6 @@ shaders at point-vertex-id gl_vertexid divisor,Crash
 shaders at point-vertex-id gl_vertexid gl_instanceid,Crash
 shaders at point-vertex-id gl_vertexid gl_instanceid divisor,Crash
 
-# "nir_src_comp_as_uint: Assertion `nir_src_is_const(src)' failed." looking up image
-spec at arb_arrays_of_arrays@execution at image_store@basic-imagestore-mixed-const-non-const-uniform-index2,Crash
-spec at arb_arrays_of_arrays@execution at image_store@basic-imagestore-mixed-const-non-const-uniform-index,Crash
-spec at arb_arrays_of_arrays@execution at image_store@basic-imagestore-non-const-uniform-index,Crash
-
 spec at arb_compute_shader@execution at border-color,Fail
 spec at arb_depth_buffer_float@fbo-clear-formats stencil,Fail
 spec at arb_depth_buffer_float@fbo-clear-formats stencil at GL_DEPTH32F_STENCIL8,Fail
@@ -145,9 +140,6 @@ spec at arb_sample_shading@samplemask 4,Fail
 spec at arb_sample_shading@samplemask 4 at noms mask_in_one,Fail
 spec at arb_sample_shading@samplemask 4 at sample mask_in_one,Fail
 
-# "nir_src_comp_as_uint: Assertion `nir_src_is_const(src)' failed." looking up image
-spec at arb_shader_image_load_store@indexing,Crash
-
 spec at arb_shader_storage_buffer_object@array-ssbo-auto-binding,Fail
 spec at arb_shader_storage_buffer_object@linker at instance-matching-shader-storage-blocks-member-array-size-mismatch,Fail
 spec at arb_tessellation_shader@execution at gs-primitiveid-instanced,Fail
diff --git a/src/freedreno/ci/freedreno-a630-flakes.txt b/src/freedreno/ci/freedreno-a630-flakes.txt
index 48285f21a15..38f3e913d35 100644
--- a/src/freedreno/ci/freedreno-a630-flakes.txt
+++ b/src/freedreno/ci/freedreno-a630-flakes.txt
@@ -142,10 +142,6 @@ glx at glx-visuals-stencil
 #  [  375.034086] adreno 5000000.gpu: [drm:a6xx_irq] *ERROR* gpu fault ring 0 fence aefe8 status 00E51005 rb 0602/06d2 ib1 000000010023D000/0000 ib2 0000000100246170/0000
 glx at glx-tfp
 
-# async shader compiler asserts in get_image_samp_tex_src()'s nir_src_comp_as_uint().
-# https://gitlab.freedesktop.org/mesa/mesa/-/issues/4474
-spec at arb_shader_image_load_store@invalid
-
 # Flaky since around 2021-03-20.  First appeared on the autotune branch.
 spec at arb_draw_indirect@arb_draw_indirect-transform-feedback
 
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 3a854458669..ff793df4916 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -1301,6 +1301,16 @@ emit_intrinsic_load_image(struct ir3_context *ctx, nir_intrinsic_instr *intr,
       return;
    }
 
+   /* The sparse set of texture descriptors for non-coherent load_images means we can't do indirection, so
+    * fall back to coherent load.
+    */
+   if (ctx->compiler->gen >= 5 &&
+       !ir3_bindless_resource(intr->src[0]) &&
+       !nir_src_is_const(intr->src[0])) {
+      ctx->funcs->emit_intrinsic_load_image(ctx, intr, dst);
+      return;
+   }
+
    struct ir3_block *b = ctx->block;
    struct tex_src_info info = get_image_samp_tex_src(ctx, intr);
    struct ir3_instruction *sam;
diff --git a/src/freedreno/ir3/ir3_image.c b/src/freedreno/ir3/ir3_image.c
index d4e64edc4e1..45a2003125d 100644
--- a/src/freedreno/ir3/ir3_image.c
+++ b/src/freedreno/ir3/ir3_image.c
@@ -41,14 +41,9 @@ ir3_ibo_mapping_init(struct ir3_ibo_mapping *mapping, unsigned num_textures)
 struct ir3_instruction *
 ir3_ssbo_to_ibo(struct ir3_context *ctx, nir_src src)
 {
-   if (ir3_bindless_resource(src)) {
+   if (ir3_bindless_resource(src))
       ctx->so->bindless_ibo = true;
-      return ir3_get_src(ctx, &src)[0];
-   } else {
-      /* can this be non-const buffer_index?  how do we handle that? */
-      int ssbo_idx = nir_src_as_uint(src);
-      return create_immed(ctx->block, ssbo_idx);
-   }
+   return ir3_get_src(ctx, &src)[0];
 }
 
 unsigned
@@ -68,10 +63,20 @@ ir3_image_to_ibo(struct ir3_context *ctx, nir_src src)
    if (ir3_bindless_resource(src)) {
       ctx->so->bindless_ibo = true;
       return ir3_get_src(ctx, &src)[0];
-   } else {
-      /* can this be non-const buffer_index?  how do we handle that? */
+   }
+
+   if (nir_src_is_const(src)) {
       int image_idx = nir_src_as_uint(src);
       return create_immed(ctx->block, ctx->s->info.num_ssbos + image_idx);
+   } else {
+      struct ir3_instruction *image_idx = ir3_get_src(ctx, &src)[0];
+      if (ctx->s->info.num_ssbos) {
+         return ir3_ADD_U(ctx->block,
+            image_idx, 0,
+            create_immed(ctx->block, ctx->s->info.num_ssbos), 0);
+      } else {
+         return image_idx;
+      }
    }
 }
 



More information about the mesa-commit mailing list