[Openchrome-users] xgamma enabled

Thomas Hellström thomas
Wed Dec 6 06:18:36 PST 2006


Gonzalo A. de la Vega wrote:

> I did it again... maybe it's the hangover... here is the right patch. 
> This one is the right one... I double checked. I did the previous one 
> offline, against a 1 day old backup... I won't do it again, it's a 
> promise!!!
>
>
Thanks,
No problem. BTW, is this code an adaptation from VIA's drivers or from 
Luc's unichrome driver?
Just for the record?

Everyone else reading, can we have this patch tried on some different 
hardware and bit-depths?


/Thomas

>------------------------------------------------------------------------
>
>Index: unichrome/via_driver.c
>===================================================================
>--- unichrome/via_driver.c	(revision 247)
>+++ unichrome/via_driver.c	(working copy)
>@@ -81,6 +81,9 @@
> static Bool VIAMapFB(ScrnInfoPtr pScrn);
> static void VIAUnmapMem(ScrnInfoPtr pScrn);
> 
>+static void VIALoadRgbLut(ScrnInfoPtr pScrn, LOCO *colors);
>+static int VIAChangeGamma(int myNum, Gamma gamma);
>+
> DriverRec VIA =
> {
>     VIA_VERSION,
>@@ -2056,9 +2059,10 @@
> 
>     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALoadPalette\n"));
> 
>-    if (pScrn->bitsPerPixel != 8)
>+    if (pScrn->bitsPerPixel != 8) 
> 	return;
> 
>+
>     SR1A = hwp->readSeq(hwp, 0x1A);
>     SR1B = hwp->readSeq(hwp, 0x1B);
>     CR67 = hwp->readCrtc(hwp, 0x67);
>@@ -2078,6 +2082,7 @@
> 	hwp->writeDacData(hwp, colors[index].green);
> 	hwp->writeDacData(hwp, colors[index].blue);
>     }
>+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALoadPalette: palete loaded\n"));
> 
>     if (pVia->IsSecondary) {
> 	hwp->writeSeq(hwp, 0x1A, SR1A);
>@@ -2098,6 +2103,110 @@
> }
> 
> /*
>+ * Loads the color table in LOCO *colors to use it as a LUT for the DAC.
>+ * The LUT values go from 0 to 255, and the lowest index should be the
>+ * lowest value for a positive image (with proper colors).
>+ */
>+
>+static void VIALoadRgbLut(ScrnInfoPtr pScrn, LOCO *colors) {
>+    VIAPtr pVia = VIAPTR(pScrn);
>+    vgaHWPtr hwp = VGAHWPTR(pScrn);
>+
>+    int i, SR1A;
>+
>+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALoadRgbLut\n"));
>+    /* 8 bpp mode can't adjust gamma */
>+    if (pScrn->bitsPerPixel == 8)
>+        return;
>+
>+    /* Enable Gamma */
>+    switch (pVia->Chipset)
>+    {
>+        case VIA_CLE266:
>+        case VIA_KM400:
>+            ViaSeqMask(hwp, 0x16, 0x80, 0x80);
>+            break;
>+
>+        /* For K8M800 or later chipsets: */
>+        default:
>+            ViaCrtcMask(hwp, 0x33, 0x80, 0x80);
>+            break;
>+    }
>+    SR1A = hwp->readSeq(hwp, 0x1A);
>+    ViaSeqMask(hwp, 0x1A, 0x0, 0x01);
>+
>+    hwp->writeDacWriteAddr(hwp, 0);
>+    for (i = 0; i < 256; i++)
>+    {
>+        hwp->writeDacData(hwp, colors[i].red);
>+        hwp->writeDacData(hwp, colors[i].green);
>+        hwp->writeDacData(hwp, colors[i].blue);
>+    }
>+
>+    /* Fill IGA1,IGA2 Gamma table simultanous.*/
>+    if (!((pVia->Chipset == VIA_CLE266) && (pVia->ChipRev < 15)))
>+    {
>+       ViaSeqMask(hwp, 0x1A, 0x01, 0x01);
>+       ViaCrtcMask(hwp, 0x6A, 0x02, 0x02);
>+        /* We should set the format of IGA2's LUT to 8-BITs, because we use 8-BITs LUT except VT3123Ax. */
>+        /* This register added in VT3314 or later chipsets. */
>+        switch(pVia->Chipset)
>+        {
>+            case VIA_CLE266:
>+            case VIA_KM400:
>+            case VIA_K8M800:
>+            case VIA_PM800:
>+                /* No need to set. */
>+                break;
>+        
>+            default:
>+                ViaCrtcMask(hwp, 0x6A, 0x20, 0x20);
>+                break;
>+        }              
>+
>+        hwp->writeDacWriteAddr(hwp, 0);
>+        for (i = 0; i < 256; i++)
>+        {
>+            hwp->writeDacData(hwp, colors[i].red);
>+            hwp->writeDacData(hwp, colors[i].green);
>+            hwp->writeDacData(hwp, colors[i].blue);
>+        }
>+    }
>+
>+    hwp->writeSeq(hwp, 0x1A, SR1A);
>+    return;
>+}
>+
>+int VIAChangeGamma(int myNum, Gamma gamma)
>+{
>+    LOCO *colors;
>+    colors=malloc(256*3*sizeof(unsigned short));
>+    int cindex;
>+    
>+    ScrnInfoPtr pScrn = xf86Screens[myNum];
>+
>+    if (gamma.red < GAMMA_MIN || gamma.red > GAMMA_MAX ||
>+        gamma.green < GAMMA_MIN || gamma.green > GAMMA_MAX ||
>+        gamma.blue < GAMMA_MIN || gamma.blue > GAMMA_MAX)
>+        return BadValue;
>+
>+    pScrn->gamma.red = gamma.red;
>+    pScrn->gamma.green = gamma.green;
>+    pScrn->gamma.blue = gamma.blue;
>+
>+    for(cindex=0;cindex<256;cindex++) {
>+       colors[cindex].red=(unsigned short)(255*powf((float)cindex/255,1/pScrn->gamma.red));
>+       colors[cindex].green=(unsigned short)(255*powf((float)cindex/255,1/pScrn->gamma.green));
>+       colors[cindex].blue=(unsigned short)(255*powf((float)cindex/255,1/pScrn->gamma.blue));
>+
>+       }
>+
>+    VIALoadRgbLut(pScrn, colors);
>+    return Success;
>+}
>+ 
>+
>+/*
>  *
>  */
> static Bool 
>@@ -2233,7 +2342,7 @@
>     pVia->CloseScreen = pScreen->CloseScreen;
>     pScreen->SaveScreen = VIASaveScreen;
>     pScreen->CloseScreen = VIACloseScreen;
>-
>+    pScrn->ChangeGamma = VIAChangeGamma;
>     xf86DPMSInit(pScreen, VIADPMS, 0);
>     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- DPMS set up\n"));
> 
>Index: unichrome/via_swov.c
>===================================================================
>--- unichrome/via_swov.c	(revision 247)
>+++ unichrome/via_swov.c	(working copy)
>@@ -730,7 +730,7 @@
> 
>     if (reset) {
> 	saturation = 10000;
>-	brightness = 5000;
>+	brightness = 2000;
> 	contrast = 10000;
>     }
> 
>  
>





More information about the Openchrome-users mailing list