Mesa (main): shader_info: Make images_used a bitset

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 10 17:15:09 UTC 2022


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

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Fri Apr 15 15:32:29 2022 -0500

shader_info: Make images_used a bitset

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15988>

---

 src/compiler/glsl/gl_nir_lower_samplers_as_deref.c   | 16 ++++++++++------
 src/compiler/shader_info.h                           |  6 +++---
 src/gallium/drivers/iris/iris_resolve.c              |  2 +-
 src/gallium/drivers/radeonsi/si_compute.c            |  8 +++++---
 src/gallium/drivers/radeonsi/si_descriptors.c        |  2 +-
 src/gallium/drivers/radeonsi/si_shader.c             |  2 +-
 src/gallium/drivers/radeonsi/si_state_shaders.cpp    |  2 +-
 src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c |  2 +-
 src/gallium/drivers/zink/zink_compiler.c             |  5 ++---
 src/gallium/drivers/zink/zink_program.c              |  2 +-
 src/gallium/frontends/lavapipe/lvp_pipeline.c        |  2 +-
 src/mesa/state_tracker/st_glsl_to_nir.cpp            |  6 +++---
 src/panfrost/bifrost/bifrost_compile.c               |  2 +-
 src/panfrost/lib/pan_shader.c                        |  2 +-
 14 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
index 0293fdcbce2..887b9b5ccc6 100644
--- a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
+++ b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
@@ -128,16 +128,20 @@ record_images_used(struct shader_info *info,
    /* Structs have been lowered already, so get_aoa_size is sufficient. */
    const unsigned size =
       glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1;
-   unsigned mask = ((1ull << MAX2(size, 1)) - 1) << var->data.binding;
 
-   info->images_used |= mask;
+   BITSET_SET_RANGE(info->images_used, var->data.binding,
+                    var->data.binding + (MAX2(size, 1) - 1));
 
    enum glsl_sampler_dim sampler_dim =
       glsl_get_sampler_dim(glsl_without_array(var->type));
-   if (sampler_dim == GLSL_SAMPLER_DIM_BUF)
-      info->image_buffers |= mask;
-   if (sampler_dim == GLSL_SAMPLER_DIM_MS)
-      info->msaa_images |= mask;
+   if (sampler_dim == GLSL_SAMPLER_DIM_BUF) {
+      BITSET_SET_RANGE(info->image_buffers, var->data.binding,
+                       var->data.binding + (MAX2(size, 1) - 1));
+   }
+   if (sampler_dim == GLSL_SAMPLER_DIM_MS) {
+      BITSET_SET_RANGE(info->msaa_images, var->data.binding,
+                       var->data.binding + (MAX2(size, 1) - 1));
+   }
 }
 
 
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index e759d542262..aa525761860 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -203,11 +203,11 @@ typedef struct shader_info {
    BITSET_DECLARE(textures_used_by_txf, 32);
 
    /** Bitfield of which images are used */
-   uint32_t images_used;
+   BITSET_DECLARE(images_used, 32);
    /** Bitfield of which images are buffers. */
-   uint32_t image_buffers;
+   BITSET_DECLARE(image_buffers, 32);
    /** Bitfield of which images are MSAA. */
-   uint32_t msaa_images;
+   BITSET_DECLARE(msaa_images, 32);
 
    /* SPV_KHR_float_controls: execution mode for floating point ops */
    uint16_t float_controls_execution_mode;
diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c
index 0dba6c16ea0..1b485f53556 100644
--- a/src/gallium/drivers/iris/iris_resolve.c
+++ b/src/gallium/drivers/iris/iris_resolve.c
@@ -121,7 +121,7 @@ resolve_image_views(struct iris_context *ice,
                     bool *draw_aux_buffer_disabled,
                     bool consider_framebuffer)
 {
-   uint32_t views = info ? (shs->bound_image_views & info->images_used) : 0;
+   uint32_t views = info ? (shs->bound_image_views & info->images_used[0]) : 0;
 
    while (views) {
       const int i = u_bit_scan(&views);
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index ad89371f1bb..c19e0d4746d 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -152,12 +152,14 @@ static void si_create_compute_state_async(void *job, void *gdata, int thread_ind
    /* Images in user SGPRs. */
    unsigned non_fmask_images = u_bit_consecutive(0, sel->info.base.num_images);
 
-   /* Remove images with FMASK from the bitmask. */
+   /* Remove images with FMASK from the bitmask.  We only care about the first
+    * 3 anyway, so we can take msaa_images[0] and ignore the rest.
+    */
    if (sscreen->info.chip_class < GFX11)
-      non_fmask_images &= ~sel->info.base.msaa_images;
+      non_fmask_images &= ~sel->info.base.msaa_images[0];
 
    for (unsigned i = 0; i < 3 && non_fmask_images & (1 << i); i++) {
-      unsigned num_sgprs = sel->info.base.image_buffers & (1 << i) ? 4 : 8;
+      unsigned num_sgprs = BITSET_TEST(sel->info.base.image_buffers, i) ? 4 : 8;
 
       if (align(user_sgprs, num_sgprs) + num_sgprs > 16)
          break;
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 20a6d145254..1985fa37743 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -2291,7 +2291,7 @@ void si_emit_compute_shader_pointers(struct si_context *sctx)
          unsigned num_sgprs = 8;
 
          /* Image buffers are in desc[4..7]. */
-         if (shader->info.base.image_buffers & (1 << i)) {
+         if (BITSET_TEST(shader->info.base.image_buffers, i)) {
             desc_offset += 4;
             num_sgprs = 4;
          }
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index d3cb9ec868e..a96042737d2 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -758,7 +758,7 @@ void si_init_shader_args(struct si_shader_context *ctx, bool ngg_cull_shader)
       }
       /* Images in user SGPRs. */
       for (unsigned i = 0; i < shader->selector->cs_num_images_in_user_sgprs; i++) {
-         unsigned num_sgprs = shader->selector->info.base.image_buffers & (1 << i) ? 4 : 8;
+         unsigned num_sgprs = BITSET_TEST(shader->selector->info.base.image_buffers, i) ? 4 : 8;
 
          while (ctx->args.num_sgprs_used % num_sgprs != 0)
             ac_add_arg(&ctx->args, AC_ARG_SGPR, 1, AC_ARG_INT, NULL);
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp
index 0c2a0fcb923..785373d310c 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp
@@ -3065,7 +3065,7 @@ void si_get_active_slot_masks(struct si_screen *sscreen, const struct si_shader_
    num_constbufs = info->base.num_ubos;
    /* two 8-byte images share one 16-byte slot */
    num_images = align(info->base.num_images, 2);
-   num_msaa_images = align(util_last_bit(info->base.msaa_images), 2);
+   num_msaa_images = align(BITSET_LAST_BIT(info->base.msaa_images), 2);
    num_samplers = BITSET_LAST_BIT(info->base.textures_used);
 
    /* The layout is: sb[last] ... sb[0], cb[0] ... cb[last] */
diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 3dd102ffbf4..85d6dbfd42a 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -3924,7 +3924,7 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_
       goto fail;
 
    spirv_builder_emit_cap(&ctx.builder, SpvCapabilityShader);
-   if (s->info.image_buffers != 0)
+   if (BITSET_COUNT(s->info.image_buffers) != 0)
       spirv_builder_emit_cap(&ctx.builder, SpvCapabilityImageBuffer);
    spirv_builder_emit_cap(&ctx.builder, SpvCapabilitySampledBuffer);
 
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index c11191a8a1a..599566ca35e 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -2020,9 +2020,8 @@ scan_nir(struct zink_screen *screen, nir_shader *shader, struct zink_shader *zs)
                 /* Structs have been lowered already, so get_aoa_size is sufficient. */
                 const unsigned size =
                    glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1;
-                unsigned mask = ((1ull << MAX2(size, 1)) - 1) << var->data.binding;
-
-                shader->info.images_used |= mask;
+                BITSET_SET_RANGE(shader->info.images_used, var->data.binding,
+                                 var->data.binding + (MAX2(size, 1) - 1));
             }
             if (intr->intrinsic == nir_intrinsic_is_sparse_texels_resident ||
                 intr->intrinsic == nir_intrinsic_image_deref_sparse_load)
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index 7dee9573389..38e1f5c775f 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -597,7 +597,7 @@ zink_program_get_descriptor_usage(struct zink_context *ctx, enum pipe_shader_typ
    case ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW:
       return BITSET_TEST_RANGE(zs->nir->info.textures_used, 0, PIPE_MAX_SAMPLERS - 1);
    case ZINK_DESCRIPTOR_TYPE_IMAGE:
-      return zs->nir->info.images_used;
+      return BITSET_TEST_RANGE(zs->nir->info.images_used, 0, PIPE_MAX_SAMPLERS - 1);
    default:
       unreachable("unknown descriptor type!");
    }
diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c
index eec27ce96ef..84267988e44 100644
--- a/src/gallium/frontends/lavapipe/lvp_pipeline.c
+++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c
@@ -589,7 +589,7 @@ set_image_access(struct lvp_pipeline *pipeline, nir_shader *nir,
    const unsigned size = glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : 1;
    unsigned mask = ((1ull << MAX2(size, 1)) - 1) << var->data.binding;
 
-   nir->info.images_used |= mask;
+   nir->info.images_used[0] |= mask;
    if (reads)
       pipeline->access[nir->info.stage].images_read |= mask;
    if (writes)
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index a701894985a..bc4d5dcf68c 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -990,9 +990,9 @@ st_nir_lower_samplers(struct pipe_screen *screen, nir_shader *nir,
    if (prog) {
       BITSET_COPY(prog->info.textures_used, nir->info.textures_used);
       BITSET_COPY(prog->info.textures_used_by_txf, nir->info.textures_used_by_txf);
-      prog->info.images_used = nir->info.images_used;
-      prog->info.image_buffers = nir->info.image_buffers;
-      prog->info.msaa_images = nir->info.msaa_images;
+      BITSET_COPY(prog->info.images_used, nir->info.images_used);
+      BITSET_COPY(prog->info.image_buffers, nir->info.image_buffers);
+      BITSET_COPY(prog->info.msaa_images, nir->info.msaa_images);
    }
 }
 
diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c
index d0d9d1dfc6f..a2d543bd45a 100644
--- a/src/panfrost/bifrost/bifrost_compile.c
+++ b/src/panfrost/bifrost/bifrost_compile.c
@@ -4202,7 +4202,7 @@ bi_optimize_nir(nir_shader *nir, unsigned gpu_id, bool is_blend)
                 nir->info.outputs_accessed_indirectly ||
                 nir->info.patch_inputs_read_indirectly ||
                 nir->info.patch_outputs_accessed_indirectly ||
-                nir->info.images_used;
+                nir->info.images_used[0];
 
         if (any_indirects) {
                 nir_convert_to_lcssa(nir, true, true);
diff --git a/src/panfrost/lib/pan_shader.c b/src/panfrost/lib/pan_shader.c
index 59179f4888c..9e6eb5aca94 100644
--- a/src/panfrost/lib/pan_shader.c
+++ b/src/panfrost/lib/pan_shader.c
@@ -317,7 +317,7 @@ GENX(pan_shader_compile)(nir_shader *s,
         else
                 info->ubo_count = s->info.num_ubos;
 
-        info->attribute_count += util_last_bit(s->info.images_used);
+        info->attribute_count += BITSET_LAST_BIT(s->info.images_used);
         info->writes_global = s->info.writes_memory;
 
         info->sampler_count = info->texture_count = BITSET_LAST_BIT(s->info.textures_used);



More information about the mesa-commit mailing list