Mesa (main): freedreno/a6xx: Disable sample averaging on z/s or integer blits.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 19 17:52:04 UTC 2021
Module: Mesa
Branch: main
Commit: 93eb697a8da184feb2b1f15a14235087f60f8ec9
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=93eb697a8da184feb2b1f15a14235087f60f8ec9
Author: Emma Anholt <emma at anholt.net>
Date: Wed Nov 17 15:40:49 2021 -0800
freedreno/a6xx: Disable sample averaging on z/s or integer blits.
We can't generally force fd_blitter_blit() to not average in our fallback
blits, but this should at help some cases.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13867>
---
src/freedreno/ci/freedreno-a630-fails.txt | 4 +++
src/gallium/drivers/freedreno/a6xx/fd6_blitter.c | 40 ++++++++++++++----------
2 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/src/freedreno/ci/freedreno-a630-fails.txt b/src/freedreno/ci/freedreno-a630-fails.txt
index c1be5994d51..d6505d78433 100644
--- a/src/freedreno/ci/freedreno-a630-fails.txt
+++ b/src/freedreno/ci/freedreno-a630-fails.txt
@@ -261,6 +261,9 @@ spec at egl_ext_protected_content@conformance,Fail
spec at egl_khr_surfaceless_context@viewport,Fail
spec at egl_mesa_configless_context@basic,Fail
spec at ext_framebuffer_blit@fbo-blit-check-limits,Fail
+
+# "MESA: warning: sample averaging on fallback z24s8 blit when we shouldn't."
+# on glBlitFramebuffer() from the MSAA FB to non-MSAA.
spec at ext_framebuffer_multisample@accuracy 2 depth_resolve depthstencil,Fail
spec at ext_framebuffer_multisample@accuracy 2 depth_resolve small depthstencil,Fail
spec at ext_framebuffer_multisample@accuracy 2 stencil_resolve depthstencil,Fail
@@ -273,6 +276,7 @@ spec at ext_framebuffer_multisample@accuracy all_samples depth_resolve depthstencil
spec at ext_framebuffer_multisample@accuracy all_samples depth_resolve small depthstencil,Fail
spec at ext_framebuffer_multisample@accuracy all_samples stencil_resolve depthstencil,Fail
spec at ext_framebuffer_multisample@accuracy all_samples stencil_resolve small depthstencil,Fail
+
spec at ext_framebuffer_multisample@alpha-to-coverage-dual-src-blend 2,Fail
spec at ext_framebuffer_multisample@alpha-to-coverage-dual-src-blend 4,Fail
spec at ext_framebuffer_multisample@alpha-to-coverage-no-draw-buffer-zero 2,Fail
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
index d9be8218713..3feb8f729b9 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
@@ -28,6 +28,7 @@
#include "util/format_srgb.h"
#include "util/half_float.h"
#include "util/u_dump.h"
+#include "util/u_log.h"
#include "freedreno_blitter.h"
#include "freedreno_fence.h"
@@ -569,7 +570,7 @@ emit_blit_dst(struct fd_ringbuffer *ring, struct pipe_resource *prsc,
static void
emit_blit_src(struct fd_ringbuffer *ring, const struct pipe_blit_info *info,
- unsigned layer, unsigned nr_samples)
+ unsigned layer, unsigned nr_samples, bool sample_0)
{
struct fd_resource *src = fd_resource(info->src.resource);
enum a6xx_format sfmt = fd6_texture_format(info->src.format, src->layout.tile_mode);
@@ -596,7 +597,7 @@ emit_blit_src(struct fd_ringbuffer *ring, const struct pipe_blit_info *info,
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(samples > MSAA_ONE && (info->mask & PIPE_MASK_RGBA),
+ COND(samples > MSAA_ONE && !sample_0,
A6XX_SP_PS_2D_SRC_INFO_SAMPLES_AVERAGE) |
COND(subwc_enabled, A6XX_SP_PS_2D_SRC_INFO_FLAGS) |
COND(util_format_is_srgb(info->src.format),
@@ -625,7 +626,7 @@ emit_blit_src(struct fd_ringbuffer *ring, const struct pipe_blit_info *info,
static void
emit_blit_texture(struct fd_context *ctx, struct fd_ringbuffer *ring,
- const struct pipe_blit_info *info)
+ const struct pipe_blit_info *info, bool sample_0)
{
const struct pipe_box *sbox = &info->src.box;
const struct pipe_box *dbox = &info->dst.box;
@@ -674,7 +675,7 @@ emit_blit_texture(struct fd_context *ctx, struct fd_ringbuffer *ring,
for (unsigned i = 0; i < info->dst.box.depth; i++) {
- emit_blit_src(ring, info, sbox->z + i, nr_samples);
+ emit_blit_src(ring, info, sbox->z + i, nr_samples, sample_0);
emit_blit_dst(ring, info->dst.resource, info->dst.format, info->dst.level,
dbox->z + i);
@@ -900,7 +901,7 @@ fd6_resolve_tile(struct fd_batch *batch, struct fd_ringbuffer *ring,
static bool
handle_rgba_blit(struct fd_context *ctx,
- const struct pipe_blit_info *info) assert_dt
+ const struct pipe_blit_info *info, bool sample_0) assert_dt
{
struct fd_batch *batch;
@@ -951,7 +952,7 @@ handle_rgba_blit(struct fd_context *ctx,
/* I don't *think* we need to handle blits between buffer <-> !buffer */
debug_assert(info->src.resource->target != PIPE_BUFFER);
debug_assert(info->dst.resource->target != PIPE_BUFFER);
- emit_blit_texture(ctx, batch->draw, info);
+ emit_blit_texture(ctx, batch->draw, info, sample_0);
}
trace_end_blit(&batch->trace, batch->draw);
@@ -983,11 +984,14 @@ handle_rgba_blit(struct fd_context *ctx,
*/
static bool
do_rewritten_blit(struct fd_context *ctx,
- const struct pipe_blit_info *info) assert_dt
+ const struct pipe_blit_info *info, bool sample_0) assert_dt
{
- bool success = handle_rgba_blit(ctx, info);
- if (!success)
+ bool success = handle_rgba_blit(ctx, info, sample_0);
+ if (!success) {
+ if (sample_0 && !util_format_is_pure_integer(info->src.format))
+ mesa_logw("sample averaging on fallback blit when we shouldn't.");
success = fd_blitter_blit(ctx, info);
+ }
debug_assert(success); /* fallback should never fail! */
return success;
}
@@ -1019,14 +1023,14 @@ handle_zs_blit(struct fd_context *ctx,
blit.mask = PIPE_MASK_R;
blit.src.format = PIPE_FORMAT_R8_UINT;
blit.dst.format = PIPE_FORMAT_R8_UINT;
- return do_rewritten_blit(ctx, &blit);
+ return do_rewritten_blit(ctx, &blit, true);
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
if (info->mask & PIPE_MASK_Z) {
blit.mask = PIPE_MASK_R;
blit.src.format = PIPE_FORMAT_R32_FLOAT;
blit.dst.format = PIPE_FORMAT_R32_FLOAT;
- do_rewritten_blit(ctx, &blit);
+ do_rewritten_blit(ctx, &blit, true);
}
if (info->mask & PIPE_MASK_S) {
@@ -1035,7 +1039,7 @@ handle_zs_blit(struct fd_context *ctx,
blit.dst.format = PIPE_FORMAT_R8_UINT;
blit.src.resource = &src->stencil->b.b;
blit.dst.resource = &dst->stencil->b.b;
- do_rewritten_blit(ctx, &blit);
+ do_rewritten_blit(ctx, &blit, true);
}
return true;
@@ -1044,7 +1048,7 @@ handle_zs_blit(struct fd_context *ctx,
blit.mask = PIPE_MASK_R;
blit.src.format = PIPE_FORMAT_R16_UNORM;
blit.dst.format = PIPE_FORMAT_R16_UNORM;
- return do_rewritten_blit(ctx, &blit);
+ return do_rewritten_blit(ctx, &blit, true);
case PIPE_FORMAT_Z32_UNORM:
case PIPE_FORMAT_Z32_FLOAT:
@@ -1052,7 +1056,7 @@ handle_zs_blit(struct fd_context *ctx,
blit.mask = PIPE_MASK_R;
blit.src.format = PIPE_FORMAT_R32_UINT;
blit.dst.format = PIPE_FORMAT_R32_UINT;
- return do_rewritten_blit(ctx, &blit);
+ return do_rewritten_blit(ctx, &blit, true);
case PIPE_FORMAT_Z24X8_UNORM:
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
@@ -1072,6 +1076,8 @@ handle_zs_blit(struct fd_context *ctx,
if (!dst->layout.ubwc)
blit.dst.format = PIPE_FORMAT_RGBA8888_UNORM;
}
+ if (info->src.resource->nr_samples > 1)
+ mesa_logw("sample averaging on fallback z24s8 blit when we shouldn't.");
return fd_blitter_blit(ctx, &blit);
default:
@@ -1124,7 +1130,7 @@ handle_compressed_blit(struct fd_context *ctx,
blit.dst.box.width = DIV_ROUND_UP(blit.dst.box.width, bw);
blit.dst.box.height = DIV_ROUND_UP(blit.dst.box.height, bh);
- return do_rewritten_blit(ctx, &blit);
+ return do_rewritten_blit(ctx, &blit, false);
}
/**
@@ -1146,7 +1152,7 @@ handle_snorm_copy_blit(struct fd_context *ctx,
blit.src.format = blit.dst.format = util_format_snorm_to_unorm(info->src.format);
- return do_rewritten_blit(ctx, &blit);
+ return do_rewritten_blit(ctx, &blit, false);
}
static bool
@@ -1163,7 +1169,7 @@ fd6_blit(struct fd_context *ctx, const struct pipe_blit_info *info) assert_dt
util_format_is_snorm(info->src.format))
return handle_snorm_copy_blit(ctx, info);
- return handle_rgba_blit(ctx, info);
+ return handle_rgba_blit(ctx, info, false);
}
void
More information about the mesa-commit
mailing list