Module: Mesa Branch: staging/21.1 Commit: 2528ff1db930ce7d4bbaffef7f5ba9740d92499e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2528ff1db930ce7d4bbaffef7f5ba9740d92499e
Author: Nanley Chery <[email protected]> Date: Tue Jan 26 15:50:20 2021 -0800 iris: Avoid sampling some MCS surfaces with clear Supposedly avoids GPU hangs in BF4. See HSD 1707282275 and 14013111325. v2. Fix bug in WA implementation. (Sagar) Cc: mesa-stable Reviewed-by: Sagar Ghuge <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8755> (cherry picked from commit bcdebf4ff8f6e1d18e3dd129039a7618907fe8af) --- .pick_status.json | 2 +- src/gallium/drivers/iris/iris_blit.c | 7 +++++++ src/gallium/drivers/iris/iris_resolve.c | 26 ++++++++++++++++++++++++++ src/gallium/drivers/iris/iris_resource.h | 3 +++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 9415e1cc679..0e0efe4e52a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -85,7 +85,7 @@ "description": "iris: Avoid sampling some MCS surfaces with clear", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/gallium/drivers/iris/iris_blit.c b/src/gallium/drivers/iris/iris_blit.c index 9caac8145ed..1dc07d883c0 100644 --- a/src/gallium/drivers/iris/iris_blit.c +++ b/src/gallium/drivers/iris/iris_blit.c @@ -571,6 +571,13 @@ get_copy_region_aux_settings(struct iris_context *ice, break; case ISL_AUX_USAGE_MCS: case ISL_AUX_USAGE_MCS_CCS: + if (!is_render_target && + !iris_can_sample_mcs_with_clear(devinfo, res)) { + *out_aux_usage = res->aux.usage; + *out_clear_supported = false; + break; + } + FALLTHROUGH; case ISL_AUX_USAGE_CCS_E: case ISL_AUX_USAGE_GFX12_CCS_E: *out_aux_usage = res->aux.usage; diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c index da90e935fbc..78a51a8c8e2 100644 --- a/src/gallium/drivers/iris/iris_resolve.c +++ b/src/gallium/drivers/iris/iris_resolve.c @@ -894,6 +894,24 @@ iris_image_view_aux_usage(struct iris_context *ice, return ISL_AUX_USAGE_NONE; } +bool +iris_can_sample_mcs_with_clear(const struct gen_device_info *devinfo, + const struct iris_resource *res) +{ + assert(isl_aux_usage_has_mcs(res->aux.usage)); + + /* On TGL, the sampler has an issue with some 8 and 16bpp MSAA fast clears. + * See HSD 1707282275, wa_14013111325. Due to the use of + * format-reinterpretation, a simplified workaround is implemented. + */ + if (devinfo->ver >= 12 && + isl_format_get_layout(res->surf.format)->bpb <= 16) { + return false; + } + + return true; +} + static bool isl_formats_are_fast_clear_compatible(enum isl_format a, enum isl_format b) { @@ -918,6 +936,9 @@ iris_resource_prepare_texture(struct iris_context *ice, uint32_t start_level, uint32_t num_levels, uint32_t start_layer, uint32_t num_layers) { + const struct iris_screen *screen = (void *) ice->ctx.screen; + const struct gen_device_info *devinfo = &screen->devinfo; + enum isl_aux_usage aux_usage = iris_resource_texture_aux_usage(ice, res, view_format); @@ -930,6 +951,11 @@ iris_resource_prepare_texture(struct iris_context *ice, if (!isl_formats_are_fast_clear_compatible(res->surf.format, view_format)) clear_supported = false; + if (isl_aux_usage_has_mcs(aux_usage) && + !iris_can_sample_mcs_with_clear(devinfo, res)) { + clear_supported = false; + } + iris_resource_prepare_access(ice, res, start_level, num_levels, start_layer, num_layers, aux_usage, clear_supported); diff --git a/src/gallium/drivers/iris/iris_resource.h b/src/gallium/drivers/iris/iris_resource.h index 01d9050ba21..5ef6ad8d745 100644 --- a/src/gallium/drivers/iris/iris_resource.h +++ b/src/gallium/drivers/iris/iris_resource.h @@ -499,6 +499,9 @@ bool iris_resource_level_has_hiz(const struct iris_resource *res, bool iris_sample_with_depth_aux(const struct gen_device_info *devinfo, const struct iris_resource *res); +bool iris_can_sample_mcs_with_clear(const struct gen_device_info *devinfo, + const struct iris_resource *res); + bool iris_has_color_unresolved(const struct iris_resource *res, unsigned start_level, unsigned num_levels, unsigned start_layer, unsigned num_layers); _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
