radv: Provide a better error for permission issues with priorities.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Wed, 29 Apr 2020 21:13:17 +0000 (23:13 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 15 May 2020 01:16:29 +0000 (03:16 +0200)
Cc: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4816>

src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_radeon_winsys.h
src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
src/amd/vulkan/winsys/null/radv_null_cs.c

index bc8bcdb6ab36b5cfcec12f146bb82a7d69466103..bdfb2dad355bc775a391910ee15bcab557871a9f 100644 (file)
@@ -2187,10 +2187,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);
index e5a4ae57d99094da147e43325226837178302007..fc6ec2594b4fd67374abf7ccf8c7055b9132dca3 100644 (file)
@@ -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,
index c4bcdb9ec92c81b646c6975331372ab49673512d..de6bd6546ed0ea73ff8e302bd8699de2ed9784ea 100644 (file)
@@ -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)
index fc76d5c6d4e8b53b263d2a0014b8b0a05231ee0b..f549357e6945abdc366f31c76b5b6d3ff2944eb6 100644 (file)
@@ -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)