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