From: Michel Dänzer <[email protected]>

(inspired by radeon commit 7b4fc4a677d252d01c2bf80d162bc35814059eaa)

Signed-off-by: Michel Dänzer <[email protected]>
---
 src/amdgpu_dri2.c     |  8 +++-----
 src/amdgpu_present.c  | 18 +++---------------
 src/drmmode_display.c | 30 ++++++++++--------------------
 src/drmmode_display.h |  2 +-
 4 files changed, 17 insertions(+), 41 deletions(-)

diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c
index 230e8ba..d974cb8 100644
--- a/src/amdgpu_dri2.c
+++ b/src/amdgpu_dri2.c
@@ -595,7 +595,6 @@ amdgpu_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr 
client,
 {
        AMDGPUInfoPtr info = AMDGPUPTR(scrn);
        struct dri2_buffer_priv *back_priv;
-       struct amdgpu_buffer *bo = NULL;
        DRI2FrameEventPtr flip_info;
        /* Main crtc for this drawable shall finally deliver pageflip event. */
        xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, FALSE);
@@ -618,10 +617,9 @@ amdgpu_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr 
client,
 
        /* Page flip the full screen buffer */
        back_priv = back->driverPrivate;
-       bo = amdgpu_get_pixmap_bo(back_priv->pixmap);
-
-       if (amdgpu_do_pageflip(scrn, client, bo, AMDGPU_DRM_QUEUE_ID_DEFAULT,
-                              flip_info, ref_crtc_hw_id,
+       if (amdgpu_do_pageflip(scrn, client, back_priv->pixmap,
+                              AMDGPU_DRM_QUEUE_ID_DEFAULT, flip_info,
+                              ref_crtc_hw_id,
                               amdgpu_dri2_flip_event_handler,
                               amdgpu_dri2_flip_event_abort)) {
                info->drmmode.dri2_flipping = TRUE;
diff --git a/src/amdgpu_present.c b/src/amdgpu_present.c
index 07d7ef7..73ebb4c 100644
--- a/src/amdgpu_present.c
+++ b/src/amdgpu_present.c
@@ -294,16 +294,11 @@ amdgpu_present_flip(RRCrtcPtr crtc, uint64_t event_id, 
uint64_t target_msc,
        struct amdgpu_present_vblank_event *event;
        xf86CrtcPtr xf86_crtc = crtc->devPrivate;
        int crtc_id = xf86_crtc ? drmmode_get_crtc_id(xf86_crtc) : -1;
-       struct amdgpu_buffer *bo;
        Bool ret;
 
        if (!amdgpu_present_check_flip(crtc, screen->root, pixmap, sync_flip))
                return FALSE;
 
-       bo = amdgpu_get_pixmap_bo(pixmap);
-       if (!bo)
-               return FALSE;
-
        event = calloc(1, sizeof(struct amdgpu_present_vblank_event));
        if (!event)
                return FALSE;
@@ -311,8 +306,8 @@ amdgpu_present_flip(RRCrtcPtr crtc, uint64_t event_id, 
uint64_t target_msc,
        event->event_id = event_id;
        event->crtc = xf86_crtc;
 
-       ret = amdgpu_do_pageflip(scrn, AMDGPU_DRM_QUEUE_CLIENT_DEFAULT, bo,
-                                event_id, event, crtc_id,
+       ret = amdgpu_do_pageflip(scrn, AMDGPU_DRM_QUEUE_CLIENT_DEFAULT,
+                                pixmap, event_id, event, crtc_id,
                                 amdgpu_present_flip_event,
                                 amdgpu_present_flip_abort);
        if (!ret)
@@ -334,18 +329,11 @@ amdgpu_present_unflip(ScreenPtr screen, uint64_t event_id)
        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
        struct amdgpu_present_vblank_event *event;
        PixmapPtr pixmap = screen->GetScreenPixmap(screen);
-       struct amdgpu_buffer *bo;
        int i;
 
        if (!amdgpu_present_check_flip(NULL, screen->root, pixmap, TRUE))
                goto modeset;
 
-       bo = amdgpu_get_pixmap_bo(pixmap);
-       if (!bo) {
-               ErrorF("%s: amdgpu_get_pixmap_bo failed, display might 
freeze\n", __func__);
-               goto modeset;
-       }
-
        event = calloc(1, sizeof(struct amdgpu_present_vblank_event));
        if (!event) {
                ErrorF("%s: calloc failed, display might freeze\n", __func__);
@@ -354,7 +342,7 @@ amdgpu_present_unflip(ScreenPtr screen, uint64_t event_id)
 
        event->event_id = event_id;
 
-       if (amdgpu_do_pageflip(scrn, AMDGPU_DRM_QUEUE_CLIENT_DEFAULT, bo,
+       if (amdgpu_do_pageflip(scrn, AMDGPU_DRM_QUEUE_CLIENT_DEFAULT, pixmap,
                               event_id, event, -1, amdgpu_present_flip_event,
                               amdgpu_present_flip_abort))
                return;
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 896b9d2..658eb90 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2307,7 +2307,7 @@ void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr 
drmmode)
 }
 
 Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
-                       struct amdgpu_buffer *new_front, uint64_t id, void 
*data,
+                       PixmapPtr new_front, uint64_t id, void *data,
                        int ref_crtc_hw_id, amdgpu_drm_handler_proc handler,
                        amdgpu_drm_abort_proc abort)
 {
@@ -2315,27 +2315,16 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr 
client,
        xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
        drmmode_crtc_private_ptr drmmode_crtc = config->crtc[0]->driver_private;
        drmmode_ptr drmmode = drmmode_crtc->drmmode;
-       unsigned int pitch;
        int i;
-       int height;
        drmmode_flipdata_ptr flipdata = NULL;
        drmmode_flipevtcarrier_ptr flipcarrier = NULL;
        struct amdgpu_drm_queue_entry *drm_queue = NULL;
-       union gbm_bo_handle bo_handle;
-       uint32_t handle;
+       uint32_t new_front_handle;
 
-       if (new_front->flags & AMDGPU_BO_FLAGS_GBM) {
-               pitch = gbm_bo_get_stride(new_front->bo.gbm);
-               height = gbm_bo_get_height(new_front->bo.gbm);
-               bo_handle = gbm_bo_get_handle(new_front->bo.gbm);
-               handle = bo_handle.u32;
-       } else {
-               pitch = scrn->displayWidth;
-               height = scrn->virtualY;
-               if (amdgpu_bo_export(new_front->bo.amdgpu,
-                               amdgpu_bo_handle_type_kms,
-                               &handle))
-                       goto error;
+       if (!amdgpu_pixmap_get_handle(new_front, &new_front_handle)) {
+               xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+                          "flip queue: data alloc failed.\n");
+               return FALSE;
        }
 
        flipdata = calloc(1, sizeof(drmmode_flipdata_rec));
@@ -2349,9 +2338,10 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr 
client,
         * Create a new handle for the back buffer
         */
        flipdata->old_fb_id = drmmode->fb_id;
-       if (drmModeAddFB(pAMDGPUEnt->fd, scrn->virtualX, height,
-                        scrn->depth, scrn->bitsPerPixel, pitch,
-                        handle, &drmmode->fb_id))
+       if (drmModeAddFB(pAMDGPUEnt->fd, new_front->drawable.width,
+                        new_front->drawable.height, scrn->depth,
+                        scrn->bitsPerPixel, new_front->devKind,
+                        new_front_handle, &drmmode->fb_id))
                goto error;
 
        /*
diff --git a/src/drmmode_display.h b/src/drmmode_display.h
index f1e6dc3..92b7457 100644
--- a/src/drmmode_display.h
+++ b/src/drmmode_display.h
@@ -144,7 +144,7 @@ extern void drmmode_uevent_fini(ScrnInfoPtr scrn, 
drmmode_ptr drmmode);
 extern int drmmode_get_crtc_id(xf86CrtcPtr crtc);
 extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe);
 Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, ClientPtr client,
-                       struct amdgpu_buffer *new_front, uint64_t id, void 
*data,
+                       PixmapPtr new_front, uint64_t id, void *data,
                        int ref_crtc_hw_id, amdgpu_drm_handler_proc handler,
                        amdgpu_drm_abort_proc abort);
 int drmmode_crtc_get_ust_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc);
-- 
2.7.0

_______________________________________________
xorg-driver-ati mailing list
[email protected]
https://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to