Mesa (master): radv: pass sample locations for transitions before depth/stencil resolves

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 21 12:48:02 UTC 2019


Module: Mesa
Branch: master
Commit: e67fc11c26111ae7aa8d140a5f62074b5e0b43c3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e67fc11c26111ae7aa8d140a5f62074b5e0b43c3

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Jun 12 11:39:58 2019 +0200

radv: pass sample locations for transitions before depth/stencil resolves

HTILE decompressions need the user sample locations if specified
in the current subpass.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

---

 src/amd/vulkan/radv_cmd_buffer.c   |  2 +-
 src/amd/vulkan/radv_meta_resolve.c | 30 ++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_private.h      |  3 +++
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index bf2ecc4b0b4..9b4d4528028 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -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;
diff --git a/src/amd/vulkan/radv_meta_resolve.c b/src/amd/vulkan/radv_meta_resolve.c
index d1cfda5dc48..6517634df25 100644
--- a/src/amd/vulkan/radv_meta_resolve.c
+++ b/src/amd/vulkan/radv_meta_resolve.c
@@ -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,
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 9de46494454..1249ad0445d 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -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;




More information about the mesa-commit mailing list