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

Reply via email to