Module: Mesa Branch: amdgpu Commit: 6951be72d6194b99bbcd4bbee8f3c871bd1facd6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6951be72d6194b99bbcd4bbee8f3c871bd1facd6
Author: Marek Olšák <[email protected]> Date: Wed May 6 18:00:51 2015 +0200 winsys/amdgpu: add userptr support The KMS handle is needed as a key for the fast cs_add_reloc lookup. Reviewed-by: Alex Deucher <[email protected]> --- src/gallium/winsys/amdgpu/drm/amdgpu_bo.c | 44 +++++++++++++++++++++++++ src/gallium/winsys/amdgpu/drm/amdgpu_bo.h | 1 + src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 1 + 3 files changed, 46 insertions(+) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c index 8bb1946..8065f46 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c @@ -198,6 +198,10 @@ static void *amdgpu_bo_map(struct radeon_winsys_cs_handle *buf, } } + /* If the buffer is created from user memory, return the user pointer. */ + if (bo->user_ptr) + return bo->user_ptr; + r = amdgpu_bo_cpu_map(bo->bo, &cpu); return r ? NULL : cpu; } @@ -626,6 +630,45 @@ static boolean amdgpu_bo_get_handle(struct pb_buffer *buffer, return TRUE; } +static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws, + void *pointer, unsigned size) +{ + struct amdgpu_winsys *ws = amdgpu_winsys(rws); + struct amdgpu_bo_alloc_result result; + struct amdgpu_winsys_bo *bo; + + bo = CALLOC_STRUCT(amdgpu_winsys_bo); + if (!bo) + return NULL; + + if (amdgpu_create_bo_from_user_mem(ws->dev, pointer, size, &result)) { + FREE(bo); + return NULL; + } + + /* Initialize it. */ + pipe_reference_init(&bo->base.reference, 1); + bo->bo = result.buf_handle; + bo->base.alignment = 0; + bo->base.usage = PB_USAGE_GPU_WRITE | PB_USAGE_GPU_READ; + bo->base.size = size; + bo->base.vtbl = &amdgpu_winsys_bo_vtbl; + bo->rws = ws; + bo->user_ptr = pointer; + bo->va = result.virtual_mc_base_address; + bo->initial_domain = RADEON_DOMAIN_GTT; + + if (amdgpu_bo_export(bo->bo, amdgpu_bo_handle_type_kms, &bo->handle)) { + amdgpu_bo_free(bo->bo); + FREE(bo); + return NULL; + } + + ws->allocated_gtt += align(bo->base.size, 4096); + + return (struct pb_buffer*)bo; +} + static uint64_t amdgpu_bo_get_va(struct radeon_winsys_cs_handle *buf) { return ((struct amdgpu_winsys_bo*)buf)->va; @@ -642,6 +685,7 @@ void amdgpu_bomgr_init_functions(struct amdgpu_winsys *ws) ws->base.buffer_is_busy = amdgpu_bo_is_busy; ws->base.buffer_create = amdgpu_bo_create; ws->base.buffer_from_handle = amdgpu_bo_from_handle; + ws->base.buffer_from_ptr = amdgpu_bo_from_ptr; ws->base.buffer_get_handle = amdgpu_bo_get_handle; ws->base.buffer_get_virtual_address = amdgpu_bo_get_va; ws->base.buffer_get_initial_domain = amdgpu_bo_get_initial_domain; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h index ecfa991..f708731 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.h @@ -47,6 +47,7 @@ struct amdgpu_winsys_bo { struct pb_buffer base; struct amdgpu_winsys *rws; + void *user_ptr; /* from buffer_from_ptr */ amdgpu_bo_handle bo; uint32_t handle; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 54664e8..8776dfd 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -249,6 +249,7 @@ static boolean do_winsys_init(struct amdgpu_winsys *ws) ws->info.has_uvd = uvd.available_rings != 0; ws->info.vce_fw_version = vce.available_rings ? vce_version : 0; + ws->info.has_userptr = TRUE; ws->info.r600_num_backends = ws->amdinfo.rb_pipes; ws->info.r600_clock_crystal_freq = ws->amdinfo.gpu_counter_freq; ws->info.r600_tiling_config = r600_get_gb_tiling_config(&ws->amdinfo); _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
