mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
67 lines
2.8 KiB
Diff
67 lines
2.8 KiB
Diff
|
From e180e9e3c830d3611a6cf7d32e988b4c28d20942 Mon Sep 17 00:00:00 2001
|
||
|
From: Martin Peres <martin.peres@linux.intel.com>
|
||
|
Date: Wed, 3 Aug 2016 12:58:23 +0300
|
||
|
Subject: [PATCH] i965: import prime buffers in the current context, not screen
|
||
|
|
||
|
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
|
||
|
|
||
|
Cc: mesa-stable@lists.freedesktop.org
|
||
|
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=71759
|
||
|
Signed-off-by: Martin Peres <martin.peres@linux.intel.com>
|
||
|
---
|
||
|
src/mesa/drivers/dri/i965/intel_screen.c | 25 +++++++++++++++++++++++--
|
||
|
1 file changed, 23 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
|
||
|
index ae51c40..169d578 100644
|
||
|
--- a/src/mesa/drivers/dri/i965/intel_screen.c
|
||
|
+++ b/src/mesa/drivers/dri/i965/intel_screen.c
|
||
|
@@ -702,8 +702,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;
|
||
|
|
||
|
@@ -744,8 +747,26 @@ 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 than
|
||
|
+ * the one used by the currently-bound context to call GLXBindTexImageExt()
|
||
|
+ * which should then import the buffer in the current bound context 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 buffer would not have been imported by the same
|
||
|
+ * buffer manager that sent the pushbuffer referencing it.
|
||
|
+ *
|
||
|
+ * 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.0
|
||
|
|