summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNanley Chery <[email protected]>2016-02-29 12:19:51 -0800
committerNanley Chery <[email protected]>2016-03-03 11:26:35 -0800
commit96ff4d0679e9243d4df070cc0eaef41e1b9d742b (patch)
tree6365b2e3c7728a9b56d0e6ade0148bb68aaad518
parent9b6c95d46ee19224e8013a0fbc991f8b2135017d (diff)
anv/meta: Use blitter API in anv_CmdCopyImage()
Signed-off-by: Nanley Chery <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r--src/intel/vulkan/anv_meta_blit.c113
1 files changed, 42 insertions, 71 deletions
diff --git a/src/intel/vulkan/anv_meta_blit.c b/src/intel/vulkan/anv_meta_blit.c
index 8ca1871f9d8..2e529eed0f8 100644
--- a/src/intel/vulkan/anv_meta_blit.c
+++ b/src/intel/vulkan/anv_meta_blit.c
@@ -836,7 +836,7 @@ void anv_CmdCopyImage(
*/
assert(src_image->samples == dest_image->samples);
- meta_prepare_blit(cmd_buffer, &saved_state);
+ anv_meta_begin_blit2d(cmd_buffer, &saved_state);
for (unsigned r = 0; r < regionCount; r++) {
assert(pRegions[r].srcSubresource.aspectMask ==
@@ -844,84 +844,55 @@ void anv_CmdCopyImage(
VkImageAspectFlags aspect = pRegions[r].srcSubresource.aspectMask;
- VkFormat src_format = choose_iview_format(src_image, aspect);
- VkFormat dst_format = choose_iview_format(dest_image, aspect);
-
- struct anv_image_view src_iview;
- anv_image_view_init(&src_iview, cmd_buffer->device,
- &(VkImageViewCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .image = srcImage,
- .viewType = anv_meta_get_view_type(src_image),
- .format = src_format,
- .subresourceRange = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
- .levelCount = 1,
- .baseArrayLayer = pRegions[r].srcSubresource.baseArrayLayer,
- .layerCount = pRegions[r].dstSubresource.layerCount,
- },
- },
- cmd_buffer, 0, VK_IMAGE_USAGE_SAMPLED_BIT);
-
- const uint32_t dest_base_array_slice =
- anv_meta_get_iview_layer(dest_image, &pRegions[r].dstSubresource,
- &pRegions[r].dstOffset);
+ /* Create blit surfaces */
+ struct isl_surf *src_isl_surf =
+ &anv_image_get_surface_for_aspect_mask(src_image, aspect)->isl;
+ struct isl_surf *dst_isl_surf =
+ &anv_image_get_surface_for_aspect_mask(dest_image, aspect)->isl;
+ struct anv_meta_blit2d_surf b_src = blit_surf_for_image(src_image, src_isl_surf);
+ struct anv_meta_blit2d_surf b_dst = blit_surf_for_image(dest_image, dst_isl_surf);
+ /* Start creating blit rect */
+ const VkOffset3D dst_offset_el = meta_region_offset_el(dest_image, &pRegions[r].dstOffset);
+ const VkOffset3D src_offset_el = meta_region_offset_el(src_image, &pRegions[r].srcOffset);
+ const VkExtent3D img_extent_el = meta_region_extent_el(src_image->vk_format,
+ &pRegions[r].extent);
+ struct anv_meta_blit2d_rect rect = {
+ .width = img_extent_el.width,
+ .height = img_extent_el.height,
+ };
+ /* Loop through each 3D or array slice */
unsigned num_slices_3d = pRegions[r].extent.depth;
unsigned num_slices_array = pRegions[r].dstSubresource.layerCount;
unsigned slice_3d = 0;
unsigned slice_array = 0;
while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
- VkOffset3D src_offset = pRegions[r].srcOffset;
- src_offset.z += slice_3d + slice_array;
-
- uint32_t img_x = 0;
- uint32_t img_y = 0;
- uint32_t img_o = 0;
- if (isl_format_is_compressed(dest_image->format->isl_format))
- isl_surf_get_image_intratile_offset_el(&cmd_buffer->device->isl_dev,
- &dest_image->color_surface.isl,
- pRegions[r].dstSubresource.mipLevel,
- pRegions[r].dstSubresource.baseArrayLayer + slice_array,
- pRegions[r].dstOffset.z + slice_3d,
- &img_o, &img_x, &img_y);
-
- VkOffset3D dest_offset_el = meta_region_offset_el(dest_image, &pRegions[r].dstOffset);
- dest_offset_el.x += img_x;
- dest_offset_el.y += img_y;
- dest_offset_el.z = 0;
-
- struct anv_image_view dest_iview;
- anv_image_view_init(&dest_iview, cmd_buffer->device,
- &(VkImageViewCreateInfo) {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .image = destImage,
- .viewType = anv_meta_get_view_type(dest_image),
- .format = dst_format,
- .subresourceRange = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = pRegions[r].dstSubresource.mipLevel,
- .levelCount = 1,
- .baseArrayLayer = dest_base_array_slice +
- slice_array + slice_3d,
- .layerCount = 1
- },
- },
- cmd_buffer, img_o, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
- const VkExtent3D img_extent_el = meta_region_extent_el(dest_image->vk_format,
- &pRegions[r].extent);
+ /* Finish creating blit rect */
+ isl_surf_get_image_offset_el(dst_isl_surf,
+ pRegions[r].dstSubresource.mipLevel,
+ pRegions[r].dstSubresource.baseArrayLayer + slice_array,
+ pRegions[r].dstOffset.z + slice_3d,
+ &rect.dst_x,
+ &rect.dst_y);
+ isl_surf_get_image_offset_el(src_isl_surf,
+ pRegions[r].srcSubresource.mipLevel,
+ pRegions[r].srcSubresource.baseArrayLayer + slice_array,
+ pRegions[r].srcOffset.z + slice_3d,
+ &rect.src_x,
+ &rect.src_y);
+ rect.dst_x += dst_offset_el.x;
+ rect.dst_y += dst_offset_el.y;
+ rect.src_x += src_offset_el.x;
+ rect.src_y += src_offset_el.y;
- meta_emit_blit(cmd_buffer,
- src_image, &src_iview,
- src_offset,
- img_extent_el,
- dest_image, &dest_iview,
- dest_offset_el,
- img_extent_el,
- VK_FILTER_NEAREST);
+ /* Perform Blit */
+ anv_meta_blit2d(cmd_buffer,
+ &b_src,
+ &b_dst,
+ 1,
+ &rect);
if (dest_image->type == VK_IMAGE_TYPE_3D)
slice_3d++;
@@ -930,7 +901,7 @@ void anv_CmdCopyImage(
}
}
- meta_finish_blit(cmd_buffer, &saved_state);
+ anv_meta_end_blit2d(cmd_buffer, &saved_state);
}
void anv_CmdBlitImage(