diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2015-11-28 16:50:47 +0900 |
---|---|---|
committer | Michel Dänzer <michel@daenzer.net> | 2016-03-01 12:47:03 +0900 |
commit | aecc6ffd03d9a949e42790cf574003fdd44a8d3b (patch) | |
tree | 8776042d9e9c1ef8639b0e7b88d3e6b5ed67924f | |
parent | 1bee4e254ca0305cb23e574b4c8b250d276ee998 (diff) |
WIP: Hook up colormaps to RandR 1.2 gamma code
-rw-r--r-- | hw/xfree86/common/xf86Helper.c | 7 | ||||
-rw-r--r-- | hw/xfree86/common/xf86cmap.c | 53 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86Crtc.c | 4 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86RandR12.c | 167 | ||||
-rw-r--r-- | hw/xfree86/modes/xf86RandR12.h | 3 | ||||
-rw-r--r-- | randr/randrstr.h | 7 |
6 files changed, 120 insertions, 121 deletions
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c index 3b01a49b5..217464175 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -54,7 +54,6 @@ #include "xf86Xinput.h" #include "xf86InPriv.h" #include "mivalidate.h" -#include "xf86Crtc.h" /* For xf86GetClocks */ #if defined(CSRG_BASED) || defined(__GNU__) @@ -908,11 +907,7 @@ xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma) scrp->gamma.green = 1.0; scrp->gamma.blue = 1.0; } - /* Pretend we succeeded if we support better a gamma system. - * This avoids a confusing message. - */ - if (xf86_crtc_supports_gamma(scrp)) - return TRUE; + xf86DrvMsg(scrp->scrnIndex, from, "Using gamma correction (%.1f, %.1f, %.1f)\n", scrp->gamma.red, scrp->gamma.green, scrp->gamma.blue); diff --git a/hw/xfree86/common/xf86cmap.c b/hw/xfree86/common/xf86cmap.c index ba0b277a1..4b38c994e 100644 --- a/hw/xfree86/common/xf86cmap.c +++ b/hw/xfree86/common/xf86cmap.c @@ -49,6 +49,7 @@ #include "xf86_OSproc.h" #include "xf86str.h" #include "micmap.h" +#include "xf86RandR12.h" #include "xf86Crtc.h" #ifdef XFreeXDGA @@ -132,9 +133,6 @@ static void CMapUnwrapScreen(ScreenPtr pScreen); Bool xf86ColormapAllocatePrivates(ScrnInfoPtr pScrn) { - /* If we support a better colormap system, then pretend we succeeded. */ - if (xf86_crtc_supports_gamma(pScrn)) - return TRUE; if (!dixRegisterPrivateKey(&CMapScreenKeyRec, PRIVATE_SCREEN, 0)) return FALSE; @@ -157,10 +155,6 @@ xf86HandleColormaps(ScreenPtr pScreen, int *indices; int elements; - /* If we support a better colormap system, then pretend we succeeded. */ - if (xf86_crtc_supports_gamma(pScrn)) - return TRUE; - if (!maxColors || !sigRGBbits || !loadPalette) return FALSE; @@ -193,7 +187,10 @@ xf86HandleColormaps(ScreenPtr pScreen, pScreen->InstallColormap = CMapInstallColormap; pScreen->StoreColors = CMapStoreColors; - pScrn->LoadPalette = loadPalette; + if (xf86_crtc_supports_gamma(pScrn)) + pScrn->LoadPalette = xf86RandR12LoadPalette; + else + pScrn->LoadPalette = loadPalette; pScrn->SetOverscan = setOverscan; pScreenPriv->maxColors = maxColors; pScreenPriv->sigRGBbits = sigRGBbits; @@ -1005,19 +1002,6 @@ xf86ChangeGammaRamp(ScreenPtr pScreen, CMapScreenPtr pScreenPriv; CMapLinkPtr pLink; - if (xf86_crtc_supports_gamma(pScrn)) { - RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn); - - if (crtc) { - if (crtc->gammaSize != size) - return BadValue; - - RRCrtcGammaSet(crtc, red, green, blue); - - return Success; - } - } - if (!CMapScreenKeyRegistered) return BadImplementation; @@ -1077,16 +1061,8 @@ xf86ChangeGammaRamp(ScreenPtr pScreen, int xf86GetGammaRampSize(ScreenPtr pScreen) { - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); CMapScreenPtr pScreenPriv; - if (xf86_crtc_supports_gamma(pScrn)) { - RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn); - - if (crtc) - return crtc->gammaSize; - } - if (!CMapScreenKeyRegistered) return 0; @@ -1104,29 +1080,10 @@ xf86GetGammaRamp(ScreenPtr pScreen, unsigned short *red, unsigned short *green, unsigned short *blue) { - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); CMapScreenPtr pScreenPriv; LOCO *entry; int shift, sigbits; - if (xf86_crtc_supports_gamma(pScrn)) { - RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn); - - if (crtc) { - if (crtc->gammaSize < size) - return BadValue; - - if (!RRCrtcGammaGet(crtc)) - return BadImplementation; - - memcpy(red, crtc->gammaRed, size * sizeof(*red)); - memcpy(green, crtc->gammaGreen, size * sizeof(*green)); - memcpy(blue, crtc->gammaBlue, size * sizeof(*blue)); - - return Success; - } - } - if (!CMapScreenKeyRegistered) return BadImplementation; diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 38bc58cbc..c2f58ff0c 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -2671,10 +2671,6 @@ xf86InitialConfiguration(ScrnInfoPtr scrn, Bool canGrow) 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 */ diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 60d22543e..e26eecd78 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -40,6 +40,7 @@ #include <randrstr.h> #include <X11/extensions/render.h> +#include "xf86cmap.h" #include "xf86Crtc.h" #include "xf86RandR12.h" @@ -1235,6 +1236,63 @@ xf86RandR12CrtcSet(ScreenPtr pScreen, return xf86RandR12CrtcNotify(randr_crtc); } +static void +xf86RandR12CrtcComputeGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc) +{ + xf86CrtcPtr crtc = randr_crtc->devPrivate; + int gamma_slots, gamma_ramp_size = xf86GetGammaRampSize(pScreen); + int i, j; + + gamma_slots = crtc->gamma_size / randr_crtc->paletteRedSize; + for (i = 0; i < randr_crtc->paletteRedSize; i++) { + j = i * gamma_slots; + crtc->gamma_red[j] = randr_crtc->gammaRed[randr_crtc->palette[i].red * + crtc->gamma_size / + gamma_ramp_size]; + + while (++j < (i + 1) * gamma_slots) + crtc->gamma_red[j] = crtc->gamma_red[j - 1]; + } + + gamma_slots = crtc->gamma_size / randr_crtc->paletteGreenSize; + for (i = 0; i < randr_crtc->paletteGreenSize; i++) { + j = i * gamma_slots; + crtc->gamma_green[j] = randr_crtc->gammaGreen[randr_crtc->palette[i].green * + crtc->gamma_size / + gamma_ramp_size]; + + while (++j < (i + 1) * gamma_slots) + crtc->gamma_green[j] = crtc->gamma_green[j - 1]; + } + + gamma_slots = crtc->gamma_size / randr_crtc->paletteBlueSize; + for (i = 0; i < randr_crtc->paletteBlueSize; i++) { + j = i * gamma_slots; + crtc->gamma_blue[j] = randr_crtc->gammaBlue[randr_crtc->palette[i].blue * + crtc->gamma_size / + gamma_ramp_size]; + + while (++j < (i + 1) * gamma_slots) + crtc->gamma_blue[j] = crtc->gamma_blue[j - 1]; + } +} + +static void +xf86RandR12CrtcResetGamma(RRCrtcPtr randr_crtc) +{ + xf86CrtcPtr crtc = randr_crtc->devPrivate; + + if (!crtc->scrn->vtSema || !crtc->funcs->gamma_set) + return; + + /* Only set it when the crtc is actually running. + * Otherwise it will be set when it's activated. + */ + if (crtc->active) + crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, + crtc->gamma_blue, crtc->gamma_size); +} + static Bool xf86RandR12CrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc) { @@ -1243,9 +1301,6 @@ xf86RandR12CrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc) if (crtc->funcs->gamma_set == NULL) return FALSE; - if (!crtc->scrn->vtSema) - return TRUE; - /* Realloc local gamma if needed. */ if (randr_crtc->gammaSize != crtc->gamma_size) { CARD16 *tmp_ptr; @@ -1257,22 +1312,11 @@ xf86RandR12CrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc) crtc->gamma_red = tmp_ptr; crtc->gamma_green = crtc->gamma_red + randr_crtc->gammaSize; crtc->gamma_blue = crtc->gamma_green + randr_crtc->gammaSize; + crtc->gamma_size = randr_crtc->gammaSize; } - crtc->gamma_size = randr_crtc->gammaSize; - memcpy(crtc->gamma_red, randr_crtc->gammaRed, - crtc->gamma_size * sizeof(CARD16)); - memcpy(crtc->gamma_green, randr_crtc->gammaGreen, - crtc->gamma_size * sizeof(CARD16)); - memcpy(crtc->gamma_blue, randr_crtc->gammaBlue, - crtc->gamma_size * sizeof(CARD16)); - - /* Only set it when the crtc is actually running. - * Otherwise it will be set when it's activated. - */ - if (crtc->active) - crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, - crtc->gamma_blue, crtc->gamma_size); + xf86RandR12CrtcComputeGamma(pScreen, randr_crtc); + xf86RandR12CrtcResetGamma(randr_crtc); return TRUE; } @@ -1738,57 +1782,55 @@ xf86RandR13SetPanning(ScreenPtr pScreen, } /* - * Compatibility with XF86VidMode's gamma changer. This necessarily clobbers - * any per-crtc setup. You asked for it... + * Compatibility with colormaps and XF86VidMode's gamma */ - -static void -gamma_to_ramp(float gamma, CARD16 *ramp, int size) +void +xf86RandR12LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, + LOCO *colors, VisualPtr pVisual) { - int i; - - for (i = 0; i < size; i++) { - if (gamma == 1.0) - ramp[i] = i | i << 8; - else - ramp[i] = - (CARD16) (pow((double) i / (double) (size - 1), 1. / gamma) - * (double) (size - 1) * 257); + ScreenPtr pScreen = pScrn->pScreen; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + int reds, greens, blues, index, palette_size; + int c, i; + + if (pVisual->class == TrueColor || pVisual->class == DirectColor) { + reds = (pVisual->redMask >> pVisual->offsetRed) + 1; + greens = (pVisual->greenMask >> pVisual->offsetGreen) + 1; + blues = (pVisual->blueMask >> pVisual->offsetBlue) + 1; + } else { + reds = greens = blues = pVisual->ColormapEntries; } -} - -static int -xf86RandR12ChangeGamma(ScrnInfoPtr pScrn, Gamma gamma) -{ - CARD16 *points, *red, *green, *blue; - RRCrtcPtr crtc = xf86CompatRRCrtc(pScrn); - int size; - - if (!crtc) - return Success; - - size = max(0, crtc->gammaSize); - if (!size) - return Success; - points = calloc(size, 3 * sizeof(CARD16)); - if (!points) - return BadAlloc; + palette_size = max(reds, max(greens, blues)); - red = points; - green = points + size; - blue = points + 2 * size; - - gamma_to_ramp(gamma.red, red, size); - gamma_to_ramp(gamma.green, green, size); - gamma_to_ramp(gamma.blue, blue, size); - RRCrtcGammaSet(crtc, red, green, blue); - - free(points); + for (c = 0; c < config->num_crtc; c++) { + xf86CrtcPtr crtc = config->crtc[c]; + RRCrtcPtr randr_crtc = crtc->randr_crtc; - pScrn->gamma = gamma; + if (randr_crtc->paletteSize != palette_size) { + randr_crtc->palette = + reallocarray(randr_crtc->palette, palette_size, + sizeof(colors[0])); + randr_crtc->paletteSize = palette_size; + } + randr_crtc->paletteRedSize = reds; + randr_crtc->paletteGreenSize = greens; + randr_crtc->paletteBlueSize = blues; + + for (i = 0; i < numColors; i++) { + index = indices[i]; + + if (index < reds) + randr_crtc->palette[index].red = colors[index].red; + if (index < greens) + randr_crtc->palette[index].green = colors[index].green; + if (index < blues) + randr_crtc->palette[index].blue = colors[index].blue; + } - return Success; + xf86RandR12CrtcComputeGamma(pScreen, randr_crtc); + xf86RandR12CrtcResetGamma(randr_crtc); + } } static Bool @@ -1811,7 +1853,7 @@ xf86RandR12EnterVT(ScrnInfoPtr pScrn) /* reload gamma */ for (i = 0; i < rp->numCrtcs; i++) - xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]); + xf86RandR12CrtcResetGamma(rp->crtcs[i]); return RRGetInfo(pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */ } @@ -1999,7 +2041,6 @@ xf86RandR12Init12(ScreenPtr pScreen) rp->rrProviderDestroy = xf86RandR14ProviderDestroy; pScrn->PointerMoved = xf86RandR12PointerMoved; - pScrn->ChangeGamma = xf86RandR12ChangeGamma; randrp->orig_EnterVT = pScrn->EnterVT; pScrn->EnterVT = xf86RandR12EnterVT; diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h index e603799be..8b4219c2d 100644 --- a/hw/xfree86/modes/xf86RandR12.h +++ b/hw/xfree86/modes/xf86RandR12.h @@ -39,5 +39,8 @@ extern _X_EXPORT void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y); extern _X_EXPORT Bool xf86RandR12PreInit(ScrnInfoPtr pScrn); extern _X_EXPORT void xf86RandR12TellChanged(ScreenPtr pScreen); +extern _X_EXPORT void xf86RandR12LoadPalette(ScrnInfoPtr pScrn, int numColors, + int *indices, LOCO *colors, + VisualPtr pVisual); #endif /* _XF86_RANDR_H_ */ diff --git a/randr/randrstr.h b/randr/randrstr.h index 472721a5a..f6cc3189a 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -37,6 +37,7 @@ #include <X11/Xproto.h> #include "misc.h" #include "os.h" +#include "colormapst.h" #include "dixstruct.h" #include "resource.h" #include "scrnintstr.h" @@ -130,6 +131,12 @@ struct _rrCrtc { struct pict_f_transform f_inverse; PixmapPtr scanout_pixmap; + + int paletteRedSize; + int paletteGreenSize; + int paletteBlueSize; + int paletteSize; + LOCO *palette; }; struct _rrOutput { |