radv/meta: simplify calling depth/stencil resolve helpers

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37300>
This commit is contained in:
Samuel Pitoiset 2025-09-10 16:14:51 +02:00 committed by Marge Bot
parent 39725fc935
commit c8f6b27964
4 changed files with 69 additions and 116 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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, &region);
}

View file

@ -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, &region,
render->view_mask);
}