st/dri: Check for kernel support before enabling fd sharing v2
authorThomas Hellstrom <thellstrom@vmware.com>
Tue, 17 Dec 2013 13:44:38 +0000 (05:44 -0800)
committerThomas Hellstrom <thellstrom@vmware.com>
Wed, 18 Dec 2013 08:11:24 +0000 (09:11 +0100)
The dri2 state tracker is checking for driver support before enabling
dri2ImageExtension version 7. This commit adds a check that also the
kernel driver supports fd sharing through prime.

Note that this adds a libdrm dependency on dri2.c.

v2: Removed unnecessary clamping of bool expression

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
src/gallium/state_trackers/dri/drm/dri2.c
src/gallium/targets/dri-vmwgfx/target.c

index 8ff77b38507a372bd9ca3d5d9898c5bb62efdadb..2a5b7b4e4e030ab1b8b2c11d12942cf86d78b2c0 100644 (file)
@@ -28,6 +28,7 @@
  *    <wallbraker@gmail.com> Chia-I Wu <olv@lunarg.com>
  */
 
+#include <xf86drm.h>
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
 #include "util/u_format.h"
@@ -1051,10 +1052,18 @@ dri2_init_screen(__DRIscreen * sPriv)
       screen->default_throttle_frames = throttle_ret->val.val_int;
    }
 
+#ifdef DRM_CAP_PRIME /* Old libdrm? */
    if (dmabuf_ret && dmabuf_ret->val.val_bool) {
-      dri2ImageExtension.base.version = 7;
-      dri2ImageExtension.createImageFromFds = dri2_from_fds;
+      uint64_t cap;
+
+      if (drmGetCap(sPriv->fd, DRM_CAP_PRIME, &cap) == 0 &&
+          (cap & DRM_PRIME_CAP_IMPORT)) {
+
+         dri2ImageExtension.base.version = 7;
+         dri2ImageExtension.createImageFromFds = dri2_from_fds;
+      }
    }
+#endif /* DRM_CAP_PRIME */
 
    sPriv->extensions = dri_screen_extensions;
 
index aaf37b0c4fcec1b45777467b56320f1f5cbba965..e3fbda1d665161271b2c4a7f1fdafff6be93b072 100644 (file)
@@ -31,12 +31,6 @@ static const struct drm_conf_ret throttle_ret = {
    .val.val_int = 2,
 };
 
-/* Technically this requires kernel support that is not yet
- * widespread.
- *
- * We could check for support in create_screen and return the correct
- * value, but for now just return true in all cases.
- */
 static const struct drm_conf_ret share_fd_ret = {
    .type = DRM_CONF_BOOL,
    .val.val_int = true,