Module: Mesa
Branch: staging/20.0
Commit: 824388eaf9a298c0fc9abe7e5e858a903aa2dbf0
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=824388eaf9a298c0fc9abe7e5e858a903aa2dbf0

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

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

Cc: <mesa-sta...@lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoi...@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           |   8 +-
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c |  20 +++--
 src/amd/vulkan/winsys/null/radv_null_cs.c     | 101 ++++++++++++++++++++++++++
 5 files changed, 126 insertions(+), 12 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index b8581d5de41..b44bed66b8f 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -6196,7 +6196,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 80c4d2c7e14..c2602b489cf 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -2134,10 +2134,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 5c7b1ab5118..aff46ef5e22 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -34,6 +34,8 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include "main/macros.h"
+#include <string.h>
+#include <vulkan/vulkan.h>
 #include "amd_family.h"
 
 struct radeon_info;
@@ -157,6 +159,7 @@ struct radeon_bo_metadata {
 };
 
 struct radeon_winsys_fence;
+struct radeon_winsys_ctx;
 
 struct radeon_winsys_bo {
        uint64_t va;
@@ -251,8 +254,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 041d6c5e9d7..342c9da3b58 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -1317,20 +1317,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;
@@ -1345,10 +1351,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
new file mode 100644
index 00000000000..f549357e694
--- /dev/null
+++ b/src/amd/vulkan/winsys/null/radv_null_cs.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2020 Valve Corporation
+ *
+ * based on amdgpu winsys.
+ * Copyright © 2016 Red Hat.
+ * Copyright © 2016 Bas Nieuwenhuizen
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "radv_null_cs.h"
+#include "util/u_memory.h"
+
+struct radv_null_cs {
+       struct radeon_cmdbuf base;
+       struct radv_null_winsys *ws;
+};
+
+static inline struct radv_null_cs *
+radv_null_cs(struct radeon_cmdbuf *base)
+{
+       return (struct radv_null_cs*)base;
+}
+
+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 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)
+{
+       struct radv_null_ctx *ctx = (struct radv_null_ctx *)rwctx;
+       FREE(ctx);
+}
+
+static struct radeon_cmdbuf *
+radv_null_cs_create(struct radeon_winsys *ws,
+                   enum ring_type ring_type)
+{
+       struct radv_null_cs *cs = calloc(1, sizeof(struct radv_null_cs));
+       if (!cs)
+               return NULL;
+
+       cs->ws = radv_null_winsys(ws);
+
+       cs->base.buf = malloc(16384);
+       cs->base.max_dw = 4096;
+       if (!cs->base.buf) {
+               FREE(cs);
+               return NULL;
+       }
+
+       return &cs->base;
+}
+
+static bool radv_null_cs_finalize(struct radeon_cmdbuf *_cs)
+{
+       return true;
+}
+
+static void radv_null_cs_destroy(struct radeon_cmdbuf *rcs)
+{
+       struct radv_null_cs *cs = radv_null_cs(rcs);
+       FREE(cs->base.buf);
+       FREE(cs);
+}
+
+void radv_null_cs_init_functions(struct radv_null_winsys *ws)
+{
+       ws->base.ctx_create = radv_null_ctx_create;
+       ws->base.ctx_destroy = radv_null_ctx_destroy;
+       ws->base.cs_create = radv_null_cs_create;
+       ws->base.cs_finalize = radv_null_cs_finalize;
+       ws->base.cs_destroy = radv_null_cs_destroy;
+
+}

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to