[Mesa-dev] [Request for Testing] i965: import prime buffers in the current context, not screen

Martin Peres martin.peres at linux.intel.com
Thu Aug 25 12:57:29 UTC 2016


This mirrors the codepath taken by DRI2 in IntelSetTexBuffer2() and
fixes many applications when using DRI3:
 - Totem with libva on hw-accelerated decoding
 - obs-studio, using Window Capture (Xcomposite) as a Source
 - gstreamer with VAAPI

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71759
Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
---

This patch supposedly prevents gnome from running for one Arch Linux
maintainer. Kenneth Graunke  and I failed to reproduce it so I am
asking for your help/comments on this.

 src/mesa/drivers/dri/i965/intel_screen.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
index 7876652..5c0d300 100644
--- a/src/mesa/drivers/dri/i965/intel_screen.c
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
@@ -698,8 +698,11 @@ intel_create_image_from_fds(__DRIscreen *screen,
                             int *fds, int num_fds, int *strides, int *offsets,
                             void *loaderPrivate)
 {
+   GET_CURRENT_CONTEXT(ctx);
    struct intel_screen *intelScreen = screen->driverPrivate;
+   struct brw_context *brw = brw_context(ctx);
    struct intel_image_format *f;
+   dri_bufmgr *bufmgr;
    __DRIimage *image;
    int i, index;
 
@@ -740,8 +743,25 @@ intel_create_image_from_fds(__DRIscreen *screen,
          size = end;
    }
 
-   image->bo = drm_intel_bo_gem_create_from_prime(intelScreen->bufmgr,
-                                                  fds[0], size);
+   /* Let's import the buffer into the current context instead of the current
+    * screen as some applications like gstreamer, totem, or obs create multiple
+    * X connections which end up creating multiple screens and thus multiple
+    * buffer managers. They then proceed to use a different X connection to call
+    * GLXBindTexImageExt() which should import the buffer in the current thread
+    * bound and not the current screen. This is done properly upstairs for
+    * texture management so we need to mirror this behaviour if we don't want
+    * the kernel rejecting our pushbuffers as the buffers have not been imported
+    * by the same bufmgr that sent the pushbuffer.
+    *
+    * If there is no context currently bound, then revert to using the screen's
+    * buffer manager and hope for the best...
+    */
+   if (brw)
+       bufmgr = brw->bufmgr;
+   else
+       bufmgr = intelScreen->bufmgr;
+
+   image->bo = drm_intel_bo_gem_create_from_prime(bufmgr, fds[0], size);
    if (image->bo == NULL) {
       free(image);
       return NULL;
-- 
2.9.3



More information about the mesa-dev mailing list