aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/freedreno
diff options
context:
space:
mode:
authorKristian H. Kristensen <[email protected]>2019-11-21 09:14:40 -0800
committerKristian H. Kristensen <[email protected]>2019-12-19 09:56:05 -0800
commit8089fb2e6249beddb774e3d0354983e7ec9afb78 (patch)
tree1a94393ecaf6170fcbd10bbedd07fd1d1230434f /src/gallium/drivers/freedreno
parent1d7267fc91ae59635faabc99022054bc4b839904 (diff)
freedreno/a6xx: Use blitter for resolve blits
We have a SAMPLES_AVERAGE bit that does what we need for resolving multisample buffers - let's use it. Reviewed-by: Eric Anholt <[email protected]> Signed-off-by: Kristian H. Kristensen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2848>
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r--src/gallium/drivers/freedreno/a6xx/fd6_blitter.c29
1 files changed, 5 insertions, 24 deletions
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
index 8357e71fc76..122a63323b4 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
@@ -129,29 +129,8 @@ can_do_blit(const struct pipe_blit_info *info)
debug_assert(info->dst.box.height >= 0);
debug_assert(info->dst.box.depth >= 0);
- /* We could probably blit between resources with equal sample count.. */
fail_if(info->dst.resource->nr_samples > 1);
- /* CP_BLIT supports resolving, but seems to pick one only of the samples
- * (no blending). This doesn't work for RGBA resolves, so we fall back in
- * that case. However, GL/GLES spec says:
- *
- * "If the source formats are integer types or stencil values, a single
- * sample’s value is selected for each pixel. If the source formats are
- * floating-point or normalized types, the sample values for each pixel
- * are resolved in an implementationdependent manner. If the source
- * formats are depth values, sample values are resolved in an
- * implementation-dependent manner where the result will be between the
- * minimum and maximum depth values in the pixel."
- *
- * so do those with CP_BLIT.
- *
- * TODO since we re-write z/s blits to RGBA, we'll fail this check in some
- * cases where we don't need to.
- */
- fail_if((info->mask & PIPE_MASK_RGBA) &&
- info->src.resource->nr_samples > 1);
-
fail_if(info->window_rectangle_include);
fail_if(util_format_is_srgb(info->src.format));
@@ -525,9 +504,11 @@ emit_blit_or_clear_texture(struct fd_context *ctx, struct fd_ringbuffer *ring,
OUT_RING(ring, A6XX_SP_PS_2D_SRC_INFO_COLOR_FORMAT(sfmt) |
A6XX_SP_PS_2D_SRC_INFO_TILE_MODE(stile) |
A6XX_SP_PS_2D_SRC_INFO_COLOR_SWAP(sswap) |
- A6XX_SP_PS_2D_SRC_INFO_SAMPLES(samples) |
- COND(subwc_enabled, A6XX_SP_PS_2D_SRC_INFO_FLAGS) |
- 0x500000 | filter);
+ A6XX_SP_PS_2D_SRC_INFO_SAMPLES(samples) |
+ COND(samples > MSAA_ONE && (info->mask & PIPE_MASK_RGBA),
+ A6XX_SP_PS_2D_SRC_INFO_SAMPLES_AVERAGE) |
+ COND(subwc_enabled, A6XX_SP_PS_2D_SRC_INFO_FLAGS) |
+ 0x500000 | filter);
OUT_RING(ring, A6XX_SP_PS_2D_SRC_SIZE_WIDTH(width) |
A6XX_SP_PS_2D_SRC_SIZE_HEIGHT(height)); /* SP_PS_2D_SRC_SIZE */
OUT_RELOC(ring, src->bo, soff, 0, 0); /* SP_PS_2D_SRC_LO/HI */