Module: Mesa Branch: master Commit: b61efd53b464615c084763d9dfff8eda07afbe3a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b61efd53b464615c084763d9dfff8eda07afbe3a
Author: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> Date: Mon Mar 8 15:45:50 2021 +0100 radv: Support DCC without a fast clear value. For imported images we can't have one in the associated memory. Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9998> --- src/amd/vulkan/radv_cmd_buffer.c | 35 ++++++++++++++++++++++++----------- src/amd/vulkan/radv_meta_clear.c | 4 ++++ src/amd/vulkan/radv_private.h | 10 ++++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index f590be50411..3e01bfc63ef 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2207,23 +2207,29 @@ radv_set_color_clear_metadata(struct radv_cmd_buffer *cmd_buffer, uint32_t color_values[2]) { struct radeon_cmdbuf *cs = cmd_buffer->cs; - uint64_t va = radv_image_get_fast_clear_va(image, range->baseMipLevel); uint32_t level_count = radv_get_levelCount(image, range); uint32_t count = 2 * level_count; assert(radv_image_has_cmask(image) || radv_dcc_enabled(image, range->baseMipLevel)); - radeon_emit(cs, PKT3(PKT3_WRITE_DATA, 2 + count, cmd_buffer->state.predicating)); - radeon_emit(cs, S_370_DST_SEL(V_370_MEM) | - S_370_WR_CONFIRM(1) | - S_370_ENGINE_SEL(V_370_PFP)); - radeon_emit(cs, va); - radeon_emit(cs, va >> 32); + if (radv_image_has_clear_value(image)) { + uint64_t va = radv_image_get_fast_clear_va(image, range->baseMipLevel); - for (uint32_t l = 0; l < level_count; l++) { - radeon_emit(cs, color_values[0]); - radeon_emit(cs, color_values[1]); + radeon_emit(cs, PKT3(PKT3_WRITE_DATA, 2 + count, cmd_buffer->state.predicating)); + radeon_emit(cs, S_370_DST_SEL(V_370_MEM) | + S_370_WR_CONFIRM(1) | + S_370_ENGINE_SEL(V_370_PFP)); + radeon_emit(cs, va); + radeon_emit(cs, va >> 32); + + for (uint32_t l = 0; l < level_count; l++) { + radeon_emit(cs, color_values[0]); + radeon_emit(cs, color_values[1]); + } + } else { + /* Some default value we can set in the update. */ + assert(color_values[0] == 0 && color_values[1] == 0); } } @@ -2264,12 +2270,19 @@ radv_load_color_clear_metadata(struct radv_cmd_buffer *cmd_buffer, { struct radeon_cmdbuf *cs = cmd_buffer->cs; struct radv_image *image = iview->image; - uint64_t va = radv_image_get_fast_clear_va(image, iview->base_mip); if (!radv_image_has_cmask(image) && !radv_dcc_enabled(image, iview->base_mip)) return; + if (!radv_image_has_clear_value(image)) { + uint32_t color_values[2] = {0, 0}; + radv_update_bound_fast_clear_color(cmd_buffer, image, cb_idx, + color_values); + return; + } + + uint64_t va = radv_image_get_fast_clear_va(image, iview->base_mip); uint32_t reg = R_028C8C_CB_COLOR0_CLEAR_WORD0 + cb_idx * 0x3c; if (cmd_buffer->device->physical_device->rad_info.has_load_ctx_reg_pkt) { diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c index 24c3b8f74f1..f49bf3b23e4 100644 --- a/src/amd/vulkan/radv_meta_clear.c +++ b/src/amd/vulkan/radv_meta_clear.c @@ -1636,6 +1636,10 @@ radv_can_fast_clear_color(struct radv_cmd_buffer *cmd_buffer, clear_color, &clear_value)) return false; + if (!radv_image_has_clear_value(iview->image) && + (clear_color[0] != 0 || clear_color[1] != 0)) + return false; + if (radv_dcc_enabled(iview->image, iview->base_mip)) { bool can_avoid_fast_clear_elim; uint32_t reset_value; diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index c959758cff6..de86a68b7d0 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -2022,10 +2022,18 @@ radv_image_tile_stencil_disabled(const struct radv_device *device, } } +static inline bool +radv_image_has_clear_value(const struct radv_image *image) +{ + return image->clear_value_offset != 0; +} + static inline uint64_t radv_image_get_fast_clear_va(const struct radv_image *image, uint32_t base_level) { + assert(radv_image_has_clear_value(image)); + uint64_t va = radv_buffer_get_va(image->bo); va += image->offset + image->clear_value_offset + base_level * 8; return va; @@ -2062,6 +2070,8 @@ static inline uint64_t radv_get_ds_clear_value_va(const struct radv_image *image, uint32_t base_level) { + assert(radv_image_has_clear_value(image)); + uint64_t va = radv_buffer_get_va(image->bo); va += image->offset + image->clear_value_offset + base_level * 8; return va; _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit