diff --git a/src/amd/vulkan/meta/radv_meta.h b/src/amd/vulkan/meta/radv_meta.h index 99f906f442b..b6279f773bd 100644 --- a/src/amd/vulkan/meta/radv_meta.h +++ b/src/amd/vulkan/meta/radv_meta.h @@ -276,15 +276,21 @@ void radv_cmd_buffer_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, st VkImageLayout src_layout, struct radv_image_view *dst_iview, VkImageLayout dst_layout, const VkImageResolve2 *region); -void radv_depth_stencil_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, VkImageAspectFlags aspects, - VkResolveModeFlagBits resolve_mode); +void radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, + VkFormat src_format, VkImageLayout src_image_layout, + struct radv_image *dst_image, VkFormat dst_format, + VkImageLayout dst_image_layout, VkResolveModeFlagBits resolve_mode, + const VkImageResolve2 *region); void radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview, VkImageLayout src_layout, struct radv_image_view *dst_iview, VkImageLayout dst_layout); -void radv_depth_stencil_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, VkImageAspectFlags aspects, - VkResolveModeFlagBits resolve_mode); +void radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, + VkFormat src_format, VkImageLayout src_image_layout, + struct radv_image *dst_image, VkFormat dst_format, + VkImageLayout dst_image_layout, VkResolveModeFlagBits resolve_mode, + const VkImageResolve2 *region, uint32_t view_mask); VkResult radv_meta_get_noop_pipeline_layout(struct radv_device *device, VkPipelineLayout *layout_out); diff --git a/src/amd/vulkan/meta/radv_meta_resolve.c b/src/amd/vulkan/meta/radv_meta_resolve.c index b485d3c234e..1e4720df809 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve.c +++ b/src/amd/vulkan/meta/radv_meta_resolve.c @@ -524,6 +524,11 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer) const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_rendering_state *render = &cmd_buffer->state.render; enum radv_resolve_method resolve_method = pdev->info.gfx_level >= GFX11 ? RESOLVE_FRAGMENT : RESOLVE_HW; + uint32_t layer_count = render->layer_count; + VkRect2D resolve_area = render->area; + + if (render->view_mask) + layer_count = util_last_bit(render->view_mask); bool has_color_resolve = false; for (uint32_t i = 0; i < render->color_att_count; ++i) { @@ -556,24 +561,68 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer) dst_iview->vk.base_mip_level, VK_IMAGE_LAYOUT_UNDEFINED, cmd_buffer, &resolve_method); - if ((src_iview->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT) && render->ds_att.resolve_mode != VK_RESOLVE_MODE_NONE) { + VkImageResolve2 region = { + .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, + .extent = + { + .width = resolve_area.extent.width, + .height = resolve_area.extent.height, + .depth = layer_count, + }, + .srcSubresource = + (VkImageSubresourceLayers){ + .aspectMask = src_iview->vk.aspects, + .mipLevel = src_iview->vk.base_mip_level, + .baseArrayLayer = src_iview->vk.base_array_layer, + .layerCount = layer_count, + }, + .dstSubresource = + (VkImageSubresourceLayers){ + .aspectMask = dst_iview->vk.aspects, + .mipLevel = dst_iview->vk.base_mip_level, + .baseArrayLayer = dst_iview->vk.base_array_layer, + .layerCount = layer_count, + }, + .srcOffset = {resolve_area.offset.x, resolve_area.offset.y, 0}, + .dstOffset = {resolve_area.offset.x, resolve_area.offset.y, 0}, + }; + + if ((region.srcSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) && + render->ds_att.resolve_mode != VK_RESOLVE_MODE_NONE) { + VkImageResolve2 depth_region = region; + depth_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + depth_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + if (resolve_method == RESOLVE_FRAGMENT) { - radv_depth_stencil_resolve_rendering_fs(cmd_buffer, VK_IMAGE_ASPECT_DEPTH_BIT, render->ds_att.resolve_mode); + radv_meta_resolve_depth_stencil_fs(cmd_buffer, src_iview->image, src_iview->vk.format, + render->ds_att.layout, dst_iview->image, dst_iview->vk.format, + render->ds_att.resolve_layout, render->ds_att.resolve_mode, + &depth_region, render->view_mask); } else { assert(resolve_method == RESOLVE_COMPUTE); - radv_depth_stencil_resolve_rendering_cs(cmd_buffer, VK_IMAGE_ASPECT_DEPTH_BIT, render->ds_att.resolve_mode); + radv_meta_resolve_depth_stencil_cs( + cmd_buffer, src_iview->image, src_iview->vk.format, render->ds_att.layout, dst_iview->image, + dst_iview->vk.format, render->ds_att.resolve_layout, render->ds_att.resolve_mode, &depth_region); } } - if ((src_iview->vk.aspects & VK_IMAGE_ASPECT_STENCIL_BIT) && + if ((region.srcSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) && render->ds_att.stencil_resolve_mode != VK_RESOLVE_MODE_NONE) { + VkImageResolve2 stencil_region = region; + stencil_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; + stencil_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; + if (resolve_method == RESOLVE_FRAGMENT) { - radv_depth_stencil_resolve_rendering_fs(cmd_buffer, VK_IMAGE_ASPECT_STENCIL_BIT, - render->ds_att.stencil_resolve_mode); + radv_meta_resolve_depth_stencil_fs(cmd_buffer, src_iview->image, src_iview->vk.format, + render->ds_att.stencil_layout, dst_iview->image, dst_iview->vk.format, + render->ds_att.stencil_resolve_layout, + render->ds_att.stencil_resolve_mode, &stencil_region, render->view_mask); } else { assert(resolve_method == RESOLVE_COMPUTE); - radv_depth_stencil_resolve_rendering_cs(cmd_buffer, VK_IMAGE_ASPECT_STENCIL_BIT, - render->ds_att.stencil_resolve_mode); + radv_meta_resolve_depth_stencil_cs(cmd_buffer, src_iview->image, src_iview->vk.format, + render->ds_att.stencil_layout, dst_iview->image, dst_iview->vk.format, + render->ds_att.stencil_resolve_layout, + render->ds_att.stencil_resolve_mode, &stencil_region); } } @@ -599,12 +648,6 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer) } if (has_color_resolve) { - uint32_t layer_count = render->layer_count; - VkRect2D resolve_area = render->area; - - if (render->view_mask) - layer_count = util_last_bit(render->view_mask); - for (uint32_t i = 0; i < render->color_att_count; ++i) { if (render->color_att[i].resolve_iview == NULL) continue; diff --git a/src/amd/vulkan/meta/radv_meta_resolve_cs.c b/src/amd/vulkan/meta/radv_meta_resolve_cs.c index f56990a5a39..84c3917a15a 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve_cs.c +++ b/src/amd/vulkan/meta/radv_meta_resolve_cs.c @@ -366,7 +366,7 @@ radv_cmd_buffer_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, struct VK_ACCESS_2_SHADER_WRITE_BIT, 0, NULL, NULL); } -static void +void radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkFormat src_format, VkImageLayout src_image_layout, struct radv_image *dst_image, VkFormat dst_format, VkImageLayout dst_image_layout, @@ -495,51 +495,3 @@ radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, struct ra cmd_buffer->state.flush_bits |= radv_clear_htile(cmd_buffer, dst_image, &range, htile_value, false); } } - -void -radv_depth_stencil_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, VkImageAspectFlags aspects, - VkResolveModeFlagBits resolve_mode) -{ - const struct radv_rendering_state *render = &cmd_buffer->state.render; - uint32_t layer_count = render->layer_count; - - if (render->view_mask) - layer_count = util_last_bit(render->view_mask); - - struct radv_image_view *src_iview = render->ds_att.iview; - VkImageLayout src_image_layout = - aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.layout : render->ds_att.stencil_layout; - - struct radv_image_view *dst_iview = render->ds_att.resolve_iview; - VkImageLayout dst_image_layout = - aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.resolve_layout : render->ds_att.stencil_resolve_layout; - - const VkImageResolve2 region = { - .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, - .extent = - { - .width = render->area.extent.width, - .height = render->area.extent.height, - .depth = layer_count, - }, - .srcSubresource = - (VkImageSubresourceLayers){ - .aspectMask = aspects, - .mipLevel = 0, - .baseArrayLayer = src_iview->vk.base_array_layer, - .layerCount = layer_count, - }, - .dstSubresource = - (VkImageSubresourceLayers){ - .aspectMask = aspects, - .mipLevel = dst_iview->vk.base_mip_level, - .baseArrayLayer = dst_iview->vk.base_array_layer, - .layerCount = layer_count, - }, - .srcOffset = {render->area.offset.x, render->area.offset.y, 0}, - .dstOffset = {render->area.offset.x, render->area.offset.y, 0}, - }; - - radv_meta_resolve_depth_stencil_cs(cmd_buffer, src_iview->image, src_iview->vk.format, src_image_layout, - dst_iview->image, dst_iview->vk.format, dst_image_layout, resolve_mode, ®ion); -} diff --git a/src/amd/vulkan/meta/radv_meta_resolve_fs.c b/src/amd/vulkan/meta/radv_meta_resolve_fs.c index 4ab4b9d5f1d..1ec19bd4579 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve_fs.c +++ b/src/amd/vulkan/meta/radv_meta_resolve_fs.c @@ -584,7 +584,7 @@ radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_restore(&saved_state, cmd_buffer); } -static void +void radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkFormat src_format, VkImageLayout src_image_layout, struct radv_image *dst_image, VkFormat dst_format, VkImageLayout dst_image_layout, @@ -709,51 +709,3 @@ radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct ra radv_meta_restore(&saved_state, cmd_buffer); } - -/** - * Depth/stencil resolves for the current rendering. - */ -void -radv_depth_stencil_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, VkImageAspectFlags aspects, - VkResolveModeFlagBits resolve_mode) -{ - const struct radv_rendering_state *render = &cmd_buffer->state.render; - - struct radv_image_view *src_iview = render->ds_att.iview; - VkImageLayout src_image_layout = - aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.layout : render->ds_att.stencil_layout; - - struct radv_image_view *dst_iview = render->ds_att.resolve_iview; - VkImageLayout dst_image_layout = - aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.resolve_layout : render->ds_att.stencil_resolve_layout; - - const VkImageResolve2 region = { - .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, - .extent = - { - .width = render->area.extent.width, - .height = render->area.extent.height, - .depth = 1, - }, - .srcSubresource = - (VkImageSubresourceLayers){ - .aspectMask = aspects, - .mipLevel = 0, - .baseArrayLayer = src_iview->vk.base_array_layer, - .layerCount = 1, - }, - .dstSubresource = - (VkImageSubresourceLayers){ - .aspectMask = aspects, - .mipLevel = dst_iview->vk.base_mip_level, - .baseArrayLayer = dst_iview->vk.base_array_layer, - .layerCount = 1, - }, - .srcOffset = {render->area.offset.x, render->area.offset.y, 0}, - .dstOffset = {render->area.offset.x, render->area.offset.y, 0}, - }; - - radv_meta_resolve_depth_stencil_fs(cmd_buffer, src_iview->image, src_iview->vk.format, src_image_layout, - dst_iview->image, dst_iview->vk.format, dst_image_layout, resolve_mode, ®ion, - render->view_mask); -}