xf86-video-ati: Branch 'master' - 3 commits

Michel Dänzer daenzer at kemper.freedesktop.org
Wed Mar 25 02:30:57 PDT 2015


 src/drmmode_display.c |    4 +--
 src/drmmode_display.h |    2 -
 src/radeon.h          |    4 +++
 src/radeon_dri2.c     |    5 ++-
 src/radeon_dri3.c     |   10 +++++++
 src/radeon_glamor.h   |    1 
 src/radeon_present.c  |   63 +++++++++++++++++++++++++++++++++++++++++++-------
 7 files changed, 76 insertions(+), 13 deletions(-)

New commits:
commit 391900a670addec39515f924265bfa9f8bfa9ec0
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Wed Mar 18 12:56:07 2015 +0900

    glamor: Avoid generating GEM flink names for BOs shared via DRI3 v2
    
    We can't create our own struct radeon_bo representation in this case
    because destroying that would make the GEM handle inaccessible to glamor
    as well. So just get the handle directly via dma-buf.
    
    v2: Close dma-buf file descriptor, pointed out by Axel Davy.
    
    Reviewed-by: Axel Davy <axel.davy at ens.fr>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon.h b/src/radeon.h
index 375a726..00d0495 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -252,6 +252,10 @@ struct radeon_pixmap {
 
 	uint32_t tiling_flags;
 	int stride;
+
+	/* GEM handle for glamor-only pixmaps shared via DRI3 */
+	Bool handle_valid;
+	uint32_t handle;
 };
 
 #if HAS_DEVPRIVATEKEYREC
diff --git a/src/radeon_dri3.c b/src/radeon_dri3.c
index 993c7a7..3a7322e 100644
--- a/src/radeon_dri3.c
+++ b/src/radeon_dri3.c
@@ -96,6 +96,16 @@ static PixmapPtr radeon_dri3_pixmap_from_fd(ScreenPtr screen,
 {
 	PixmapPtr pixmap;
 
+#ifdef USE_GLAMOR
+	/* Avoid generating a GEM flink name if possible */
+	if (RADEONPTR(xf86ScreenToScrn(screen))->use_glamor) {
+		pixmap = glamor_pixmap_from_fd(screen, fd, width, height,
+					       stride, depth, bpp);
+		if (pixmap)
+			return pixmap;
+	}
+#endif
+
 	if (depth < 8)
 		return NULL;
 
diff --git a/src/radeon_glamor.h b/src/radeon_glamor.h
index f450f0e..7cef1a9 100644
--- a/src/radeon_glamor.h
+++ b/src/radeon_glamor.h
@@ -37,6 +37,7 @@
 
 #ifndef GLAMOR_NO_DRI3
 #define glamor_fd_from_pixmap glamor_dri3_fd_from_pixmap
+#define glamor_pixmap_from_fd glamor_egl_dri3_pixmap_from_fd
 #endif
 
 Bool radeon_glamor_pre_init(ScrnInfoPtr scrn);
diff --git a/src/radeon_present.c b/src/radeon_present.c
index 85f1bfc..711b45d 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -42,6 +42,7 @@
 #include <time.h>
 #include <errno.h>
 
+#include "radeon_glamor.h"
 #include "radeon_video.h"
 
 #include "present.h"
@@ -220,12 +221,47 @@ static Bool
 radeon_present_get_pixmap_handle(PixmapPtr pixmap, uint32_t *handle)
 {
     struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
+#ifdef USE_GLAMOR
+    ScreenPtr screen = pixmap->drawable.pScreen;
+    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen));
+#endif
 
     if (bo) {
 	*handle = bo->handle;
 	return TRUE;
     }
 
+#ifdef USE_GLAMOR
+    if (info->use_glamor) {
+	struct radeon_pixmap *priv = radeon_get_pixmap_private(pixmap);
+	CARD16 stride;
+	CARD32 size;
+	int fd, r;
+
+	if (!priv) {
+	    priv = calloc(1, sizeof(*priv));
+	    radeon_set_pixmap_private(pixmap, priv);
+	}
+
+	if (priv->handle_valid) {
+	    *handle = priv->handle;
+	    return TRUE;
+	}
+
+	fd = glamor_fd_from_pixmap(screen, pixmap, &stride, &size);
+	if (fd < 0)
+	    return FALSE;
+
+	r = drmPrimeFDToHandle(info->dri2.drm_fd, fd, &priv->handle);
+	close(fd);
+	if (r == 0) {
+	    priv->handle_valid = TRUE;
+	    *handle = priv->handle;
+	    return TRUE;
+	}
+    }
+#endif
+
     return FALSE;
 }
 
commit dfad91fffb5bd013785223b42d78886df839eacf
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Mar 19 12:37:01 2015 +0900

    Present: Add radeon_present_get_pixmap_handle helper
    
    Reviewed-by: Axel Davy <axel.davy at ens.fr>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_present.c b/src/radeon_present.c
index 9d774ab..85f1bfc 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -216,6 +216,19 @@ get_drmmode_crtc(ScrnInfoPtr scrn, RRCrtcPtr crtc)
     return NULL;
 }
 
+static Bool
+radeon_present_get_pixmap_handle(PixmapPtr pixmap, uint32_t *handle)
+{
+    struct radeon_bo *bo = radeon_get_pixmap_bo(pixmap);
+
+    if (bo) {
+	*handle = bo->handle;
+	return TRUE;
+    }
+
+    return FALSE;
+}
+
 /*
  * Test to see if page flipping is possible on the target crtc
  */
@@ -282,7 +295,7 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc,
     struct radeon_present_vblank_event *event;
     drmmode_crtc_private_ptr drmmode_crtc = get_drmmode_crtc(scrn, crtc);
     int crtc_id = drmmode_crtc->mode_crtc->crtc_id;
-    struct radeon_bo *bo;
+    uint32_t handle;
     Bool ret;
 
     if (!sync_flip)
@@ -291,8 +304,7 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc,
     if (!radeon_present_check_flip(crtc, screen->root, pixmap, sync_flip))
 	return FALSE;
 
-    bo = radeon_get_pixmap_bo(pixmap);
-    if (!bo)
+    if (!radeon_present_get_pixmap_handle(pixmap, &handle))
 	return FALSE;
 
     event = calloc(1, sizeof(struct radeon_present_vblank_event));
@@ -301,7 +313,7 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc,
 
     event->event_id = event_id;
 
-    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo->handle,
+    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, handle,
 			     event_id, event, crtc_id,
 			     radeon_present_flip_event,
 			     radeon_present_flip_abort);
@@ -320,14 +332,13 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id)
     ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
     struct radeon_present_vblank_event *event;
     PixmapPtr pixmap = screen->GetScreenPixmap(screen);
-    struct radeon_bo *bo;
+    uint32_t handle;
     Bool ret;
 
     if (!radeon_present_check_flip(NULL, screen->root, pixmap, TRUE))
 	return;
 
-    bo = radeon_get_pixmap_bo(pixmap);
-    if (!bo)
+    if (!radeon_present_get_pixmap_handle(pixmap, &handle))
 	return;
 
     event = calloc(1, sizeof(struct radeon_present_vblank_event));
@@ -336,7 +347,7 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id)
 
     event->event_id = event_id;
 
-    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo->handle,
+    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, handle,
 			     event_id, event, -1, radeon_present_flip_event,
 			     radeon_present_flip_abort);
     if (!ret)
commit 7b4fc4a677d252d01c2bf80d162bc35814059eaa
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Mar 19 12:15:52 2015 +0900

    Make radeon_do_pageflip take a BO handle directly
    
    Reviewed-by: Axel Davy <axel.davy at ens.fr>
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 86bc446..f719f0c 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2265,7 +2265,7 @@ void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode)
 }
 
 Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
-			struct radeon_bo *new_front, uint64_t id, void *data,
+			uint32_t new_front_handle, uint64_t id, void *data,
 			int ref_crtc_hw_id, radeon_drm_handler_proc handler,
 			radeon_drm_abort_proc abort)
 {
@@ -2301,7 +2301,7 @@ Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
 	old_fb_id = drmmode->fb_id;
 	if (drmModeAddFB(drmmode->fd, scrn->virtualX, height,
 			 scrn->depth, scrn->bitsPerPixel, pitch,
-			 new_front->handle, &drmmode->fb_id))
+			 new_front_handle, &drmmode->fb_id))
 		goto error_out;
 
         flipdata = calloc(1, sizeof(drmmode_flipdata_rec));
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index 6f883c0..b3804ba 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -129,7 +129,7 @@ extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling);
 extern int drmmode_get_base_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling);
 
 Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
-			struct radeon_bo *new_front, uint64_t id, void *data,
+			uint32_t new_front_handle, uint64_t id, void *data,
 			int ref_crtc_hw_id, radeon_drm_handler_proc handler,
 			radeon_drm_abort_proc abort);
 int drmmode_crtc_get_ust_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc);
diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 02e8e8f..2636456 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -647,8 +647,9 @@ radeon_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr client,
     back_priv = back->driverPrivate;
     bo = radeon_get_pixmap_bo(back_priv->pixmap);
 
-    return radeon_do_pageflip(scrn, client, bo, RADEON_DRM_QUEUE_ID_DEFAULT,
-			      flip_info, ref_crtc_hw_id,
+    return radeon_do_pageflip(scrn, client, bo->handle,
+			      RADEON_DRM_QUEUE_ID_DEFAULT, flip_info,
+			      ref_crtc_hw_id,
 			      radeon_dri2_flip_event_handler,
 			      radeon_dri2_flip_event_abort);
 }
diff --git a/src/radeon_present.c b/src/radeon_present.c
index 0aa96cf..9d774ab 100644
--- a/src/radeon_present.c
+++ b/src/radeon_present.c
@@ -301,7 +301,7 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc,
 
     event->event_id = event_id;
 
-    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo,
+    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo->handle,
 			     event_id, event, crtc_id,
 			     radeon_present_flip_event,
 			     radeon_present_flip_abort);
@@ -336,7 +336,7 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id)
 
     event->event_id = event_id;
 
-    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo,
+    ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, bo->handle,
 			     event_id, event, -1, radeon_present_flip_event,
 			     radeon_present_flip_abort);
     if (!ret)


More information about the xorg-commit mailing list