From 9960637b26ee138addfee9f526cc28f9808aedc6 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Wed, 8 Apr 2026 00:18:55 +0800 Subject: [PATCH] pvr: record deferred RTA clears for secondary cmdbuf subcmds Currently the code handling deferred RTA clears cannot handle them for secondary command buffers within render passes, because the code immediately configures the transfer command for the deferred clear operation, but the specific attachment image view isn't known when recording secondary command buffers to be executed inside render passes. Add code to record parameters for deferred RTA clears in secondary command buffers when the attachment is unknown, and bind the recorded clears to the attachment's image view when executing the secondary command buffer inside a render pass. Fixes many dynamic rendering random tests. Backport-to: 26.0 Signed-off-by: Icenowy Zheng Reviewed-by: Luigi Santivetti Part-of: --- src/imagination/ci/bxs-4-64-fails.txt | 83 -------- src/imagination/vulkan/pvr_arch_cmd_buffer.c | 13 ++ src/imagination/vulkan/pvr_blit.h | 5 + src/imagination/vulkan/pvr_cmd_buffer.h | 12 ++ src/imagination/vulkan/rogue/pvr_blit.c | 193 +++++++++++++------ 5 files changed, 162 insertions(+), 144 deletions(-) diff --git a/src/imagination/ci/bxs-4-64-fails.txt b/src/imagination/ci/bxs-4-64-fails.txt index 876d56b2e91..142935d92f7 100644 --- a/src/imagination/ci/bxs-4-64-fails.txt +++ b/src/imagination/ci/bxs-4-64-fails.txt @@ -19,195 +19,112 @@ dEQP-VK.pipeline.monolithic.stencil.no_stencil_att.dynamic_rendering.dynamic_ena dEQP-VK.pipeline.monolithic.stencil.no_stencil_att.dynamic_rendering.static_enable.d24_unorm_s8_uint,Fail dEQP-VK.pipeline.monolithic.stencil.no_stencil_att.dynamic_rendering.static_enable.d32_sfloat_s8_uint,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.basic.partial_binding_depth_stencil,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed0,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed0_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed1,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed10,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed10_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed11,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed11_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed12,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed12_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed13,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed13_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed14,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed14_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed15,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed15_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed16,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed16_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed17,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed17_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed18,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed18_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed19,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed19_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed1_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed2,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed20,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed20_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed21,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed21_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed22,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed22_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed23,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed23_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed24,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed24_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed25,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed26,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed26_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed27,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed27_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed28,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed28_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed29,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed29_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed2_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed3,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed30_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed31,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed31_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed32,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed32_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed33,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed33_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed34,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed34_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed35,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed35_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed36,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed36_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed37,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed37_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed38,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed38_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed39,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed39_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed3_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed4,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed40_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed41,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed41_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed42,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed42_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed43,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed43_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed44,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed44_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed45,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed45_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed46,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed46_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed47,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed47_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed48,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed48_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed49,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed49_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed4_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed5,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed50,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed50_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed51,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed51_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed52_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed53,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed53_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed54,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed54_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed55,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed55_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed56,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed56_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed57,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed57_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed58,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed58_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed59,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed59_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed5_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed60,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed60_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed61,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed61_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed62,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed62_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed63,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed63_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed64,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed64_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed65,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed65_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed66,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed66_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed67,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed67_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed68,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed68_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed69,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed69_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed6_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed7,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed70,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed70_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed71,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed71_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed72,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed72_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed73,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed73_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed74,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed74_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed75,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed75_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed76,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed76_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed77,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed77_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed78,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed78_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed79,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed79_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed7_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed8,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed80,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed80_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed81,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed81_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed82_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed83,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed83_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed84_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed85,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed85_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed86,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed86_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed87,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed87_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed88,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed88_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed89,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed89_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed8_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed9,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed90,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed90_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed91,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed91_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed92,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed92_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed93_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed94,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed94_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed95,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed95_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed96,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed96_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed97,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed97_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed98,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed98_multiview,Fail -dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed99,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed99_multiview,Fail dEQP-VK.renderpasses.dynamic_rendering.primary_cmd_buff.random.seed9_multiview,Fail diff --git a/src/imagination/vulkan/pvr_arch_cmd_buffer.c b/src/imagination/vulkan/pvr_arch_cmd_buffer.c index 9c37a797e5e..bb59f707496 100644 --- a/src/imagination/vulkan/pvr_arch_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_arch_cmd_buffer.c @@ -136,6 +136,7 @@ static void pvr_cmd_buffer_free_sub_cmd(struct pvr_cmd_buffer *cmd_buffer, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT); util_dynarray_fini(&sub_cmd->gfx.sec_query_indices); + util_dynarray_fini(&sub_cmd->gfx.unbound_deferred_clears); pvr_csb_finish(&sub_cmd->gfx.control_stream); pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.terminate_ctrl_stream); pvr_bo_free(cmd_buffer->device, sub_cmd->gfx.multiview_ctrl_stream); @@ -2753,6 +2754,7 @@ VkResult pvr_arch_cmd_buffer_start_sub_cmd(struct pvr_cmd_buffer *cmd_buffer, } sub_cmd->gfx.sec_query_indices = UTIL_DYNARRAY_INIT; + sub_cmd->gfx.unbound_deferred_clears = UTIL_DYNARRAY_INIT; break; case PVR_SUB_CMD_TYPE_QUERY: @@ -9036,6 +9038,17 @@ pvr_execute_graphics_cmd_buffer(struct pvr_cmd_buffer *cmd_buffer, &sec_sub_cmd->gfx.sec_query_indices); } + if (!PVR_HAS_FEATURE(dev_info, gs_rta_support)) { + util_dynarray_foreach (&sec_sub_cmd->gfx.unbound_deferred_clears, + struct pvr_unbound_deferred_clear, + recorded_clear) { + result = + pvr_bind_unbound_deferred_clear(cmd_buffer, recorded_clear); + if (result != VK_SUCCESS) + return result; + } + } + if (pvr_cmd_uses_deferred_cs_cmds(sec_cmd_buffer)) { /* TODO: In case if secondary buffer is created with * VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, then we patch the diff --git a/src/imagination/vulkan/pvr_blit.h b/src/imagination/vulkan/pvr_blit.h index 366dd43b4a2..323724a74fe 100644 --- a/src/imagination/vulkan/pvr_blit.h +++ b/src/imagination/vulkan/pvr_blit.h @@ -34,6 +34,7 @@ struct pvr_device; struct pvr_image; struct pvr_transfer_cmd; struct pvr_transfer_cmd_surface; +struct pvr_unbound_deferred_clear; VkFormat pvr_get_raw_copy_format(VkFormat format); @@ -80,4 +81,8 @@ void pvr_clear_depth_stencil_image(struct pvr_cmd_buffer *cmd_buffer, uint32_t rangeCount, const VkImageSubresourceRange *pRanges); +VkResult pvr_bind_unbound_deferred_clear( + struct pvr_cmd_buffer *cmd_buffer, + struct pvr_unbound_deferred_clear *recorded_clear); + #endif /* PVR_BLIT_H */ diff --git a/src/imagination/vulkan/pvr_cmd_buffer.h b/src/imagination/vulkan/pvr_cmd_buffer.h index ce07a0455b1..f29fb624b56 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.h +++ b/src/imagination/vulkan/pvr_cmd_buffer.h @@ -114,6 +114,15 @@ struct pvr_transfer_cmd { struct pvr_cmd_buffer *cmd_buffer; }; +struct pvr_unbound_deferred_clear { + union fi clear_color[4]; + VkOffset3D offset; + VkExtent3D extent; + uint32_t array_layer; + VkImageAspectFlags aspect_mask; + uint32_t attachment_index; +}; + struct pvr_color_attachment_output_map { uint32_t index_color; uint32_t index_resolve; @@ -208,6 +217,9 @@ struct pvr_sub_cmd_gfx { uint32_t view_mask; bool multiview_enabled; + + /* Recorded deferred RTA clears for secondary command buffers */ + struct util_dynarray unbound_deferred_clears; }; struct pvr_sub_cmd_compute { diff --git a/src/imagination/vulkan/rogue/pvr_blit.c b/src/imagination/vulkan/rogue/pvr_blit.c index eaaa1e1f294..00d535f2234 100644 --- a/src/imagination/vulkan/rogue/pvr_blit.c +++ b/src/imagination/vulkan/rogue/pvr_blit.c @@ -45,6 +45,7 @@ #include "util/bitscan.h" #include "util/list.h" #include "util/macros.h" +#include "util/u_dynarray.h" #include "util/u_math.h" #include "vk_alloc.h" #include "vk_command_buffer.h" @@ -1936,8 +1937,9 @@ static VkResult pvr_add_deferred_rta_clear(struct pvr_cmd_buffer *cmd_buffer, struct pvr_sub_cmd_gfx *sub_cmd = &cmd_buffer->state.current_sub_cmd->gfx; const struct pvr_renderpass_hwsetup_render *hw_render = pvr_arch_pass_info_get_hw_render(pass_info, sub_cmd->hw_render_idx); - const struct pvr_image_view *image_view; - const struct pvr_image *image; + const struct pvr_image_view *image_view = NULL; + const struct pvr_image *image = NULL; + uint32_t attachment_index; const VkOffset3D offset = { .x = rect->rect.offset.x, @@ -1965,82 +1967,157 @@ static VkResult pvr_add_deferred_rta_clear(struct pvr_cmd_buffer *cmd_buffer, attachment->aspectMask == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)); - image_view = pass_info->attachments[hw_render->ds_attach_idx]; + attachment_index = hw_render->ds_attach_idx; } else if (is_render_init) { - uint32_t index; - assert(attachment->colorAttachment < hw_render->color_init_count); - index = hw_render->color_init[attachment->colorAttachment].index; - - image_view = pass_info->attachments[index]; + attachment_index = + hw_render->color_init[attachment->colorAttachment].index; } else if (cmd_buffer->state.current_sub_cmd->is_dynamic_render) { const struct pvr_dynamic_render_info *dr_info = pass_info->dr_info; - const uint32_t index = + attachment_index = dr_info->color_attachments[attachment->colorAttachment].index_color; - - image_view = pass_info->attachments[index]; } else { const struct pvr_renderpass_hwsetup_subpass *hw_pass = pvr_arch_get_hw_subpass(pass_info->pass, pass_info->subpass_idx); const struct pvr_render_subpass *sub_pass = &pass_info->pass->subpasses[hw_pass->index]; - const uint32_t attachment_idx = + attachment_index = sub_pass->color_attachments[attachment->colorAttachment]; - assert(attachment->colorAttachment < sub_pass->color_count); - - image_view = pass_info->attachments[attachment_idx]; } - image = vk_to_pvr_image(image_view->vk.image); + if (pass_info->attachments) { + image_view = pass_info->attachments[attachment_index]; + image = vk_to_pvr_image(image_view->vk.image); + } else { + assert(cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY && + (cmd_buffer->usage_flags & + VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)); + } for (uint32_t i = 0; i < rect->layerCount; i++) { - struct pvr_transfer_cmd *transfer_cmd; uint32_t rt_id = rect->baseArrayLayer + i; - float depth = 0.0f; - uint32_t layer = 0; - /* Do not defer the clear of active render target */ if (hw_render->view_mask & (1 << rt_id)) continue; - transfer_cmd = pvr_transfer_cmd_alloc(cmd_buffer); - if (!transfer_cmd) - return VK_ERROR_OUT_OF_HOST_MEMORY; + if (pass_info->attachments) { + struct pvr_transfer_cmd *transfer_cmd; + float depth = 0.0f; + uint32_t layer = 0; - list_addtail(&transfer_cmd->link, &cmd_buffer->deferred_clears); + transfer_cmd = pvr_transfer_cmd_alloc(cmd_buffer); + if (!transfer_cmd) + return VK_ERROR_OUT_OF_HOST_MEMORY; - transfer_cmd->flags = PVR_TRANSFER_CMD_FLAGS_FILL; + list_addtail(&transfer_cmd->link, &cmd_buffer->deferred_clears); - if (attachment->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { - for (uint32_t j = 0; j < ARRAY_SIZE(transfer_cmd->clear_color); j++) { - transfer_cmd->clear_color[j].ui = - attachment->clearValue.color.uint32[j]; + transfer_cmd->flags = PVR_TRANSFER_CMD_FLAGS_FILL; + + if (attachment->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { + for (uint32_t j = 0; j < ARRAY_SIZE(transfer_cmd->clear_color); + j++) { + transfer_cmd->clear_color[j].ui = + attachment->clearValue.color.uint32[j]; + } + } else { + transfer_cmd->clear_color[0].f = + attachment->clearValue.depthStencil.depth; + transfer_cmd->clear_color[1].ui = + attachment->clearValue.depthStencil.stencil; } - } else { - transfer_cmd->clear_color[0].f = - attachment->clearValue.depthStencil.depth; - transfer_cmd->clear_color[1].ui = - attachment->clearValue.depthStencil.stencil; - } - pvr_set_rta_clear_layer_depth(image_view, rt_id, &layer, &depth); - pvr_setup_transfer_surface(cmd_buffer->device, - &transfer_cmd->dst, - &transfer_cmd->scissor, - image, - layer, - 0, - &offset, - &extent, - depth, - image->vk.format, - attachment->aspectMask); + pvr_set_rta_clear_layer_depth(image_view, rt_id, &layer, &depth); + pvr_setup_transfer_surface(cmd_buffer->device, + &transfer_cmd->dst, + &transfer_cmd->scissor, + image, + layer, + 0, + &offset, + &extent, + depth, + image->vk.format, + attachment->aspectMask); + } else { + struct pvr_unbound_deferred_clear recorded_clear; + + if (attachment->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) { + for (uint32_t j = 0; j < ARRAY_SIZE(recorded_clear.clear_color); + j++) { + recorded_clear.clear_color[j].ui = + attachment->clearValue.color.uint32[j]; + } + } else { + recorded_clear.clear_color[0].f = + attachment->clearValue.depthStencil.depth; + recorded_clear.clear_color[1].ui = + attachment->clearValue.depthStencil.stencil; + } + + recorded_clear.extent = extent; + recorded_clear.offset = offset; + recorded_clear.array_layer = rt_id; + recorded_clear.aspect_mask = attachment->aspectMask; + recorded_clear.attachment_index = attachment_index; + + util_dynarray_append(&sub_cmd->unbound_deferred_clears, + recorded_clear); + } } return VK_SUCCESS; } +VkResult pvr_bind_unbound_deferred_clear( + struct pvr_cmd_buffer *cmd_buffer, + struct pvr_unbound_deferred_clear *recorded_clear) +{ + struct pvr_render_pass_info *pass_info = &cmd_buffer->state.render_pass_info; + const struct pvr_image_view *image_view; + struct pvr_transfer_cmd *transfer_cmd; + const struct pvr_image *image; + float depth = 0.0f; + uint32_t layer = 0; + + image_view = pass_info->attachments[recorded_clear->attachment_index]; + image = vk_to_pvr_image(image_view->vk.image); + + transfer_cmd = pvr_transfer_cmd_alloc(cmd_buffer); + if (!transfer_cmd) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + list_addtail(&transfer_cmd->link, &cmd_buffer->deferred_clears); + + transfer_cmd->flags = PVR_TRANSFER_CMD_FLAGS_FILL; + + if (recorded_clear->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT) { + for (uint32_t i = 0; i < ARRAY_SIZE(transfer_cmd->clear_color); i++) + transfer_cmd->clear_color[i].ui = recorded_clear->clear_color[i].ui; + } else { + transfer_cmd->clear_color[0].f = recorded_clear->clear_color[0].f; + transfer_cmd->clear_color[1].ui = recorded_clear->clear_color[1].ui; + } + + pvr_set_rta_clear_layer_depth(image_view, + recorded_clear->array_layer, + &layer, + &depth); + pvr_setup_transfer_surface(cmd_buffer->device, + &transfer_cmd->dst, + &transfer_cmd->scissor, + image, + layer, + 0, + &recorded_clear->offset, + &recorded_clear->extent, + depth, + image->vk.format, + recorded_clear->aspect_mask); + + return VK_SUCCESS; +} + static void pvr_clear_attachments(struct pvr_cmd_buffer *cmd_buffer, uint32_t attachment_count, const VkClearAttachment *attachments, @@ -2279,21 +2356,15 @@ static void pvr_clear_attachments(struct pvr_cmd_buffer *cmd_buffer, if (!PVR_HAS_FEATURE(dev_info, gs_rta_support) && (clear_rect->baseArrayLayer != 0 || clear_rect->layerCount > 1)) { - if (pass_info->attachments) { - result = pvr_add_deferred_rta_clear(cmd_buffer, - attachment, - clear_rect, - is_render_init); - if (result != VK_SUCCESS) - return; + result = pvr_add_deferred_rta_clear(cmd_buffer, + attachment, + clear_rect, + is_render_init); + if (result != VK_SUCCESS) + return; - if (clear_rect->baseArrayLayer != 0) - continue; - - } else { - pvr_finishme( - "incomplete support for deferred (emulated) RTA clears"); - } + if (clear_rect->baseArrayLayer != 0) + continue; } /* TODO: Allocate all the buffers in one go before the loop, and add