<div dir="ltr"><div dir="ltr"><br></div><div dir="auto"><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 13, 2019, 3:42 PM Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This allows us to disable the FMASK decompress pass when<br>
transitioning from CB writes to shader reads.<br>
<br>
This will likely be improved and enabled by default in the future.<br>
<br>
No CTS regressions on GFX8 but a few number of multisample CTS<br>
failures on GFX9 (they look related to the small hint).<br>
<br>
Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" rel="noreferrer" target="_blank">samuel.pitoiset@gmail.com</a>><br>
---<br>
 src/amd/vulkan/radv_cmd_buffer.c      |  9 ++++++<br>
 src/amd/vulkan/radv_debug.h           |  1 +<br>
 src/amd/vulkan/radv_device.c          | 15 ++++++++++<br>
 src/amd/vulkan/radv_image.c           | 42 +++++++++++++++++++++++++++<br>
 src/amd/vulkan/radv_meta.h            | 26 +++++++++++++++++<br>
 src/amd/vulkan/radv_meta_fast_clear.c |  2 +-<br>
 src/amd/vulkan/radv_private.h         | 10 +++++++<br>
 7 files changed, 104 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c<br>
index 2fd5f8b7a07..bf208899887 100644<br>
--- a/src/amd/vulkan/radv_cmd_buffer.c<br>
+++ b/src/amd/vulkan/radv_cmd_buffer.c<br>
@@ -1254,6 +1254,15 @@ radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer,<br>
                cb_color_info &= C_028C70_DCC_ENABLE;<br>
        }<br>
<br>
+       if (radv_image_is_tc_compat_cmask(image) &&<br>
+           (radv_is_fmask_decompress_pipeline(cmd_buffer) ||<br>
+            radv_is_dcc_decompress_pipeline(cmd_buffer))) {<br>
+               /* If this bit is set, the FMASK decompression operation<br>
+                * doesn't occur (DCC_COMPRESS also implies FMASK_DECOMPRESS).<br>
+                */<br>
+               cb_color_info &= C_028C70_FMASK_COMPRESS_1FRAG_ONLY;<br>
+       }<br>
+<br>
        if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9) {<br>
                radeon_set_context_reg_seq(cmd_buffer->cs, R_028C60_CB_COLOR0_BASE + index * 0x3c, 11);<br>
                radeon_emit(cmd_buffer->cs, cb->cb_color_base);<br>
diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h<br>
index 652a3b677d2..29793e549ce 100644<br>
--- a/src/amd/vulkan/radv_debug.h<br>
+++ b/src/amd/vulkan/radv_debug.h<br>
@@ -61,6 +61,7 @@ enum {<br>
        RADV_PERFTEST_OUT_OF_ORDER   =   0x8,<br>
        RADV_PERFTEST_DCC_MSAA       =  0x10,<br>
        RADV_PERFTEST_BO_LIST        =  0x20,<br>
+       RADV_PERFTEST_TC_COMPAT_CMASK = 0x40,<br>
 };<br>
<br>
 bool<br>
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c<br>
index 3b69e457496..b75ce59dfc3 100644<br>
--- a/src/amd/vulkan/radv_device.c<br>
+++ b/src/amd/vulkan/radv_device.c<br>
@@ -479,6 +479,7 @@ static const struct debug_control radv_perftest_options[] = {<br>
        {"localbos", RADV_PERFTEST_LOCAL_BOS},<br>
        {"dccmsaa", RADV_PERFTEST_DCC_MSAA},<br>
        {"bolist", RADV_PERFTEST_BO_LIST},<br>
+       {"tccompatcmask", RADV_PERFTEST_TC_COMPAT_CMASK},<br>
        {NULL, 0}<br>
 };<br>
<br>
@@ -4389,6 +4390,20 @@ radv_initialise_color_surface(struct radv_device *device,<br>
                        unsigned fmask_bankh = util_logbase2(iview->image->fmask.bank_height);<br>
                        cb->cb_color_attrib |= S_028C74_FMASK_BANK_HEIGHT(fmask_bankh);<br>
                }<br>
+<br>
+               if (radv_image_is_tc_compat_cmask(iview->image)) {<br>
+                       /* Allow the texture block to read FMASK directly<br>
+                        * without decompressing it. This bit must be cleared<br>
+                        * when performing FMASK_DECOMPRESS or DCC_COMPRESS,<br>
+                        * otherwise the operation doesn't happen.<br>
+                        */<br>
+                       cb->cb_color_info |= S_028C70_FMASK_COMPRESS_1FRAG_ONLY(1);<br>
+<br>
+                       /* Set CMASK into a tiling format that allows the<br>
+                        * texture block to read it.<br>
+                        */<br>
+                       cb->cb_color_info |= S_028C70_CMASK_ADDR_TYPE(2);<br>
+               }<br>
        }<br>
<br>
        if (radv_image_has_cmask(iview->image) &&<br>
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c<br>
index d8dc2dfabde..c58c08fca59 100644<br>
--- a/src/amd/vulkan/radv_image.c<br>
+++ b/src/amd/vulkan/radv_image.c<br>
@@ -219,6 +219,29 @@ radv_use_dcc_for_image(struct radv_device *device,<br>
        return true;<br>
 }<br>
<br>
+static bool<br>
+radv_use_tc_compat_cmask_for_image(struct radv_device *device,<br>
+                                  struct radv_image *image)<br>
+{</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+       if (!(device->instance->perftest_flags & RADV_PERFTEST_TC_COMPAT_CMASK))<br>
+               return false;<br>
+<br>
+       /* TC-compat CMASK is only available for GFX8+. */<br>
+       if (device->physical_device->rad_info.chip_class < GFX8)<br>
+               return false;<br>
+<br>
+       if (image->usage & VK_IMAGE_USAGE_STORAGE_BIT)<br>
+               return false;<br>
+<br>
+       if (radv_image_has_dcc(image))<br>
+               return false;<br>
+<br>
+       if (!radv_image_has_cmask(image))<br>
+               return false;<br>
+<br>
+       return true;<br>
+}<br>
+<br>
 static void<br>
 radv_prefill_surface_from_metadata(struct radv_device *device,<br>
                                    struct radeon_surf *surface,<br>
@@ -726,11 +749,26 @@ si_make_texture_descriptor(struct radv_device *device,<br>
                                          S_008F20_PITCH(image->planes[0].surface.u.gfx9.fmask.epitch);<br>
                        fmask_state[5] |= S_008F24_META_PIPE_ALIGNED(image->planes[0].surface.u.gfx9.cmask.pipe_aligned) |<br>
                                          S_008F24_META_RB_ALIGNED(image->planes[0].surface.u.gfx9.cmask.rb_aligned);<br>
+<br>
+                       if (radv_image_is_tc_compat_cmask(image)) {<br>
+                               va = gpu_address + image->offset + image->cmask.offset;<br>
+<br>
+                               fmask_state[5] |= S_008F24_META_DATA_ADDRESS(va >> 40);<br>
+                               fmask_state[6] |= S_008F28_COMPRESSION_EN(1);<br>
+                               fmask_state[7] |= va >> 8;<br>
+                       }<br>
                } else {<br>
                        fmask_state[3] |= S_008F1C_TILING_INDEX(image->fmask.tile_mode_index);<br>
                        fmask_state[4] |= S_008F20_DEPTH(depth - 1) |<br>
                                S_008F20_PITCH(image->fmask.pitch_in_pixels - 1);<br>
                        fmask_state[5] |= S_008F24_LAST_ARRAY(last_layer);<br>
+<br>
+                       if (radv_image_is_tc_compat_cmask(image)) {<br>
+                               va = gpu_address + image->offset + image->cmask.offset;<br>
+<br>
+                               fmask_state[6] |= S_008F28_COMPRESSION_EN(1);<br>
+                               fmask_state[7] |= va >> 8;<br>
+                       }<br>
                }<br>
        } else if (fmask_state)<br>
                memset(fmask_state, 0, 8 * 4);<br>
@@ -1034,6 +1072,7 @@ radv_image_can_enable_fmask(struct radv_image *image)<br>
        return image->info.samples > 1 && vk_format_is_color(image->vk_format);<br>
 }<br>
<br>
+<br></blockquote><div> </div><div>spurious change?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 static inline bool<br>
 radv_image_can_enable_htile(struct radv_image *image)<br>
 {<br>
@@ -1158,6 +1197,9 @@ radv_image_create(VkDevice _device,<br>
                /* Try to enable FMASK for multisampled images. */<br>
                if (radv_image_can_enable_fmask(image)) {<br>
                        radv_image_alloc_fmask(device, image);<br>
+<br>
+                       if (radv_use_tc_compat_cmask_for_image(device, image))<br>
+                               image->tc_compatible_cmask = true;<br>
                } else {<br>
                        /* Otherwise, try to enable HTILE for depth surfaces. */<br>
                        if (radv_image_can_enable_htile(image) &&<br>
diff --git a/src/amd/vulkan/radv_meta.h b/src/amd/vulkan/radv_meta.h<br>
index 59b9121cf39..2aa2d15770b 100644<br>
--- a/src/amd/vulkan/radv_meta.h<br>
+++ b/src/amd/vulkan/radv_meta.h<br>
@@ -221,6 +221,32 @@ uint32_t radv_clear_htile(struct radv_cmd_buffer *cmd_buffer,<br>
                          struct radv_image *image,<br>
                          const VkImageSubresourceRange *range, uint32_t value);<br>
<br>
+/**<br>
+ * Return whether the bound pipeline is the FMASK decompress pass.<br>
+ */<br>
+static inline bool<br>
+radv_is_fmask_decompress_pipeline(struct radv_cmd_buffer *cmd_buffer)<br>
+{<br>
+       struct radv_meta_state *meta_state = &cmd_buffer->device->meta_state;<br>
+       struct radv_pipeline *pipeline = cmd_buffer->state.pipeline;<br>
+<br>
+       return radv_pipeline_to_handle(pipeline) ==<br>
+              meta_state->fast_clear_flush.fmask_decompress_pipeline;<br>
+}<br>
+<br>
+/**<br>
+ * Return whether the bound pipeline is the DCC decompress pass.<br>
+ */<br>
+static inline bool<br>
+radv_is_dcc_decompress_pipeline(struct radv_cmd_buffer *cmd_buffer)<br>
+{<br>
+       struct radv_meta_state *meta_state = &cmd_buffer->device->meta_state;<br>
+       struct radv_pipeline *pipeline = cmd_buffer->state.pipeline;<br>
+<br>
+       return radv_pipeline_to_handle(pipeline) ==<br>
+              meta_state->fast_clear_flush.dcc_decompress_pipeline;<br>
+}<br>
+<br>
 /* common nir builder helpers */<br>
 #include "nir/nir_builder.h"<br>
<br>
diff --git a/src/amd/vulkan/radv_meta_fast_clear.c b/src/amd/vulkan/radv_meta_fast_clear.c<br>
index 8f97c1a8f15..94c83dc96be 100644<br>
--- a/src/amd/vulkan/radv_meta_fast_clear.c<br>
+++ b/src/amd/vulkan/radv_meta_fast_clear.c<br>
@@ -595,7 +595,7 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,<br>
<br>
        if (decompress_dcc && radv_image_has_dcc(image)) {<br>
                pipeline = cmd_buffer->device->meta_state.fast_clear_flush.dcc_decompress_pipeline;<br>
-       } else if (radv_image_has_fmask(image)) {<br>
+       } else if (radv_image_has_fmask(image) && !image->tc_compatible_cmask) {<br>
                pipeline = cmd_buffer->device->meta_state.fast_clear_flush.fmask_decompress_pipeline;<br>
        } else {<br>
                pipeline = cmd_buffer->device->meta_state.fast_clear_flush.cmask_eliminate_pipeline;<br>
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h<br>
index 8f2e80b3017..1a7797b55e1 100644<br>
--- a/src/amd/vulkan/radv_private.h<br>
+++ b/src/amd/vulkan/radv_private.h<br>
@@ -1555,6 +1555,7 @@ struct radv_image {<br>
        uint64_t dcc_offset;<br>
        uint64_t htile_offset;<br>
        bool tc_compatible_htile;<br>
+       bool tc_compatible_cmask;<br>
<br>
        struct radv_fmask_info fmask;<br>
        struct radv_cmask_info cmask;<br>
@@ -1628,6 +1629,15 @@ radv_image_has_dcc(const struct radv_image *image)<br>
        return image->planes[0].surface.dcc_size;<br>
 }<br>
<br>
+/**<br>
+ * Return whether the image is TC-compatible CMASK.<br>
+ */<br>
+static inline bool<br>
+radv_image_is_tc_compat_cmask(const struct radv_image *image)<br>
+{<br>
+       return radv_image_has_fmask(image) && image->tc_compatible_cmask;<br>
+}<br>
+<br>
 /**<br>
  * Return whether DCC metadata is enabled for a level.<br>
  */<br>
-- <br>
2.22.0<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" rel="noreferrer" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div></div>
</div>