diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2017-02-21 15:55:13 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2017-02-22 18:27:19 +0900 |
commit | 305e2cbf335837a2ab6a24e9ff65815afe038296 (patch) | |
tree | f6bf4eaaf989d8e6d66f005784596054b5ca0200 /src | |
parent | 649644a88347a6d03de68f8c41db03a82deeb23b (diff) |
Factor out drmmode_crtc_scanout_update helper
Cleanup in preparation for following change, no functional change
intended.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/drmmode_display.c | 85 |
1 files changed, 49 insertions, 36 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 2258e7a6..fcac1562 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -706,6 +706,53 @@ drmmode_handle_transform(xf86CrtcPtr crtc) #endif +static void +drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode, + unsigned scanout_id, int *fb_id, int *x, int *y) +{ + ScrnInfoPtr scrn = crtc->scrn; + ScreenPtr screen = scrn->pScreen; + RADEONInfoPtr info = RADEONPTR(scrn); + drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; + + drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0], + mode->HDisplay, mode->VDisplay); + if (info->tear_free) { + drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1], + mode->HDisplay, mode->VDisplay); + } + + if (drmmode_crtc->scanout[0].pixmap && + (!info->tear_free || drmmode_crtc->scanout[1].pixmap)) { + RegionPtr region; + BoxPtr box; + + if (!drmmode_crtc->scanout_damage) { + drmmode_crtc->scanout_damage = + DamageCreate(radeon_screen_damage_report, + NULL, DamageReportRawRegion, + TRUE, screen, NULL); + DamageRegister(&screen->GetScreenPixmap(screen)->drawable, + drmmode_crtc->scanout_damage); + } + + region = DamageRegion(drmmode_crtc->scanout_damage); + RegionUninit(region); + region->data = NULL; + box = RegionExtents(region); + box->x1 = 0; + box->y1 = 0; + box->x2 = max(box->x2, scrn->virtualX); + box->y2 = max(box->y2, scrn->virtualY); + + *fb_id = drmmode_crtc->scanout[scanout_id].fb_id; + *x = *y = 0; + + radeon_scanout_do_update(crtc, scanout_id); + radeon_bo_wait(drmmode_crtc->scanout[scanout_id].bo); + } +} + static Bool drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int x, int y) @@ -779,42 +826,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, crtc->driverIsPerformingTransform || #endif info->shadow_primary)) { - for (i = 0; i < (info->tear_free ? 2 : 1); i++) { - drmmode_crtc_scanout_create(crtc, - &drmmode_crtc->scanout[i], - mode->HDisplay, - mode->VDisplay); - } - - if (drmmode_crtc->scanout[0].pixmap && - (!info->tear_free || drmmode_crtc->scanout[1].pixmap)) { - RegionPtr pRegion; - BoxPtr pBox; - - if (!drmmode_crtc->scanout_damage) { - drmmode_crtc->scanout_damage = - DamageCreate(radeon_screen_damage_report, - NULL, DamageReportRawRegion, - TRUE, pScreen, NULL); - DamageRegister(&pScreen->GetScreenPixmap(pScreen)->drawable, - drmmode_crtc->scanout_damage); - } - - pRegion = DamageRegion(drmmode_crtc->scanout_damage); - RegionUninit(pRegion); - pRegion->data = NULL; - pBox = RegionExtents(pRegion); - pBox->x1 = 0; - pBox->y1 = 0; - pBox->x2 = max(pBox->x2, pScrn->virtualX); - pBox->y2 = max(pBox->y2, pScrn->virtualY); - - fb_id = drmmode_crtc->scanout[scanout_id].fb_id; - x = y = 0; - - radeon_scanout_do_update(crtc, scanout_id); - radeon_bo_wait(drmmode_crtc->scanout[scanout_id].bo); - } + drmmode_crtc_scanout_update(crtc, mode, scanout_id, + &fb_id, &x, &y); } if (fb_id == 0) { |