Mesa (main): radv/amdgpu: Add support for submitting 0 commandbuffers.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Dec 8 20:45:34 UTC 2021
Module: Mesa
Branch: main
Commit: 7675d066caa8fd41911e0f5e88b78fb4d7a5f626
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7675d066caa8fd41911e0f5e88b78fb4d7a5f626
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Mon Dec 6 23:40:10 2021 +0100
radv/amdgpu: Add support for submitting 0 commandbuffers.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14097>
---
src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 86 ++++++++++++++++++++++++++-
1 file changed, 85 insertions(+), 1 deletion(-)
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index fd837760948..6629200a291 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -24,6 +24,7 @@
#include <amdgpu.h>
#include <assert.h>
+#include <libsync.h>
#include <pthread.h>
#include <stdlib.h>
#include "drm-uapi/amdgpu_drm.h"
@@ -1168,6 +1169,87 @@ radv_amdgpu_winsys_cs_submit_sysmem(struct radeon_winsys_ctx *_ctx, int queue_id
return VK_SUCCESS;
}
+static VkResult
+radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum ring_type ring_type, int queue_idx,
+ struct radv_winsys_sem_info *sem_info)
+{
+ unsigned hw_ip = ring_to_hw_ip(ring_type);
+ unsigned queue_syncobj = radv_amdgpu_ctx_queue_syncobj(ctx, hw_ip, queue_idx);
+ int ret;
+
+ if (!queue_syncobj)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ if (sem_info->wait.syncobj_count || sem_info->wait.timeline_syncobj_count) {
+ int fd;
+ ret = amdgpu_cs_syncobj_export_sync_file(ctx->ws->dev, queue_syncobj, &fd);
+ if (ret < 0)
+ return VK_ERROR_DEVICE_LOST;
+
+ for (unsigned i = 0; i < sem_info->wait.syncobj_count; ++i) {
+ int fd2;
+ ret = amdgpu_cs_syncobj_export_sync_file(ctx->ws->dev, sem_info->wait.syncobj[i], &fd2);
+ if (ret < 0) {
+ close(fd);
+ return VK_ERROR_DEVICE_LOST;
+ }
+
+ sync_accumulate("radv", &fd, fd2);
+ close(fd2);
+ }
+ for (unsigned i = 0; i < sem_info->wait.timeline_syncobj_count; ++i) {
+ int fd2;
+ ret = amdgpu_cs_syncobj_export_sync_file2(
+ ctx->ws->dev, sem_info->wait.syncobj[i + sem_info->wait.syncobj_count],
+ sem_info->wait.points[i], 0, &fd2);
+ if (ret < 0) {
+ /* This works around a kernel bug where the fence isn't copied if it is already
+ * signalled. Since it is already signalled it is totally fine to not wait on it.
+ *
+ * kernel patch: https://patchwork.freedesktop.org/patch/465583/ */
+ uint64_t point;
+ ret = amdgpu_cs_syncobj_query2(
+ ctx->ws->dev, &sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], &point, 1,
+ 0);
+ if (!ret && point >= sem_info->wait.points[i])
+ continue;
+
+ close(fd);
+ return VK_ERROR_DEVICE_LOST;
+ }
+
+ sync_accumulate("radv", &fd, fd2);
+ close(fd2);
+ }
+ ret = amdgpu_cs_syncobj_import_sync_file(ctx->ws->dev, queue_syncobj, fd);
+ close(fd);
+ if (ret < 0)
+ return VK_ERROR_DEVICE_LOST;
+ }
+
+ if (sem_info->wait.syncobj_reset_count) {
+ ret = amdgpu_cs_syncobj_reset(ctx->ws->dev, sem_info->wait.syncobj,
+ sem_info->wait.syncobj_reset_count);
+ if (ret < 0)
+ return VK_ERROR_DEVICE_LOST;
+ }
+
+ for (unsigned i = 0; i < sem_info->signal.syncobj_count; ++i) {
+ ret = amdgpu_cs_syncobj_transfer(ctx->ws->dev, sem_info->signal.syncobj[i], 0, queue_syncobj,
+ 0, 0);
+ if (ret < 0)
+ return VK_ERROR_DEVICE_LOST;
+ }
+ for (unsigned i = 0; i < sem_info->signal.timeline_syncobj_count; ++i) {
+ ret = amdgpu_cs_syncobj_transfer(ctx->ws->dev,
+ sem_info->signal.syncobj[i + sem_info->signal.syncobj_count],
+ sem_info->signal.points[i], queue_syncobj, 0, 0);
+ if (ret < 0)
+ return VK_ERROR_DEVICE_LOST;
+ }
+ return VK_SUCCESS;
+}
+
static VkResult
radv_amdgpu_winsys_cs_submit(struct radeon_winsys_ctx *_ctx, enum ring_type ring_type,
int queue_idx, struct radeon_cmdbuf **cs_array, unsigned cs_count,
@@ -1179,7 +1261,9 @@ radv_amdgpu_winsys_cs_submit(struct radeon_winsys_ctx *_ctx, enum ring_type ring
VkResult result;
assert(sem_info);
- if (!ctx->ws->use_ib_bos) {
+ if (!cs_count) {
+ result = radv_amdgpu_cs_submit_zero(ctx, ring_type, queue_idx, sem_info);
+ } else if (!ctx->ws->use_ib_bos) {
result = radv_amdgpu_winsys_cs_submit_sysmem(_ctx, queue_idx, sem_info, cs_array, cs_count,
initial_preamble_cs, continue_preamble_cs);
} else if (can_patch) {
More information about the mesa-commit
mailing list