diff --git a/src/amd/common/ac_linux_drm.c b/src/amd/common/ac_linux_drm.c index c2d954b3feb..8557eeba602 100644 --- a/src/amd/common/ac_linux_drm.c +++ b/src/amd/common/ac_linux_drm.c @@ -441,76 +441,76 @@ int ac_drm_cs_query_fence_status(ac_drm_device *dev, uint32_t ctx_id, uint32_t i return r; } -int ac_drm_cs_create_syncobj2(int device_fd, uint32_t flags, uint32_t *handle) +int ac_drm_cs_create_syncobj2(ac_drm_device *dev, uint32_t flags, uint32_t *handle) { - return drmSyncobjCreate(device_fd, flags, handle); + return dev->p->create(dev->p, flags, handle); } -int ac_drm_cs_destroy_syncobj(int device_fd, uint32_t handle) +int ac_drm_cs_destroy_syncobj(ac_drm_device *dev, uint32_t handle) { - return drmSyncobjDestroy(device_fd, handle); + return dev->p->destroy(dev->p, handle); } -int ac_drm_cs_syncobj_wait(int device_fd, uint32_t *handles, unsigned num_handles, +int ac_drm_cs_syncobj_wait(ac_drm_device *dev, uint32_t *handles, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled) { - return drmSyncobjWait(device_fd, handles, num_handles, timeout_nsec, flags, first_signaled); + return dev->p->wait(dev->p, handles, num_handles, timeout_nsec, flags, first_signaled); } -int ac_drm_cs_syncobj_query2(int device_fd, uint32_t *handles, uint64_t *points, +int ac_drm_cs_syncobj_query2(ac_drm_device *dev, uint32_t *handles, uint64_t *points, unsigned num_handles, uint32_t flags) { - return drmSyncobjQuery2(device_fd, handles, points, num_handles, flags); + return dev->p->query(dev->p, handles, points, num_handles, flags); } -int ac_drm_cs_import_syncobj(int device_fd, int shared_fd, uint32_t *handle) +int ac_drm_cs_import_syncobj(ac_drm_device *dev, int shared_fd, uint32_t *handle) { - return drmSyncobjFDToHandle(device_fd, shared_fd, handle); + return dev->p->fd_to_handle(dev->p, shared_fd, handle); } -int ac_drm_cs_syncobj_export_sync_file(int device_fd, uint32_t syncobj, int *sync_file_fd) +int ac_drm_cs_syncobj_export_sync_file(ac_drm_device *dev, uint32_t syncobj, int *sync_file_fd) { - return drmSyncobjExportSyncFile(device_fd, syncobj, sync_file_fd); + return dev->p->export_sync_file(dev->p, syncobj, sync_file_fd); } -int ac_drm_cs_syncobj_import_sync_file(int device_fd, uint32_t syncobj, int sync_file_fd) +int ac_drm_cs_syncobj_import_sync_file(ac_drm_device *dev, uint32_t syncobj, int sync_file_fd) { - return drmSyncobjImportSyncFile(device_fd, syncobj, sync_file_fd); + return dev->p->import_sync_file(dev->p, syncobj, sync_file_fd); } -int ac_drm_cs_syncobj_export_sync_file2(int device_fd, uint32_t syncobj, uint64_t point, +int ac_drm_cs_syncobj_export_sync_file2(ac_drm_device *dev, uint32_t syncobj, uint64_t point, uint32_t flags, int *sync_file_fd) { uint32_t binary_handle; int ret; if (!point) - return drmSyncobjExportSyncFile(device_fd, syncobj, sync_file_fd); + return dev->p->export_sync_file(dev->p, syncobj, sync_file_fd); - ret = drmSyncobjCreate(device_fd, 0, &binary_handle); + ret = dev->p->create(dev->p, 0, &binary_handle); if (ret) return ret; - ret = drmSyncobjTransfer(device_fd, binary_handle, 0, syncobj, point, flags); + ret = dev->p->transfer(dev->p, binary_handle, 0, syncobj, point, flags); if (ret) goto out; - ret = drmSyncobjExportSyncFile(device_fd, binary_handle, sync_file_fd); + ret = dev->p->export_sync_file(dev->p, binary_handle, sync_file_fd); out: - drmSyncobjDestroy(device_fd, binary_handle); + dev->p->destroy(dev->p, binary_handle); return ret; } -int ac_drm_cs_syncobj_transfer(int device_fd, uint32_t dst_handle, uint64_t dst_point, +int ac_drm_cs_syncobj_transfer(ac_drm_device *dev, uint32_t dst_handle, uint64_t dst_point, uint32_t src_handle, uint64_t src_point, uint32_t flags) { - return drmSyncobjTransfer(device_fd, dst_handle, dst_point, src_handle, src_point, flags); + return dev->p->transfer(dev->p, dst_handle, dst_point, src_handle, src_point, flags); } -int ac_drm_cs_syncobj_timeline_wait(int device_fd, uint32_t *handles, uint64_t *points, +int ac_drm_cs_syncobj_timeline_wait(ac_drm_device *dev, uint32_t *handles, uint64_t *points, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled) { - return drmSyncobjTimelineWait(device_fd, handles, points, num_handles, timeout_nsec, flags, + return dev->p->timeline_wait(dev->p, handles, points, num_handles, timeout_nsec, flags, first_signaled); } diff --git a/src/amd/common/ac_linux_drm.h b/src/amd/common/ac_linux_drm.h index 5244a79001f..d3d44f416c4 100644 --- a/src/amd/common/ac_linux_drm.h +++ b/src/amd/common/ac_linux_drm.h @@ -90,27 +90,27 @@ PROC int ac_drm_cs_query_reset_state2(ac_drm_device *dev, uint32_t ctx_id, uint6 PROC int ac_drm_cs_query_fence_status(ac_drm_device *dev, uint32_t ctx_id, uint32_t ip_type, uint32_t ip_instance, uint32_t ring, uint64_t fence_seq_no, uint64_t timeout_ns, uint64_t flags, uint32_t *expired) TAIL; -PROC int ac_drm_cs_create_syncobj2(int device_fd, uint32_t flags, uint32_t *handle) TAIL; -PROC int ac_drm_cs_destroy_syncobj(int device_fd, uint32_t handle) TAIL; -PROC int ac_drm_cs_syncobj_wait(int device_fd, uint32_t *handles, unsigned num_handles, +PROC int ac_drm_cs_create_syncobj2(ac_drm_device *dev, uint32_t flags, uint32_t *handle) TAIL; +PROC int ac_drm_cs_destroy_syncobj(ac_drm_device *dev, uint32_t handle) TAIL; +PROC int ac_drm_cs_syncobj_wait(ac_drm_device *dev, uint32_t *handles, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled) TAIL; -PROC int ac_drm_cs_syncobj_query2(int device_fd, uint32_t *handles, uint64_t *points, +PROC int ac_drm_cs_syncobj_query2(ac_drm_device *dev, uint32_t *handles, uint64_t *points, unsigned num_handles, uint32_t flags) TAIL; -PROC int ac_drm_cs_import_syncobj(int device_fd, int shared_fd, uint32_t *handle) TAIL; -PROC int ac_drm_cs_syncobj_export_sync_file(int device_fd, uint32_t syncobj, +PROC int ac_drm_cs_import_syncobj(ac_drm_device *dev, int shared_fd, uint32_t *handle) TAIL; +PROC int ac_drm_cs_syncobj_export_sync_file(ac_drm_device *dev, uint32_t syncobj, int *sync_file_fd) TAIL; -PROC int ac_drm_cs_syncobj_import_sync_file(int device_fd, uint32_t syncobj, int sync_file_fd) TAIL; -PROC int ac_drm_cs_syncobj_export_sync_file2(int device_fd, uint32_t syncobj, uint64_t point, +PROC int ac_drm_cs_syncobj_import_sync_file(ac_drm_device *dev, uint32_t syncobj, int sync_file_fd) TAIL; +PROC int ac_drm_cs_syncobj_export_sync_file2(ac_drm_device *dev, uint32_t syncobj, uint64_t point, uint32_t flags, int *sync_file_fd) TAIL; -PROC int ac_drm_cs_syncobj_transfer(int device_fd, uint32_t dst_handle, uint64_t dst_point, +PROC int ac_drm_cs_syncobj_transfer(ac_drm_device *dev, uint32_t dst_handle, uint64_t dst_point, uint32_t src_handle, uint64_t src_point, uint32_t flags) TAIL; PROC int ac_drm_cs_submit_raw2(ac_drm_device *dev, uint32_t ctx_id, uint32_t bo_list_handle, int num_chunks, struct drm_amdgpu_cs_chunk *chunks, uint64_t *seq_no) TAIL; PROC void ac_drm_cs_chunk_fence_info_to_data(uint32_t bo_handle, uint64_t offset, struct drm_amdgpu_cs_chunk_data *data) TAILV; -PROC int ac_drm_cs_syncobj_timeline_wait(int device_fd, uint32_t *handles, uint64_t *points, +PROC int ac_drm_cs_syncobj_timeline_wait(ac_drm_device *dev, uint32_t *handles, uint64_t *points, unsigned num_handles, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled) TAIL; PROC int ac_drm_query_info(ac_drm_device *dev, unsigned info_id, unsigned size, void *value) TAIL; diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 82c18ae7379..21bdde6c185 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -1242,13 +1242,13 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type if (sem_info->wait.syncobj_count || sem_info->wait.timeline_syncobj_count) { int fd; - ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, queue_syncobj, &fd); + ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, queue_syncobj, &fd); if (ret < 0) return VK_ERROR_DEVICE_LOST; for (unsigned i = 0; i < sem_info->wait.syncobj_count; ++i) { int fd2; - ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, sem_info->wait.syncobj[i], &fd2); + ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, sem_info->wait.syncobj[i], &fd2); if (ret < 0) { close(fd); return VK_ERROR_DEVICE_LOST; @@ -1260,14 +1260,14 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type for (unsigned i = 0; i < sem_info->wait.timeline_syncobj_count; ++i) { int fd2; ret = ac_drm_cs_syncobj_export_sync_file2( - ctx->ws->fd, sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], sem_info->wait.points[i], 0, &fd2); + ctx->ws->dev, sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], sem_info->wait.points[i], 0, &fd2); if (ret < 0) { /* This works around a kernel bug where the fence isn't copied if it is already * signalled. Since it is already signalled it is totally fine to not wait on it. * * kernel patch: https://patchwork.freedesktop.org/patch/465583/ */ uint64_t point; - ret = ac_drm_cs_syncobj_query2(ctx->ws->fd, &sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], + ret = ac_drm_cs_syncobj_query2(ctx->ws->dev, &sem_info->wait.syncobj[i + sem_info->wait.syncobj_count], &point, 1, 0); if (!ret && point >= sem_info->wait.points[i]) continue; @@ -1279,7 +1279,7 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type sync_accumulate("radv", &fd, fd2); close(fd2); } - ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->fd, queue_syncobj, fd); + ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->dev, queue_syncobj, fd); close(fd); if (ret < 0) return VK_ERROR_DEVICE_LOST; @@ -1292,23 +1292,23 @@ radv_amdgpu_cs_submit_zero(struct radv_amdgpu_ctx *ctx, enum amd_ip_type ip_type uint32_t src_handle = queue_syncobj; if (ctx->ws->info.has_timeline_syncobj) { - ret = ac_drm_cs_syncobj_transfer(ctx->ws->fd, dst_handle, 0, src_handle, 0, 0); + ret = ac_drm_cs_syncobj_transfer(ctx->ws->dev, dst_handle, 0, src_handle, 0, 0); if (ret < 0) return VK_ERROR_DEVICE_LOST; } else { int fd; - ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->fd, src_handle, &fd); + ret = ac_drm_cs_syncobj_export_sync_file(ctx->ws->dev, src_handle, &fd); if (ret < 0) return VK_ERROR_DEVICE_LOST; - ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->fd, dst_handle, fd); + ret = ac_drm_cs_syncobj_import_sync_file(ctx->ws->dev, dst_handle, fd); close(fd); if (ret < 0) return VK_ERROR_DEVICE_LOST; } } for (unsigned i = 0; i < sem_info->signal.timeline_syncobj_count; ++i) { - ret = ac_drm_cs_syncobj_transfer(ctx->ws->fd, sem_info->signal.syncobj[i + sem_info->signal.syncobj_count], + ret = ac_drm_cs_syncobj_transfer(ctx->ws->dev, sem_info->signal.syncobj[i + sem_info->signal.syncobj_count], sem_info->signal.points[i], queue_syncobj, 0, 0); if (ret < 0) return VK_ERROR_DEVICE_LOST; @@ -1630,7 +1630,7 @@ radv_amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx) for (unsigned ip = 0; ip <= AMDGPU_HW_IP_NUM; ++ip) { for (unsigned ring = 0; ring < MAX_RINGS_PER_TYPE; ++ring) { if (ctx->queue_syncobj[ip][ring]) - ac_drm_cs_destroy_syncobj(ctx->ws->fd, ctx->queue_syncobj[ip][ring]); + ac_drm_cs_destroy_syncobj(ctx->ws->dev, ctx->queue_syncobj[ip][ring]); } } @@ -1644,7 +1644,7 @@ radv_amdgpu_ctx_queue_syncobj(struct radv_amdgpu_ctx *ctx, unsigned ip, unsigned { uint32_t *syncobj = &ctx->queue_syncobj[ip][ring]; if (!*syncobj) { - ac_drm_cs_create_syncobj2(ctx->ws->fd, DRM_SYNCOBJ_CREATE_SIGNALED, syncobj); + ac_drm_cs_create_syncobj2(ctx->ws->dev, DRM_SYNCOBJ_CREATE_SIGNALED, syncobj); } return *syncobj; } diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp index 91d2f1be981..88d8f2cd05a 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp @@ -29,7 +29,7 @@ void amdgpu_fence_destroy(struct amdgpu_fence *fence) { - ac_drm_cs_destroy_syncobj(fence->aws->fd, fence->syncobj); + ac_drm_cs_destroy_syncobj(fence->aws->dev, fence->syncobj); if (fence->ctx) amdgpu_ctx_reference(&fence->ctx, NULL); @@ -49,7 +49,7 @@ amdgpu_fence_create(struct amdgpu_cs *acs) amdgpu_ctx_reference(&fence->ctx, ctx); fence->ctx = ctx; fence->ip_type = acs->ip_type; - if (ac_drm_cs_create_syncobj2(ctx->aws->fd, 0, &fence->syncobj)) { + if (ac_drm_cs_create_syncobj2(ctx->aws->dev, 0, &fence->syncobj)) { free(fence); return NULL; } @@ -74,7 +74,7 @@ amdgpu_fence_import_syncobj(struct radeon_winsys *rws, int fd) fence->aws = aws; fence->ip_type = 0xffffffff; - r = ac_drm_cs_import_syncobj(aws->fd, fd, &fence->syncobj); + r = ac_drm_cs_import_syncobj(aws->dev, fd, &fence->syncobj); if (r) { FREE(fence); return NULL; @@ -100,15 +100,15 @@ amdgpu_fence_import_sync_file(struct radeon_winsys *rws, int fd) /* fence->ctx == NULL means that the fence is syncobj-based. */ /* Convert sync_file into syncobj. */ - int r = ac_drm_cs_create_syncobj2(aws->fd, 0, &fence->syncobj); + int r = ac_drm_cs_create_syncobj2(aws->dev, 0, &fence->syncobj); if (r) { FREE(fence); return NULL; } - r = ac_drm_cs_syncobj_import_sync_file(aws->fd, fence->syncobj, fd); + r = ac_drm_cs_syncobj_import_sync_file(aws->dev, fence->syncobj, fd); if (r) { - ac_drm_cs_destroy_syncobj(aws->fd, fence->syncobj); + ac_drm_cs_destroy_syncobj(aws->dev, fence->syncobj); FREE(fence); return NULL; } @@ -129,7 +129,7 @@ static int amdgpu_fence_export_sync_file(struct radeon_winsys *rws, util_queue_fence_wait(&fence->submitted); /* Convert syncobj into sync_file. */ - r = ac_drm_cs_syncobj_export_sync_file(aws->fd, fence->syncobj, &fd); + r = ac_drm_cs_syncobj_export_sync_file(aws->dev, fence->syncobj, &fd); return r ? -1 : fd; } @@ -139,18 +139,18 @@ static int amdgpu_export_signalled_sync_file(struct radeon_winsys *rws) uint32_t syncobj; int fd = -1; - int r = ac_drm_cs_create_syncobj2(aws->fd, DRM_SYNCOBJ_CREATE_SIGNALED, + int r = ac_drm_cs_create_syncobj2(aws->dev, DRM_SYNCOBJ_CREATE_SIGNALED, &syncobj); if (r) { return -1; } - r = ac_drm_cs_syncobj_export_sync_file(aws->fd, syncobj, &fd); + r = ac_drm_cs_syncobj_export_sync_file(aws->dev, syncobj, &fd); if (r) { fd = -1; } - ac_drm_cs_destroy_syncobj(aws->fd, syncobj); + ac_drm_cs_destroy_syncobj(aws->dev, syncobj); return fd; } @@ -209,7 +209,7 @@ bool amdgpu_fence_wait(struct pipe_fence_handle *fence, uint64_t timeout, if ((uint64_t)abs_timeout == OS_TIMEOUT_INFINITE) abs_timeout = INT64_MAX; - if (ac_drm_cs_syncobj_wait(afence->aws->fd, &afence->syncobj, 1, + if (ac_drm_cs_syncobj_wait(afence->aws->dev, &afence->syncobj, 1, abs_timeout, 0, NULL)) return false; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_userq.c b/src/gallium/winsys/amdgpu/drm/amdgpu_userq.c index 9a50d79fc20..5c1d88e1322 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_userq.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_userq.c @@ -165,7 +165,7 @@ amdgpu_userq_init(struct amdgpu_winsys *aws, struct amdgpu_userq *userq, enum am /* The VA page table for ring buffer should be ready before job submission so that the packets * submitted can be read by gpu. The same applies to rptr, wptr buffers also. */ - r = ac_drm_cs_syncobj_timeline_wait(aws->fd, &aws->vm_timeline_syncobj, + r = ac_drm_cs_syncobj_timeline_wait(aws->dev, &aws->vm_timeline_syncobj, &get_real_bo(amdgpu_winsys_bo(userq->doorbell_bo)) ->vm_timeline_point, 1, INT64_MAX, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL | diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index a5b81bb8d11..70bef8c9540 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -101,8 +101,8 @@ static void do_winsys_deinit(struct amdgpu_winsys *aws) simple_mtx_destroy(&aws->bo_export_table_lock); ac_addrlib_destroy(aws->addrlib); + ac_drm_cs_destroy_syncobj(aws->dev, aws->vm_timeline_syncobj); ac_drm_device_deinitialize(aws->dev); - ac_drm_cs_destroy_syncobj(aws->fd, aws->vm_timeline_syncobj); simple_mtx_destroy(&aws->bo_fence_lock); FREE(aws); @@ -456,7 +456,7 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config, aws->info.drm_major = drm_major; aws->info.drm_minor = drm_minor; - if (ac_drm_cs_create_syncobj2(aws->fd, 0, &aws->vm_timeline_syncobj)) + if (ac_drm_cs_create_syncobj2(aws->dev, 0, &aws->vm_timeline_syncobj)) goto fail_alloc; simple_mtx_init(&aws->vm_ioctl_lock, mtx_plain);