Mesa (main): radv: Support task shaders in secondary cmd buffers.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jul 20 19:31:56 UTC 2022
Module: Mesa
Branch: main
Commit: 7b8f087f6bbcae94e85ea9bc827d18baad34b8a4
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7b8f087f6bbcae94e85ea9bc827d18baad34b8a4
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Sat Feb 12 21:30:55 2022 +0100
radv: Support task shaders in secondary cmd buffers.
Special consideration is needed to keep ACE and GFX in sync.
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16531>
---
src/amd/vulkan/radv_cmd_buffer.c | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 4747d63b1d9..3530407757f 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -6187,6 +6187,39 @@ radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCou
radv_emit_framebuffer_state(primary);
}
+ if (secondary->ace_internal.cs) {
+ if (!primary->ace_internal.cs) {
+ primary->ace_internal.cs = radv_ace_internal_create(primary);
+ if (!primary->ace_internal.cs)
+ return;
+ }
+
+ struct radeon_cmdbuf *ace_primary = primary->ace_internal.cs;
+ struct radeon_cmdbuf *ace_secondary = secondary->ace_internal.cs;
+
+ /* Emit pending flushes on primary prior to executing secondary. */
+ radv_ace_internal_cache_flush(primary);
+
+ /* Wait for primary GFX->ACE semaphore, if necessary. */
+ if (radv_flush_gfx2ace_semaphore(primary))
+ radv_wait_gfx2ace_semaphore(primary);
+
+ /* Execute the secondary compute cmdbuf.
+ * Don't use IB2 packets because they are not supported on compute queues.
+ */
+ primary->device->ws->cs_execute_secondary(ace_primary, ace_secondary, false);
+ }
+
+ /* Update pending ACE internal flush bits from the secondary cmdbuf */
+ primary->ace_internal.flush_bits |= secondary->ace_internal.flush_bits;
+
+ /* Increment primary semaphore if secondary was dirty.
+ * This happens when the secondary cmdbuf has a barrier which
+ * isn't consumed by a draw call.
+ */
+ if (radv_ace_internal_sem_dirty(secondary))
+ primary->ace_internal.sem.gfx2ace_value++;
+
primary->device->ws->cs_execute_secondary(primary->cs, secondary->cs, allow_ib2);
/* When the secondary command buffer is compute only we don't
More information about the mesa-commit
mailing list