mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 14:20:11 +01:00
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:
parent
39725fc935
commit
c8f6b27964
4 changed files with 69 additions and 116 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue