From: Michel Dänzer <michel.daen...@amd.com>

The helper transparently handles BOs allocated from GBM and
libdrm_amdgpu.

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/amdgpu_bo_helper.c | 11 +++++++++++
 src/amdgpu_bo_helper.h |  2 ++
 src/amdgpu_glamor.c    | 18 ++++++++++--------
 src/drmmode_display.c  | 32 ++++++++++----------------------
 4 files changed, 33 insertions(+), 30 deletions(-)

diff --git a/src/amdgpu_bo_helper.c b/src/amdgpu_bo_helper.c
index 54270c6..47cd9eb 100644
--- a/src/amdgpu_bo_helper.c
+++ b/src/amdgpu_bo_helper.c
@@ -118,6 +118,17 @@ struct amdgpu_buffer *amdgpu_alloc_pixmap_bo(ScrnInfoPtr 
pScrn, int width,
        return pixmap_buffer;
 }
 
+Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, uint32_t *handle)
+{
+       if (bo->flags & AMDGPU_BO_FLAGS_GBM) {
+               *handle = gbm_bo_get_handle(bo->bo.gbm).u32;
+               return TRUE;
+       }
+
+       return amdgpu_bo_export(bo->bo.amdgpu, amdgpu_bo_handle_type_kms,
+                               handle) == 0;
+}
+
 int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo)
 {
        AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
diff --git a/src/amdgpu_bo_helper.h b/src/amdgpu_bo_helper.h
index 8270d39..4dae200 100644
--- a/src/amdgpu_bo_helper.h
+++ b/src/amdgpu_bo_helper.h
@@ -29,6 +29,8 @@ extern struct amdgpu_buffer 
*amdgpu_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width
                                                     int height, int depth, int 
usage_hint,
                                                     int bitsPerPixel, int 
*new_pitch);
 
+extern Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, uint32_t *handle);
+
 extern int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo);
 
 extern void amdgpu_bo_unmap(struct amdgpu_buffer *bo);
diff --git a/src/amdgpu_glamor.c b/src/amdgpu_glamor.c
index 7c45f34..d91effc 100644
--- a/src/amdgpu_glamor.c
+++ b/src/amdgpu_glamor.c
@@ -55,7 +55,7 @@ Bool amdgpu_glamor_create_screen_resources(ScreenPtr screen)
 {
        ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
        AMDGPUInfoPtr info = AMDGPUPTR(scrn);
-       union gbm_bo_handle bo_handle;
+       uint32_t bo_handle;
 
        if (!info->use_glamor)
                return TRUE;
@@ -65,9 +65,9 @@ Bool amdgpu_glamor_create_screen_resources(ScreenPtr screen)
                return FALSE;
 #endif
 
-       bo_handle = gbm_bo_get_handle(info->front_buffer->bo.gbm);
-       if (!glamor_egl_create_textured_screen_ext(screen,
-                                                  bo_handle.u32,
+       if (!amdgpu_bo_get_handle(info->front_buffer, &bo_handle) ||
+           !glamor_egl_create_textured_screen_ext(screen,
+                                                  bo_handle,
                                                   scrn->displayWidth *
                                                   info->pixel_bytes, NULL)) {
                return FALSE;
@@ -131,7 +131,7 @@ amdgpu_glamor_create_textured_pixmap(PixmapPtr pixmap, 
struct amdgpu_pixmap *pri
 {
        ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
        AMDGPUInfoPtr info = AMDGPUPTR(scrn);
-       union gbm_bo_handle bo_handle;
+       uint32_t bo_handle;
 
        if ((info->use_glamor) == 0)
                return TRUE;
@@ -139,9 +139,11 @@ amdgpu_glamor_create_textured_pixmap(PixmapPtr pixmap, 
struct amdgpu_pixmap *pri
        if (!priv->stride)
                priv->stride = pixmap->devKind;
 
-       bo_handle = gbm_bo_get_handle(priv->bo->bo.gbm);
-       return glamor_egl_create_textured_pixmap(pixmap, bo_handle.u32,
-                                                priv->stride);
+       if (!amdgpu_bo_get_handle(priv->bo, &bo_handle))
+               return FALSE;
+
+       return glamor_egl_create_textured_pixmap(pixmap, bo_handle,
+                                                pixmap->devKind);
 }
 
 #ifndef CREATE_PIXMAP_USAGE_SHARED
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index d855787..1fcf901 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -420,18 +420,12 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
        int i;
        int fb_id;
        drmModeModeInfo kmode;
-       union gbm_bo_handle bo_handle;
+       uint32_t bo_handle;
 
        if (drmmode->fb_id == 0) {
-               if (info->gbm) {
-                       bo_handle = 
gbm_bo_get_handle(info->front_buffer->bo.gbm);
-               } else {
-                       if (amdgpu_bo_export(info->front_buffer->bo.amdgpu,
-                                            amdgpu_bo_handle_type_kms,
-                                            &bo_handle.u32)) {
-                               ErrorF("failed to get BO handle for FB\n");
-                               return FALSE;
-                       }
+               if (!amdgpu_bo_get_handle(info->front_buffer, &bo_handle)) {
+                       ErrorF("failed to get BO handle for FB\n");
+                       return FALSE;
                }
 
                ret = drmModeAddFB(drmmode->fd,
@@ -439,7 +433,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr 
mode,
                                   pScrn->virtualY,
                                   pScrn->depth, pScrn->bitsPerPixel,
                                   pScrn->displayWidth * info->pixel_bytes,
-                                  bo_handle.u32, &drmmode->fb_id);
+                                  bo_handle, &drmmode->fb_id);
                if (ret < 0) {
                        ErrorF("failed to add fb\n");
                        return FALSE;
@@ -595,20 +589,14 @@ static void drmmode_show_cursor(xf86CrtcPtr crtc)
        AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
        drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
        drmmode_ptr drmmode = drmmode_crtc->drmmode;
-       union gbm_bo_handle bo_handle;
+       uint32_t bo_handle;
 
-       if (info->gbm) {
-               bo_handle = 
gbm_bo_get_handle(drmmode_crtc->cursor_buffer->bo.gbm);
-       } else {
-               if (amdgpu_bo_export(drmmode_crtc->cursor_buffer->bo.amdgpu,
-                                    amdgpu_bo_handle_type_kms,
-                                    &bo_handle.u32)) {
-                       ErrorF("failed to get BO handle for cursor\n");
-                       return;
-               }
+       if (!amdgpu_bo_get_handle(drmmode_crtc->cursor_buffer, &bo_handle)) {
+               ErrorF("failed to get BO handle for cursor\n");
+               return;
        }
 
-       drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 
bo_handle.u32,
+       drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 
bo_handle,
                         info->cursor_w, info->cursor_h);
 }
 
-- 
2.1.4

_______________________________________________
xorg-driver-ati mailing list
xorg-driver-ati@lists.x.org
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to