mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-15 09:08:20 +02:00
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 <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39729>
This commit is contained in:
parent
04f6bfae51
commit
04d5077b00
1 changed files with 17 additions and 40 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue