diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2016-02-23 18:10:29 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-02-27 15:24:25 +0900 |
commit | e463b849f3e9d7b69e64a65619a22e00e78d297b (patch) | |
tree | b6c3150e42a12a0fe6589051cd65eb205b2f146f /src | |
parent | 1ee341f9d909f3b7ba2984fc912dabdb98c34b19 (diff) |
Make amdgpu_do_pageflip take a pixmap instead of a BO
(inspired by radeon commit 7b4fc4a677d252d01c2bf80d162bc35814059eaa)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/amdgpu_dri2.c | 8 | ||||
-rw-r--r-- | src/amdgpu_present.c | 18 | ||||
-rw-r--r-- | src/drmmode_display.c | 30 | ||||
-rw-r--r-- | 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); |