diff options
author | Chia-I Wu <olvaffe@gmail.com> | 2023-09-28 09:40:36 -0700 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-10-14 02:36:40 +0000 |
commit | a73e0e9a042045bd2c063bd9d8d7a6ef95cbf5fc (patch) | |
tree | e3070b27a7f077bbcf56855ef52213ee66dfa9cc /src/intel/vulkan/anv_blorp.c | |
parent | 61e480cb545c5aa27b40560d205d6be044679bda (diff) |
anv: decompress on upload for emulated formats
Add anv_astc_emu_decompress to decompress the raw texel data to the
hidden plane. Call anv_astc_emu_decompress from anv_CmdCopyImage2 and
anv_CmdCopyBufferToImage2.
v2: support transfer queue and add missing flushes (Lionel)
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25467>
Diffstat (limited to 'src/intel/vulkan/anv_blorp.c')
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 90 |
1 files changed, 81 insertions, 9 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 414893d2343..e1d6e988905 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -398,6 +398,28 @@ end_main_rcs_cmd_buffer_done(struct anv_cmd_buffer *cmd_buffer, syncpoint); } +static bool +anv_blorp_execute_on_companion(struct anv_cmd_buffer *cmd_buffer, + struct anv_image *dst_image) +{ + /* MSAA images have to be dealt with on the companion RCS command buffer + * for both CCS && BCS engines. + */ + if ((anv_cmd_buffer_is_blitter_queue(cmd_buffer) || + anv_cmd_buffer_is_compute_queue(cmd_buffer)) && + dst_image->vk.samples > 1) + return true; + + /* Emulation of formats is done through a compute shader, so we need + * the companion command buffer for the BCS engine. + */ + if (anv_cmd_buffer_is_blitter_queue(cmd_buffer) && + dst_image->emu_plane_format != VK_FORMAT_UNDEFINED) + return true; + + return false; +} + void anv_CmdCopyImage2( VkCommandBuffer commandBuffer, const VkCopyImageInfo2* pCopyImageInfo) @@ -407,12 +429,9 @@ void anv_CmdCopyImage2( ANV_FROM_HANDLE(anv_image, dst_image, pCopyImageInfo->dstImage); struct anv_cmd_buffer *main_cmd_buffer = cmd_buffer; - UNUSED struct anv_state rcs_done = ANV_STATE_NULL;; + UNUSED struct anv_state rcs_done = ANV_STATE_NULL; - if (cmd_buffer->device->info->verx10 >= 125 && - dst_image->vk.samples > 1 && - (anv_cmd_buffer_is_blitter_queue(main_cmd_buffer) || - anv_cmd_buffer_is_compute_queue(main_cmd_buffer))) { + if (anv_blorp_execute_on_companion(cmd_buffer, dst_image)) { rcs_done = record_main_rcs_cmd_buffer_done(cmd_buffer); cmd_buffer = cmd_buffer->companion_rcs_cmd_buffer; } @@ -429,6 +448,28 @@ void anv_CmdCopyImage2( anv_blorp_batch_finish(&batch); + if (dst_image->emu_plane_format != VK_FORMAT_UNDEFINED) { + assert(!anv_cmd_buffer_is_blitter_queue(cmd_buffer)); + const enum anv_pipe_bits pipe_bits = + anv_cmd_buffer_is_compute_queue(cmd_buffer) ? + ANV_PIPE_HDC_PIPELINE_FLUSH_BIT : + ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; + anv_add_pending_pipe_bits(cmd_buffer, pipe_bits, + "Copy flush before decompression"); + + for (unsigned r = 0; r < pCopyImageInfo->regionCount; r++) { + const VkImageCopy2 *region = &pCopyImageInfo->pRegions[r]; + const VkOffset3D block_offset = vk_image_offset_to_elements( + &dst_image->vk, region->dstOffset); + const VkExtent3D block_extent = vk_image_extent_to_elements( + &src_image->vk, region->extent); + anv_astc_emu_decompress(cmd_buffer, dst_image, + pCopyImageInfo->dstImageLayout, + ®ion->dstSubresource, + block_offset, block_extent); + } + } + if (rcs_done.alloc_size) end_main_rcs_cmd_buffer_done(main_cmd_buffer, rcs_done); } @@ -563,6 +604,14 @@ void anv_CmdCopyBufferToImage2( ANV_FROM_HANDLE(anv_buffer, src_buffer, pCopyBufferToImageInfo->srcBuffer); ANV_FROM_HANDLE(anv_image, dst_image, pCopyBufferToImageInfo->dstImage); + struct anv_cmd_buffer *main_cmd_buffer = cmd_buffer; + UNUSED struct anv_state rcs_done = ANV_STATE_NULL; + + if (anv_blorp_execute_on_companion(cmd_buffer, dst_image)) { + rcs_done = record_main_rcs_cmd_buffer_done(cmd_buffer); + cmd_buffer = cmd_buffer->companion_rcs_cmd_buffer; + } + struct blorp_batch batch; anv_blorp_batch_init(cmd_buffer, &batch, 0); @@ -573,6 +622,32 @@ void anv_CmdCopyBufferToImage2( } anv_blorp_batch_finish(&batch); + + if (dst_image->emu_plane_format != VK_FORMAT_UNDEFINED) { + assert(!anv_cmd_buffer_is_blitter_queue(cmd_buffer)); + const enum anv_pipe_bits pipe_bits = + anv_cmd_buffer_is_compute_queue(cmd_buffer) ? + ANV_PIPE_HDC_PIPELINE_FLUSH_BIT : + ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT; + anv_add_pending_pipe_bits(cmd_buffer, pipe_bits, + "Copy flush before decompression"); + + for (unsigned r = 0; r < pCopyBufferToImageInfo->regionCount; r++) { + const VkBufferImageCopy2 *region = + &pCopyBufferToImageInfo->pRegions[r]; + const VkOffset3D block_offset = vk_image_offset_to_elements( + &dst_image->vk, region->imageOffset); + const VkExtent3D block_extent = vk_image_extent_to_elements( + &dst_image->vk, region->imageExtent); + anv_astc_emu_decompress(cmd_buffer, dst_image, + pCopyBufferToImageInfo->dstImageLayout, + ®ion->imageSubresource, + block_offset, block_extent); + } + } + + if (rcs_done.alloc_size) + end_main_rcs_cmd_buffer_done(main_cmd_buffer, rcs_done); } static void @@ -1018,10 +1093,7 @@ void anv_CmdClearColorImage( struct anv_cmd_buffer *main_cmd_buffer = cmd_buffer; UNUSED struct anv_state rcs_done = ANV_STATE_NULL; - if (cmd_buffer->device->info->verx10 >= 125 && - image->vk.samples > 1 && - (anv_cmd_buffer_is_blitter_queue(main_cmd_buffer) || - anv_cmd_buffer_is_compute_queue(main_cmd_buffer))) { + if (anv_blorp_execute_on_companion(cmd_buffer, image)) { rcs_done = record_main_rcs_cmd_buffer_done(cmd_buffer); cmd_buffer = cmd_buffer->companion_rcs_cmd_buffer; } |