gallium: handle copy_image of depth textures

copy_image calls blit now for multisampled images, including
depth. But blit explicitly uses only PIPE_MASK_RGBA, so it is
incapable of copying depth buffers.

This patch checks the destination format and uses PIPE_MASK_ZS if
it is a depth or stencil. Ideally we would simply use PIPE_MASK_RGBAZS
always, but not all drivers actually handle getting this mask
(they probably should, but that's another story).

The change to copy_image was in 5027b5aa2, so in some sense this
patch "fixes" that. In fact though the issue wasn't in the copy_image
change, it was always latent in blit().

Fixes: 5027b5aa28 ("gallium: stop calling resource_copy_region for multisampled copy_image")
Signed-off-by: Eric R. Smith <eric.smith@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28585>
(cherry picked from commit 0cb852050d)
This commit is contained in:
Eric R. Smith 2024-04-04 17:22:15 -03:00 committed by Eric Engestrom
parent 6dab9b4a6d
commit 3e9ac50d37
2 changed files with 5 additions and 2 deletions

View file

@ -1084,7 +1084,7 @@
"description": "gallium: handle copy_image of depth textures",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "5027b5aa28fb9395b1acff57336d2862753bba17",
"notes": null

View file

@ -282,7 +282,10 @@ blit(struct pipe_context *pipe,
blit.src.box = *src_box;
u_box_3d(dstx, dsty, dstz, src_box->width, src_box->height,
src_box->depth, &blit.dst.box);
blit.mask = PIPE_MASK_RGBA;
if (util_format_is_depth_or_stencil(dst_format))
blit.mask = PIPE_MASK_ZS;
else
blit.mask = PIPE_MASK_RGBA;
blit.filter = PIPE_TEX_FILTER_NEAREST;
pipe->blit(pipe, &blit);