randr12: Add compatibility for XF86VidMode gamma ramps.

Fixes screensaver fadeout effects.

Also make all RandR 1.2 compatibility code for XF86VidMode operate only on the
CRTC associated with the compatibility output, not all CRTCs at once.
This commit is contained in:
Michel Dänzer 2009-07-21 14:34:47 +02:00
parent 268e227ba0
commit 9dc8106ba0
2 changed files with 45 additions and 12 deletions

View File

@ -999,6 +999,18 @@ xf86ChangeGammaRamp(
CMapScreenPtr pScreenPriv; CMapScreenPtr pScreenPriv;
CMapLinkPtr pLink; CMapLinkPtr pLink;
if (xf86_crtc_supports_gamma(pScrn)) {
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
if (crtc->gammaSize != size)
return BadValue;
RRCrtcGammaSet(crtc, red, green, blue);
return Success;
}
if(CMapScreenKey == NULL) if(CMapScreenKey == NULL)
return BadImplementation; return BadImplementation;
@ -1057,8 +1069,16 @@ xf86ChangeGammaRamp(
int int
xf86GetGammaRampSize(ScreenPtr pScreen) xf86GetGammaRampSize(ScreenPtr pScreen)
{ {
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
CMapScreenPtr pScreenPriv; CMapScreenPtr pScreenPriv;
if (xf86_crtc_supports_gamma(pScrn)) {
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
return crtc->gammaSize;
}
if(CMapScreenKey == NULL) return 0; if(CMapScreenKey == NULL) return 0;
pScreenPriv = (CMapScreenPtr)dixLookupPrivate(&pScreen->devPrivates, pScreenPriv = (CMapScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
@ -1076,10 +1096,28 @@ xf86GetGammaRamp(
unsigned short *green, unsigned short *green,
unsigned short *blue unsigned short *blue
){ ){
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
CMapScreenPtr pScreenPriv; CMapScreenPtr pScreenPriv;
LOCO *entry; LOCO *entry;
int shift, sigbits; int shift, sigbits;
if (xf86_crtc_supports_gamma(pScrn)) {
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_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(CMapScreenKey == NULL) if(CMapScreenKey == NULL)
return BadImplementation; return BadImplementation;

View File

@ -1718,13 +1718,11 @@ gamma_to_ramp(float gamma, CARD16 *ramp, int size)
static int static int
xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma) xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
{ {
int i, size = 0;
CARD16 *points, *red, *green, *blue; CARD16 *points, *red, *green, *blue;
ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
rrScrPrivPtr rp = rrGetScrPriv(pScrn->pScreen); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
for (i = 0; i < rp->numCrtcs; i++) int size = max(0, crtc->gammaSize);
size = max(size, rp->crtcs[i]->gammaSize);
if (!size) if (!size)
return Success; return Success;
@ -1737,13 +1735,10 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
green = points + size; green = points + size;
blue = points + 2 * size; blue = points + 2 * size;
for (i = 0; i < rp->numCrtcs; i++) { gamma_to_ramp(gamma.red, red, size);
gamma_to_ramp(gamma.red, red, rp->crtcs[i]->gammaSize); gamma_to_ramp(gamma.green, green, size);
gamma_to_ramp(gamma.green, green, rp->crtcs[i]->gammaSize); gamma_to_ramp(gamma.blue, blue, size);
gamma_to_ramp(gamma.blue, blue, rp->crtcs[i]->gammaSize); RRCrtcGammaSet(crtc, red, green, blue);
RRCrtcGammaSet(rp->crtcs[i], red, green, blue);
memset(points, 0, 3 * size * sizeof(CARD16));
}
xfree(points); xfree(points);