> -----Original Message-----
> From: amd-gfx [mailto:[email protected]] On Behalf
> Of Michel Dänzer
> Sent: Wednesday, August 02, 2017 6:13 AM
> To: [email protected]
> Subject: [PATCH xf86-video-amdgpu 3/3] Allow DRI page flipping when some
> CRTCs use separate scanout buffers
> 
> From: Michel Dänzer <[email protected]>
> 
> As long as the CRTC we're synchronizing to doesn't.
> 
> (Ported from radeon commit
> 5309bde0c4e28adf2b167191c6d7011a19e31eed)
> 
> Signed-off-by: Michel Dänzer <[email protected]>

Series is:
Reviewed-by: Alex Deucher <[email protected]>

> ---
>  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
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to