From: Nicolai Hähnle <nicolai.haeh...@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 <bri...@vmware.com> (v1) Reviewed-by: Roland Scheidegger <srol...@vmware.com> (v1) Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> (v1) Reviewed-by: Marek Olšák <marek.ol...@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); + /* 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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev