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