From: Mario Kleiner <mario.kleiner.de@xxxxxxxxx> This allows to en-/disable some functions depending on individual screen settings. Prep work for more efficient depth 30 support. Suggested-by: Michel Dänzer <michel.daenzer at amd.com> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com> (Ported from radeon commit 21f6753462464acfd3c452393328c977a375ce26) Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> --- src/amdgpu_drv.h | 1 + src/drmmode_display.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/amdgpu_drv.h b/src/amdgpu_drv.h index f60b192da..40157262e 100644 --- a/src/amdgpu_drv.h +++ b/src/amdgpu_drv.h @@ -340,6 +340,7 @@ typedef struct { SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking; } glamor; + xf86CrtcFuncsRec drmmode_crtc_funcs; } AMDGPUInfoRec, *AMDGPUInfoPtr; diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 047179449..be3deef20 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1344,8 +1344,9 @@ drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_res xf86CrtcPtr crtc; drmmode_crtc_private_ptr drmmode_crtc; AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); + AMDGPUInfoPtr info = AMDGPUPTR(pScrn); - crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs); + crtc = xf86CrtcCreate(pScrn, &info->drmmode_crtc_funcs); if (crtc == NULL) return 0; @@ -2348,11 +2349,16 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp) xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, AMDGPU_LOGLEVEL_DEBUG, "%d crtcs needed for screen.\n", crtcs_needed); + /* Need per-screen drmmode_crtc_funcs, based on our global template, + * so we can disable some functions, depending on screen settings. + */ + info->drmmode_crtc_funcs = drmmode_crtc_funcs; + if (!info->use_glamor) { /* Rotation requires hardware acceleration */ - drmmode_crtc_funcs.shadow_allocate = NULL; - drmmode_crtc_funcs.shadow_create = NULL; - drmmode_crtc_funcs.shadow_destroy = NULL; + info->drmmode_crtc_funcs.shadow_allocate = NULL; + info->drmmode_crtc_funcs.shadow_create = NULL; + info->drmmode_crtc_funcs.shadow_destroy = NULL; } for (i = 0; i < mode_res->count_crtcs; i++) -- 2.16.1