[PATCH xf86-video-amdgpu] Make the dedicated scanout mechanism work with arbitrary transforms

Alex Deucher alexdeucher at gmail.com
Thu Jun 23 13:55:44 UTC 2016


On Thu, Jun 23, 2016 at 5:41 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> This makes TearFree work with arbitrary transforms, and makes transforms
> work better even without TearFree, with xserver >= 1.12.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  src/amdgpu_kms.c      | 24 +++++-------------------
>  src/drmmode_display.c | 23 +++++++----------------
>  2 files changed, 12 insertions(+), 35 deletions(-)
>
> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
> index b34a223..01d6b93 100644
> --- a/src/amdgpu_kms.c
> +++ b/src/amdgpu_kms.c
> @@ -256,19 +256,11 @@ static Bool
>  amdgpu_scanout_extents_intersect(xf86CrtcPtr xf86_crtc, BoxPtr extents, int w,
>                                  int h)
>  {
> -       extents->x1 = max(extents->x1 - xf86_crtc->x, 0);
> -       extents->y1 = max(extents->y1 - xf86_crtc->y, 0);
> -
> -       switch (xf86_crtc->rotation & 0xf) {
> -       case RR_Rotate_90:
> -       case RR_Rotate_270:
> -               extents->x2 = min(extents->x2 - xf86_crtc->x, h);
> -               extents->y2 = min(extents->y2 - xf86_crtc->y, w);
> -               break;
> -       default:
> -               extents->x2 = min(extents->x2 - xf86_crtc->x, w);
> -               extents->y2 = min(extents->y2 - xf86_crtc->y, h);
> -       }
> +       extents->x1 -= xf86_crtc->filter_width >> 1;
> +       extents->x2 += xf86_crtc->filter_width >> 1;
> +       extents->y1 -= xf86_crtc->filter_height >> 1;
> +       extents->y2 += xf86_crtc->filter_height >> 1;
> +       pixman_f_transform_bounds(&xf86_crtc->f_framebuffer_to_crtc, extents);
>
>         return (extents->x1 < extents->x2 && extents->y1 < extents->y2);
>  }
> @@ -340,12 +332,6 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
>                         SetPicturePictFilter(src, xf86_crtc->filter, xf86_crtc->params,
>                                              xf86_crtc->nparams);
>
> -               extents.x1 += xf86_crtc->x - (xf86_crtc->filter_width >> 1);
> -               extents.x2 += xf86_crtc->x + (xf86_crtc->filter_width >> 1);
> -               extents.y1 += xf86_crtc->y - (xf86_crtc->filter_height >> 1);
> -               extents.y2 += xf86_crtc->y + (xf86_crtc->filter_height >> 1);
> -               pixman_f_transform_bounds(&xf86_crtc->f_framebuffer_to_crtc, &extents);
> -
>                 pScreen->SourceValidate = NULL;
>                 CompositePicture(PictOpSrc,
>                                  src, NULL, dst,
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 5bddfd0..f5d73c4 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -606,15 +606,15 @@ drmmode_handle_transform(xf86CrtcPtr crtc)
>         Bool ret;
>
>  #if XF86_CRTC_VERSION >= 7
> -       if (!crtc->transformPresent && crtc->rotation != RR_Rotate_0)
> +       if (crtc->transformPresent || crtc->rotation != RR_Rotate_0)
>             crtc->driverIsPerformingTransform = XF86DriverTransformOutput;
>         else
>             crtc->driverIsPerformingTransform = XF86DriverTransformNone;
>  #else
>         AMDGPUInfoPtr info = AMDGPUPTR(crtc->scrn);
>
> -       crtc->driverIsPerformingTransform = info->tear_free &&
> -               !crtc->transformPresent && crtc->rotation != RR_Rotate_0;
> +       crtc->driverIsPerformingTransform = crtc->transformPresent ||
> +               (info->tear_free && crtc->rotation != RR_Rotate_0);
>  #endif
>
>         ret = xf86CrtcRotate(crtc);
> @@ -730,19 +730,10 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
>                                         RegionUninit(pRegion);
>                                         pRegion->data = NULL;
>                                         pBox = RegionExtents(pRegion);
> -                                       pBox->x1 = min(pBox->x1, x);
> -                                       pBox->y1 = min(pBox->y1, y);
> -
> -                                       switch (crtc->rotation & 0xf) {
> -                                       case RR_Rotate_90:
> -                                       case RR_Rotate_270:
> -                                               pBox->x2 = max(pBox->x2, x + mode->VDisplay);
> -                                               pBox->y2 = max(pBox->y2, y + mode->HDisplay);
> -                                               break;
> -                                       default:
> -                                               pBox->x2 = max(pBox->x2, x + mode->HDisplay);
> -                                               pBox->y2 = max(pBox->y2, y + mode->VDisplay);
> -                                       }
> +                                       pBox->x1 = 0;
> +                                       pBox->y1 = 0;
> +                                       pBox->x2 = max(pBox->x2, pScrn->virtualX);
> +                                       pBox->y2 = max(pBox->y2, pScrn->virtualY);
>                                 }
>                         }
>
> --
> 2.8.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list