summaryrefslogtreecommitdiff
path: root/src/intel/vulkan/anv_blorp.c
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2023-05-21 23:11:13 -0700
committerMarge Bot <emma+marge@anholt.net>2023-09-07 06:39:06 +0000
commit6f4fe3f81b0895bf8f528909bc9119294680b9f9 (patch)
treecdc31f024d42196e2a04e987b81fea9979173d3d /src/intel/vulkan/anv_blorp.c
parent5b8bef86501ff742f36873525eec9e7e0d30cecf (diff)
anv: Copy/Clear MSAA images over companion RCS while we are on compute
When we have MSAA copy/clear operation on the compute queue, use the companion RCS command buffer to carry out copy/clear operations. v2: (Sagar) - Flush cache according to command buffer - Invalidate AUX when we create new companion RCS command buffer if platform support AUX TT. Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com> Reviewed-by: José Roberto de Souza <jose.souza@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23661>
Diffstat (limited to 'src/intel/vulkan/anv_blorp.c')
-rw-r--r--src/intel/vulkan/anv_blorp.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 8553327626a..a1e8c855a4d 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -22,6 +22,7 @@
*/
#include "anv_private.h"
+#include "genxml/gen8_pack.h"
static bool
lookup_blorp_shader(struct blorp_batch *batch,
@@ -371,6 +372,38 @@ copy_image(struct anv_cmd_buffer *cmd_buffer,
}
}
+static struct anv_state
+record_main_rcs_cmd_buffer_done(struct anv_cmd_buffer *cmd_buffer)
+{
+ const struct intel_device_info *info = cmd_buffer->device->info;
+
+ if (cmd_buffer->companion_rcs_cmd_buffer == NULL) {
+ anv_create_companion_rcs_command_buffer(cmd_buffer);
+ /* Re-emit the aux table register in every command buffer. This way we're
+ * ensured that we have the table even if this command buffer doesn't
+ * initialize any images.
+ */
+ if (cmd_buffer->device->info->has_aux_map) {
+ assert(cmd_buffer->companion_rcs_cmd_buffer != NULL);
+ anv_add_pending_pipe_bits(cmd_buffer->companion_rcs_cmd_buffer,
+ ANV_PIPE_AUX_TABLE_INVALIDATE_BIT,
+ "new cmd buffer with aux-tt");
+ }
+ }
+
+ assert(cmd_buffer->companion_rcs_cmd_buffer != NULL);
+ return anv_genX(info, cmd_buffer_begin_companion_rcs_syncpoint)(cmd_buffer);
+}
+
+static void
+end_main_rcs_cmd_buffer_done(struct anv_cmd_buffer *cmd_buffer,
+ struct anv_state syncpoint)
+{
+ const struct intel_device_info *info = cmd_buffer->device->info;
+ anv_genX(info, cmd_buffer_end_companion_rcs_syncpoint)(cmd_buffer,
+ syncpoint);
+}
+
void anv_CmdCopyImage2(
VkCommandBuffer commandBuffer,
const VkCopyImageInfo2* pCopyImageInfo)
@@ -379,6 +412,17 @@ void anv_CmdCopyImage2(
ANV_FROM_HANDLE(anv_image, src_image, pCopyImageInfo->srcImage);
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;;
+
+ 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))) {
+ 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);
@@ -390,6 +434,9 @@ void anv_CmdCopyImage2(
}
anv_blorp_batch_finish(&batch);
+
+ if (rcs_done.alloc_size)
+ end_main_rcs_cmd_buffer_done(main_cmd_buffer, rcs_done);
}
static enum isl_format
@@ -974,6 +1021,17 @@ void anv_CmdClearColorImage(
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
ANV_FROM_HANDLE(anv_image, image, _image);
+ 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))) {
+ 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);
@@ -1023,6 +1081,9 @@ void anv_CmdClearColorImage(
}
anv_blorp_batch_finish(&batch);
+
+ if (rcs_done.alloc_size)
+ end_main_rcs_cmd_buffer_done(main_cmd_buffer, rcs_done);
}
void anv_CmdClearDepthStencilImage(