From 18ccde4d68b0f8f2e89e2ae6a2d58cdbf900aaed Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 6 Jun 2019 11:46:21 +0200 Subject: radv: add radv_process_depth_image_layer() helper Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_meta_decompress.c | 138 ++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 63 deletions(-) (limited to 'src/amd/vulkan/radv_meta_decompress.c') diff --git a/src/amd/vulkan/radv_meta_decompress.c b/src/amd/vulkan/radv_meta_decompress.c index 027ab299c15..262dfd67b3c 100644 --- a/src/amd/vulkan/radv_meta_decompress.c +++ b/src/amd/vulkan/radv_meta_decompress.c @@ -357,6 +357,77 @@ radv_get_depth_pipeline(struct radv_cmd_buffer *cmd_buffer, return pipeline; } +static void +radv_process_depth_image_layer(struct radv_cmd_buffer *cmd_buffer, + struct radv_image *image, + const VkImageSubresourceRange *range, + 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; + + width = radv_minify(image->info.width, range->baseMipLevel); + height = radv_minify(image->info.height, range->baseMipLevel); + + radv_image_view_init(&iview, device, + &(VkImageViewCreateInfo) { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = radv_image_to_handle(image), + .viewType = radv_meta_get_view_type(image), + .format = image->vk_format, + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, + .baseMipLevel = range->baseMipLevel, + .levelCount = 1, + .baseArrayLayer = range->baseArrayLayer + layer, + .layerCount = 1, + }, + }, 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->alloc, &fb_h); + + radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(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, + }, + VK_SUBPASS_CONTENTS_INLINE); + + radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0); + radv_CmdEndRenderPass(radv_cmd_buffer_to_handle(cmd_buffer)); + + radv_DestroyFramebuffer(radv_device_to_handle(device), fb_h, + &cmd_buffer->pool->alloc); +} + static void radv_process_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image, VkImageSubresourceRange *subresourceRange, @@ -364,15 +435,11 @@ static void radv_process_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer, enum radv_depth_op op) { struct radv_meta_saved_state saved_state; - VkDevice device_h = radv_device_to_handle(cmd_buffer->device); VkCommandBuffer cmd_buffer_h = radv_cmd_buffer_to_handle(cmd_buffer); uint32_t width = radv_minify(image->info.width, subresourceRange->baseMipLevel); uint32_t height = radv_minify(image->info.height, subresourceRange->baseMipLevel); - uint32_t samples = image->info.samples; - uint32_t samples_log2 = ffs(samples) - 1; - struct radv_meta_state *meta_state = &cmd_buffer->device->meta_state; VkPipeline *pipeline; if (!radv_image_has_htile(image)) @@ -417,66 +484,11 @@ static void radv_process_depth_image_inplace(struct radv_cmd_buffer *cmd_buffer, }); } - for (uint32_t layer = 0; layer < radv_get_layerCount(image, subresourceRange); layer++) { - struct radv_image_view iview; - - radv_image_view_init(&iview, cmd_buffer->device, - &(VkImageViewCreateInfo) { - .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, - .image = radv_image_to_handle(image), - .viewType = radv_meta_get_view_type(image), - .format = image->vk_format, - .subresourceRange = { - .aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT, - .baseMipLevel = subresourceRange->baseMipLevel, - .levelCount = 1, - .baseArrayLayer = subresourceRange->baseArrayLayer + layer, - .layerCount = 1, - }, - }, NULL); - - - VkFramebuffer fb_h; - radv_CreateFramebuffer(device_h, - &(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->alloc, - &fb_h); - - radv_CmdBeginRenderPass(cmd_buffer_h, - &(VkRenderPassBeginInfo) { - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, - .renderPass = meta_state->depth_decomp[samples_log2].pass, - .framebuffer = fb_h, - .renderArea = { - .offset = { - 0, - 0, - }, - .extent = { - width, - height, - } - }, - .clearValueCount = 0, - .pClearValues = NULL, - }, - VK_SUBPASS_CONTENTS_INLINE); - - radv_CmdDraw(cmd_buffer_h, 3, 1, 0, 0); - radv_CmdEndRenderPass(cmd_buffer_h); - - radv_DestroyFramebuffer(device_h, fb_h, - &cmd_buffer->pool->alloc); + for (uint32_t s = 0; s < radv_get_layerCount(image, subresourceRange); s++) { + radv_process_depth_image_layer(cmd_buffer, image, + subresourceRange, s); } + radv_meta_restore(&saved_state, cmd_buffer); } -- cgit v1.2.3