radv: initialize FMASK for images in fully expanded mode
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 17 Dec 2018 20:23:42 +0000 (21:23 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 20 Dec 2018 17:01:15 +0000 (18:01 +0100)
The value depends on the number of samples.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_cmd_buffer.c
src/amd/vulkan/radv_meta.h
src/amd/vulkan/radv_meta_clear.c
src/amd/vulkan/radv_private.h

index c61310f3fc962d211864c14c788f849b7072dc8e..f4dbab8171a404432cd450dc5a816863ac6bc54d 100644 (file)
@@ -4351,6 +4351,27 @@ static void radv_initialise_cmask(struct radv_cmd_buffer *cmd_buffer,
        state->flush_bits |= RADV_CMD_FLAG_FLUSH_AND_INV_CB_META;
 }
 
+void radv_initialize_fmask(struct radv_cmd_buffer *cmd_buffer,
+                          struct radv_image *image)
+{
+       struct radv_cmd_state *state = &cmd_buffer->state;
+       static const uint32_t fmask_clear_values[4] = {
+               0x00000000,
+               0x02020202,
+               0xE4E4E4E4,
+               0x76543210
+       };
+       uint32_t log2_samples = util_logbase2(image->info.samples);
+       uint32_t value = fmask_clear_values[log2_samples];
+
+       state->flush_bits |= RADV_CMD_FLAG_FLUSH_AND_INV_CB |
+                            RADV_CMD_FLAG_FLUSH_AND_INV_CB_META;
+
+       state->flush_bits |= radv_clear_fmask(cmd_buffer, image, value);
+
+       state->flush_bits |= RADV_CMD_FLAG_FLUSH_AND_INV_CB_META;
+}
+
 void radv_initialize_dcc(struct radv_cmd_buffer *cmd_buffer,
                         struct radv_image *image, uint32_t value)
 {
@@ -4386,6 +4407,10 @@ static void radv_init_color_image_metadata(struct radv_cmd_buffer *cmd_buffer,
                radv_initialise_cmask(cmd_buffer, image, value);
        }
 
+       if (radv_image_has_fmask(image)) {
+               radv_initialize_fmask(cmd_buffer, image);
+       }
+
        if (radv_image_has_dcc(image)) {
                uint32_t value = 0xffffffffu; /* Fully expanded mode. */
                bool need_decompress_pass = false;
index f8d48f4d791b6e72a421f2eefd118c4868870c4f..22f7ae7490a5925d01ba9e41345e173129dd0deb 100644 (file)
@@ -201,6 +201,8 @@ void radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer,
 
 uint32_t radv_clear_cmask(struct radv_cmd_buffer *cmd_buffer,
                          struct radv_image *image, uint32_t value);
+uint32_t radv_clear_fmask(struct radv_cmd_buffer *cmd_buffer,
+                         struct radv_image *image, uint32_t value);
 uint32_t radv_clear_dcc(struct radv_cmd_buffer *cmd_buffer,
                        struct radv_image *image, uint32_t value);
 
index 7a364ec684a733b0319e53c17ebaaa24371dc45e..cd6a90e63494011c6516886c02ff6958d126d7da 100644 (file)
@@ -1295,6 +1295,15 @@ radv_clear_cmask(struct radv_cmd_buffer *cmd_buffer,
                                image->cmask.size, value);
 }
 
+uint32_t
+radv_clear_fmask(struct radv_cmd_buffer *cmd_buffer,
+                struct radv_image *image, uint32_t value)
+{
+       return radv_fill_buffer(cmd_buffer, image->bo,
+                               image->offset + image->fmask.offset,
+                               image->fmask.size, value);
+}
+
 uint32_t
 radv_clear_dcc(struct radv_cmd_buffer *cmd_buffer,
               struct radv_image *image, uint32_t value)
index 9a9cd5ff935b6a73e6fa27d7b74cb9ad18d72634..5204e8761d99f5c8642b949be89d71a796744581 100644 (file)
@@ -1895,6 +1895,9 @@ void radv_meta_push_descriptor_set(struct radv_cmd_buffer *cmd_buffer,
 void radv_initialize_dcc(struct radv_cmd_buffer *cmd_buffer,
                         struct radv_image *image, uint32_t value);
 
+void radv_initialize_fmask(struct radv_cmd_buffer *cmd_buffer,
+                          struct radv_image *image);
+
 struct radv_fence {
        struct radeon_winsys_fence *fence;
        struct wsi_fence *fence_wsi;