[PATCH 2/2] DRI2: Use radeon_get_pixmap_handle
Michel Dänzer
michel at daenzer.net
Thu Mar 26 20:37:28 PDT 2015
From: Michel Dänzer <michel.daenzer at amd.com>
Now we can share pixmaps with no struct radeon_bo via DRI2.
Fixes VDPAU video playback freezing when using an OpenGL compositor with
DRI3 enabled.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89755
Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
src/radeon_dri2.c | 35 ++++++++++++++++++++++++++---------
1 file changed, 26 insertions(+), 9 deletions(-)
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 2636456..edf643d 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -40,6 +40,7 @@
#include <fcntl.h>
#include <errno.h>
+#include "radeon_bo_helper.h"
#include "radeon_version.h"
#include "radeon_list.h"
@@ -125,6 +126,26 @@ static PixmapPtr fixup_glamor(DrawablePtr drawable, PixmapPtr pixmap)
return old;
}
+/* Get GEM flink name for a pixmap */
+static Bool
+radeon_get_flink_name(RADEONInfoPtr info, PixmapPtr pixmap, uint32_t *name)
+{
+ struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
+ struct drm_gem_flink flink;
+
+ if (bo)
+ return radeon_gem_get_kernel_name(bo, name) == 0;
+
+ if (radeon_get_pixmap_handle(pixmap, &flink.handle)) {
+ if (drmIoctl(info->dri2.drm_fd, DRM_IOCTL_GEM_FLINK, &flink) != 0)
+ return FALSE;
+
+ *name = flink.name;
+ return TRUE;
+ }
+
+ return FALSE;
+}
static BufferPtr
radeon_dri2_create_buffer2(ScreenPtr pScreen,
@@ -137,7 +158,6 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen,
BufferPtr buffers;
struct dri2_buffer_priv *privates;
PixmapPtr pixmap, depth_pixmap;
- struct radeon_bo *bo;
int flags;
unsigned front_width;
uint32_t tiling = 0;
@@ -171,10 +191,12 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen,
pixmap = depth_pixmap = NULL;
if (attachment == DRI2BufferFrontLeft) {
+ uint32_t handle;
+
pixmap = get_drawable_pixmap(drawable);
if (pScreen != pixmap->drawable.pScreen)
pixmap = NULL;
- else if (info->use_glamor && !radeon_get_pixmap_bo(pixmap)) {
+ else if (info->use_glamor && !radeon_get_pixmap_handle(pixmap, &handle)) {
is_glamor_pixmap = TRUE;
aligned_width = pixmap->drawable.width;
height = pixmap->drawable.height;
@@ -285,8 +307,7 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen,
if (is_glamor_pixmap)
pixmap = fixup_glamor(drawable, pixmap);
- bo = radeon_get_pixmap_bo(pixmap);
- if (!bo || radeon_gem_get_kernel_name(bo, &buffers->name) != 0)
+ if (!radeon_get_flink_name(info, pixmap, &buffers->name))
goto error;
}
@@ -657,20 +678,16 @@ radeon_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr client,
static Bool
update_front(DrawablePtr draw, DRI2BufferPtr front)
{
- int r;
PixmapPtr pixmap;
RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(draw->pScreen));
struct dri2_buffer_priv *priv = front->driverPrivate;
- struct radeon_bo *bo;
pixmap = get_drawable_pixmap(draw);
pixmap->refcnt++;
if (!info->use_glamor)
exaMoveInPixmap(pixmap);
- bo = radeon_get_pixmap_bo(pixmap);
- r = radeon_gem_get_kernel_name(bo, &front->name);
- if (r) {
+ if (!radeon_get_flink_name(info, pixmap, &front->name)) {
(*draw->pScreen->DestroyPixmap)(pixmap);
return FALSE;
}
--
2.1.4
More information about the xorg-driver-ati
mailing list