diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2017-02-08 18:14:30 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2017-05-11 18:49:55 +0900 |
commit | 944391b0052466b71bf9919b56139dc197a7e072 (patch) | |
tree | 8eba0d64fc228f19d4ce976e7c2ce84033ab3457 | |
parent | f32c45194ac6f82cbe42d255ed72f857018778e0 (diff) |
Pass pixmap instead of handle to radeon_do_pageflip
This brings us in line with amdgpu and prepares for the following
change, no functional change intended.
(Ported from amdgpu commit e463b849f3e9d7b69e64a65619a22e00e78d297b)
v2:
* Be more consistent with the amdgpu code, which should make porting
the following change to amdgpu easier
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | src/drmmode_display.c | 26 | ||||
-rw-r--r-- | src/drmmode_display.h | 2 | ||||
-rw-r--r-- | src/radeon_dri2.c | 5 | ||||
-rw-r--r-- | src/radeon_present.c | 15 |
4 files changed, 13 insertions, 35 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 0b823754..a101ac23 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -2950,36 +2950,27 @@ void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode) } Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client, - uint32_t new_front_handle, uint64_t id, void *data, + PixmapPtr new_front, uint64_t id, void *data, int ref_crtc_hw_id, radeon_drm_handler_proc handler, radeon_drm_abort_proc abort, enum drmmode_flip_sync flip_sync, uint32_t target_msc) { RADEONEntPtr pRADEONEnt = RADEONEntPriv(scrn); - RADEONInfoPtr info = RADEONPTR(scrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); xf86CrtcPtr crtc = NULL; drmmode_crtc_private_ptr drmmode_crtc = config->crtc[0]->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; - unsigned int pitch; int i; - uint32_t tiling_flags = 0; uint32_t flip_flags = flip_sync == FLIP_ASYNC ? DRM_MODE_PAGE_FLIP_ASYNC : 0; drmmode_flipdata_ptr flipdata; uintptr_t drm_queue_seq = 0; + uint32_t new_front_handle; - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - - pitch = RADEON_ALIGN(scrn->displayWidth, drmmode_get_pitch_align(scrn, info->pixel_bytes, tiling_flags)) * - info->pixel_bytes; - if (info->ChipFamily >= CHIP_FAMILY_R600 && info->surf_man) { - pitch = info->front_surface.level[0].pitch_bytes; + if (!radeon_get_pixmap_handle(new_front, &new_front_handle)) { + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "flip queue: failed to get new front handle\n"); + return FALSE; } flipdata = calloc(1, sizeof(drmmode_flipdata_rec)); @@ -2993,8 +2984,9 @@ Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client, * Create a new handle for the back buffer */ flipdata->old_fb_id = drmmode->fb_id; - if (drmModeAddFB(drmmode->fd, scrn->virtualX, scrn->virtualY, - scrn->depth, scrn->bitsPerPixel, pitch, + if (drmModeAddFB(drmmode->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 bd3f5f98..35d64179 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -168,7 +168,7 @@ extern int drmmode_get_base_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling); extern void drmmode_clear_pending_flip(xf86CrtcPtr crtc); Bool radeon_do_pageflip(ScrnInfoPtr scrn, ClientPtr client, - uint32_t new_front_handle, uint64_t id, void *data, + PixmapPtr new_front, uint64_t id, void *data, int ref_crtc_hw_id, radeon_drm_handler_proc handler, radeon_drm_abort_proc abort, enum drmmode_flip_sync flip_sync, diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c index c108ceab..cc72bd52 100644 --- a/src/radeon_dri2.c +++ b/src/radeon_dri2.c @@ -652,7 +652,6 @@ radeon_dri2_schedule_flip(xf86CrtcPtr crtc, ClientPtr client, ScrnInfoPtr scrn = crtc->scrn; RADEONInfoPtr info = RADEONPTR(scrn); struct dri2_buffer_priv *back_priv; - struct radeon_bo *bo; DRI2FrameEventPtr flip_info; int ref_crtc_hw_id = drmmode_get_crtc_id(crtc); @@ -673,9 +672,7 @@ radeon_dri2_schedule_flip(xf86CrtcPtr crtc, ClientPtr client, /* Page flip the full screen buffer */ back_priv = back->driverPrivate; - bo = radeon_get_pixmap_bo(back_priv->pixmap); - - if (radeon_do_pageflip(scrn, client, bo->handle, + if (radeon_do_pageflip(scrn, client, back_priv->pixmap, RADEON_DRM_QUEUE_ID_DEFAULT, flip_info, ref_crtc_hw_id, radeon_dri2_flip_event_handler, diff --git a/src/radeon_present.c b/src/radeon_present.c index af55e462..90632d0e 100644 --- a/src/radeon_present.c +++ b/src/radeon_present.c @@ -332,15 +332,11 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc, struct radeon_present_vblank_event *event; xf86CrtcPtr xf86_crtc = crtc->devPrivate; int crtc_id = xf86_crtc ? drmmode_get_crtc_id(xf86_crtc) : -1; - uint32_t handle; Bool ret; if (!radeon_present_check_flip(crtc, screen->root, pixmap, sync_flip)) return FALSE; - if (!radeon_get_pixmap_handle(pixmap, &handle)) - return FALSE; - event = calloc(1, sizeof(struct radeon_present_vblank_event)); if (!event) return FALSE; @@ -349,7 +345,7 @@ radeon_present_flip(RRCrtcPtr crtc, uint64_t event_id, uint64_t target_msc, radeon_cs_flush_indirect(scrn); - ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, handle, + ret = radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, pixmap, event_id, event, crtc_id, radeon_present_flip_event, radeon_present_flip_abort, @@ -377,7 +373,6 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id) enum drmmode_flip_sync flip_sync = (radeon_present_screen_info.capabilities & PresentCapabilityAsync) ? FLIP_ASYNC : FLIP_VSYNC; - uint32_t handle; int old_fb_id; int i; @@ -386,12 +381,6 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id) if (!radeon_present_check_unflip(scrn)) goto modeset; - if (!radeon_get_pixmap_handle(pixmap, &handle)) { - ErrorF("%s: radeon_get_pixmap_handle failed, display might freeze\n", - __func__); - goto modeset; - } - event = calloc(1, sizeof(struct radeon_present_vblank_event)); if (!event) { ErrorF("%s: calloc failed, display might freeze\n", __func__); @@ -401,7 +390,7 @@ radeon_present_unflip(ScreenPtr screen, uint64_t event_id) event->event_id = event_id; event->unflip = TRUE; - if (radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, handle, + if (radeon_do_pageflip(scrn, RADEON_DRM_QUEUE_CLIENT_DEFAULT, pixmap, event_id, event, -1, radeon_present_flip_event, radeon_present_flip_abort, flip_sync, 0)) return; |