[PATCH v2 xf86-video-ati 3/3] Allow toggling TearFree at runtime via output property

Alex Deucher alexdeucher at gmail.com
Tue Feb 21 21:06:09 UTC 2017


On Tue, Feb 21, 2017 at 3:17 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Option "TearFree" now sets the default value of the output property.
> See the manpage update for details.
>
> TearFree is now enabled by default for outputs using rotation or other
> RandR transforms, and for RandR 1.4 slave outputs.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>

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

> ---
>
> v2: Fix build against xserver 1.10
>
>  man/radeon.man        |  15 +++--
>  src/drmmode_display.c | 161 +++++++++++++++++++++++++++++++++++++++++++++-----
>  src/drmmode_display.h |   2 +
>  src/radeon.h          |   2 +-
>  src/radeon_dri2.c     |  35 ++++++++---
>  src/radeon_kms.c      |  43 +++++++++-----
>  6 files changed, 216 insertions(+), 42 deletions(-)
>
> diff --git a/man/radeon.man b/man/radeon.man
> index 8990ae21d..5301dd7f0 100644
> --- a/man/radeon.man
> +++ b/man/radeon.man
> @@ -281,10 +281,17 @@ Enable DRI2 page flipping.  The default is
>  Pageflipping is supported on all radeon hardware.
>  .TP
>  .BI "Option \*qTearFree\*q \*q" boolean \*q
> -Enable tearing prevention using the hardware page flipping mechanism. Requires allocating two
> -separate scanout buffers for each CRTC. Enabling this option currently disables Option
> -\*qEnablePageFlip\*q. The default is
> -.B off.
> +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
> +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
> +.B auto,
> +which means that TearFree is on for outputs with rotation or other RandR
> +transforms, and for RandR 1.4 slave outputs, otherwise off.
>  .TP
>  .BI "Option \*qAccelMethod\*q \*q" "string" \*q
>  Chooses between available acceleration architectures.  Valid values are
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index fcac1562b..5b0236da4 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -670,6 +670,34 @@ drmmode_can_use_hw_cursor(xf86CrtcPtr crtc)
>         return TRUE;
>  }
>
> +static void
> +drmmode_crtc_update_tear_free(xf86CrtcPtr crtc)
> +{
> +       RADEONInfoPtr info = RADEONPTR(crtc->scrn);
> +       xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
> +       drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +       int i;
> +
> +       drmmode_crtc->tear_free = FALSE;
> +
> +       for (i = 0; i < xf86_config->num_output; i++) {
> +               xf86OutputPtr output = xf86_config->output[i];
> +               drmmode_output_private_ptr drmmode_output = output->driver_private;
> +
> +               if (output->crtc != crtc)
> +                       continue;
> +
> +               if (drmmode_output->tear_free == 1 ||
> +                   (drmmode_output->tear_free == 2 &&
> +                    (radeon_is_gpu_screen(crtc->scrn->pScreen) ||
> +                     info->shadow_primary ||
> +                     crtc->transformPresent || crtc->rotation != RR_Rotate_0))) {
> +                       drmmode_crtc->tear_free = TRUE;
> +                       return;
> +               }
> +       }
> +}
> +
>  #if XF86_CRTC_VERSION >= 4
>
>  static Bool
> @@ -683,10 +711,11 @@ drmmode_handle_transform(xf86CrtcPtr crtc)
>         else
>             crtc->driverIsPerformingTransform = XF86DriverTransformNone;
>  #else
> +       drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>         RADEONInfoPtr info = RADEONPTR(crtc->scrn);
>
>         crtc->driverIsPerformingTransform = crtc->transformPresent ||
> -               (info->tear_free && crtc->rotation != RR_Rotate_0);
> +               (drmmode_crtc->tear_free && crtc->rotation != RR_Rotate_0);
>  #endif
>
>         ret = xf86CrtcRotate(crtc);
> @@ -706,24 +735,87 @@ drmmode_handle_transform(xf86CrtcPtr crtc)
>
>  #endif
>
> +#ifdef RADEON_PIXMAP_SHARING
> +
>  static void
> +drmmode_crtc_prime_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
> +                                 unsigned scanout_id, int *fb_id, int *x,
> +                                 int *y)
> +{
> +       ScrnInfoPtr scrn = crtc->scrn;
> +       ScreenPtr screen = scrn->pScreen;
> +       drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +
> +       if (drmmode_crtc->tear_free &&
> +           !drmmode_crtc->scanout[1].pixmap) {
> +               RegionPtr region;
> +               BoxPtr box;
> +
> +               drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1],
> +                                           mode->HDisplay,
> +                                           mode->VDisplay);
> +               region = &drmmode_crtc->scanout_last_region;
> +               RegionUninit(region);
> +               region->data = NULL;
> +               box = RegionExtents(region);
> +               box->x1 = crtc->x;
> +               box->y1 = crtc->y;
> +               box->x2 = crtc->x + mode->HDisplay;
> +               box->y2 = crtc->y + mode->VDisplay;
> +       }
> +
> +       if (scanout_id != drmmode_crtc->scanout_id) {
> +               PixmapDirtyUpdatePtr dirty = NULL;
> +
> +               xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list,
> +                                        ent) {
> +                       if (dirty->src == crtc->randr_crtc->scanout_pixmap &&
> +                           dirty->slave_dst ==
> +                           drmmode_crtc->scanout[drmmode_crtc->scanout_id].pixmap) {
> +                               dirty->slave_dst =
> +                                       drmmode_crtc->scanout[scanout_id].pixmap;
> +                               break;
> +                       }
> +               }
> +
> +               if (!drmmode_crtc->tear_free) {
> +                       GCPtr gc = GetScratchGC(scrn->depth, screen);
> +
> +                       ValidateGC(&drmmode_crtc->scanout[0].pixmap->drawable, gc);
> +                       gc->ops->CopyArea(&drmmode_crtc->scanout[1].pixmap->drawable,
> +                                         &drmmode_crtc->scanout[0].pixmap->drawable,
> +                                         gc, 0, 0, mode->HDisplay, mode->VDisplay,
> +                                         0, 0);
> +                       FreeScratchGC(gc);
> +                       radeon_cs_flush_indirect(scrn);
> +                       radeon_bo_wait(drmmode_crtc->scanout[0].bo);
> +               }
> +       }
> +
> +       *fb_id = drmmode_crtc->scanout[scanout_id].fb_id;
> +       *x = *y = 0;
> +       drmmode_crtc->scanout_id = scanout_id;
> +}
> +
> +#endif /* RADEON_PIXMAP_SHARING */
> +
> +                       static void
>  drmmode_crtc_scanout_update(xf86CrtcPtr crtc, DisplayModePtr mode,
>                             unsigned scanout_id, int *fb_id, int *x, int *y)
>  {
>         ScrnInfoPtr scrn = crtc->scrn;
>         ScreenPtr screen = scrn->pScreen;
> -       RADEONInfoPtr info = RADEONPTR(scrn);
>         drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>
>         drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[0],
>                                     mode->HDisplay, mode->VDisplay);
> -       if (info->tear_free) {
> +       if (drmmode_crtc->tear_free) {
>                 drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1],
>                                             mode->HDisplay, mode->VDisplay);
>         }
>
>         if (drmmode_crtc->scanout[0].pixmap &&
> -           (!info->tear_free || drmmode_crtc->scanout[1].pixmap)) {
> +           (!drmmode_crtc->tear_free || drmmode_crtc->scanout[1].pixmap)) {
>                 RegionPtr region;
>                 BoxPtr box;
>
> @@ -762,7 +854,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
>         RADEONInfoPtr info = RADEONPTR(pScrn);
>         xf86CrtcConfigPtr   xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
>         drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> -       unsigned scanout_id = drmmode_crtc->scanout_id ^ info->tear_free;
> +       unsigned scanout_id = 0;
>         drmmode_ptr drmmode = drmmode_crtc->drmmode;
>         int saved_x, saved_y;
>         Rotation saved_rotation;
> @@ -804,6 +896,10 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
>                 if (!drmmode_handle_transform(crtc))
>                         goto done;
>
> +               drmmode_crtc_update_tear_free(crtc);
> +               if (drmmode_crtc->tear_free)
> +                       scanout_id = drmmode_crtc->scanout_id;
> +
>                 crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green,
>                                        crtc->gamma_blue, crtc->gamma_size);
>
> @@ -812,8 +908,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
>                 fb_id = drmmode->fb_id;
>  #ifdef RADEON_PIXMAP_SHARING
>                 if (crtc->randr_crtc && crtc->randr_crtc->scanout_pixmap) {
> -                       fb_id = drmmode_crtc->scanout[scanout_id].fb_id;
> -                       x = y = 0;
> +                       drmmode_crtc_prime_scanout_update(crtc, mode, scanout_id,
> +                                                         &fb_id, &x, &y);
>                 } else
>  #endif
>                 if (drmmode_crtc->rotate.fb_id) {
> @@ -821,7 +917,7 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
>                         x = y = 0;
>
>                 } else if (!radeon_is_gpu_screen(pScreen) &&
> -                          (info->tear_free ||
> +                          (drmmode_crtc->tear_free ||
>  #if XF86_CRTC_VERSION >= 4
>                             crtc->driverIsPerformingTransform ||
>  #endif
> @@ -905,6 +1001,10 @@ done:
>
>                 if (fb_id != drmmode_crtc->scanout[scanout_id].fb_id)
>                         drmmode_crtc_scanout_free(drmmode_crtc);
> +               else if (!drmmode_crtc->tear_free) {
> +                       drmmode_crtc_scanout_destroy(drmmode,
> +                                                    &drmmode_crtc->scanout[1]);
> +               }
>         }
>
>         free(output_ids);
> @@ -1142,7 +1242,6 @@ drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
>  {
>         drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>         unsigned scanout_id = drmmode_crtc->scanout_id;
> -       RADEONInfoPtr info = RADEONPTR(crtc->scrn);
>         ScreenPtr screen = crtc->scrn->pScreen;
>         PixmapDirtyUpdatePtr dirty;
>
> @@ -1163,7 +1262,7 @@ drmmode_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
>                                          ppix->drawable.height))
>                 return FALSE;
>
> -       if (info->tear_free &&
> +       if (drmmode_crtc->tear_free &&
>             !drmmode_crtc_scanout_create(crtc, &drmmode_crtc->scanout[1],
>                                          ppix->drawable.width,
>                                          ppix->drawable.height)) {
> @@ -1418,13 +1517,14 @@ drmmode_property_ignore(drmModePropertyPtr prop)
>  static void
>  drmmode_output_create_resources(xf86OutputPtr output)
>  {
> +    RADEONInfoPtr info = RADEONPTR(output->scrn);
>      drmmode_output_private_ptr drmmode_output = output->driver_private;
>      drmModeConnectorPtr mode_output = drmmode_output->mode_output;
>      drmmode_ptr drmmode = drmmode_output->drmmode;
> -    drmModePropertyPtr drmmode_prop;
> +    drmModePropertyPtr drmmode_prop, tearfree_prop;
>      int i, j, err;
>
> -    drmmode_output->props = calloc(mode_output->count_props, sizeof(drmmode_prop_rec));
> +    drmmode_output->props = calloc(mode_output->count_props + 1, sizeof(drmmode_prop_rec));
>      if (!drmmode_output->props)
>         return;
>
> @@ -1441,6 +1541,23 @@ drmmode_output_create_resources(xf86OutputPtr output)
>         j++;
>      }
>
> +    /* Userspace-only property for TearFree */
> +    tearfree_prop = calloc(1, sizeof(*tearfree_prop));
> +    tearfree_prop->flags = DRM_MODE_PROP_ENUM;
> +    strncpy(tearfree_prop->name, "TearFree", 8);
> +    tearfree_prop->count_enums = 3;
> +    tearfree_prop->enums = calloc(tearfree_prop->count_enums,
> +                                 sizeof(*tearfree_prop->enums));
> +    strncpy(tearfree_prop->enums[0].name, "off", 3);
> +    strncpy(tearfree_prop->enums[1].name, "on", 2);
> +    tearfree_prop->enums[1].value = 1;
> +    strncpy(tearfree_prop->enums[2].name, "auto", 4);
> +    tearfree_prop->enums[2].value = 2;
> +    drmmode_output->props[j].mode_prop = tearfree_prop;
> +    drmmode_output->props[j].value = info->tear_free;
> +    drmmode_output->tear_free = info->tear_free;
> +    drmmode_output->num_props++;
> +
>      for (i = 0; i < drmmode_output->num_props; i++) {
>         drmmode_prop_ptr p = &drmmode_output->props[i];
>         drmmode_prop = p->mode_prop;
> @@ -1540,8 +1657,24 @@ drmmode_output_set_property(xf86OutputPtr output, Atom property,
>             /* search for matching name string, then set its value down */
>             for (j = 0; j < p->mode_prop->count_enums; j++) {
>                 if (!strcmp(p->mode_prop->enums[j].name, name)) {
> -                   drmModeConnectorSetProperty(drmmode->fd, drmmode_output->output_id,
> -                           p->mode_prop->prop_id, p->mode_prop->enums[j].value);
> +                   if (i == (drmmode_output->num_props - 1)) {
> +                       if (drmmode_output->tear_free != j) {
> +                           xf86CrtcPtr crtc = output->crtc;
> +
> +                           drmmode_output->tear_free = j;
> +                           if (crtc) {
> +                               drmmode_set_mode_major(crtc, &crtc->mode,
> +                                                      crtc->rotation,
> +                                                      crtc->x, crtc->y);
> +                           }
> +                       }
> +                   } else {
> +                       drmModeConnectorSetProperty(drmmode->fd,
> +                                                   drmmode_output->output_id,
> +                                                   p->mode_prop->prop_id,
> +                                                   p->mode_prop->enums[j].value);
> +                   }
> +
>                     return TRUE;
>                 }
>             }
> diff --git a/src/drmmode_display.h b/src/drmmode_display.h
> index 6bbf71c18..bd3f5f987 100644
> --- a/src/drmmode_display.h
> +++ b/src/drmmode_display.h
> @@ -89,6 +89,7 @@ typedef struct {
>      RegionRec scanout_last_region;
>      unsigned scanout_id;
>      Bool scanout_update_pending;
> +    Bool tear_free;
>      int dpms_mode;
>      /* For when a flip is pending when DPMS off requested */
>      int pending_dpms_mode;
> @@ -124,6 +125,7 @@ typedef struct {
>      drmmode_prop_ptr props;
>      int enc_mask;
>      int enc_clone_mask;
> +    int tear_free;
>  } drmmode_output_private_rec, *drmmode_output_private_ptr;
>
>
> diff --git a/src/radeon.h b/src/radeon.h
> index 039a620be..bfff232c4 100644
> --- a/src/radeon.h
> +++ b/src/radeon.h
> @@ -507,7 +507,7 @@ typedef struct {
>      Bool              accelOn;
>      Bool              use_glamor;
>      Bool              shadow_primary;
> -    Bool              tear_free;
> +    int               tear_free;
>      Bool             exa_pixmaps;
>      Bool              exa_force_create;
>      XF86ModReqInfo    exaReq;
> diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
> index d0dcf8906..c108ceab2 100644
> --- a/src/radeon_dri2.c
> +++ b/src/radeon_dri2.c
> @@ -47,6 +47,7 @@
>  #include "radeon_bo_gem.h"
>
>  #include <xf86Priv.h>
> +#include <X11/extensions/dpmsconst.h>
>
>  #if DRI2INFOREC_VERSION >= 9
>  #define USE_DRI2_PRIME
> @@ -756,14 +757,34 @@ can_flip(ScrnInfoPtr pScrn, DrawablePtr draw,
>          DRI2BufferPtr front, DRI2BufferPtr back)
>  {
>      RADEONInfoPtr info = RADEONPTR(pScrn);
> +    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> +    int num_crtcs_on;
> +    int i;
> +
> +    if (draw->type != DRAWABLE_WINDOW ||
> +       !info->allowPageFlip ||
> +       info->hwcursor_disabled ||
> +       info->drmmode.present_flipping ||
> +       !pScrn->vtSema ||
> +       !DRI2CanFlip(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 (!crtc->enabled)
> +           continue;
> +
> +       if (!drmmode_crtc || drmmode_crtc->rotate.bo ||
> +           drmmode_crtc->scanout[0].bo)
> +           return FALSE;
> +
> +       if (drmmode_crtc->pending_dpms_mode == DPMSModeOn)
> +           num_crtcs_on++;
> +    }
>
> -    return draw->type == DRAWABLE_WINDOW &&
> -          info->allowPageFlip &&
> -          !info->hwcursor_disabled &&
> -          !info->drmmode.present_flipping &&
> -          pScrn->vtSema &&
> -          DRI2CanFlip(draw) &&
> -          can_exchange(pScrn, draw, front, back);
> +    return num_crtcs_on > 0 && can_exchange(pScrn, draw, front, back);
>  }
>
>  static void
> diff --git a/src/radeon_kms.c b/src/radeon_kms.c
> index 0ed7680e7..331f3f1c9 100644
> --- a/src/radeon_kms.c
> +++ b/src/radeon_kms.c
> @@ -669,7 +669,6 @@ radeon_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id)
>  {
>      ScrnInfoPtr scrn = crtc->scrn;
>      ScreenPtr screen = scrn->pScreen;
> -    RADEONInfoPtr info = RADEONPTR(scrn);
>      drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>      PixmapPtr scanoutpix = crtc->randr_crtc->scanout_pixmap;
>      PixmapDirtyUpdatePtr dirty;
> @@ -677,7 +676,7 @@ radeon_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id)
>
>      xorg_list_for_each_entry(dirty, &screen->pixmap_dirty_list, ent) {
>         if (dirty->src == scanoutpix && dirty->slave_dst ==
> -           drmmode_crtc->scanout[scanout_id ^ info->tear_free].pixmap) {
> +           drmmode_crtc->scanout[scanout_id ^ drmmode_crtc->tear_free].pixmap) {
>             RegionPtr region;
>
>             if (master_has_sync_shared_pixmap(scrn, dirty))
> @@ -687,7 +686,7 @@ radeon_prime_scanout_do_update(xf86CrtcPtr crtc, unsigned scanout_id)
>             if (RegionNil(region))
>                 goto destroy;
>
> -           if (info->tear_free) {
> +           if (drmmode_crtc->tear_free) {
>                 RegionTranslate(region, crtc->x, crtc->y);
>                 radeon_sync_scanout_pixmaps(crtc, region, scanout_id);
>                 radeon_cs_flush_indirect(scrn);
> @@ -823,7 +822,6 @@ radeon_prime_scanout_flip(PixmapDirtyUpdatePtr ent)
>  static void
>  radeon_dirty_update(ScrnInfoPtr scrn)
>  {
> -       RADEONInfoPtr info = RADEONPTR(scrn);
>         ScreenPtr screen = scrn->pScreen;
>         PixmapDirtyUpdatePtr ent;
>         RegionPtr region;
> @@ -844,7 +842,13 @@ radeon_dirty_update(ScrnInfoPtr scrn)
>                         region = dirty_region(region_ent);
>
>                         if (RegionNotEmpty(region)) {
> -                               if (info->tear_free)
> +                               xf86CrtcPtr crtc = radeon_prime_dirty_to_crtc(ent);
> +                               drmmode_crtc_private_ptr drmmode_crtc = NULL;
> +
> +                               if (crtc)
> +                                   drmmode_crtc = crtc->driver_private;
> +
> +                               if (drmmode_crtc && drmmode_crtc->tear_free)
>                                         radeon_prime_scanout_flip(ent);
>                                 else
>                                         radeon_prime_scanout_update(ent);
> @@ -890,7 +894,7 @@ radeon_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id)
>      if (!radeon_scanout_extents_intersect(xf86_crtc, &extents))
>         return FALSE;
>
> -    if (info->tear_free) {
> +    if (drmmode_crtc->tear_free) {
>         radeon_sync_scanout_pixmaps(xf86_crtc, pRegion, scanout_id);
>         RegionCopy(&drmmode_crtc->scanout_last_region, pRegion);
>      }
> @@ -1112,14 +1116,17 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL)
>      if (!radeon_is_gpu_screen(pScreen))
>      {
>         for (c = 0; c < xf86_config->num_crtc; c++) {
> -           if (info->tear_free)
> -               radeon_scanout_flip(pScreen, info, xf86_config->crtc[c]);
> +           xf86CrtcPtr crtc = xf86_config->crtc[c];
> +           drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
> +
> +           if (drmmode_crtc->tear_free)
> +               radeon_scanout_flip(pScreen, info, crtc);
>             else if (info->shadow_primary
>  #if XF86_CRTC_VERSION >= 4
> -                    || xf86_config->crtc[c]->driverIsPerformingTransform
> +                    || crtc->driverIsPerformingTransform
>  #endif
>                 )
> -               radeon_scanout_update(xf86_config->crtc[c]);
> +               radeon_scanout_update(crtc);
>         }
>      }
>
> @@ -1633,6 +1640,7 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
>  {
>      RADEONInfoPtr     info;
>      RADEONEntPtr pRADEONEnt;
> +    MessageType from;
>      DevUnion* pPriv;
>      Gamma  zeros = { 0.0, 0.0, 0.0 };
>      uint32_t tiling = 0;
> @@ -1778,11 +1786,14 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
>  #endif
>
>      if (!info->r600_shadow_fb) {
> -       info->tear_free = xf86ReturnOptValBool(info->Options, OPTION_TEAR_FREE,
> -                                              FALSE);
> +       from = X_DEFAULT;
>
> -       if (info->tear_free)
> -           xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TearFree enabled\n");
> +       info->tear_free = 2;
> +       if (xf86GetOptValBool(info->Options, OPTION_TEAR_FREE,
> +                             &info->tear_free))
> +           from = X_CONFIG;
> +       xf86DrvMsg(pScrn->scrnIndex, from, "TearFree property default: %s\n",
> +                  info->tear_free == 2 ? "auto" : (info->tear_free ? "on" : "off"));
>      }
>
>      if (info->dri2.pKernelDRMVersion->version_minor >= 8) {
> @@ -1791,13 +1802,13 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
>         info->allowPageFlip = xf86ReturnOptValBool(info->Options,
>                                                    OPTION_PAGE_FLIP, TRUE);
>
> -       if (sw_cursor || info->tear_free || info->shadow_primary) {
> +       if (sw_cursor || info->shadow_primary) {
>             xf86DrvMsg(pScrn->scrnIndex,
>                        info->allowPageFlip ? X_WARNING : X_DEFAULT,
>                        "KMS Pageflipping: disabled%s\n",
>                        info->allowPageFlip ?
>                        (sw_cursor ? " because of SWcursor" :
> -                       " because of ShadowPrimary/TearFree") : "");
> +                       " because of ShadowPrimary") : "");
>             info->allowPageFlip = FALSE;
>         } else {
>             xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> --
> 2.11.0
>
> _______________________________________________
> 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