Module: Mesa Branch: main Commit: 70e663aa215c590e0015f936631436a6b6ecc107 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=70e663aa215c590e0015f936631436a6b6ecc107
Author: Samuel Pitoiset <[email protected]> Date: Wed Mar 16 16:07:58 2022 +0100 radv: convert the meta depth decompression path to dynamic rendering Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15612> --- src/amd/vulkan/radv_meta_decompress.c | 167 ++++++++++------------------------ src/amd/vulkan/radv_private.h | 1 - 2 files changed, 46 insertions(+), 122 deletions(-) diff --git a/src/amd/vulkan/radv_meta_decompress.c b/src/amd/vulkan/radv_meta_decompress.c index cb70e569e92..0df3d9476a7 100644 --- a/src/amd/vulkan/radv_meta_decompress.c +++ b/src/amd/vulkan/radv_meta_decompress.c @@ -148,74 +148,6 @@ cleanup: return result; } -static VkResult -create_pass(struct radv_device *device, uint32_t samples, VkRenderPass *pass) -{ - VkResult result; - VkDevice device_h = radv_device_to_handle(device); - const VkAllocationCallbacks *alloc = &device->meta_state.alloc; - VkAttachmentDescription2 attachment; - - attachment.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2; - attachment.pNext = NULL; - attachment.flags = 0; - attachment.format = VK_FORMAT_D32_SFLOAT_S8_UINT; - attachment.samples = samples; - attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; - attachment.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - attachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - result = radv_CreateRenderPass2( - device_h, - &(VkRenderPassCreateInfo2){ - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2, - .attachmentCount = 1, - .pAttachments = &attachment, - .subpassCount = 1, - .pSubpasses = - &(VkSubpassDescription2){ - .sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2, - .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, - .inputAttachmentCount = 0, - .colorAttachmentCount = 0, - .pColorAttachments = NULL, - .pResolveAttachments = NULL, - .pDepthStencilAttachment = - &(VkAttachmentReference2){ - .sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2, - .attachment = 0, - .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, - }, - .preserveAttachmentCount = 0, - .pPreserveAttachments = NULL, - }, - .dependencyCount = 2, - .pDependencies = - (VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, - .srcSubpass = VK_SUBPASS_EXTERNAL, - .dstSubpass = 0, - .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, - .srcAccessMask = 0, - .dstAccessMask = 0, - .dependencyFlags = 0}, - {.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2, - .srcSubpass = 0, - .dstSubpass = VK_SUBPASS_EXTERNAL, - .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, - .srcAccessMask = 0, - .dstAccessMask = 0, - .dependencyFlags = 0}}, - }, - alloc, pass); - - return result; -} - static VkResult create_pipeline_layout(struct radv_device *device, VkPipelineLayout *layout) { @@ -232,8 +164,8 @@ create_pipeline_layout(struct radv_device *device, VkPipelineLayout *layout) } static VkResult -create_pipeline(struct radv_device *device, uint32_t samples, VkRenderPass pass, - VkPipelineLayout layout, enum radv_depth_op op, VkPipeline *pipeline) +create_pipeline(struct radv_device *device, uint32_t samples, VkPipelineLayout layout, + enum radv_depth_op op, VkPipeline *pipeline) { VkResult result; VkDevice device_h = radv_device_to_handle(device); @@ -258,8 +190,15 @@ create_pipeline(struct radv_device *device, uint32_t samples, VkRenderPass pass, .sampleLocationsEnable = false, }; + const VkPipelineRenderingCreateInfo rendering_create_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, + .depthAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT, + .stencilAttachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT, + }; + const VkGraphicsPipelineCreateInfo pipeline_create_info = { .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .pNext = &rendering_create_info, .stageCount = 2, .pStages = (VkPipelineShaderStageCreateInfo[]){ @@ -340,7 +279,7 @@ create_pipeline(struct radv_device *device, uint32_t samples, VkRenderPass pass, }, }, .layout = layout, - .renderPass = pass, + .renderPass = VK_NULL_HANDLE, .subpass = 0, }; @@ -368,8 +307,6 @@ radv_device_finish_meta_depth_decomp_state(struct radv_device *device) struct radv_meta_state *state = &device->meta_state; for (uint32_t i = 0; i < ARRAY_SIZE(state->depth_decomp); ++i) { - radv_DestroyRenderPass(radv_device_to_handle(device), state->depth_decomp[i].pass, - &state->alloc); radv_DestroyPipelineLayout(radv_device_to_handle(device), state->depth_decomp[i].p_layout, &state->alloc); @@ -396,10 +333,6 @@ radv_device_init_meta_depth_decomp_state(struct radv_device *device, bool on_dem for (uint32_t i = 0; i < ARRAY_SIZE(state->depth_decomp); ++i) { uint32_t samples = 1 << i; - res = create_pass(device, samples, &state->depth_decomp[i].pass); - if (res != VK_SUCCESS) - goto fail; - res = create_pipeline_layout(device, &state->depth_decomp[i].p_layout); if (res != VK_SUCCESS) goto fail; @@ -407,14 +340,12 @@ radv_device_init_meta_depth_decomp_state(struct radv_device *device, bool on_dem if (on_demand) continue; - res = create_pipeline(device, samples, state->depth_decomp[i].pass, - state->depth_decomp[i].p_layout, DEPTH_DECOMPRESS, + res = create_pipeline(device, samples, state->depth_decomp[i].p_layout, DEPTH_DECOMPRESS, &state->depth_decomp[i].decompress_pipeline); if (res != VK_SUCCESS) goto fail; - res = create_pipeline(device, samples, state->depth_decomp[i].pass, - state->depth_decomp[i].p_layout, DEPTH_RESUMMARIZE, + res = create_pipeline(device, samples, state->depth_decomp[i].p_layout, DEPTH_RESUMMARIZE, &state->depth_decomp[i].resummarize_pipeline); if (res != VK_SUCCESS) goto fail; @@ -443,17 +374,15 @@ radv_get_depth_pipeline(struct radv_cmd_buffer *cmd_buffer, struct radv_image *i if (!state->depth_decomp[samples_log2].decompress_pipeline) { VkResult ret; - ret = create_pipeline(cmd_buffer->device, samples, state->depth_decomp[samples_log2].pass, - state->depth_decomp[samples_log2].p_layout, DEPTH_DECOMPRESS, - &state->depth_decomp[samples_log2].decompress_pipeline); + ret = create_pipeline(cmd_buffer->device, samples, state->depth_decomp[samples_log2].p_layout, + DEPTH_DECOMPRESS, &state->depth_decomp[samples_log2].decompress_pipeline); if (ret != VK_SUCCESS) { cmd_buffer->record_result = ret; return NULL; } - ret = create_pipeline(cmd_buffer->device, samples, state->depth_decomp[samples_log2].pass, - state->depth_decomp[samples_log2].p_layout, DEPTH_RESUMMARIZE, - &state->depth_decomp[samples_log2].resummarize_pipeline); + ret = create_pipeline(cmd_buffer->device, samples, state->depth_decomp[samples_log2].p_layout, + DEPTH_RESUMMARIZE, &state->depth_decomp[samples_log2].resummarize_pipeline); if (ret != VK_SUCCESS) { cmd_buffer->record_result = ret; return NULL; @@ -479,8 +408,6 @@ radv_process_depth_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_i const VkImageSubresourceRange *range, int level, int layer) { struct radv_device *device = cmd_buffer->device; - struct radv_meta_state *state = &device->meta_state; - uint32_t samples_log2 = ffs(image->info.samples) - 1; struct radv_image_view iview; uint32_t width, height; @@ -504,42 +431,40 @@ radv_process_depth_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_i }, NULL); - VkFramebuffer fb_h; - radv_CreateFramebuffer( - radv_device_to_handle(device), - &(VkFramebufferCreateInfo){.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, - .attachmentCount = 1, - .pAttachments = (VkImageView[]){radv_image_view_to_handle(&iview)}, - .width = width, - .height = height, - .layers = 1}, - &cmd_buffer->pool->vk.alloc, &fb_h); - - radv_cmd_buffer_begin_render_pass(cmd_buffer, - &(VkRenderPassBeginInfo){ - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, - .renderPass = state->depth_decomp[samples_log2].pass, - .framebuffer = fb_h, - .renderArea = {.offset = - { - 0, - 0, - }, - .extent = - { - width, - height, - }}, - .clearValueCount = 0, - .pClearValues = NULL, - }); - radv_cmd_buffer_set_subpass(cmd_buffer, &cmd_buffer->state.pass->subpasses[0]); + const VkRenderingAttachmentInfo depth_att = { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .imageView = radv_image_view_to_handle(&iview), + .imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + }; + + const VkRenderingAttachmentInfo stencil_att = { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .imageView = radv_image_view_to_handle(&iview), + .imageLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + }; + + const VkRenderingInfo rendering_info = { + .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, + .renderArea = { + .offset = { 0, 0 }, + .extent = { width, height } + }, + .layerCount = 1, + .pDepthAttachment = &depth_att, + .pStencilAttachment = &stencil_att, + }; + + radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info); radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0); - radv_cmd_buffer_end_render_pass(cmd_buffer); + + radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer)); radv_image_view_finish(&iview); - radv_DestroyFramebuffer(radv_device_to_handle(device), fb_h, &cmd_buffer->pool->vk.alloc); } static void diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index b30c65aff71..aa9536cca83 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -630,7 +630,6 @@ struct radv_meta_state { VkPipelineLayout p_layout; VkPipeline decompress_pipeline; VkPipeline resummarize_pipeline; - VkRenderPass pass; } depth_decomp[MAX_SAMPLES_LOG2]; VkDescriptorSetLayout expand_depth_stencil_compute_ds_layout;
