From 04d5077b00210183d885e49c7ae7fee5af73f4e8 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 6 Feb 2026 09:24:20 +0100 Subject: [PATCH] radv: emit late decompressions for fbfetch slightly earlier Right after "normal" layout transitions and just before the rendering state is set, mostly because it doesn't need to be saved/restored either. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 57 ++++++++++---------------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 113c7e0a62d..9bd0cb321ec 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -9494,16 +9494,12 @@ radv_CmdSetRenderingInputAttachmentIndices(VkCommandBuffer commandBuffer, } static void -radv_handle_color_fbfetch_output(struct radv_cmd_buffer *cmd_buffer, uint32_t index) +radv_handle_color_fbfetch_output(struct radv_cmd_buffer *cmd_buffer, struct radv_attachment *att, uint32_t layer_count, + uint32_t view_mask) { const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - struct radv_rendering_state *render = &cmd_buffer->state.render; - struct radv_attachment *att = &render->color_att[index]; - if (!att->iview) - return; - - if (!(att->flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR)) + if (!device->vk.enabled_features.dynamicRenderingLocalRead) return; const struct radv_image *image = att->iview->image; @@ -9526,7 +9522,7 @@ radv_handle_color_fbfetch_output(struct radv_cmd_buffer *cmd_buffer, uint32_t in /* Force a transition to FEEDBACK_LOOP_OPTIMAL to decompress DCC. */ radv_handle_rendering_image_transition( - cmd_buffer, att->iview, render->layer_count, render->view_mask, att->layout, VK_IMAGE_LAYOUT_UNDEFINED, + cmd_buffer, att->iview, layer_count, view_mask, att->layout, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT, VK_IMAGE_LAYOUT_UNDEFINED, NULL); radv_describe_barrier_end(cmd_buffer); @@ -9539,16 +9535,12 @@ radv_handle_color_fbfetch_output(struct radv_cmd_buffer *cmd_buffer, uint32_t in } static void -radv_handle_depth_fbfetch_output(struct radv_cmd_buffer *cmd_buffer) +radv_handle_depth_fbfetch_output(struct radv_cmd_buffer *cmd_buffer, struct radv_attachment *att, uint32_t layer_count, + uint32_t view_mask, struct radv_sample_locations_state *sample_locs) { const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - struct radv_rendering_state *render = &cmd_buffer->state.render; - struct radv_attachment *att = &render->ds_att; - if (!att->iview) - return; - - if (!(att->flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR)) + if (!device->vk.enabled_features.dynamicRenderingLocalRead) return; if (!radv_layout_is_htile_compressed( @@ -9566,10 +9558,9 @@ radv_handle_depth_fbfetch_output(struct radv_cmd_buffer *cmd_buffer) radv_describe_barrier_start(cmd_buffer, RGP_BARRIER_UNKNOWN_REASON); /* Force a transition to FEEDBACK_LOOP_OPTIMAL to decompress HTILE. */ - radv_handle_rendering_image_transition(cmd_buffer, att->iview, render->layer_count, render->view_mask, att->layout, + radv_handle_rendering_image_transition(cmd_buffer, att->iview, layer_count, view_mask, att->layout, att->stencil_layout, VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT, - VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT, - render->sample_locations.count > 0 ? &render->sample_locations : NULL); + VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT, sample_locs); radv_describe_barrier_end(cmd_buffer); @@ -9582,20 +9573,6 @@ radv_handle_depth_fbfetch_output(struct radv_cmd_buffer *cmd_buffer) att->iview->image, &range); } -static void -radv_handle_fbfetch_output(struct radv_cmd_buffer *cmd_buffer) -{ - const struct radv_rendering_state *render = &cmd_buffer->state.render; - - /* Check if any color attachments are compressed and also used as input attachments. */ - for (uint32_t i = 0; i < render->color_att_count; i++) { - radv_handle_color_fbfetch_output(cmd_buffer, i); - } - - /* Check if the depth/stencil attachment is compressed and also used as input attachment. */ - radv_handle_depth_fbfetch_output(cmd_buffer); -} - VKAPI_ATTR void VKAPI_CALL radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCmdBuffers) { @@ -9869,7 +9846,6 @@ radv_CmdBeginRendering(VkCommandBuffer commandBuffer, const VkRenderingInfo *pRe struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); VkExtent2D screen_scissor = {pdev->image_props.max_dims.width, pdev->image_props.max_dims.height}; - bool has_input_attachment_concurrent_writes = false; struct radv_cmd_stream *cs = cmd_buffer->cs; bool disable_constant_encode_ac01 = false; @@ -9940,8 +9916,10 @@ radv_CmdBeginRendering(VkCommandBuffer commandBuffer, const VkRenderingInfo *pRe screen_scissor.width = MIN2(screen_scissor.width, iview->vk.extent.width); screen_scissor.height = MIN2(screen_scissor.height, iview->vk.extent.height); - if (color_att[i].flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR) - has_input_attachment_concurrent_writes = true; + if (color_att[i].flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR) { + radv_handle_color_fbfetch_output(cmd_buffer, &color_att[i], pRenderingInfo->layerCount, + pRenderingInfo->viewMask); + } } struct radv_attachment ds_att = {.iview = NULL}; @@ -10020,8 +9998,10 @@ radv_CmdBeginRendering(VkCommandBuffer commandBuffer, const VkRenderingInfo *pRe screen_scissor.width = MIN2(screen_scissor.width, ds_att.iview->vk.extent.width); screen_scissor.height = MIN2(screen_scissor.height, ds_att.iview->vk.extent.height); - if (ds_att.flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR) - has_input_attachment_concurrent_writes = true; + if (ds_att.flags & VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR) { + radv_handle_depth_fbfetch_output(cmd_buffer, &ds_att, pRenderingInfo->layerCount, pRenderingInfo->viewMask, + sample_locs_info ? &sample_locations : NULL); + } } if (cmd_buffer->vk.render_pass) radv_describe_barrier_end(cmd_buffer); @@ -10162,9 +10142,6 @@ radv_CmdBeginRendering(VkCommandBuffer commandBuffer, const VkRenderingInfo *pRe if (!(pRenderingInfo->flags & VK_RENDERING_RESUMING_BIT)) radv_cmd_buffer_clear_rendering(cmd_buffer, pRenderingInfo); - - if (device->vk.enabled_features.dynamicRenderingLocalRead && has_input_attachment_concurrent_writes) - radv_handle_fbfetch_output(cmd_buffer); } VKAPI_ATTR void VKAPI_CALL