diff options
author | Bas Nieuwenhuizen <[email protected]> | 2020-02-18 15:22:39 +0100 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-02-19 22:51:12 +0000 |
commit | 68d1757420be28e99e4e919ed2e0c6062e2460c5 (patch) | |
tree | 0b8b3446db45ae5e5860628fa1d5318ae2de2692 /src | |
parent | d795eb207ff90e4885a278910fdc87e932242da6 (diff) |
radeonsi: Fix compute copies for subsampled formats.
We cannot do image stores (or render) to subsampled formats.
Reinterpret as R32_UINT instead.
si_set_shader_image_desc already uses the blockwidth from
the view formats, so the image width adjustments are
already implemented.
This is still icky with mipmapping on GFX9+ though, but
since it is mostly a video format I don't think that will
be much of an issue and broken mipmapping is still better
than broken everything.
Fixes: e5167a9276d "radeonsi: disable SDMA on gfx8 to fix corruption on RX 580"
Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2535
Reviewed-by: Marek Olšák <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3853>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3853>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_compute_blit.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index 3e544d68500..73020f9d3b4 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -392,8 +392,23 @@ void si_compute_copy_image(struct si_context *sctx, unsigned width = src_box->width; unsigned height = src_box->height; unsigned depth = src_box->depth; + enum pipe_format src_format = util_format_linear(src->format); + enum pipe_format dst_format = util_format_linear(dst->format); - unsigned data[] = {src_box->x, src_box->y, src_box->z, 0, dstx, dsty, dstz, 0}; + assert(util_format_is_subsampled_422(src_format) == + util_format_is_subsampled_422(dst_format)); + + if (util_format_is_subsampled_422(src_format)) + src_format = dst_format = PIPE_FORMAT_R32_UINT; + + unsigned x_div = util_format_get_blockwidth(src->format) / + util_format_get_blockwidth(src_format); + assert(src_box->x % x_div == 0); + assert(width % x_div == 0); + + unsigned data[] = {src_box->x / x_div, src_box->y, src_box->z, 0, + dstx / x_div, dsty, dstz, 0}; + width /= x_div; if (width == 0 || height == 0) return; @@ -430,7 +445,7 @@ void si_compute_copy_image(struct si_context *sctx, struct pipe_image_view image[2] = {0}; image[0].resource = src; image[0].shader_access = image[0].access = PIPE_IMAGE_ACCESS_READ; - image[0].format = util_format_linear(src->format); + image[0].format = src_format; image[0].u.tex.level = src_level; image[0].u.tex.first_layer = 0; image[0].u.tex.last_layer = @@ -438,7 +453,7 @@ void si_compute_copy_image(struct si_context *sctx, : (unsigned)(src->array_size - 1); image[1].resource = dst; image[1].shader_access = image[1].access = PIPE_IMAGE_ACCESS_WRITE; - image[1].format = util_format_linear(dst->format); + image[1].format = dst_format; image[1].u.tex.level = dst_level; image[1].u.tex.first_layer = 0; image[1].u.tex.last_layer = |