radv: Provide a better error for permission issues with priorities.
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>
This commit is contained in:
@@ -2187,10 +2187,11 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue,
|
|||||||
queue->queue_idx = idx;
|
queue->queue_idx = idx;
|
||||||
queue->priority = radv_get_queue_global_priority(global_priority);
|
queue->priority = radv_get_queue_global_priority(global_priority);
|
||||||
queue->flags = flags;
|
queue->flags = flags;
|
||||||
|
queue->hw_ctx = NULL;
|
||||||
|
|
||||||
queue->hw_ctx = device->ws->ctx_create(device->ws, queue->priority);
|
VkResult result = device->ws->ctx_create(device->ws, queue->priority, &queue->hw_ctx);
|
||||||
if (!queue->hw_ctx)
|
if (result != VK_SUCCESS)
|
||||||
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
return vk_error(device->instance, result);
|
||||||
|
|
||||||
list_inithead(&queue->pending_submissions);
|
list_inithead(&queue->pending_submissions);
|
||||||
pthread_mutex_init(&queue->pending_mutex, NULL);
|
pthread_mutex_init(&queue->pending_mutex, NULL);
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
#include "amd_family.h"
|
#include "amd_family.h"
|
||||||
#include "util/u_memory.h"
|
#include "util/u_memory.h"
|
||||||
#include "util/u_math.h"
|
#include "util/u_math.h"
|
||||||
@@ -158,6 +159,7 @@ struct radeon_bo_metadata {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct radeon_winsys_fence;
|
struct radeon_winsys_fence;
|
||||||
|
struct radeon_winsys_ctx;
|
||||||
|
|
||||||
struct radeon_winsys_bo {
|
struct radeon_winsys_bo {
|
||||||
uint64_t va;
|
uint64_t va;
|
||||||
@@ -256,8 +258,9 @@ struct radeon_winsys {
|
|||||||
void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
|
void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
|
||||||
uint64_t offset, uint64_t size,
|
uint64_t offset, uint64_t size,
|
||||||
struct radeon_winsys_bo *bo, uint64_t bo_offset);
|
struct radeon_winsys_bo *bo, uint64_t bo_offset);
|
||||||
struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws,
|
VkResult (*ctx_create)(struct radeon_winsys *ws,
|
||||||
enum radeon_ctx_priority priority);
|
enum radeon_ctx_priority priority,
|
||||||
|
struct radeon_winsys_ctx **ctx);
|
||||||
void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
|
void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
|
||||||
|
|
||||||
bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx,
|
bool (*ctx_wait_idle)(struct radeon_winsys_ctx *ctx,
|
||||||
|
@@ -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,
|
static VkResult radv_amdgpu_ctx_create(struct radeon_winsys *_ws,
|
||||||
enum radeon_ctx_priority priority)
|
enum radeon_ctx_priority priority,
|
||||||
|
struct radeon_winsys_ctx **rctx)
|
||||||
{
|
{
|
||||||
struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
|
struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
|
||||||
struct radv_amdgpu_ctx *ctx = CALLOC_STRUCT(radv_amdgpu_ctx);
|
struct radv_amdgpu_ctx *ctx = CALLOC_STRUCT(radv_amdgpu_ctx);
|
||||||
uint32_t amdgpu_priority = radv_to_amdgpu_priority(priority);
|
uint32_t amdgpu_priority = radv_to_amdgpu_priority(priority);
|
||||||
|
VkResult result;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
return NULL;
|
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||||
|
|
||||||
r = amdgpu_cs_ctx_create2(ws->dev, amdgpu_priority, &ctx->ctx);
|
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);
|
fprintf(stderr, "amdgpu: radv_amdgpu_cs_ctx_create2 failed. (%i)\n", r);
|
||||||
|
result = VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||||
goto error_create;
|
goto error_create;
|
||||||
}
|
}
|
||||||
ctx->ws = ws;
|
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);
|
ctx->fence_map = (uint64_t*)ws->base.buffer_map(ctx->fence_bo);
|
||||||
if (ctx->fence_map)
|
if (ctx->fence_map)
|
||||||
memset(ctx->fence_map, 0, 4096);
|
memset(ctx->fence_map, 0, 4096);
|
||||||
return (struct radeon_winsys_ctx *)ctx;
|
|
||||||
|
*rctx = (struct radeon_winsys_ctx *)ctx;
|
||||||
|
return VK_SUCCESS;
|
||||||
error_create:
|
error_create:
|
||||||
FREE(ctx);
|
FREE(ctx);
|
||||||
return NULL;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)
|
static void radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx)
|
||||||
|
@@ -39,16 +39,17 @@ radv_null_cs(struct radeon_cmdbuf *base)
|
|||||||
return (struct radv_null_cs*)base;
|
return (struct radv_null_cs*)base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct radeon_winsys_ctx *radv_null_ctx_create(struct radeon_winsys *_ws,
|
static VkResult radv_null_ctx_create(struct radeon_winsys *_ws,
|
||||||
enum radeon_ctx_priority priority)
|
enum radeon_ctx_priority priority,
|
||||||
|
struct radeon_winsys_ctx **rctx)
|
||||||
{
|
{
|
||||||
struct radv_null_ctx *ctx = CALLOC_STRUCT(radv_null_ctx);
|
struct radv_null_ctx *ctx = CALLOC_STRUCT(radv_null_ctx);
|
||||||
|
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
return NULL;
|
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||||
|
|
||||||
return (struct radeon_winsys_ctx *)ctx;
|
|
||||||
|
|
||||||
|
*rctx = (struct radeon_winsys_ctx *)ctx;
|
||||||
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radv_null_ctx_destroy(struct radeon_winsys_ctx *rwctx)
|
static void radv_null_ctx_destroy(struct radeon_winsys_ctx *rwctx)
|
||||||
|
Reference in New Issue
Block a user