summaryrefslogtreecommitdiff
path: root/src/intel/vulkan/anv_blorp.c
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2023-09-28 09:40:36 -0700
committerMarge Bot <emma+marge@anholt.net>2023-10-14 02:36:40 +0000
commita73e0e9a042045bd2c063bd9d8d7a6ef95cbf5fc (patch)
treee3070b27a7f077bbcf56855ef52213ee66dfa9cc /src/intel/vulkan/anv_blorp.c
parent61e480cb545c5aa27b40560d205d6be044679bda (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.c90
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,
+ &region->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,
+ &region->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;
}