And pushed.
On Fri, Apr 18, 2014 at 8:19 PM, Stéphane Marchesin < [email protected]> wrote: > > > > On Tue, Apr 1, 2014 at 8:02 PM, <[email protected]> wrote: > >> From: Dominik Behr <[email protected]> >> >> 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 <[email protected]> >> > > Reviewed-by: Stéphane Marchesin <[email protected]> > > --- >> 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 >> >> _______________________________________________ >> [email protected]: X.Org development >> Archives: http://lists.x.org/archives/xorg-devel >> Info: http://lists.x.org/mailman/listinfo/xorg-devel >> > >
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
