Assuming nothing got lost in the indent, looks good to me. Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net>
On Tue, Aug 28, 2018 at 6:27 AM Lionel Landwerlin < lionel.g.landwer...@intel.com> wrote: > 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.landwer...@intel.com> > Fixes: 9f44745eca0e41 ("anv: Use blorp to implement VkBlitImage") > --- > src/intel/vulkan/anv_blorp.c | 145 ++++++++++++++++++----------------- > 1 file changed, 75 insertions(+), 70 deletions(-) > > diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c > index cd67cc636b2..35b304f92b3 100644 > --- a/src/intel/vulkan/anv_blorp.c > +++ b/src/intel/vulkan/anv_blorp.c > @@ -532,81 +532,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); > - > - 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); > - > - 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); > + assert(anv_image_aspects_compatible(src_res->aspectMask, > + dst_res->aspectMask)); > + > + 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); > + > + 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); > + } > > - if (flip_z) { > - src_start = src_end; > - src_z_step *= -1; > - } > + 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); > + } > > - 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); > + 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); > > - 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); > + if (flip_z) { > + src_start = src_end; > + src_z_step *= -1; > + } > > - 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, dst_format.swizzle, > - src_x0, src_y0, src_x1, src_y1, > - dst_x0, dst_y0, dst_x1, dst_y1, > - blorp_filter, flip_x, flip_y); > + 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, > + blorp_filter, flip_x, flip_y); > + } > } > - > } > > blorp_batch_finish(&batch); > -- > 2.18.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev