nir: Gather samplers_used separately from textures

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15988>
This commit is contained in:
Jason Ekstrand
2022-04-15 16:16:03 -05:00
parent 3c07c3e16d
commit b37831c606
3 changed files with 20 additions and 0 deletions

View File

@@ -255,6 +255,21 @@ record_textures_used(struct shader_info *info,
}
}
static void
record_samplers_used(struct shader_info *info,
nir_deref_instr *deref,
nir_texop op)
{
nir_variable *var = nir_deref_instr_get_variable(deref);
/* 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;
BITSET_SET_RANGE(info->samplers_used, var->data.binding,
var->data.binding + (MAX2(size, 1) - 1));
}
static bool
lower_sampler(nir_tex_instr *instr, struct lower_samplers_as_deref_state *state,
nir_builder *b)
@@ -287,6 +302,7 @@ lower_sampler(nir_tex_instr *instr, struct lower_samplers_as_deref_state *state,
if (sampler_deref) {
nir_instr_rewrite_src(&instr->instr, &instr->src[sampler_idx].src,
nir_src_for_ssa(&sampler_deref->dest.ssa));
record_samplers_used(&b->shader->info, sampler_deref, instr->op);
}
}

View File

@@ -202,6 +202,9 @@ typedef struct shader_info {
/** Bitfield of which textures are used by texelFetch() */
BITSET_DECLARE(textures_used_by_txf, 32);
/** Bitfield of which samplers are used */
BITSET_DECLARE(samplers_used, 32);
/** Bitfield of which images are used */
BITSET_DECLARE(images_used, 32);
/** Bitfield of which images are buffers. */

View File

@@ -990,6 +990,7 @@ 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);
BITSET_COPY(prog->info.samplers_used, nir->info.samplers_used);
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);