From: Michel Dänzer <michel.daen...@amd.com> This should allow using multiple CRTCs via RandR 1.4 even with xserver < 1.17. It also simplifies the code a little, and paves the way for following changes.
(Ported from radeon commits 4cfa4615f79f64062e5e771cd45dd7048f48b4f6 and a92c27484703abc7c410b6ae0e4b8d1efbbb8e6f) Signed-off-by: Michel Dänzer <michel.daen...@amd.com> --- src/amdgpu_kms.c | 19 ++++++++----- src/drmmode_display.c | 76 +++++++++++++++------------------------------------ src/drmmode_display.h | 1 - 3 files changed, 34 insertions(+), 62 deletions(-) diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 1bce781..9670c3f 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -595,15 +595,20 @@ static void AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS); pScreen->BlockHandler = AMDGPUBlockHandler_KMS; - for (c = 0; c < xf86_config->num_crtc; c++) { - if (info->tear_free) - amdgpu_scanout_flip(pScreen, info, xf86_config->crtc[c]); - else if (info->shadow_primary +#ifdef AMDGPU_PIXMAP_SHARING + if (!pScreen->isGPU) +#endif + { + for (c = 0; c < xf86_config->num_crtc; c++) { + if (info->tear_free) + amdgpu_scanout_flip(pScreen, info, xf86_config->crtc[c]); + else if (info->shadow_primary #if XF86_CRTC_VERSION >= 4 - || xf86_config->crtc[c]->driverIsPerformingTransform + || xf86_config->crtc[c]->driverIsPerformingTransform #endif - ) - amdgpu_scanout_update(xf86_config->crtc[c]); + ) + amdgpu_scanout_update(xf86_config->crtc[c]); + } } if (info->use_glamor) diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 491599f..a8ee5f0 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -705,18 +705,22 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, fb_id = drmmode->fb_id; #ifdef AMDGPU_PIXMAP_SHARING if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap) { - x = drmmode_crtc->prime_pixmap_x; - y = 0; + fb_id = drmmode_crtc->scanout[0].fb_id; + x = y = 0; } else #endif if (drmmode_crtc->rotate.fb_id) { fb_id = drmmode_crtc->rotate.fb_id; x = y = 0; - } else if (info->tear_free || + } else if ( +#ifdef AMDGPU_PIXMAP_SHARING + !pScreen->isGPU && +#endif + (info->tear_free || #if XF86_CRTC_VERSION >= 4 - crtc->driverIsPerformingTransform || + crtc->driverIsPerformingTransform || #endif - info->shadow_primary) { + info->shadow_primary)) { for (i = 0; i < (info->tear_free ? 2 : 1); i++) { drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[i], @@ -1058,66 +1062,30 @@ drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t * red, uint16_t * green, #ifdef AMDGPU_PIXMAP_SHARING static Bool drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix) { - ScreenPtr screen = xf86ScrnToScreen(crtc->scrn); - PixmapPtr screenpix = screen->GetScreenPixmap(screen); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - int c, total_width = 0, max_height = 0, this_x = 0; if (!ppix) { if (crtc->randr_crtc->scanout_pixmap) - PixmapStopDirtyTracking(crtc-> - randr_crtc->scanout_pixmap, - screenpix); - drmmode_crtc->prime_pixmap_x = 0; + PixmapStopDirtyTracking(crtc->randr_crtc->scanout_pixmap, + drmmode_crtc->scanout[0].pixmap); + drmmode_crtc_scanout_destroy(drmmode_crtc->drmmode, + &drmmode_crtc->scanout[0]); return TRUE; } - /* iterate over all the attached crtcs - - work out bounding box */ - for (c = 0; c < xf86_config->num_crtc; c++) { - xf86CrtcPtr iter = xf86_config->crtc[c]; - if (!iter->enabled && iter != crtc) - continue; - if (iter == crtc) { - this_x = total_width; - total_width += ppix->drawable.width; - if (max_height < ppix->drawable.height) - max_height = ppix->drawable.height; - } else { - total_width += iter->mode.HDisplay; - if (max_height < iter->mode.VDisplay) - max_height = iter->mode.VDisplay; - } -#if !defined(HAS_DIRTYTRACKING_ROTATION) && !defined(HAS_DIRTYTRACKING2) - if (iter != crtc) { - ErrorF - ("Cannot do multiple crtcs without X server dirty tracking 2 interface\n"); - return FALSE; - } -#endif - } - - if (total_width != screenpix->drawable.width || - max_height != screenpix->drawable.height) { - Bool ret; - ret = - drmmode_xf86crtc_resize(crtc->scrn, total_width, - max_height); - if (ret == FALSE) - return FALSE; + if (!drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0], + ppix->drawable.width, + ppix->drawable.height)) + return FALSE; - screenpix = screen->GetScreenPixmap(screen); - screen->width = screenpix->drawable.width = total_width; - screen->height = screenpix->drawable.height = max_height; - } - drmmode_crtc->prime_pixmap_x = this_x; #ifdef HAS_DIRTYTRACKING_ROTATION - PixmapStartDirtyTracking(ppix, screenpix, 0, 0, this_x, 0, RR_Rotate_0); + PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap, + 0, 0, 0, 0, RR_Rotate_0); #elif defined(HAS_DIRTYTRACKING2) - PixmapStartDirtyTracking2(ppix, screenpix, 0, 0, this_x, 0); + PixmapStartDirtyTracking2(ppix, drmmode_crtc->scanout[0].pixmap, + 0, 0, 0, 0); #else - PixmapStartDirtyTracking(ppix, screenpix, 0, 0); + PixmapStartDirtyTracking(ppix, drmmode_crtc->scanout[0].pixmap, 0, 0); #endif return TRUE; } diff --git a/src/drmmode_display.h b/src/drmmode_display.h index 14fbcfc..e739382 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -94,7 +94,6 @@ typedef struct { uint32_t dpms_last_seq; int dpms_last_fps; uint32_t interpolated_vblanks; - int prime_pixmap_x; /* Modeset needed for DPMS on */ Bool need_modeset; -- 2.9.3 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx