Module: Mesa
Branch: main
Commit: e8b2680045b68334f3c82fada27a4edfe83bad22
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e8b2680045b68334f3c82fada27a4edfe83bad22

Author: Mike Blumenkrantz <[email protected]>
Date:   Thu Oct 26 11:32:11 2023 -0400

zink: clamp resolve extents to src/dst geometry

exceeding src/dst extents is illegal

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25914>

---

 src/gallium/drivers/zink/zink_blit.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_blit.c 
b/src/gallium/drivers/zink/zink_blit.c
index 594dc5dede9..43ab2db5649 100644
--- a/src/gallium/drivers/zink/zink_blit.c
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -122,6 +122,18 @@ blit_resolve(struct zink_context *ctx, const struct 
pipe_blit_info *info, bool *
    region.extent.width = info->dst.box.width;
    region.extent.height = info->dst.box.height;
    region.extent.depth = info->dst.box.depth;
+   if (region.srcOffset.x + region.extent.width >= 
u_minify(src->base.b.width0, region.srcSubresource.mipLevel))
+      region.extent.width = u_minify(src->base.b.width0, 
region.srcSubresource.mipLevel) - region.srcOffset.x;
+   if (region.dstOffset.x + region.extent.width >= 
u_minify(dst->base.b.width0, region.dstSubresource.mipLevel))
+      region.extent.width = u_minify(dst->base.b.width0, 
region.dstSubresource.mipLevel) - region.dstOffset.x;
+   if (region.srcOffset.y + region.extent.height >= 
u_minify(src->base.b.height0, region.srcSubresource.mipLevel))
+      region.extent.height = u_minify(src->base.b.height0, 
region.srcSubresource.mipLevel) - region.srcOffset.y;
+   if (region.dstOffset.y + region.extent.height >= 
u_minify(dst->base.b.height0, region.dstSubresource.mipLevel))
+      region.extent.height = u_minify(dst->base.b.height0, 
region.dstSubresource.mipLevel) - region.dstOffset.y;
+   if (region.srcOffset.z + region.extent.depth >= 
u_minify(src->base.b.depth0, region.srcSubresource.mipLevel))
+      region.extent.depth = u_minify(src->base.b.depth0, 
region.srcSubresource.mipLevel) - region.srcOffset.z;
+   if (region.dstOffset.z + region.extent.depth >= 
u_minify(dst->base.b.depth0, region.dstSubresource.mipLevel))
+      region.extent.depth = u_minify(dst->base.b.depth0, 
region.dstSubresource.mipLevel) - region.dstOffset.z;
    VKCTX(CmdResolveImage)(cmdbuf, use_src->obj->image, src->layout,
                      dst->obj->image, dst->layout,
                      1, &region);

Reply via email to