diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 987f9bbb855..363096f1c30 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -701,7 +701,14 @@ create_bvci(struct zink_context *ctx, struct zink_resource *res, enum pipe_forma assert(bvci.format); bvci.offset = offset; bvci.range = !offset && range == res->base.b.width0 ? VK_WHOLE_SIZE : range; - uint32_t clamp = util_format_get_blocksize(format) * screen->info.props.limits.maxTexelBufferElements; + unsigned blocksize = util_format_get_blocksize(format); + if (bvci.range != VK_WHOLE_SIZE) { + /* clamp out partial texels */ + bvci.range -= bvci.range % blocksize; + if (bvci.offset + bvci.range >= res->base.b.width0) + bvci.range = VK_WHOLE_SIZE; + } + uint32_t clamp = blocksize * screen->info.props.limits.maxTexelBufferElements; if (bvci.range == VK_WHOLE_SIZE && res->base.b.width0 > clamp) bvci.range = clamp; bvci.flags = 0;