radv: add semaphore support
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
d270b5fac3
commit
72aaa83f4b
|
@ -857,6 +857,10 @@ VkResult radv_QueueSubmit(
|
||||||
}
|
}
|
||||||
ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, cs_array,
|
ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, cs_array,
|
||||||
pSubmits[i].commandBufferCount,
|
pSubmits[i].commandBufferCount,
|
||||||
|
(struct radeon_winsys_sem **)pSubmits[i].pWaitSemaphores,
|
||||||
|
pSubmits[i].waitSemaphoreCount,
|
||||||
|
(struct radeon_winsys_sem **)pSubmits[i].pSignalSemaphores,
|
||||||
|
pSubmits[i].signalSemaphoreCount,
|
||||||
can_patch, base_fence);
|
can_patch, base_fence);
|
||||||
if (ret)
|
if (ret)
|
||||||
radv_loge("failed to submit CS %d\n", i);
|
radv_loge("failed to submit CS %d\n", i);
|
||||||
|
@ -866,7 +870,7 @@ VkResult radv_QueueSubmit(
|
||||||
if (fence) {
|
if (fence) {
|
||||||
if (!submitCount)
|
if (!submitCount)
|
||||||
ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, &queue->device->empty_cs,
|
ret = queue->device->ws->cs_submit(ctx, queue->queue_idx, &queue->device->empty_cs,
|
||||||
1, false, base_fence);
|
1, NULL, 0, NULL, 0, false, base_fence);
|
||||||
|
|
||||||
fence->submitted = true;
|
fence->submitted = true;
|
||||||
}
|
}
|
||||||
|
@ -1270,25 +1274,34 @@ VkResult radv_GetFenceStatus(VkDevice _device, VkFence _fence)
|
||||||
// Queue semaphore functions
|
// Queue semaphore functions
|
||||||
|
|
||||||
VkResult radv_CreateSemaphore(
|
VkResult radv_CreateSemaphore(
|
||||||
VkDevice device,
|
VkDevice _device,
|
||||||
const VkSemaphoreCreateInfo* pCreateInfo,
|
const VkSemaphoreCreateInfo* pCreateInfo,
|
||||||
const VkAllocationCallbacks* pAllocator,
|
const VkAllocationCallbacks* pAllocator,
|
||||||
VkSemaphore* pSemaphore)
|
VkSemaphore* pSemaphore)
|
||||||
{
|
{
|
||||||
/* The DRM execbuffer ioctl always execute in-oder, even between different
|
RADV_FROM_HANDLE(radv_device, device, _device);
|
||||||
* rings. As such, there's nothing to do for the user space semaphore.
|
struct radeon_winsys_sem *sem;
|
||||||
*/
|
|
||||||
|
|
||||||
*pSemaphore = (VkSemaphore)1;
|
sem = device->ws->create_sem(device->ws);
|
||||||
|
if (!sem)
|
||||||
|
return VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||||
|
|
||||||
|
*pSemaphore = (VkSemaphore)sem;
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void radv_DestroySemaphore(
|
void radv_DestroySemaphore(
|
||||||
VkDevice device,
|
VkDevice _device,
|
||||||
VkSemaphore semaphore,
|
VkSemaphore _semaphore,
|
||||||
const VkAllocationCallbacks* pAllocator)
|
const VkAllocationCallbacks* pAllocator)
|
||||||
{
|
{
|
||||||
|
RADV_FROM_HANDLE(radv_device, device, _device);
|
||||||
|
struct radeon_winsys_sem *sem;
|
||||||
|
if (!_semaphore)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sem = (struct radeon_winsys_sem *)_semaphore;
|
||||||
|
device->ws->destroy_sem(sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult radv_CreateEvent(
|
VkResult radv_CreateEvent(
|
||||||
|
|
|
@ -253,6 +253,7 @@ struct radeon_bo_metadata {
|
||||||
|
|
||||||
struct radeon_winsys_bo;
|
struct radeon_winsys_bo;
|
||||||
struct radeon_winsys_fence;
|
struct radeon_winsys_fence;
|
||||||
|
struct radeon_winsys_sem;
|
||||||
|
|
||||||
struct radeon_winsys {
|
struct radeon_winsys {
|
||||||
void (*destroy)(struct radeon_winsys *ws);
|
void (*destroy)(struct radeon_winsys *ws);
|
||||||
|
@ -304,6 +305,10 @@ struct radeon_winsys {
|
||||||
int queue_index,
|
int queue_index,
|
||||||
struct radeon_winsys_cs **cs_array,
|
struct radeon_winsys_cs **cs_array,
|
||||||
unsigned cs_count,
|
unsigned cs_count,
|
||||||
|
struct radeon_winsys_sem **wait_sem,
|
||||||
|
unsigned wait_sem_count,
|
||||||
|
struct radeon_winsys_sem **signal_sem,
|
||||||
|
unsigned signal_sem_count,
|
||||||
bool can_patch,
|
bool can_patch,
|
||||||
struct radeon_winsys_fence *fence);
|
struct radeon_winsys_fence *fence);
|
||||||
|
|
||||||
|
@ -326,6 +331,10 @@ struct radeon_winsys {
|
||||||
struct radeon_winsys_fence *fence,
|
struct radeon_winsys_fence *fence,
|
||||||
bool absolute,
|
bool absolute,
|
||||||
uint64_t timeout);
|
uint64_t timeout);
|
||||||
|
|
||||||
|
struct radeon_winsys_sem *(*create_sem)(struct radeon_winsys *ws);
|
||||||
|
void (*destroy_sem)(struct radeon_winsys_sem *sem);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
|
static inline void radeon_emit(struct radeon_winsys_cs *cs, uint32_t value)
|
||||||
|
|
|
@ -739,20 +739,40 @@ static int radv_amdgpu_winsys_cs_submit(struct radeon_winsys_ctx *_ctx,
|
||||||
int queue_idx,
|
int queue_idx,
|
||||||
struct radeon_winsys_cs **cs_array,
|
struct radeon_winsys_cs **cs_array,
|
||||||
unsigned cs_count,
|
unsigned cs_count,
|
||||||
|
struct radeon_winsys_sem **wait_sem,
|
||||||
|
unsigned wait_sem_count,
|
||||||
|
struct radeon_winsys_sem **signal_sem,
|
||||||
|
unsigned signal_sem_count,
|
||||||
bool can_patch,
|
bool can_patch,
|
||||||
struct radeon_winsys_fence *_fence)
|
struct radeon_winsys_fence *_fence)
|
||||||
{
|
{
|
||||||
struct radv_amdgpu_cs *cs = radv_amdgpu_cs(cs_array[0]);
|
struct radv_amdgpu_cs *cs = radv_amdgpu_cs(cs_array[0]);
|
||||||
|
struct radv_amdgpu_ctx *ctx = radv_amdgpu_ctx(_ctx);
|
||||||
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < wait_sem_count; i++) {
|
||||||
|
amdgpu_semaphore_handle sem = (amdgpu_semaphore_handle)wait_sem[i];
|
||||||
|
amdgpu_cs_wait_semaphore(ctx->ctx, cs->hw_ip, 0, queue_idx,
|
||||||
|
sem);
|
||||||
|
}
|
||||||
if (!cs->ws->use_ib_bos) {
|
if (!cs->ws->use_ib_bos) {
|
||||||
return radv_amdgpu_winsys_cs_submit_sysmem(_ctx, queue_idx, cs_array,
|
ret = radv_amdgpu_winsys_cs_submit_sysmem(_ctx, queue_idx, cs_array,
|
||||||
cs_count, _fence);
|
cs_count, _fence);
|
||||||
} else if (can_patch && cs_count > AMDGPU_CS_MAX_IBS_PER_SUBMIT && false) {
|
} else if (can_patch && cs_count > AMDGPU_CS_MAX_IBS_PER_SUBMIT && false) {
|
||||||
return radv_amdgpu_winsys_cs_submit_chained(_ctx, queue_idx, cs_array,
|
ret = radv_amdgpu_winsys_cs_submit_chained(_ctx, queue_idx, cs_array,
|
||||||
cs_count, _fence);
|
cs_count, _fence);
|
||||||
} else {
|
} else {
|
||||||
return radv_amdgpu_winsys_cs_submit_fallback(_ctx, queue_idx, cs_array,
|
ret = radv_amdgpu_winsys_cs_submit_fallback(_ctx, queue_idx, cs_array,
|
||||||
cs_count, _fence);
|
cs_count, _fence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < signal_sem_count; i++) {
|
||||||
|
amdgpu_semaphore_handle sem = (amdgpu_semaphore_handle)signal_sem[i];
|
||||||
|
amdgpu_cs_signal_semaphore(ctx->ctx, cs->hw_ip, 0, queue_idx,
|
||||||
|
sem);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct radeon_winsys_ctx *radv_amdgpu_ctx_create(struct radeon_winsys *_ws)
|
static struct radeon_winsys_ctx *radv_amdgpu_ctx_create(struct radeon_winsys *_ws)
|
||||||
|
@ -800,6 +820,23 @@ static bool radv_amdgpu_ctx_wait_idle(struct radeon_winsys_ctx *rwctx,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct radeon_winsys_sem *radv_amdgpu_create_sem(struct radeon_winsys *_ws)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
amdgpu_semaphore_handle sem;
|
||||||
|
|
||||||
|
ret = amdgpu_cs_create_semaphore(&sem);
|
||||||
|
if (ret)
|
||||||
|
return NULL;
|
||||||
|
return (struct radeon_winsys_sem *)sem;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void radv_amdgpu_destroy_sem(struct radeon_winsys_sem *_sem)
|
||||||
|
{
|
||||||
|
amdgpu_semaphore_handle sem = (amdgpu_semaphore_handle)_sem;
|
||||||
|
amdgpu_cs_destroy_semaphore(sem);
|
||||||
|
}
|
||||||
|
|
||||||
void radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
|
void radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
|
||||||
{
|
{
|
||||||
ws->base.ctx_create = radv_amdgpu_ctx_create;
|
ws->base.ctx_create = radv_amdgpu_ctx_create;
|
||||||
|
@ -815,5 +852,7 @@ void radv_amdgpu_cs_init_functions(struct radv_amdgpu_winsys *ws)
|
||||||
ws->base.cs_submit = radv_amdgpu_winsys_cs_submit;
|
ws->base.cs_submit = radv_amdgpu_winsys_cs_submit;
|
||||||
ws->base.create_fence = radv_amdgpu_create_fence;
|
ws->base.create_fence = radv_amdgpu_create_fence;
|
||||||
ws->base.destroy_fence = radv_amdgpu_destroy_fence;
|
ws->base.destroy_fence = radv_amdgpu_destroy_fence;
|
||||||
|
ws->base.create_sem = radv_amdgpu_create_sem;
|
||||||
|
ws->base.destroy_sem = radv_amdgpu_destroy_sem;
|
||||||
ws->base.fence_wait = radv_amdgpu_fence_wait;
|
ws->base.fence_wait = radv_amdgpu_fence_wait;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue