radv: pass sample locations for transitions before depth/stencil resolves
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 12 Jun 2019 09:39:58 +0000 (11:39 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 21 Jun 2019 12:50:35 +0000 (14:50 +0200)
HTILE decompressions need the user sample locations if specified
in the current subpass.

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_resolve.c
src/amd/vulkan/radv_private.h

index bf2ecc4..9b4d452 100644 (file)
@@ -2688,7 +2688,7 @@ void radv_subpass_barrier(struct radv_cmd_buffer *cmd_buffer,
                                                              NULL);
 }
 
-static uint32_t
+uint32_t
 radv_get_subpass_id(struct radv_cmd_buffer *cmd_buffer)
 {
        struct radv_cmd_state *state = &cmd_buffer->state;
index d1cfda5..6517634 100644 (file)
@@ -818,6 +818,20 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
        }
 }
 
+static struct radv_sample_locations_state *
+radv_get_resolve_sample_locations(struct radv_cmd_buffer *cmd_buffer)
+{
+       struct radv_cmd_state *state = &cmd_buffer->state;
+       uint32_t subpass_id = radv_get_subpass_id(cmd_buffer);
+
+       for (uint32_t i = 0; i < state->num_subpass_sample_locs; i++) {
+               if (state->subpass_sample_locs[i].subpass_idx == subpass_id)
+                       return &state->subpass_sample_locs[i].sample_location;
+       }
+
+       return NULL;
+}
+
 /**
  * Decompress CMask/FMask before resolving a multisampled source image.
  */
@@ -848,6 +862,22 @@ radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer,
                        .layerCount = region->srcSubresource.layerCount,
                };
 
+               if (src_image->flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) {
+                       /* If the depth/stencil image uses different sample
+                        * locations, we need them during HTILE decompressions.
+                        */
+                       struct radv_sample_locations_state *sample_locs =
+                               radv_get_resolve_sample_locations(cmd_buffer);
+
+                       barrier.pNext = &(VkSampleLocationsInfoEXT) {
+                               .sType = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT,
+                               .sampleLocationsPerPixel = sample_locs->per_pixel,
+                               .sampleLocationGridSize = sample_locs->grid_size,
+                               .sampleLocationsCount = sample_locs->count,
+                               .pSampleLocations = sample_locs->locations,
+                       };
+               }
+
                radv_CmdPipelineBarrier(radv_cmd_buffer_to_handle(cmd_buffer),
                                        VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
                                        VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
index 9de4649..1249ad0 100644 (file)
@@ -2003,6 +2003,9 @@ struct radv_subpass {
        VkSampleCountFlagBits                        max_sample_count;
 };
 
+uint32_t
+radv_get_subpass_id(struct radv_cmd_buffer *cmd_buffer);
+
 struct radv_render_pass_attachment {
        VkFormat                                     format;
        uint32_t                                     samples;