> -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf > Of Michel Dänzer > Sent: Wednesday, August 02, 2017 6:13 AM > To: amd-gfx at lists.freedesktop.org > Subject: [PATCH xf86-video-amdgpu 3/3] Allow DRI page flipping when some > CRTCs use separate scanout buffers > > From: Michel Dänzer <michel.daenzer at amd.com> > > As long as the CRTC we're synchronizing to doesn't. > > (Ported from radeon commit > 5309bde0c4e28adf2b167191c6d7011a19e31eed) > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Series is: Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > man/amdgpu.man | 2 +- > src/amdgpu_dri2.c | 30 +++++++----------------------- > src/amdgpu_present.c | 12 ++++-------- > src/drmmode_display.c | 2 +- > src/drmmode_display.h | 4 +++- > 5 files changed, 16 insertions(+), 34 deletions(-) > > diff --git a/man/amdgpu.man b/man/amdgpu.man > index d6904b818..ebb472aba 100644 > --- a/man/amdgpu.man > +++ b/man/amdgpu.man > @@ -77,7 +77,7 @@ Set the default value of the per-output 'TearFree' > property, which controls > tearing prevention using the hardware page flipping mechanism. TearFree is > on for any CRTC associated with one or more outputs with TearFree on. Two > separate scanout buffers need to be allocated for each CRTC with TearFree > -on. While TearFree is on for any CRTC, it currently prevents clients from > using > +on. While TearFree is on for any CRTC, it may prevent clients from using > DRI page flipping. If this option is set, the default value of the property > is 'on' or 'off' accordingly. If this option isn't set, the default value of the > property is > diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c > index b4cb1ecc7..dfbc9998c 100644 > --- a/src/amdgpu_dri2.c > +++ b/src/amdgpu_dri2.c > @@ -600,18 +600,6 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw, > struct dri2_buffer_priv *back_priv = back->driverPrivate; > PixmapPtr front_pixmap; > PixmapPtr back_pixmap = back_priv->pixmap; > - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); > - int i; > - > - for (i = 0; i < xf86_config->num_crtc; i++) { > - xf86CrtcPtr crtc = xf86_config->crtc[i]; > - drmmode_crtc_private_ptr drmmode_crtc = crtc- > >driver_private; > - > - if (crtc->enabled && > - (crtc->rotatedData || > - drmmode_crtc->scanout[drmmode_crtc- > >scanout_id].bo)) > - return FALSE; > - } > > if (!update_front(draw, front)) > return FALSE; > @@ -635,9 +623,10 @@ can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw, > } > > static Bool > -can_flip(ScrnInfoPtr pScrn, DrawablePtr draw, > +can_flip(xf86CrtcPtr crtc, DrawablePtr draw, > DRI2BufferPtr front, DRI2BufferPtr back) > { > + ScrnInfoPtr pScrn = crtc->scrn; > AMDGPUInfoPtr info = AMDGPUPTR(pScrn); > xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); > int num_crtcs_on; > @@ -652,15 +641,10 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw, > return FALSE; > > for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) { > - xf86CrtcPtr crtc = config->crtc[i]; > - drmmode_crtc_private_ptr drmmode_crtc = crtc- > >driver_private; > - > - if (!drmmode_crtc || drmmode_crtc->rotate.bo || > - drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo) > - return FALSE; > - > - if (drmmode_crtc_can_flip(crtc)) > + if (drmmode_crtc_can_flip(config->crtc[i])) > num_crtcs_on++; > + else if (config->crtc[i] == crtc) > + return FALSE; > } > > return num_crtcs_on > 0 && can_exchange(pScrn, draw, front, > back); > @@ -745,7 +729,7 @@ static void > amdgpu_dri2_frame_event_handler(xf86CrtcPtr crtc, uint32_t seq, > > switch (event->type) { > case DRI2_FLIP: > - if (can_flip(scrn, drawable, event->front, event->back) && > + if (can_flip(crtc, drawable, event->front, event->back) && > amdgpu_dri2_schedule_flip(crtc, > event->client, > drawable, > @@ -1237,7 +1221,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr > client, DrawablePtr draw, > current_msc &= 0xffffffff; > > /* Flips need to be submitted one frame before */ > - if (can_flip(scrn, draw, front, back)) { > + if (can_flip(crtc, draw, front, back)) { > swap_info->type = DRI2_FLIP; > flip = 1; > } > diff --git a/src/amdgpu_present.c b/src/amdgpu_present.c > index 375456976..550b70242 100644 > --- a/src/amdgpu_present.c > +++ b/src/amdgpu_present.c > @@ -228,14 +228,7 @@ amdgpu_present_check_unflip(ScrnInfoPtr scrn) > return FALSE; > > for (i = 0, num_crtcs_on = 0; i < config->num_crtc; i++) { > - xf86CrtcPtr crtc = config->crtc[i]; > - drmmode_crtc_private_ptr drmmode_crtc = crtc- > >driver_private; > - > - if (!drmmode_crtc || drmmode_crtc->rotate.bo || > - drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo) > - return FALSE; > - > - if (drmmode_crtc_can_flip(crtc)) > + if (drmmode_crtc_can_flip(config->crtc[i])) > num_crtcs_on++; > } > > @@ -269,6 +262,9 @@ amdgpu_present_check_flip(RRCrtcPtr crtc, > WindowPtr window, PixmapPtr pixmap, > amdgpu_pixmap_get_tiling_info(screen- > >GetScreenPixmap(screen))) > return FALSE; > > + if (!drmmode_crtc_can_flip(crtc->devPrivate)) > + return FALSE; > + > return amdgpu_present_check_unflip(scrn); > } > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index 8ddb2ac9b..75cf7842f 100644 > --- a/src/drmmode_display.c > +++ b/src/drmmode_display.c > @@ -2814,7 +2814,7 @@ Bool amdgpu_do_pageflip(ScrnInfoPtr scrn, > ClientPtr client, > for (i = 0; i < config->num_crtc; i++) { > crtc = config->crtc[i]; > > - if (!crtc->enabled) > + if (!drmmode_crtc_can_flip(crtc)) > continue; > > flipdata->flip_count++; > diff --git a/src/drmmode_display.h b/src/drmmode_display.h > index 677f796b1..ca556f254 100644 > --- a/src/drmmode_display.h > +++ b/src/drmmode_display.h > @@ -139,7 +139,9 @@ drmmode_crtc_can_flip(xf86CrtcPtr crtc) > drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; > > return crtc->enabled && > - drmmode_crtc->pending_dpms_mode == DPMSModeOn; > + drmmode_crtc->pending_dpms_mode == DPMSModeOn > && > + !drmmode_crtc->rotate.bo && > + !drmmode_crtc->scanout[drmmode_crtc->scanout_id].bo; > } > > > -- > 2.13.3 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx