From e41436beec4bbd4a2bb627018f0628d68113b948 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Iv=C3=A1n=20Briano?= Date: Thu, 4 Nov 2021 12:30:20 -0700 Subject: [PATCH] anv: allocate fake render pass for continuation command buffers v4: Assert if there's no VkCommandBufferInheritanceRenderingInfoKHR (Lionel) Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_private.h | 2 + src/intel/vulkan/genX_cmd_buffer.c | 90 ++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 8d2fa29..d54c6c0 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3086,6 +3086,8 @@ struct anv_cmd_state { * is one of the states in attachment_states. */ struct anv_state null_surface_state; + + struct anv_dynamic_render_pass dynamic_render_pass; }; struct anv_cmd_pool { diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 6dc1780..9517ac6 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -1817,43 +1817,75 @@ genX(BeginCommandBuffer)( assert(pBeginInfo->pInheritanceInfo); ANV_FROM_HANDLE(anv_render_pass, pass, pBeginInfo->pInheritanceInfo->renderPass); - struct anv_subpass *subpass = - &pass->subpasses[pBeginInfo->pInheritanceInfo->subpass]; - ANV_FROM_HANDLE(anv_framebuffer, framebuffer, - pBeginInfo->pInheritanceInfo->framebuffer); + struct anv_subpass *subpass; + if (!pass) { + const VkCommandBufferInheritanceRenderingInfoKHR *inheritance_info = + vk_find_struct_const(pBeginInfo->pInheritanceInfo->pNext, + COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR); + assert(inheritance_info); + struct anv_dynamic_pass_create_info info = { + .viewMask = inheritance_info->viewMask, + .colorAttachmentCount = inheritance_info->colorAttachmentCount, + .pColorAttachmentFormats = inheritance_info->pColorAttachmentFormats, + .depthAttachmentFormat = inheritance_info->depthAttachmentFormat, + .stencilAttachmentFormat = inheritance_info->stencilAttachmentFormat, + .rasterizationSamples = inheritance_info->rasterizationSamples, + }; + anv_dynamic_pass_init(&cmd_buffer->state.dynamic_render_pass, &info); + pass = &cmd_buffer->state.dynamic_render_pass.pass; + subpass = &cmd_buffer->state.dynamic_render_pass.subpass; + + result = cmd_buffer_alloc_state_attachments(cmd_buffer, + pass->attachment_count); + if (result != VK_SUCCESS) + return result; + + result = genX(cmd_buffer_alloc_att_surf_states)(cmd_buffer, pass, + subpass); + if (result != VK_SUCCESS) + return result; + + cmd_buffer->state.pass = pass; + cmd_buffer->state.subpass = subpass; + } else { + subpass = &pass->subpasses[pBeginInfo->pInheritanceInfo->subpass]; - cmd_buffer->state.pass = pass; - cmd_buffer->state.subpass = subpass; + ANV_FROM_HANDLE(anv_framebuffer, framebuffer, + pBeginInfo->pInheritanceInfo->framebuffer); - /* This is optional in the inheritance info. */ - cmd_buffer->state.framebuffer = framebuffer; + cmd_buffer->state.pass = pass; + cmd_buffer->state.subpass = subpass; - result = genX(cmd_buffer_setup_attachments)(cmd_buffer, pass, - framebuffer, NULL); - if (result != VK_SUCCESS) - return result; + /* This is optional in the inheritance info. */ + cmd_buffer->state.framebuffer = framebuffer; - result = genX(cmd_buffer_alloc_att_surf_states)(cmd_buffer, pass, - subpass); - if (result != VK_SUCCESS) - return result; + result = genX(cmd_buffer_setup_attachments)(cmd_buffer, pass, + framebuffer, NULL); + if (result != VK_SUCCESS) + return result; + + result = genX(cmd_buffer_alloc_att_surf_states)(cmd_buffer, pass, + subpass); + if (result != VK_SUCCESS) + return result; - /* Record that HiZ is enabled if we can. */ - if (cmd_buffer->state.framebuffer) { - const struct anv_image_view * const iview = - anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); + /* Record that HiZ is enabled if we can. */ + if (cmd_buffer->state.framebuffer) { + const struct anv_image_view * const iview = + anv_cmd_buffer_get_depth_stencil_view(cmd_buffer); - if (iview) { - VkImageLayout layout = - cmd_buffer->state.subpass->depth_stencil_attachment->layout; + if (iview) { + VkImageLayout layout = + cmd_buffer->state.subpass->depth_stencil_attachment->layout; - enum isl_aux_usage aux_usage = - anv_layout_to_aux_usage(&cmd_buffer->device->info, iview->image, - VK_IMAGE_ASPECT_DEPTH_BIT, - VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, - layout); + enum isl_aux_usage aux_usage = + anv_layout_to_aux_usage(&cmd_buffer->device->info, iview->image, + VK_IMAGE_ASPECT_DEPTH_BIT, + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + layout); - cmd_buffer->state.hiz_enabled = isl_aux_usage_has_hiz(aux_usage); + cmd_buffer->state.hiz_enabled = isl_aux_usage_has_hiz(aux_usage); + } } } -- 2.7.4