mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 11:38:05 +02:00
anv: blorp: support multiple aspect blits
Newer blit tests are enabling depth&stencils blits. We currently don't support it but can do by iterating over the aspects masks (copy some logic from the CopyImage function). Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Fixes:9f44745eca("anv: Use blorp to implement VkBlitImage") Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> (cherry picked from commit5a1c23d150)
This commit is contained in:
parent
d7065dc401
commit
7a9b95bd7e
1 changed files with 77 additions and 73 deletions
|
|
@ -533,82 +533,86 @@ void anv_CmdBlitImage(
|
|||
const VkImageSubresourceLayers *src_res = &pRegions[r].srcSubresource;
|
||||
const VkImageSubresourceLayers *dst_res = &pRegions[r].dstSubresource;
|
||||
|
||||
get_blorp_surf_for_anv_image(cmd_buffer->device,
|
||||
src_image, src_res->aspectMask,
|
||||
srcImageLayout, ISL_AUX_USAGE_NONE, &src);
|
||||
get_blorp_surf_for_anv_image(cmd_buffer->device,
|
||||
dst_image, dst_res->aspectMask,
|
||||
dstImageLayout, ISL_AUX_USAGE_NONE, &dst);
|
||||
assert(anv_image_aspects_compatible(src_res->aspectMask,
|
||||
dst_res->aspectMask));
|
||||
|
||||
struct anv_format_plane src_format =
|
||||
anv_get_format_plane(&cmd_buffer->device->info, src_image->vk_format,
|
||||
src_res->aspectMask, src_image->tiling);
|
||||
struct anv_format_plane dst_format =
|
||||
anv_get_format_plane(&cmd_buffer->device->info, dst_image->vk_format,
|
||||
dst_res->aspectMask, dst_image->tiling);
|
||||
uint32_t aspect_bit;
|
||||
anv_foreach_image_aspect_bit(aspect_bit, src_image, src_res->aspectMask) {
|
||||
get_blorp_surf_for_anv_image(cmd_buffer->device,
|
||||
src_image, 1U << aspect_bit,
|
||||
srcImageLayout, ISL_AUX_USAGE_NONE, &src);
|
||||
get_blorp_surf_for_anv_image(cmd_buffer->device,
|
||||
dst_image, 1U << aspect_bit,
|
||||
dstImageLayout, ISL_AUX_USAGE_NONE, &dst);
|
||||
|
||||
unsigned dst_start, dst_end;
|
||||
if (dst_image->type == VK_IMAGE_TYPE_3D) {
|
||||
assert(dst_res->baseArrayLayer == 0);
|
||||
dst_start = pRegions[r].dstOffsets[0].z;
|
||||
dst_end = pRegions[r].dstOffsets[1].z;
|
||||
} else {
|
||||
dst_start = dst_res->baseArrayLayer;
|
||||
dst_end = dst_start + anv_get_layerCount(dst_image, dst_res);
|
||||
struct anv_format_plane src_format =
|
||||
anv_get_format_plane(&cmd_buffer->device->info, src_image->vk_format,
|
||||
1U << aspect_bit, src_image->tiling);
|
||||
struct anv_format_plane dst_format =
|
||||
anv_get_format_plane(&cmd_buffer->device->info, dst_image->vk_format,
|
||||
1U << aspect_bit, dst_image->tiling);
|
||||
|
||||
unsigned dst_start, dst_end;
|
||||
if (dst_image->type == VK_IMAGE_TYPE_3D) {
|
||||
assert(dst_res->baseArrayLayer == 0);
|
||||
dst_start = pRegions[r].dstOffsets[0].z;
|
||||
dst_end = pRegions[r].dstOffsets[1].z;
|
||||
} else {
|
||||
dst_start = dst_res->baseArrayLayer;
|
||||
dst_end = dst_start + anv_get_layerCount(dst_image, dst_res);
|
||||
}
|
||||
|
||||
unsigned src_start, src_end;
|
||||
if (src_image->type == VK_IMAGE_TYPE_3D) {
|
||||
assert(src_res->baseArrayLayer == 0);
|
||||
src_start = pRegions[r].srcOffsets[0].z;
|
||||
src_end = pRegions[r].srcOffsets[1].z;
|
||||
} else {
|
||||
src_start = src_res->baseArrayLayer;
|
||||
src_end = src_start + anv_get_layerCount(src_image, src_res);
|
||||
}
|
||||
|
||||
bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);
|
||||
float src_z_step = (float)(src_end + 1 - src_start) /
|
||||
(float)(dst_end + 1 - dst_start);
|
||||
|
||||
if (flip_z) {
|
||||
src_start = src_end;
|
||||
src_z_step *= -1;
|
||||
}
|
||||
|
||||
unsigned src_x0 = pRegions[r].srcOffsets[0].x;
|
||||
unsigned src_x1 = pRegions[r].srcOffsets[1].x;
|
||||
unsigned dst_x0 = pRegions[r].dstOffsets[0].x;
|
||||
unsigned dst_x1 = pRegions[r].dstOffsets[1].x;
|
||||
bool flip_x = flip_coords(&src_x0, &src_x1, &dst_x0, &dst_x1);
|
||||
|
||||
unsigned src_y0 = pRegions[r].srcOffsets[0].y;
|
||||
unsigned src_y1 = pRegions[r].srcOffsets[1].y;
|
||||
unsigned dst_y0 = pRegions[r].dstOffsets[0].y;
|
||||
unsigned dst_y1 = pRegions[r].dstOffsets[1].y;
|
||||
bool flip_y = flip_coords(&src_y0, &src_y1, &dst_y0, &dst_y1);
|
||||
|
||||
const unsigned num_layers = dst_end - dst_start;
|
||||
anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
|
||||
1U << aspect_bit,
|
||||
dst.aux_usage,
|
||||
dst_res->mipLevel,
|
||||
dst_start, num_layers);
|
||||
|
||||
for (unsigned i = 0; i < num_layers; i++) {
|
||||
unsigned dst_z = dst_start + i;
|
||||
unsigned src_z = src_start + i * src_z_step;
|
||||
|
||||
blorp_blit(&batch, &src, src_res->mipLevel, src_z,
|
||||
src_format.isl_format, src_format.swizzle,
|
||||
&dst, dst_res->mipLevel, dst_z,
|
||||
dst_format.isl_format, dst_format.swizzle,
|
||||
src_x0, src_y0, src_x1, src_y1,
|
||||
dst_x0, dst_y0, dst_x1, dst_y1,
|
||||
gl_filter, flip_x, flip_y);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned src_start, src_end;
|
||||
if (src_image->type == VK_IMAGE_TYPE_3D) {
|
||||
assert(src_res->baseArrayLayer == 0);
|
||||
src_start = pRegions[r].srcOffsets[0].z;
|
||||
src_end = pRegions[r].srcOffsets[1].z;
|
||||
} else {
|
||||
src_start = src_res->baseArrayLayer;
|
||||
src_end = src_start + anv_get_layerCount(src_image, src_res);
|
||||
}
|
||||
|
||||
bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);
|
||||
float src_z_step = (float)(src_end + 1 - src_start) /
|
||||
(float)(dst_end + 1 - dst_start);
|
||||
|
||||
if (flip_z) {
|
||||
src_start = src_end;
|
||||
src_z_step *= -1;
|
||||
}
|
||||
|
||||
unsigned src_x0 = pRegions[r].srcOffsets[0].x;
|
||||
unsigned src_x1 = pRegions[r].srcOffsets[1].x;
|
||||
unsigned dst_x0 = pRegions[r].dstOffsets[0].x;
|
||||
unsigned dst_x1 = pRegions[r].dstOffsets[1].x;
|
||||
bool flip_x = flip_coords(&src_x0, &src_x1, &dst_x0, &dst_x1);
|
||||
|
||||
unsigned src_y0 = pRegions[r].srcOffsets[0].y;
|
||||
unsigned src_y1 = pRegions[r].srcOffsets[1].y;
|
||||
unsigned dst_y0 = pRegions[r].dstOffsets[0].y;
|
||||
unsigned dst_y1 = pRegions[r].dstOffsets[1].y;
|
||||
bool flip_y = flip_coords(&src_y0, &src_y1, &dst_y0, &dst_y1);
|
||||
|
||||
const unsigned num_layers = dst_end - dst_start;
|
||||
anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
|
||||
dst_res->aspectMask,
|
||||
dst.aux_usage,
|
||||
dst_res->mipLevel,
|
||||
dst_start, num_layers);
|
||||
|
||||
for (unsigned i = 0; i < num_layers; i++) {
|
||||
unsigned dst_z = dst_start + i;
|
||||
unsigned src_z = src_start + i * src_z_step;
|
||||
|
||||
blorp_blit(&batch, &src, src_res->mipLevel, src_z,
|
||||
src_format.isl_format, src_format.swizzle,
|
||||
&dst, dst_res->mipLevel, dst_z,
|
||||
dst_format.isl_format,
|
||||
anv_swizzle_for_render(dst_format.swizzle),
|
||||
src_x0, src_y0, src_x1, src_y1,
|
||||
dst_x0, dst_y0, dst_x1, dst_y1,
|
||||
gl_filter, flip_x, flip_y);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
blorp_batch_finish(&batch);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue