From: Michel Dänzer <michel.daen...@amd.com> No functional change.
Signed-off-by: Michel Dänzer <michel.daen...@amd.com> --- src/radeon_bo_helper.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++ src/radeon_bo_helper.h | 3 +++ src/radeon_present.c | 53 +++----------------------------------------------- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/radeon_bo_helper.c b/src/radeon_bo_helper.c index c3a2d63..f45aa76 100644 --- a/src/radeon_bo_helper.c +++ b/src/radeon_bo_helper.c @@ -25,6 +25,7 @@ #endif #include "radeon.h" +#include "radeon_glamor.h" #ifdef RADEON_PIXMAP_SHARING #include "radeon_bo_gem.h" @@ -187,6 +188,54 @@ radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int height, int depth, return bo; } +/* Get GEM handle for the pixmap */ +Bool radeon_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; +} + #ifdef RADEON_PIXMAP_SHARING Bool radeon_share_pixmap_backing(struct radeon_bo *bo, void **handle_p) diff --git a/src/radeon_bo_helper.h b/src/radeon_bo_helper.h index 9c3d73f..89ad4be 100644 --- a/src/radeon_bo_helper.h +++ b/src/radeon_bo_helper.h @@ -29,6 +29,9 @@ radeon_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width, int height, int depth, struct radeon_surface *new_surface, uint32_t *new_tiling); extern Bool +radeon_get_pixmap_handle(PixmapPtr pixmap, uint32_t *handle); + +extern Bool radeon_share_pixmap_backing(struct radeon_bo *bo, void **handle_p); extern Bool diff --git a/src/radeon_present.c b/src/radeon_present.c index 711b45d..b402110 100644 --- a/src/radeon_present.c +++ b/src/radeon_present.c @@ -42,6 +42,7 @@ #include <time.h> #include <errno.h> +#include "radeon_bo_helper.h" #include "radeon_glamor.h" #include "radeon_video.h" @@ -217,54 +218,6 @@ 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); -#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; -} - /* * Test to see if page flipping is possible on the target crtc */ @@ -340,7 +293,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; - if (!radeon_present_get_pixmap_handle(pixmap, &handle)) + if (!radeon_get_pixmap_handle(pixmap, &handle)) return FALSE; event = calloc(1, sizeof(struct radeon_present_vblank_event)); @@ -374,7 +327,7 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id) if (!radeon_present_check_flip(NULL, screen->root, pixmap, TRUE)) return; - if (!radeon_present_get_pixmap_handle(pixmap, &handle)) + if (!radeon_get_pixmap_handle(pixmap, &handle)) return; event = calloc(1, sizeof(struct radeon_present_vblank_event)); -- 2.1.4 _______________________________________________ xorg-driver-ati mailing list xorg-driver-ati@lists.x.org http://lists.x.org/mailman/listinfo/xorg-driver-ati