From 574c5d15406405d65d1a3b640a3514f2935e4df8 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Mon, 4 Oct 2021 16:17:18 -0700 Subject: [PATCH] blorp: Disallow multisampling for BLORP compute blits and copies. We don't support typed image writes for multisampling, so we can't handle multisampled destinations. We also usually handle MSAA by running the fragment shader per-sample, which we aren't accounting for in our compute shaders, so we can't handle MSAA sources either. We could do both of these things if we really wanted to, but we don't. Reviewed-by: Jordan Justen Part-of: --- src/intel/blorp/blorp.h | 4 ++++ src/intel/blorp/blorp_blit.c | 26 +++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/intel/blorp/blorp.h b/src/intel/blorp/blorp.h index 72eb3d90b87..fffbbaa7748 100644 --- a/src/intel/blorp/blorp.h +++ b/src/intel/blorp/blorp.h @@ -186,10 +186,14 @@ blorp_clear_supports_compute(struct blorp_context *blorp, bool blorp_copy_supports_compute(struct blorp_context *blorp, + const struct isl_surf *src_surf, + const struct isl_surf *dst_surf, enum isl_aux_usage dst_aux_usage); bool blorp_blit_supports_compute(struct blorp_context *blorp, + const struct isl_surf *src_surf, + const struct isl_surf *dst_surf, enum isl_aux_usage dst_aux_usage); void diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index e15bad15b4b..5f5c4d31f66 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -2434,8 +2434,16 @@ do_blorp_blit(struct blorp_batch *batch, bool blorp_blit_supports_compute(struct blorp_context *blorp, + const struct isl_surf *src_surf, + const struct isl_surf *dst_surf, enum isl_aux_usage dst_aux_usage) { + /* Our compiler doesn't currently support typed image writes with MSAA. + * Also, our BLORP compute shaders don't handle multisampling cases. + */ + if (dst_surf->samples > 1 || src_surf->samples > 1) + return false; + if (blorp->isl_dev->info->ver >= 12) { return dst_aux_usage == ISL_AUX_USAGE_GFX12_CCS_E || dst_aux_usage == ISL_AUX_USAGE_CCS_E || @@ -2467,8 +2475,11 @@ blorp_blit(struct blorp_batch *batch, blorp_params_init(¶ms); params.snapshot_type = INTEL_SNAPSHOT_BLIT; const bool compute = batch->flags & BLORP_BATCH_USE_COMPUTE; - if (compute) - assert(blorp_blit_supports_compute(batch->blorp, dst_surf->aux_usage)); + if (compute) { + assert(blorp_blit_supports_compute(batch->blorp, + src_surf->surf, dst_surf->surf, + dst_surf->aux_usage)); + } /* We cannot handle combined depth and stencil. */ if (src_surf->surf->usage & ISL_SURF_USAGE_STENCIL_BIT) @@ -2775,9 +2786,11 @@ blorp_surf_convert_to_uncompressed(const struct isl_device *isl_dev, bool blorp_copy_supports_compute(struct blorp_context *blorp, + const struct isl_surf *src_surf, + const struct isl_surf *dst_surf, enum isl_aux_usage dst_aux_usage) { - return blorp_blit_supports_compute(blorp, dst_aux_usage); + return blorp_blit_supports_compute(blorp, src_surf, dst_surf, dst_aux_usage); } void @@ -2800,8 +2813,11 @@ blorp_copy(struct blorp_batch *batch, params.snapshot_type = INTEL_SNAPSHOT_COPY; const bool compute = batch->flags & BLORP_BATCH_USE_COMPUTE; - if (compute) - assert(blorp_copy_supports_compute(batch->blorp, dst_surf->aux_usage)); + if (compute) { + assert(blorp_copy_supports_compute(batch->blorp, + src_surf->surf, dst_surf->surf, + dst_surf->aux_usage)); + } brw_blorp_surface_info_init(batch, ¶ms.src, src_surf, src_level, src_layer, ISL_FORMAT_UNSUPPORTED, false);