Mesa (staging/20.1): radv: Provide a better error for permission issues with priorities.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue May 19 20:24:36 UTC 2020


Module: Mesa
Branch: staging/20.1
Commit: ce745bdd4daf9fb2a4ba0e2210fd9b5bfa1f06ec
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ce745bdd4daf9fb2a4ba0e2210fd9b5bfa1f06ec

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Wed Apr 29 23:13:17 2020 +0200

radv: Provide a better error for permission issues with priorities.

Cc: <mesa-stable at lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4816>
(cherry picked from commit 9e3c6a7ba769d358dfffa690751cac6ca7f9c5df)

---

 .pick_status.json                             |  2 +-
 src/amd/vulkan/radv_device.c                  |  7 ++++---
 src/amd/vulkan/radv_radeon_winsys.h           |  7 +++++--
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 20 ++++++++++++++------
 src/amd/vulkan/winsys/null/radv_null_cs.c     | 11 ++++++-----
 5 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index ad0ec701ce3..bfd5017f846 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1723,7 +1723,7 @@
         "description": "radv: Provide a better error for permission issues with priorities.",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index c6d4884cad5..f4922830a01 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -2154,10 +2154,11 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue,
 	queue->queue_idx = idx;
 	queue->priority = radv_get_queue_global_priority(global_priority);
 	queue->flags = flags;
+	queue->hw_ctx = NULL;
 
-	queue->hw_ctx = device->ws->ctx_create(device->ws, queue->priority);
-	if (!queue->hw_ctx)
-		return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
+	VkResult result = device->ws->ctx_create(device->ws, queue->priority, &queue->hw_ctx);
+	if (result != VK_SUCCESS)
+		return vk_error(device->instance, result);
 
 	list_inithead(&queue->pending_submissions);
 	pthread_mutex_init(&queue->pending_mutex, NULL);
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index ef2b4849692..62e2e954f72 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -34,6 +34,7 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
+#include <vulkan/vulkan.h>
 #include "amd_family.h"
 #include "util/u_memory.h"
 #include "util/u_math.h"
@@ -158,6 +159,7 @@ struct radeon_bo_metadata {
 };
 
 struct radeon_winsys_fence;
+struct radeon_winsys_ctx;
 
 struct radeon_winsys_bo {
 	uint64_t va;
@@ -256,8 +258,9 @@ struct radeon_winsys {
 	void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
 	                            uint64_t offset, uint64_t size,
 	                            struct radeon_winsys_bo *bo, uint64_t bo_offset);
-	struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws,
-						enum radeon_ctx_priority priority);
+	VkResult (*ctx_create)(struct radeon_winsys *ws,
+	                       enum radeon_ctx_priority priority,
+	                       struct radeon_winsys_ctx **ctx);
 	void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
 
 	bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx,
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index c4bcdb9ec92..de6bd6546ed 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -1318,20 +1318,26 @@ static uint32_t radv_to_amdgpu_priority(enum radeon_ctx_priority radv_priority)
 	}
 }
 
-static struct radeon_winsys_ctx *radv_amdgpu_ctx_create(struct radeon_winsys *_ws,
-							enum radeon_ctx_priority priority)
+static VkResult radv_amdgpu_ctx_create(struct radeon_winsys *_ws,
+                                       enum radeon_ctx_priority priority,
+                                       struct radeon_winsys_ctx **rctx)
 {
 	struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
 	struct radv_amdgpu_ctx *ctx = CALLOC_STRUCT(radv_amdgpu_ctx);
 	uint32_t amdgpu_priority = radv_to_amdgpu_priority(priority);
+	VkResult result;
 	int r;
 
 	if (!ctx)
-		return NULL;
+		return VK_ERROR_OUT_OF_HOST_MEMORY;
 
 	r = amdgpu_cs_ctx_create2(ws->dev, amdgpu_priority, &ctx->ctx);
-	if (r) {
+	if (r && r == -EACCES) {
+		result = VK_ERROR_NOT_PERMITTED_EXT;
+		goto error_create;
+	} else if (r) {
 		fprintf(stderr, "amdgpu: radv_amdgpu_cs_ctx_create2 failed. (%i)\n", r);
+		result = VK_ERROR_OUT_OF_HOST_MEMORY;
 		goto error_create;
 	}
 	ctx->ws = ws;
@@ -1346,10 +1352,12 @@ static struct radeon_winsys_ctx *radv_amdgpu_ctx_create(struct radeon_winsys *_w
 		ctx->fence_map = (uint64_t*)ws->base.buffer_map(ctx->fence_bo);
 	if (ctx->fence_map)
 		memset(ctx->fence_map, 0, 4096);
-	return (struct radeon_winsys_ctx *)ctx;
+
+	*rctx = (struct radeon_winsys_ctx *)ctx;
+	return VK_SUCCESS;
 error_create:
 	FREE(ctx);
-	return NULL;
+	return result;
 }
 
 static void radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)
diff --git a/src/amd/vulkan/winsys/null/radv_null_cs.c b/src/amd/vulkan/winsys/null/radv_null_cs.c
index fc76d5c6d4e..f549357e694 100644
--- a/src/amd/vulkan/winsys/null/radv_null_cs.c
+++ b/src/amd/vulkan/winsys/null/radv_null_cs.c
@@ -39,16 +39,17 @@ radv_null_cs(struct radeon_cmdbuf *base)
 	return (struct radv_null_cs*)base;
 }
 
-static struct radeon_winsys_ctx *radv_null_ctx_create(struct radeon_winsys *_ws,
-						      enum radeon_ctx_priority priority)
+static VkResult radv_null_ctx_create(struct radeon_winsys *_ws,
+				     enum radeon_ctx_priority priority,
+				     struct radeon_winsys_ctx **rctx)
 {
 	struct radv_null_ctx *ctx = CALLOC_STRUCT(radv_null_ctx);
 
 	if (!ctx)
-		return NULL;
-
-	return (struct radeon_winsys_ctx *)ctx;
+		return VK_ERROR_OUT_OF_HOST_MEMORY;
 
+	*rctx = (struct radeon_winsys_ctx *)ctx;
+	return VK_SUCCESS;
 }
 
 static void radv_null_ctx_destroy(struct radeon_winsys_ctx *rwctx)



More information about the mesa-commit mailing list