[Mesa-dev] [PATCH v2 1/8] util/pstipple: stronger guard against no free samplers (v2)

Ilia Mirkin imirkin at alum.mit.edu
Thu Apr 7 17:50:33 UTC 2016


On Thu, Apr 7, 2016 at 1:35 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> When hasFixedUnit is false, polygon stippling will fail when there is no free
> sampler available. Make the corresponding guard more robust in preparation
> of raising PIPE_MAX_SAMPLERS to 32.
>
> The literal 1 is a (signed) int, and shifting into the sign bit is undefined
> in C, so change occurences of 1 to 1u.
>
> v2: add an assert for bitfield size and use 1u << idx
>
> Reviewed-by: Brian Paul <brianp at vmware.com> (v1)
> Reviewed-by: Roland Scheidegger <sroland at vmware.com> (v1)
> Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl> (v1)
> Reviewed-by: Marek Olšák <marek.olsak at amd.com> (v1)
> ---
>  src/gallium/auxiliary/util/u_pstipple.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_pstipple.c b/src/gallium/auxiliary/util/u_pstipple.c
> index bcbe2a2..eb725d8 100644
> --- a/src/gallium/auxiliary/util/u_pstipple.c
> +++ b/src/gallium/auxiliary/util/u_pstipple.c
> @@ -204,7 +204,7 @@ pstip_transform_decl(struct tgsi_transform_context *ctx,
>     if (decl->Declaration.File == TGSI_FILE_SAMPLER) {
>        uint i;
>        for (i = decl->Range.First; i <= decl->Range.Last; i++) {
> -         pctx->samplersUsed |= 1 << i;
> +         pctx->samplersUsed |= 1u << i;
>        }
>     }
>     else if (decl->Declaration.File == pctx->wincoordFile) {
> @@ -266,9 +266,11 @@ pstip_transform_prolog(struct tgsi_transform_context *ctx)
>     int texTemp;
>     int sampIdx;
>
> +   assert(sizeof(pctx->samplersUsed) * 8 >= PIPE_MAX_SAMPLERS);

My personal preference would be for these to be STATIC_ASSERT() so
that we get compiler failures (and in your other patches too). This is
optional, however, and definitely no need to resend if you choose to
make the change.

  -ilia

> +
>     /* find free texture sampler */
>     pctx->freeSampler = free_bit(pctx->samplersUsed);
> -   if (pctx->freeSampler >= PIPE_MAX_SAMPLERS)
> +   if (pctx->freeSampler < 0 || pctx->freeSampler >= PIPE_MAX_SAMPLERS)
>        pctx->freeSampler = PIPE_MAX_SAMPLERS - 1;
>
>     if (pctx->wincoordInput < 0)
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list