diff options
Diffstat (limited to 'src/freedreno/vulkan/tu_meta_resolve.c')
-rw-r--r-- | src/freedreno/vulkan/tu_meta_resolve.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/freedreno/vulkan/tu_meta_resolve.c b/src/freedreno/vulkan/tu_meta_resolve.c index 4a9ebedfdab..74ce766aacf 100644 --- a/src/freedreno/vulkan/tu_meta_resolve.c +++ b/src/freedreno/vulkan/tu_meta_resolve.c @@ -29,6 +29,23 @@ #include "nir/nir_builder.h" #include "vk_format.h" +#include "tu_blit.h" + +static void +tu_resolve_image(struct tu_cmd_buffer *cmdbuf, + struct tu_image *src_image, + struct tu_image *dst_image, + const VkImageResolve *info) +{ + assert(info->dstSubresource.layerCount == info->srcSubresource.layerCount); + + tu_blit(cmdbuf, &(struct tu_blit) { + .dst = tu_blit_surf_ext(dst_image, info->dstSubresource, info->dstOffset, info->extent), + .src = tu_blit_surf_ext(src_image, info->srcSubresource, info->srcOffset, info->extent), + .layers = MAX2(info->extent.depth, info->dstSubresource.layerCount) + }, false); +} + void tu_CmdResolveImage(VkCommandBuffer cmd_buffer_h, VkImage src_image_h, @@ -38,4 +55,13 @@ tu_CmdResolveImage(VkCommandBuffer cmd_buffer_h, uint32_t region_count, const VkImageResolve *regions) { + TU_FROM_HANDLE(tu_cmd_buffer, cmdbuf, cmd_buffer_h); + TU_FROM_HANDLE(tu_image, src_image, src_image_h); + TU_FROM_HANDLE(tu_image, dst_image, dest_image_h); + + tu_bo_list_add(&cmdbuf->bo_list, src_image->bo, MSM_SUBMIT_BO_READ); + tu_bo_list_add(&cmdbuf->bo_list, dst_image->bo, MSM_SUBMIT_BO_WRITE); + + for (uint32_t i = 0; i < region_count; ++i) + tu_resolve_image(cmdbuf, src_image, dst_image, regions + i); } |