[PATCH xserver 1/3] xfree86/modes: Move gamma initialization to xf86RandR12Init12 v2

walter harms wharms at bfs.de
Tue Jul 26 14:25:31 UTC 2016



Am 26.07.2016 11:11, schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer at amd.com>
> 
> RRCrtcGammaSetSize cannot be used yet in xf86InitialConfiguration,
> because randr_crtc isn't allocated yet at that point, but a following
> change will require RRCrtcGammaSetSize to be called from
> xf86RandR12CrtcInitGamma.
> 
> v2:
> * Bail from xf86RandR12CrtcInitGamma if !crtc->funcs->gamma_set (Keith
>   Packard)
> 
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>  hw/xfree86/modes/xf86Crtc.c    | 113 ----------------------------------------
>  hw/xfree86/modes/xf86RandR12.c | 115 ++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 114 insertions(+), 114 deletions(-)
> 
> diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
> index 4a13c13..966a168 100644
> --- a/hw/xfree86/modes/xf86Crtc.c
> +++ b/hw/xfree86/modes/xf86Crtc.c
> @@ -2451,108 +2451,6 @@ xf86TargetUserpref(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
>      return FALSE;
>  }
>  
> -static Bool
> -xf86CrtcSetInitialGamma(xf86CrtcPtr crtc, float gamma_red, float gamma_green,
> -                        float gamma_blue)
> -{
> -    int i, size = 256;
> -    CARD16 *red, *green, *blue;
> -
> -    red = xallocarray(size, 3 * sizeof(CARD16));
> -    green = red + size;
> -    blue = green + size;
> -
> -    /* Only cause warning if user wanted gamma to be set. */
> -    if (!crtc->funcs->gamma_set &&
> -        (gamma_red != 1.0 || gamma_green != 1.0 || gamma_blue != 1.0)) {
> -        free(red);
> -        return FALSE;
> -    }
> -    else if (!crtc->funcs->gamma_set) {
> -        free(red);
> -        return TRUE;
> -    }
> -
> -    /* At this early stage none of the randr-interface stuff is up.
> -     * So take the default gamma size for lack of something better.
> -     */
> -    for (i = 0; i < size; i++) {
> -        if (gamma_red == 1.0)
> -            red[i] = i << 8;
> -        else
> -            red[i] = (CARD16) (pow((double) i / (double) (size - 1),
> -                                   1. / (double) gamma_red) * (double) (size -
> -                                                                        1) *
> -                               256);
> -
> -        if (gamma_green == 1.0)
> -            green[i] = i << 8;
> -        else
> -            green[i] = (CARD16) (pow((double) i / (double) (size - 1),
> -                                     1. / (double) gamma_green) *
> -                                 (double) (size - 1) * 256);
> -
> -        if (gamma_blue == 1.0)
> -            blue[i] = i << 8;
> -        else
> -            blue[i] = (CARD16) (pow((double) i / (double) (size - 1),
> -                                    1. / (double) gamma_blue) * (double) (size -
> -                                                                          1) *
> -                                256);
> -    }
> -
> -    /* Default size is 256, so anything else is failure. */
> -    if (size != crtc->gamma_size) {
> -        free(red);
> -        return FALSE;
> -    }
> -
> -    crtc->gamma_size = size;
> -    memcpy(crtc->gamma_red, red, crtc->gamma_size * sizeof(CARD16));
> -    memcpy(crtc->gamma_green, green, crtc->gamma_size * sizeof(CARD16));
> -    memcpy(crtc->gamma_blue, blue, crtc->gamma_size * sizeof(CARD16));
> -
> -    /* Do not set gamma now, delay until the crtc is activated. */
> -
> -    free(red);
> -
> -    return TRUE;
> -}
> -
> -static Bool
> -xf86OutputSetInitialGamma(xf86OutputPtr output)
> -{
> -    XF86ConfMonitorPtr mon = output->conf_monitor;
> -    float gamma_red = 1.0, gamma_green = 1.0, gamma_blue = 1.0;
> -
> -    if (!mon)
> -        return TRUE;
> -
> -    if (!output->crtc)
> -        return FALSE;
> -
> -    /* Get configured values, where they exist. */
> -    if (mon->mon_gamma_red >= GAMMA_MIN && mon->mon_gamma_red <= GAMMA_MAX)
> -        gamma_red = mon->mon_gamma_red;
> -
> -    if (mon->mon_gamma_green >= GAMMA_MIN && mon->mon_gamma_green <= GAMMA_MAX)
> -        gamma_green = mon->mon_gamma_green;
> -
> -    if (mon->mon_gamma_blue >= GAMMA_MIN && mon->mon_gamma_blue <= GAMMA_MAX)
> -        gamma_blue = mon->mon_gamma_blue;
> -
> -    /* This avoids setting gamma 1.0 in case another cloned output on this crtc has a specific gamma. */
> -    if (gamma_red != 1.0 || gamma_green != 1.0 || gamma_blue != 1.0) {
> -        xf86DrvMsg(output->scrn->scrnIndex, X_INFO,
> -                   "Output %s wants gamma correction (%.1f, %.1f, %.1f)\n",
> -                   output->name, gamma_red, gamma_green, gamma_blue);
> -        return xf86CrtcSetInitialGamma(output->crtc, gamma_red, gamma_green,
> -                                       gamma_blue);
> -    }
> -    else
> -        return TRUE;
> -}
> -
>  /**
>   * Construct default screen configuration
>   *
> @@ -2672,15 +2570,8 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
>  
>          crtc->enabled = FALSE;
>          memset(&crtc->desiredMode, '\0', sizeof(crtc->desiredMode));
> -        /* Set default gamma for all crtc's. */
> -        /* This is done to avoid problems later on with cloned outputs. */
> -        xf86CrtcSetInitialGamma(crtc, 1.0, 1.0, 1.0);
>      }
>  
> -    if (xf86_crtc_supports_gamma(scrn))
> -        xf86DrvMsg(scrn->scrnIndex, X_INFO,
> -                   "Using default gamma of (1.0, 1.0, 1.0) unless otherwise stated.\n");
> -
>      /*
>       * Set initial configuration
>       */
> @@ -2703,10 +2594,6 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow)
>              memcpy(crtc->panningBorder, output->initialBorder,
>                     4 * sizeof(INT16));
>              output->crtc = crtc;
> -            if (!xf86OutputSetInitialGamma(output))
> -                xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> -                           "Initial gamma correction for output %s: failed.\n",
> -                           output->name);
>          }
>          else {
>              output->crtc = NULL;
> diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
> index 9f93270..5b24ebb 100644
> --- a/hw/xfree86/modes/xf86RandR12.c
> +++ b/hw/xfree86/modes/xf86RandR12.c
> @@ -1313,6 +1313,116 @@ xf86RandR12CrtcGetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc)
>      return TRUE;
>  }
>  
> +static void
> +init_one_component(CARD16 *comp, unsigned size, unsigned shift, float gamma)
> +{
> +    int i;
> +
> +    if (gamma == 1.0) {
> +        for (i = 0; i < size; i++)
> +            comp[i] = i << shift;
> +    } else {
> +        for (i = 0; i < size; i++)
I know it was not the the original source but to have a change to read this ...

          double a=(double) i / (double) (size - 1);
 	  double b=(double) (size - 1) * (1 << shift)    //const
	  double c= 1.0 / (double) gamma;                //const

          comp[i] = (CARD16) (pow(a,c)*b);

feel free to move the lines marked const out of the loop to be faster

just my 2 cetnts.
re,
 wh
	

> +            comp[i] = (CARD16) (pow((double) i / (double) (size - 1),
> +                                   1. / (double) gamma) *
> +                               (double) (size - 1) * (1 << shift));
> +    }
> +}
> +
> +static Bool
> +xf86RandR12CrtcInitGamma(xf86CrtcPtr crtc, float gamma_red, float gamma_green,
> +                         float gamma_blue)
> +{
> +    unsigned size = crtc->randr_crtc->gammaSize, shift;
> +    CARD16 *red, *green, *blue;
> +
> +    if (!crtc->funcs->gamma_set &&
> +        (gamma_red != 1.0f || gamma_green != 1.0f || gamma_blue != 1.0f))
> +        return FALSE;
> +
> +    red = xallocarray(size, 3 * sizeof(CARD16));
> +    if (!red)
> +        return FALSE;
> +
> +    green = red + size;
> +    blue = green + size;
> +
> +    for (shift = 0; (size << shift) < (1 << 16); shift++);
> +
> +    init_one_component(red, size, shift, gamma_red);
> +    init_one_component(green, size, shift, gamma_green);
> +    init_one_component(blue, size, shift, gamma_blue);
> +
> +    RRCrtcGammaSet(crtc->randr_crtc, red, green, blue);
> +    free(red);
> +
> +    return TRUE;
> +}
> +
> +static Bool
> +xf86RandR12OutputInitGamma(xf86OutputPtr output)
> +{
> +    XF86ConfMonitorPtr mon = output->conf_monitor;
> +    float gamma_red = 1.0, gamma_green = 1.0, gamma_blue = 1.0;
> +
> +    if (!mon)
> +        return TRUE;
> +
> +    /* Get configured values, where they exist. */
> +    if (mon->mon_gamma_red >= GAMMA_MIN && mon->mon_gamma_red <= GAMMA_MAX)
> +        gamma_red = mon->mon_gamma_red;
> +
> +    if (mon->mon_gamma_green >= GAMMA_MIN && mon->mon_gamma_green <= GAMMA_MAX)
> +        gamma_green = mon->mon_gamma_green;
> +
> +    if (mon->mon_gamma_blue >= GAMMA_MIN && mon->mon_gamma_blue <= GAMMA_MAX)
> +        gamma_blue = mon->mon_gamma_blue;
> +
> +    /* Don't set gamma 1.0 if another cloned output on this CRTC already set a
> +     * different gamma
> +     */
> +    if (gamma_red != 1.0 || gamma_green != 1.0 || gamma_blue != 1.0) {
> +        xf86DrvMsg(output->scrn->scrnIndex, X_INFO,
> +                   "Output %s wants gamma correction (%.1f, %.1f, %.1f)\n",
> +                   output->name, gamma_red, gamma_green, gamma_blue);
> +        return xf86RandR12CrtcInitGamma(output->crtc, gamma_red, gamma_green,
> +                                        gamma_blue);
> +    }
> +
> +    return TRUE;
> +}
> +
> +static Bool
> +xf86RandR12InitGamma(ScrnInfoPtr pScrn, unsigned gammaSize) {
> +    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> +    int o, c;
> +
> +    /* Set default gamma for all CRTCs
> +     * This is done to avoid problems later on with cloned outputs
> +     */
> +    for (c = 0; c < config->num_crtc; c++) {
> +        xf86CrtcPtr crtc = config->crtc[c];
> +
> +        if (!RRCrtcGammaSetSize(crtc->randr_crtc, gammaSize) ||
> +            !xf86RandR12CrtcInitGamma(crtc, 1.0f, 1.0f, 1.0f))
> +            return FALSE;
> +    }
> +
> +    /* Set initial gamma per monitor configuration
> +     */
> +    for (o = 0; o < config->num_output; o++) {
> +        xf86OutputPtr output = config->output[o];
> +
> +        if (output->crtc &&
> +            !xf86RandR12OutputInitGamma(output))
> +            xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
> +                       "Initial gamma correction for output %s: failed.\n",
> +                       output->name);
> +    }
> +
> +    return TRUE;
> +}
> +
>  static Bool
>  xf86RandR12OutputSetProperty(ScreenPtr pScreen,
>                               RROutputPtr randr_output,
> @@ -1533,7 +1643,6 @@ xf86RandR12CreateObjects12(ScreenPtr pScreen)
>          xf86CrtcPtr crtc = config->crtc[c];
>  
>          crtc->randr_crtc = RRCrtcCreate(pScreen, crtc);
> -        RRCrtcGammaSetSize(crtc->randr_crtc, 256);
>      }
>      /*
>       * Configure outputs
> @@ -2011,6 +2120,10 @@ xf86RandR12Init12(ScreenPtr pScreen)
>       */
>      if (!xf86RandR12SetInfo12(pScreen))
>          return FALSE;
> +
> +    if (!xf86RandR12InitGamma(pScrn, 256))
> +        return FALSE;
> +
>      for (i = 0; i < rp->numCrtcs; i++) {
>          xf86RandR12CrtcGetGamma(pScreen, rp->crtcs[i]);
>      }


More information about the xorg-devel mailing list