i965: Improve same-buffer restriction for imports
authorDaniel Stone <daniels@collabora.com>
Tue, 30 May 2017 11:53:48 +0000 (17:23 +0530)
committerDaniel Stone <daniels@collabora.com>
Thu, 8 Jun 2017 21:27:30 +0000 (22:27 +0100)
Intel hardware requires that all planes of an image come from the same
buffer, which is currently implemented by testing that all FDs are
numerically the same.

However, when going through a winsys (e.g.) or anything which transits
FDs individually, the FDs may be different even if the underlying buffer
is the same.

Instead of checking the FDs for equality, we must check if they actually
point to the same buffer (Jason).

Reviewed-by: Varad Gautam <varad.gautam@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/intel_screen.c

index 96f30168127acac0909714a21bd179c1b30d7376..638a9b080bd332cc71c7d8c38fc92c49983a2319 100644 (file)
@@ -841,11 +841,6 @@ intel_create_image_from_fds(__DRIscreen *dri_screen,
    if (fds == NULL || num_fds < 1)
       return NULL;
 
-   /* We only support all planes from the same bo */
-   for (i = 0; i < num_fds; i++)
-      if (fds[0] != fds[i])
-         return NULL;
-
    f = intel_image_format_lookup(fourcc);
    if (f == NULL)
       return NULL;
@@ -872,6 +867,19 @@ intel_create_image_from_fds(__DRIscreen *dri_screen,
       return NULL;
    }
 
+   /* We only support all planes from the same bo.
+    * brw_bo_gem_create_from_prime() should return the same pointer for all
+    * fds received here */
+   for (i = 1; i < num_fds; i++) {
+      struct brw_bo *aux = brw_bo_gem_create_from_prime(screen->bufmgr, fds[i]);
+      brw_bo_unreference(aux);
+      if (aux != image->bo) {
+         brw_bo_unreference(image->bo);
+         free(image);
+         return NULL;
+      }
+   }
+
    image->modifier = tiling_to_modifier(image->bo->tiling_mode);
    tiled_height = get_tiled_height(image->modifier, height);