From: Christopher James Halse Rogers <r...@ubuntu.com>

---
 src/gallium/drivers/nouveau/nouveau_screen.c | 19 ++++++++++++++++++-
 src/gallium/drivers/nouveau/nouveau_screen.h |  2 ++
 src/gallium/drivers/nv30/nv30_screen.c       |  6 +++++-
 src/gallium/drivers/nv50/nv50_screen.c       |  5 ++++-
 src/gallium/drivers/nvc0/nvc0_screen.c       |  5 ++++-
 5 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c 
b/src/gallium/drivers/nouveau/nouveau_screen.c
index d129a55..6308a91 100644
--- a/src/gallium/drivers/nouveau/nouveau_screen.c
+++ b/src/gallium/drivers/nouveau/nouveau_screen.c
@@ -14,6 +14,7 @@
 #include <errno.h>
 #include <stdlib.h>
 
+#include <xf86drm.h>
 #include <libdrm/nouveau_drm.h>
 
 #include "nouveau_winsys.h"
@@ -86,7 +87,18 @@ nouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
        struct nouveau_bo *bo = 0;
        int ret;
  
-       ret = nouveau_bo_name_ref(dev, whandle->handle, &bo);
+       if (whandle->type != DRM_API_HANDLE_TYPE_SHARED &&
+           whandle->type != DRM_API_HANDLE_TYPE_FD) {
+               debug_printf("%s: attempt to import unsupported handle type 
%d\n",
+                            __FUNCTION__, whandle->type);
+               return NULL;            
+       }
+
+       if (whandle->type == DRM_API_HANDLE_TYPE_SHARED)
+               ret = nouveau_bo_name_ref(dev, whandle->handle, &bo);
+       else
+               ret = nouveau_bo_prime_handle_ref(dev, whandle->handle, &bo);
+
        if (ret) {
                debug_printf("%s: ref name 0x%08x failed with %d\n",
                             __FUNCTION__, whandle->handle, ret);
@@ -111,6 +123,8 @@ nouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
        } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
                whandle->handle = bo->handle;
                return TRUE;
+       } else if (whandle->type == DRM_API_HANDLE_TYPE_FD) {
+               return nouveau_bo_set_prime(bo, (int *)&whandle->handle) == 0;
        } else {
                return FALSE;
        }
@@ -161,6 +175,9 @@ nouveau_screen_init(struct nouveau_screen *screen, struct 
nouveau_device *dev)
         if (!ret)
            screen->cpu_gpu_time_delta = time - screen->cpu_gpu_time_delta * 
1000;
 
+       screen->prime_caps = 0;
+       ret = drmGetCap(dev->fd, DRM_CAP_PRIME, &screen->prime_caps);
+       
        pscreen->get_name = nouveau_screen_get_name;
        pscreen->get_vendor = nouveau_screen_get_vendor;
 
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h 
b/src/gallium/drivers/nouveau/nouveau_screen.h
index 7f15d10..fc5531b 100644
--- a/src/gallium/drivers/nouveau/nouveau_screen.h
+++ b/src/gallium/drivers/nouveau/nouveau_screen.h
@@ -47,6 +47,8 @@ struct nouveau_screen {
 
        int64_t cpu_gpu_time_delta;
 
+       uint64_t prime_caps;
+
        boolean hint_buf_keep_sysmem_copy;
 
 #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
diff --git a/src/gallium/drivers/nv30/nv30_screen.c 
b/src/gallium/drivers/nv30/nv30_screen.c
index 97471a7..d014fb9 100644
--- a/src/gallium/drivers/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nv30/nv30_screen.c
@@ -31,6 +31,8 @@
 #include "nv30-40_3d.xml.h"
 #include "nv01_2d.xml.h"
 
+#include <drm.h>
+
 #include "nouveau/nouveau_fence.h"
 #include "nv30_screen.h"
 #include "nv30_context.h"
@@ -124,13 +126,15 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
    case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
    case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
-   case PIPE_CAP_PRIME:
       return 0;
    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
    case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
    case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
       return 1;
+   case PIPE_CAP_PRIME:
+      return screen->base.prime_caps &
+         (DRM_PRIME_CAP_EXPORT | DRM_PRIME_CAP_IMPORT);
    default:
       debug_printf("unknown param %d\n", param);
       return 0;
diff --git a/src/gallium/drivers/nv50/nv50_screen.c 
b/src/gallium/drivers/nv50/nv50_screen.c
index 1177c1b..7194604 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -24,6 +24,8 @@
 #include "util/u_format_s3tc.h"
 #include "pipe/p_screen.h"
 
+#include <drm.h>
+
 #include "nv50_context.h"
 #include "nv50_screen.h"
 
@@ -189,7 +191,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
       return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50;
    case PIPE_CAP_PRIME:
-      return 0;
+      return nouveau_screen(pscreen)->prime_caps &
+         (DRM_PRIME_CAP_EXPORT | DRM_PRIME_CAP_IMPORT);
    default:
       NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
       return 0;
diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c 
b/src/gallium/drivers/nvc0/nvc0_screen.c
index e3eff40..c2ae7e1 100644
--- a/src/gallium/drivers/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nvc0/nvc0_screen.c
@@ -24,6 +24,8 @@
 #include "util/u_format_s3tc.h"
 #include "pipe/p_screen.h"
 
+#include <drm.h>
+
 #include "vl/vl_decoder.h"
 #include "vl/vl_video_buffer.h"
 
@@ -179,7 +181,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
       return PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50;
    case PIPE_CAP_PRIME:
-      return 0;
+      return nouveau_screen(pscreen)->prime_caps &
+         (DRM_PRIME_CAP_EXPORT | DRM_PRIME_CAP_IMPORT);
    default:
       NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
       return 0;
-- 
1.8.1.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to