[Mesa-dev] [PATCH] tgsi/scan: use wrap-around shift behavior explicitly for file_mask
Brian Paul
brianp at vmware.com
Fri Mar 2 02:23:35 UTC 2018
On 03/01/2018 07:01 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> The comment said it will only represent the lowest 32 regs. This was
> not entirely true in practice, since at least on x86 you'll get
> masked shifts (unless the compiler could recognize it already and toss
> it out). It turns out this actually works out alright (presumably
> noone uses it for temp regs) when increasing max sampler views, so
> make that behavior explicit.
> Albeit it feels a bit hacky (but in any case, explicit behavior there
> is better than undefined behavior).
> ---
> src/gallium/auxiliary/tgsi/tgsi_scan.c | 7 +++++--
> src/gallium/drivers/llvmpipe/lp_state_fs.c | 7 ++++++-
> src/gallium/drivers/swr/swr_shader.cpp | 2 +-
> 3 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> index c35eff2..0d229c9 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c
> @@ -585,8 +585,11 @@ scan_declaration(struct tgsi_shader_info *info,
> int buffer;
> unsigned index, target, type;
>
> - /* only first 32 regs will appear in this bitfield */
> - info->file_mask[file] |= (1 << reg);
> + /*
> + * only first 32 regs will appear in this bitfield, if larger
> + * bits will wrap around.
> + */
> + info->file_mask[file] |= (1 << (reg & 31));
Or, reg % 32 and let the compiler optimize it.
Either way, Reviewed-by: Brian Paul <brianp at vmware.com>
> info->file_count[file]++;
> info->file_max[file] = MAX2(info->file_max[file], (int)reg);
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> index 603fd84..48c004c 100644
> --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
> +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
> @@ -3323,7 +3323,12 @@ make_variant_key(struct llvmpipe_context *lp,
> if (shader->info.base.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) {
> key->nr_sampler_views = shader->info.base.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
> for(i = 0; i < key->nr_sampler_views; ++i) {
> - if(shader->info.base.file_mask[TGSI_FILE_SAMPLER_VIEW] & (1 << i)) {
> + /*
> + * Note sview may exceed what's representable by file_mask.
> + * This will still work, the only downside is that not actually
> + * used views may be included in the shader key.
> + */
> + if(shader->info.base.file_mask[TGSI_FILE_SAMPLER_VIEW] & (1 << (i & 31))) {
> lp_sampler_static_texture_state(&key->state[i].texture_state,
> lp->sampler_views[PIPE_SHADER_FRAGMENT][i]);
> }
> diff --git a/src/gallium/drivers/swr/swr_shader.cpp b/src/gallium/drivers/swr/swr_shader.cpp
> index e5fb679..fa1c0b8 100644
> --- a/src/gallium/drivers/swr/swr_shader.cpp
> +++ b/src/gallium/drivers/swr/swr_shader.cpp
> @@ -98,7 +98,7 @@ swr_generate_sampler_key(const struct lp_tgsi_info &info,
> key.nr_sampler_views =
> info.base.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
> for (unsigned i = 0; i < key.nr_sampler_views; i++) {
> - if (info.base.file_mask[TGSI_FILE_SAMPLER_VIEW] & (1 << i)) {
> + if (info.base.file_mask[TGSI_FILE_SAMPLER_VIEW] & (1 << (i & 31))) {
> const struct pipe_sampler_view *view =
> ctx->sampler_views[shader_type][i];
> lp_sampler_static_texture_state(
>
More information about the mesa-dev
mailing list