Mesa (master): shader_info: convert textures_used to a bitset.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Mar 9 21:04:32 UTC 2021


Module: Mesa
Branch: master
Commit: 8027a7ba8adbd9fb4fff584d2e4098cf38100650
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8027a7ba8adbd9fb4fff584d2e4098cf38100650

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Mar  8 15:23:31 2021 +1000

shader_info: convert textures_used to a bitset.

For now keep it a bitset of 1 32-bit dword.

Reviewed-by: Eric Anholt <eric at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9456>

---

 src/compiler/glsl/gl_nir_lower_samplers_as_deref.c       |  5 ++---
 src/compiler/shader_info.h                               |  4 ++--
 src/freedreno/ir3/ir3_compiler_nir.c                     |  2 +-
 src/freedreno/vulkan/tu_shader.c                         |  3 +--
 src/gallium/auxiliary/nir/nir_draw_helpers.c             |  2 +-
 src/gallium/auxiliary/nir/nir_to_tgsi.c                  |  2 +-
 src/gallium/auxiliary/nir/nir_to_tgsi_info.c             |  4 ++--
 src/gallium/auxiliary/nir/tgsi_to_nir.c                  |  5 ++---
 src/gallium/drivers/iris/iris_program.c                  |  8 ++++----
 src/gallium/drivers/iris/iris_resolve.c                  |  2 +-
 src/gallium/drivers/iris/iris_state.c                    |  2 +-
 src/gallium/drivers/radeonsi/si_blit.c                   |  2 +-
 src/gallium/drivers/radeonsi/si_compute.c                |  2 +-
 src/gallium/drivers/radeonsi/si_debug.c                  |  2 +-
 src/gallium/drivers/radeonsi/si_descriptors.c            |  4 ++--
 src/gallium/drivers/radeonsi/si_shader_llvm.c            |  2 +-
 src/gallium/drivers/radeonsi/si_state_draw.cpp           |  4 ++--
 src/gallium/drivers/radeonsi/si_state_shaders.c          |  2 +-
 src/gallium/frontends/clover/nir/invocation.cpp          |  4 +++-
 .../frontends/lavapipe/lvp_lower_vulkan_resource.c       |  2 +-
 src/mesa/drivers/common/meta.c                           |  4 ++--
 src/mesa/drivers/dri/i965/brw_draw.c                     | 16 +++++++---------
 src/mesa/drivers/dri/i965/brw_program.c                  |  4 ++--
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c         |  6 +++---
 src/mesa/state_tracker/st_atom_texture.c                 |  2 +-
 src/mesa/state_tracker/st_glsl_to_nir.cpp                |  4 ++--
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp               |  4 ++--
 src/mesa/state_tracker/st_nir_lower_tex_src_plane.c      |  2 +-
 28 files changed, 51 insertions(+), 54 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 384f4a4d284..0174c25642a 100644
--- a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
+++ b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c
@@ -230,14 +230,13 @@ record_textures_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->textures_used |= mask;
+   BITSET_SET_RANGE(info->textures_used, var->data.binding, var->data.binding + (MAX2(size, 1) - 1));
 
    if (op == nir_texop_txf ||
        op == nir_texop_txf_ms ||
        op == nir_texop_txf_ms_mcs)
-      info->textures_used_by_txf |= mask;
+      BITSET_SET_RANGE(info->textures_used_by_txf, var->data.binding, var->data.binding + (MAX2(size, 1) - 1));
 }
 
 static bool
diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h
index 0d7183f96e8..8e92f1972e3 100644
--- a/src/compiler/shader_info.h
+++ b/src/compiler/shader_info.h
@@ -165,10 +165,10 @@ typedef struct shader_info {
    uint64_t patch_outputs_accessed_indirectly;
 
    /** Bitfield of which textures are used */
-   uint32_t textures_used;
+   BITSET_DECLARE(textures_used, 32);
 
    /** Bitfield of which textures are used by texelFetch() */
-   uint32_t textures_used_by_txf;
+   BITSET_DECLARE(textures_used_by_txf, 32);
 
    /** Bitfield of which images are used */
    uint32_t images_used;
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 9718f148c64..5178313d803 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -3405,7 +3405,7 @@ emit_instructions(struct ir3_context *ctx)
 	 * it is write-only we don't have to count it, but after lowering derefs
 	 * is too late to compact indices for that.
 	 */
-	ctx->so->num_samp = util_last_bit(ctx->s->info.textures_used) + ctx->s->info.num_images;
+	ctx->so->num_samp = BITSET_LAST_BIT(ctx->s->info.textures_used) + ctx->s->info.num_images;
 
 	/* Save off clip+cull information. Note that in OpenGL clip planes may
 	 * be individually enabled/disabled, so we can't use the
diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c
index 460c66fbdb3..7a286e9f6d6 100644
--- a/src/freedreno/vulkan/tu_shader.c
+++ b/src/freedreno/vulkan/tu_shader.c
@@ -340,8 +340,7 @@ build_bindless(nir_builder *b, nir_deref_instr *deref, bool is_sampler,
       const struct glsl_type *glsl_type = glsl_without_array(var->type);
       uint32_t idx = var->data.index * 2;
 
-      b->shader->info.textures_used |=
-         ((1ull << (bind_layout->array_size * 2)) - 1) << (idx * 2);
+      BITSET_SET_RANGE(b->shader->info.textures_used, idx * 2, ((idx * 2) + (bind_layout->array_size * 2)) - 1);
 
       /* D24S8 workaround: stencil of D24S8 will be sampled as uint */
       if (glsl_get_sampler_result_type(glsl_type) == GLSL_TYPE_UINT)
diff --git a/src/gallium/auxiliary/nir/nir_draw_helpers.c b/src/gallium/auxiliary/nir/nir_draw_helpers.c
index bc1437f0830..b5706631fb4 100644
--- a/src/gallium/auxiliary/nir/nir_draw_helpers.c
+++ b/src/gallium/auxiliary/nir/nir_draw_helpers.c
@@ -134,7 +134,7 @@ nir_lower_pstipple_fs(struct nir_shader *shader,
    tex_var->data.explicit_binding = true;
    tex_var->data.how_declared = nir_var_hidden;
 
-   shader->info.textures_used |= (1 << binding);
+   BITSET_SET(shader->info.textures_used, binding);
    state.stip_tex = tex_var;
 
    nir_foreach_function(function, shader) {
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi.c b/src/gallium/auxiliary/nir/nir_to_tgsi.c
index b8060d60f8a..e6e5c3c67e8 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi.c
@@ -403,7 +403,7 @@ ntt_setup_uniforms(struct ntt_compile *c)
    }
 
    for (int i = 0; i < PIPE_MAX_SAMPLERS; i++) {
-      if (c->s->info.textures_used & (1 << i))
+      if (BITSET_TEST(c->s->info.textures_used, i))
          ureg_DECL_sampler(c->ureg, i);
    }
 }
diff --git a/src/gallium/auxiliary/nir/nir_to_tgsi_info.c b/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
index d54860315ec..ded0ff6af37 100644
--- a/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
+++ b/src/gallium/auxiliary/nir/nir_to_tgsi_info.c
@@ -801,9 +801,9 @@ void nir_tgsi_scan_shader(const struct nir_shader *nir,
    info->samplers_declared = sampler_mask;
 
    info->file_max[TGSI_FILE_SAMPLER] = util_last_bit(info->samplers_declared) - 1;
-   info->file_max[TGSI_FILE_SAMPLER_VIEW] = util_last_bit(nir->info.textures_used) - 1;
+   info->file_max[TGSI_FILE_SAMPLER_VIEW] = BITSET_LAST_BIT(nir->info.textures_used) - 1;
    info->file_mask[TGSI_FILE_SAMPLER] = info->samplers_declared;
-   info->file_mask[TGSI_FILE_SAMPLER_VIEW] = nir->info.textures_used;
+   info->file_mask[TGSI_FILE_SAMPLER_VIEW] = nir->info.textures_used[0];
    info->file_max[TGSI_FILE_IMAGE] = util_last_bit(info->images_declared) - 1;
    info->file_mask[TGSI_FILE_IMAGE] = info->images_declared;
 
diff --git a/src/gallium/auxiliary/nir/tgsi_to_nir.c b/src/gallium/auxiliary/nir/tgsi_to_nir.c
index 74a94545c2a..a39309a6ac7 100644
--- a/src/gallium/auxiliary/nir/tgsi_to_nir.c
+++ b/src/gallium/auxiliary/nir/tgsi_to_nir.c
@@ -1274,12 +1274,11 @@ get_sampler_var(struct ttn_compile *c, int binding,
       c->num_samplers = MAX2(c->num_samplers, binding + 1);
 
       /* Record textures used */
-      unsigned mask = 1 << binding;
-      c->build.shader->info.textures_used |= mask;
+      BITSET_SET(c->build.shader->info.textures_used, binding);
       if (op == nir_texop_txf ||
           op == nir_texop_txf_ms ||
           op == nir_texop_txf_ms_mcs)
-         c->build.shader->info.textures_used_by_txf |= mask;
+         BITSET_SET(c->build.shader->info.textures_used_by_txf, binding);
    }
 
    return var;
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 10fb67b8d5a..deca44a783a 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -822,8 +822,8 @@ iris_setup_binding_table(const struct gen_device_info *devinfo,
       bt->sizes[IRIS_SURFACE_GROUP_CS_WORK_GROUPS] = 1;
    }
 
-   bt->sizes[IRIS_SURFACE_GROUP_TEXTURE] = util_last_bit(info->textures_used);
-   bt->used_mask[IRIS_SURFACE_GROUP_TEXTURE] = info->textures_used;
+   bt->sizes[IRIS_SURFACE_GROUP_TEXTURE] = BITSET_LAST_BIT(info->textures_used);
+   bt->used_mask[IRIS_SURFACE_GROUP_TEXTURE] = info->textures_used[0];
 
    bt->sizes[IRIS_SURFACE_GROUP_IMAGE] = info->num_images;
 
@@ -2570,8 +2570,8 @@ bind_shader_state(struct iris_context *ice,
    const struct shader_info *old_info = iris_get_shader_info(ice, stage);
    const struct shader_info *new_info = ish ? &ish->nir->info : NULL;
 
-   if ((old_info ? util_last_bit(old_info->textures_used) : 0) !=
-       (new_info ? util_last_bit(new_info->textures_used) : 0)) {
+   if ((old_info ? BITSET_LAST_BIT(old_info->textures_used) : 0) !=
+       (new_info ? BITSET_LAST_BIT(new_info->textures_used) : 0)) {
       ice->state.stage_dirty |= IRIS_STAGE_DIRTY_SAMPLER_STATES_VS << stage;
    }
 
diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c
index 335fda0ac90..1d9f920ba51 100644
--- a/src/gallium/drivers/iris/iris_resolve.c
+++ b/src/gallium/drivers/iris/iris_resolve.c
@@ -89,7 +89,7 @@ resolve_sampler_views(struct iris_context *ice,
                       bool *draw_aux_buffer_disabled,
                       bool consider_framebuffer)
 {
-   uint32_t views = info ? (shs->bound_sampler_views & info->textures_used) : 0;
+   uint32_t views = info ? (shs->bound_sampler_views & info->textures_used[0]) : 0;
 
    while (views) {
       const int i = u_bit_scan(&views);
diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c
index 8a06b50fcf6..376cd5a43a8 100644
--- a/src/gallium/drivers/iris/iris_state.c
+++ b/src/gallium/drivers/iris/iris_state.c
@@ -2100,7 +2100,7 @@ iris_upload_sampler_states(struct iris_context *ice, gl_shader_stage stage)
    /* We assume gallium frontends will call pipe->bind_sampler_states()
     * if the program's number of textures changes.
     */
-   unsigned count = info ? util_last_bit(info->textures_used) : 0;
+   unsigned count = info ? BITSET_LAST_BIT(info->textures_used) : 0;
 
    if (!count)
       return;
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index ab133f6880b..f34ecc1a0bb 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -690,7 +690,7 @@ static void si_check_render_feedback(struct si_context *sctx)
       si_check_render_feedback_images(sctx, &sctx->images[i],
                                       u_bit_consecutive(0, info->base.num_images));
       si_check_render_feedback_textures(sctx, &sctx->samplers[i],
-                                        info->base.textures_used);
+                                        info->base.textures_used[0]);
    }
 
    si_check_render_feedback_resident_images(sctx);
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index 82ee4a09cca..45dc52631ee 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -837,7 +837,7 @@ static bool si_check_needs_implicit_sync(struct si_context *sctx)
     */
    struct si_shader_info *info = &sctx->cs_shader_state.program->sel.info;
    struct si_samplers *samplers = &sctx->samplers[PIPE_SHADER_COMPUTE];
-   unsigned mask = samplers->enabled_mask & info->base.textures_used;
+   unsigned mask = samplers->enabled_mask & info->base.textures_used[0];
 
    while (mask) {
       int i = u_bit_scan(&mask);
diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
index 241ad8977e7..99f30198ab8 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -791,7 +791,7 @@ static void si_dump_descriptors(struct si_context *sctx, gl_shader_stage stage,
    if (info) {
       enabled_constbuf = u_bit_consecutive(0, info->base.num_ubos);
       enabled_shaderbuf = u_bit_consecutive(0, info->base.num_ssbos);
-      enabled_samplers = info->base.textures_used;
+      enabled_samplers = info->base.textures_used[0];
       enabled_images = u_bit_consecutive(0, info->base.num_images);
    } else {
       enabled_constbuf =
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 0c071f2c75d..de14de145ea 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -2663,7 +2663,7 @@ bool si_gfx_resources_check_encrypted(struct si_context *sctx)
          si_buffer_resources_check_encrypted(sctx, &sctx->const_and_shader_buffers[i]);
       use_encrypted_bo |=
          si_sampler_views_check_encrypted(sctx, &sctx->samplers[i],
-                                          current_shader->cso->info.base.textures_used);
+                                          current_shader->cso->info.base.textures_used[0]);
       use_encrypted_bo |= si_image_views_check_encrypted(sctx, &sctx->images[i],
                                           u_bit_consecutive(0, current_shader->cso->info.base.num_images));
    }
@@ -2743,7 +2743,7 @@ bool si_compute_resources_check_encrypted(struct si_context *sctx)
     * or all writable buffers are encrypted.
     */
    return si_buffer_resources_check_encrypted(sctx, &sctx->const_and_shader_buffers[sh]) ||
-          si_sampler_views_check_encrypted(sctx, &sctx->samplers[sh], info->base.textures_used) ||
+          si_sampler_views_check_encrypted(sctx, &sctx->samplers[sh], info->base.textures_used[0]) ||
           si_image_views_check_encrypted(sctx, &sctx->images[sh], u_bit_consecutive(0, info->base.num_images)) ||
           si_buffer_resources_check_encrypted(sctx, &sctx->internal_bindings);
 }
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index c558ca3872d..1592de128fe 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -820,7 +820,7 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
    ctx->num_const_buffers = info->base.num_ubos;
    ctx->num_shader_buffers = info->base.num_ssbos;
 
-   ctx->num_samplers = util_last_bit(info->base.textures_used);
+   ctx->num_samplers = BITSET_LAST_BIT(info->base.textures_used);
    ctx->num_images = info->base.num_images;
 
    si_llvm_init_resource_callbacks(ctx);
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp
index 0f5d62006a9..2bf3aa500eb 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.cpp
+++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp
@@ -1612,8 +1612,8 @@ static bool si_all_vs_resources_read_only(struct si_context *sctx, struct pipe_r
    }
 
    /* Samplers. */
-   if (vs->info.base.textures_used) {
-      unsigned num_samplers = util_last_bit(vs->info.base.textures_used);
+   if (vs->info.base.textures_used[0]) {
+      unsigned num_samplers = BITSET_LAST_BIT(vs->info.base.textures_used);
 
       for (unsigned i = 0; i < num_samplers; i++) {
          struct pipe_sampler_view *view = sctx->samplers[PIPE_SHADER_VERTEX].views[i];
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index c0fe177f08b..b6baf283d14 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2621,7 +2621,7 @@ void si_get_active_slot_masks(const struct si_shader_info *info, uint64_t *const
    /* 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_samplers = util_last_bit(info->base.textures_used);
+   num_samplers = BITSET_LAST_BIT(info->base.textures_used);
 
    /* The layout is: sb[last] ... sb[0], cb[0] ... cb[last] */
    start = si_get_shaderbuf_slot(num_shaderbufs - 1);
diff --git a/src/gallium/frontends/clover/nir/invocation.cpp b/src/gallium/frontends/clover/nir/invocation.cpp
index b7f520b4f90..197eda8b976 100644
--- a/src/gallium/frontends/clover/nir/invocation.cpp
+++ b/src/gallium/frontends/clover/nir/invocation.cpp
@@ -111,7 +111,9 @@ clover_nir_lower_images(nir_shader *shader)
       }
    }
    shader->info.num_textures = num_rd_images;
-   shader->info.textures_used = (1 << num_rd_images) - 1;
+   BITSET_ZERO(shader->info.textures_used);
+   if (num_rd_images)
+      BITSET_SET_RANGE(shader->info.textures_used, 0, num_rd_images - 1);
    shader->info.num_images = num_wr_images;
 
    nir_builder b;
diff --git a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
index 221e84135a3..4cfc68ead99 100644
--- a/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
+++ b/src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c
@@ -154,7 +154,7 @@ static void lower_vri_instr_tex(struct nir_builder *b,
    lower_vri_instr_tex_deref(tex, nir_tex_src_sampler_deref, b->shader->info.stage, layout);
    tex_value = lower_vri_instr_tex_deref(tex, nir_tex_src_texture_deref, b->shader->info.stage, layout);
    if (tex_value >= 0)
-      b->shader->info.textures_used |= (1 << tex_value);
+      BITSET_SET(b->shader->info.textures_used, tex_value);
 }
 
 static nir_ssa_def *lower_vri_instr(struct nir_builder *b,
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 1496b722a86..5ebe7c5fa9b 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -214,9 +214,9 @@ _mesa_meta_compile_and_link_program(struct gl_context *ctx,
     * around this bad interaction.  This is a bit fragile as it may break
     * if you re-run the pass that gathers this info, but we probably won't...
     */
-   fp->info.textures_used_by_txf = 0;
+   BITSET_ZERO(fp->info.textures_used_by_txf);
    if (fp->nir)
-      fp->nir->info.textures_used_by_txf = 0;
+      BITSET_ZERO(fp->nir->info.textures_used_by_txf);
 
    _mesa_meta_use_program(ctx, sh_prog);
 
diff --git a/src/mesa/drivers/dri/i965/brw_draw.c b/src/mesa/drivers/dri/i965/brw_draw.c
index 732b803c686..7de4e0b6ac3 100644
--- a/src/mesa/drivers/dri/i965/brw_draw.c
+++ b/src/mesa/drivers/dri/i965/brw_draw.c
@@ -478,11 +478,9 @@ mark_textures_used_for_txf(BITSET_WORD *used_for_txf,
    if (!prog)
       return;
 
-   uint32_t mask = prog->info.textures_used_by_txf;
-   while (mask) {
-      int s = u_bit_scan(&mask);
+   unsigned s;
+   BITSET_FOREACH_SET(s, prog->info.textures_used_by_txf, 32)
       BITSET_SET(used_for_txf, prog->SamplerUnits[s]);
-   }
 }
 
 /**
@@ -851,15 +849,15 @@ brw_prepare_drawing(struct gl_context *ctx,
     * index.
     */
    brw->wm.base.sampler_count =
-      util_last_bit(ctx->FragmentProgram._Current->info.textures_used);
+      BITSET_LAST_BIT(ctx->FragmentProgram._Current->info.textures_used);
    brw->gs.base.sampler_count = ctx->GeometryProgram._Current ?
-      util_last_bit(ctx->GeometryProgram._Current->info.textures_used) : 0;
+      BITSET_LAST_BIT(ctx->GeometryProgram._Current->info.textures_used) : 0;
    brw->tes.base.sampler_count = ctx->TessEvalProgram._Current ?
-      util_last_bit(ctx->TessEvalProgram._Current->info.textures_used) : 0;
+      BITSET_LAST_BIT(ctx->TessEvalProgram._Current->info.textures_used) : 0;
    brw->tcs.base.sampler_count = ctx->TessCtrlProgram._Current ?
-      util_last_bit(ctx->TessCtrlProgram._Current->info.textures_used) : 0;
+      BITSET_LAST_BIT(ctx->TessCtrlProgram._Current->info.textures_used) : 0;
    brw->vs.base.sampler_count =
-      util_last_bit(ctx->VertexProgram._Current->info.textures_used);
+      BITSET_LAST_BIT(ctx->VertexProgram._Current->info.textures_used);
 
    brw_prepare_render(brw);
 
diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c
index d923d0d6215..6a8cf7aef5e 100644
--- a/src/mesa/drivers/dri/i965/brw_program.c
+++ b/src/mesa/drivers/dri/i965/brw_program.c
@@ -183,8 +183,8 @@ brw_nir_lower_resources(nir_shader *nir, struct gl_shader_program *shader_prog,
 {
    NIR_PASS_V(nir, brw_nir_lower_uniforms, nir->options->lower_to_scalar);
    NIR_PASS_V(prog->nir, gl_nir_lower_samplers, shader_prog);
-   prog->info.textures_used = prog->nir->info.textures_used;
-   prog->info.textures_used_by_txf = prog->nir->info.textures_used_by_txf;
+   BITSET_COPY(prog->info.textures_used, prog->nir->info.textures_used);
+   BITSET_COPY(prog->info.textures_used_by_txf, prog->nir->info.textures_used_by_txf);
 
    NIR_PASS_V(prog->nir, brw_nir_lower_image_load_store, devinfo, NULL);
 
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index 86bc51e7d0b..fd020f22df9 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -1173,13 +1173,13 @@ update_stage_texture_surfaces(struct brw_context *brw,
    else
       surf_offset += stage_state->prog_data->binding_table.plane_start[plane];
 
-   unsigned num_samplers = util_last_bit(prog->info.textures_used);
+   unsigned num_samplers = BITSET_LAST_BIT(prog->info.textures_used);
    for (unsigned s = 0; s < num_samplers; s++) {
       surf_offset[s] = 0;
 
-      if (prog->info.textures_used & (1 << s)) {
+      if (BITSET_TEST(prog->info.textures_used, s)) {
          const unsigned unit = prog->SamplerUnits[s];
-         const bool used_by_txf = prog->info.textures_used_by_txf & (1 << s);
+         const bool used_by_txf = BITSET_TEST(prog->info.textures_used_by_txf, s);
          struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current;
          struct brw_texture_object *iobj = brw_texture_object(obj);
 
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 117c5b5a481..f42cac58856 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -106,7 +106,7 @@ update_textures(struct st_context *st,
    struct pipe_context *pipe = st->pipe;
    const GLuint old_max = st->state.num_sampler_views[shader_stage];
    GLbitfield samplers_used = prog->SamplersUsed;
-   GLbitfield texel_fetch_samplers = prog->info.textures_used_by_txf;
+   GLbitfield texel_fetch_samplers = prog->info.textures_used_by_txf[0];
    GLbitfield free_slots = ~prog->SamplersUsed;
    GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
    GLuint unit;
diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
index 2af4e70d63a..384738cb3bf 100644
--- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
@@ -968,8 +968,8 @@ st_nir_lower_samplers(struct pipe_screen *screen, nir_shader *nir,
       NIR_PASS_V(nir, gl_nir_lower_samplers, shader_program);
 
    if (prog) {
-      prog->info.textures_used = nir->info.textures_used;
-      prog->info.textures_used_by_txf = nir->info.textures_used_by_txf;
+      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;
    }
 }
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index b3fa53cb141..96c1f93c474 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -4868,7 +4868,7 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
 {
    v->samplers_used = 0;
    v->images_used = 0;
-   prog->info.textures_used_by_txf = 0;
+   BITSET_ZERO(prog->info.textures_used_by_txf);
 
    foreach_in_list(glsl_to_tgsi_instruction, inst, &v->instructions) {
       if (inst->info->is_tex) {
@@ -4882,7 +4882,7 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
                st_translate_texture_target(inst->tex_target, inst->tex_shadow);
 
             if (inst->op == TGSI_OPCODE_TXF || inst->op == TGSI_OPCODE_TXF_LZ) {
-               prog->info.textures_used_by_txf |= 1u << idx;
+               BITSET_SET(prog->info.textures_used_by_txf, idx);
             }
          }
       }
diff --git a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
index 2697c1460b2..1701a646cf5 100644
--- a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
+++ b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c
@@ -129,7 +129,7 @@ lower_tex_src_plane_block(nir_builder *b, lower_tex_src_state *state, nir_block
          tex->texture_index = tex->sampler_index =
                state->sampler_map[y_samp][plane[0].i32 - 1];
 
-         state->shader->info.textures_used |= 1u << tex->texture_index;
+         BITSET_SET(state->shader->info.textures_used, tex->texture_index);
 
          /* For drivers using PIPE_CAP_NIR_SAMPLERS_AS_DEREF, we need
           * to reference the correct sampler nir variable.



More information about the mesa-commit mailing list