[PATCH] xrandr: use full range for gamma table generation

Stéphane Marchesin stephane.marchesin at gmail.com
Fri Apr 18 20:19:10 PDT 2014


On Tue, Apr 1, 2014 at 8:02 PM, <dbehr at chromium.org> wrote:

> From: Dominik Behr <dbehr at chromium.org>
>
> Calculate gamma table using full [0,65536) range and do not make any
> assumptions about relation of gamma table size and significant bits.
>
> Gamma table size has nothing to do with number of significant bits in
> hardware.
> In particular we are dealing now with gamma table that has 17 entries and 8
> bit precision, there are other GPUs with 10 bit precision and less than 256
> entries using partial linear approximation. Deriving assumed gamma table
> significant bits from size of gamma table leads to incorrect calculations
> and
> loss of precision. Also XRandR specification never mentions that gamma
> tables
> need to be power of 2.
>
> Signed-off-by: Dominik Behr <dbehr at chromium.org>
>

Reviewed-by: Stéphane Marchesin <marcheu at chromium.org>

---
>  xrandr.c | 25 +++++++------------------
>  1 file changed, 7 insertions(+), 18 deletions(-)
>
> diff --git a/xrandr.c b/xrandr.c
> index c51bee3..7a5fa30 100644
> --- a/xrandr.c
> +++ b/xrandr.c
> @@ -1394,7 +1394,7 @@ set_gamma(void)
>      output_t   *output;
>
>      for (output = all_outputs; output; output = output->next) {
> -       int i, size, shift;
> +       int i, size;
>         crtc_t *crtc;
>         XRRCrtcGamma *crtc_gamma;
>         float gammaRed;
> @@ -1429,14 +1429,6 @@ set_gamma(void)
>             continue;
>         }
>
> -       /*
> -        * The hardware color lookup table has a number of significant
> -        * bits equal to ffs(size) - 1; compute all values so that
> -        * they are in the range [0,size) then shift the values so
> -        * that they occupy the MSBs of the 16-bit X Color.
> -        */
> -       shift = 16 - (ffs(size) - 1);
> -
>         crtc_gamma = XRRAllocGamma(size);
>         if (!crtc_gamma) {
>             fatal("Gamma allocation failed.\n");
> @@ -1456,28 +1448,25 @@ set_gamma(void)
>
>         for (i = 0; i < size; i++) {
>             if (gammaRed == 1.0 && output->brightness == 1.0)
> -               crtc_gamma->red[i] = i;
> +               crtc_gamma->red[i] = (double)i / (double)(size - 1) *
> 65535.0;
>             else
>                 crtc_gamma->red[i] = dmin(pow((double)i/(double)(size - 1),
>                                               gammaRed) *
> output->brightness,
> -                                         1.0) * (double)(size - 1);
> -           crtc_gamma->red[i] <<= shift;
> +                                         1.0) * 65535.0;
>
>             if (gammaGreen == 1.0 && output->brightness == 1.0)
> -               crtc_gamma->green[i] = i;
> +               crtc_gamma->green[i] = (double)i / (double)(size - 1) *
> 65535.0;
>             else
>                 crtc_gamma->green[i] = dmin(pow((double)i/(double)(size -
> 1),
>                                                 gammaGreen) *
> output->brightness,
> -                                           1.0) * (double)(size - 1);
> -           crtc_gamma->green[i] <<= shift;
> +                                           1.0) * 65535.0;
>
>             if (gammaBlue == 1.0 && output->brightness == 1.0)
> -               crtc_gamma->blue[i] = i;
> +               crtc_gamma->blue[i] = (double)i / (double)(size - 1) *
> 65535.0;
>             else
>                 crtc_gamma->blue[i] = dmin(pow((double)i/(double)(size -
> 1),
>                                                gammaBlue) *
> output->brightness,
> -                                          1.0) * (double)(size - 1);
> -           crtc_gamma->blue[i] <<= shift;
> +                                          1.0) * 65535.0;
>         }
>
>         XRRSetCrtcGamma(dpy, crtc->crtc.xid, crtc_gamma);
> --
> 1.9.1.423.g4596e3a
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140418/98f053b3/attachment-0001.html>


More information about the xorg-devel mailing list