diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2021-12-07 14:33:09 +0100 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2021-12-13 10:48:44 +0000 |
commit | 841949e50b3a98d0a2b0ad040ed31ba6331f2b2e (patch) | |
tree | ea77adb3425b108c0913898cad6333b026528e50 | |
parent | 43022ecc3af59fef83e1b2aa6212ac305bc694e6 (diff) |
radv: fix dynamic rendering inheritance if the subpass index isn't 0
The driver will always create only one subpass in the render pass
for inheritance but the subpass index isn't always zero.
This fixes dEQP-VK.multiview.dynamic_rendering.secondary_cmd_buffer*.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14109>
-rw-r--r-- | src/amd/vulkan/radv_cmd_buffer.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 6cfb8497482..922d72dde38 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -4372,14 +4372,9 @@ radv_ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags static void radv_inherit_dynamic_rendering(struct radv_cmd_buffer *cmd_buffer, - const VkCommandBufferInheritanceInfo *inherit_info) + const VkCommandBufferInheritanceInfo *inherit_info, + const VkCommandBufferInheritanceRenderingInfoKHR *dyn_info) { - const VkCommandBufferInheritanceRenderingInfoKHR *dyn_info = - vk_find_struct_const(inherit_info->pNext, COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR); - - if (!dyn_info) - return; - const VkAttachmentSampleCountInfoAMD *sample_info = vk_find_struct_const(inherit_info->pNext, ATTACHMENT_SAMPLE_COUNT_INFO_AMD); VkResult result; @@ -4503,16 +4498,26 @@ radv_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBegi if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY && (pBeginInfo->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) { + struct radv_subpass *subpass; + assert(pBeginInfo->pInheritanceInfo); + cmd_buffer->state.framebuffer = radv_framebuffer_from_handle(pBeginInfo->pInheritanceInfo->framebuffer); cmd_buffer->state.pass = radv_render_pass_from_handle(pBeginInfo->pInheritanceInfo->renderPass); - radv_inherit_dynamic_rendering(cmd_buffer, pBeginInfo->pInheritanceInfo); + const VkCommandBufferInheritanceRenderingInfoKHR *dyn_info = + vk_find_struct_const(pBeginInfo->pInheritanceInfo->pNext, + COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR); - struct radv_subpass *subpass = - &cmd_buffer->state.pass->subpasses[pBeginInfo->pInheritanceInfo->subpass]; + if (dyn_info) { + radv_inherit_dynamic_rendering(cmd_buffer, pBeginInfo->pInheritanceInfo, dyn_info); + subpass = &cmd_buffer->state.pass->subpasses[0]; + } else { + assert(pBeginInfo->pInheritanceInfo->subpass < cmd_buffer->state.pass->subpass_count); + subpass = &cmd_buffer->state.pass->subpasses[pBeginInfo->pInheritanceInfo->subpass]; + } if (cmd_buffer->state.framebuffer) { result = radv_cmd_state_setup_attachments(cmd_buffer, cmd_buffer->state.pass, NULL, NULL); |