132b578d3Smrg/* 232b578d3Smrg * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org 332b578d3Smrg * 432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its 532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that 632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright 732b578d3Smrg * notice and this permission notice appear in supporting documentation, and 832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or 932b578d3Smrg * publicity pertaining to distribution of the software without specific, 1032b578d3Smrg * written prior permission. Marc Aurele La France makes no representations 1132b578d3Smrg * about the suitability of this software for any purpose. It is provided 1232b578d3Smrg * "as-is" without express or implied warranty. 1332b578d3Smrg * 1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO 1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE. 2132b578d3Smrg */ 2232b578d3Smrg 2332b578d3Smrg#ifdef HAVE_CONFIG_H 2432b578d3Smrg#include "config.h" 2532b578d3Smrg#endif 2632b578d3Smrg 2732b578d3Smrg#include <string.h> 2832b578d3Smrg 2932b578d3Smrg#include "ati.h" 3032b578d3Smrg#include "atidac.h" 3132b578d3Smrg#include "atimach64io.h" 3232b578d3Smrg 3332b578d3Smrg/* 3432b578d3Smrg * RAMDAC-related definitions. 3532b578d3Smrg */ 3632b578d3Smrgconst SymTabRec ATIDACDescriptors[] = 3732b578d3Smrg{ /* Keep this table in ascending DACType order */ 3832b578d3Smrg {ATI_DAC_ATI68830, "ATI 68830 or similar"}, 3932b578d3Smrg {ATI_DAC_SC11483, "Sierra 11483 or similar"}, 4032b578d3Smrg {ATI_DAC_ATI68875, "ATI 68875 or similar"}, 4132b578d3Smrg {ATI_DAC_TVP3026_A, "TI ViewPoint3026 or similar"}, 4232b578d3Smrg {ATI_DAC_GENERIC, "Brooktree 476 or similar"}, 4332b578d3Smrg {ATI_DAC_BT481, "Brooktree 481 or similar"}, 4432b578d3Smrg {ATI_DAC_ATT20C491, "AT&T 20C491 or similar"}, 4532b578d3Smrg {ATI_DAC_SC15026, "Sierra 15026 or similar"}, 4632b578d3Smrg {ATI_DAC_MU9C1880, "Music 9C1880 or similar"}, 4732b578d3Smrg {ATI_DAC_IMSG174, "Inmos G174 or similar"}, 4832b578d3Smrg {ATI_DAC_ATI68860_B, "ATI 68860 (Revision B) or similar"}, 4932b578d3Smrg {ATI_DAC_ATI68860_C, "ATI 68860 (Revision C) or similar"}, 5032b578d3Smrg {ATI_DAC_TVP3026_B, "TI ViewPoint3026 or similar"}, 5132b578d3Smrg {ATI_DAC_STG1700, "SGS-Thompson 1700 or similar"}, 5232b578d3Smrg {ATI_DAC_ATT20C498, "AT&T 20C498 or similar"}, 5332b578d3Smrg {ATI_DAC_STG1702, "SGS-Thompson 1702 or similar"}, 5432b578d3Smrg {ATI_DAC_SC15021, "Sierra 15021 or similar"}, 5532b578d3Smrg {ATI_DAC_ATT21C498, "AT&T 21C498 or similar"}, 5632b578d3Smrg {ATI_DAC_STG1703, "SGS-Thompson 1703 or similar"}, 5732b578d3Smrg {ATI_DAC_CH8398, "Chrontel 8398 or similar"}, 5832b578d3Smrg {ATI_DAC_ATT20C408, "AT&T 20C408 or similar"}, 5932b578d3Smrg {ATI_DAC_INTERNAL, "Internal"}, 6032b578d3Smrg {ATI_DAC_IBMRGB514, "IBM RGB 514 or similar"}, 6132b578d3Smrg {ATI_DAC_UNKNOWN, "Unknown"} /* Must be last */ 6232b578d3Smrg}; 6332b578d3Smrg 6432b578d3Smrg#ifndef AVOID_CPIO 6532b578d3Smrg 6632b578d3Smrg/* 6732b578d3Smrg * ATISetDACIOPorts -- 6832b578d3Smrg * 6932b578d3Smrg * This function sets up DAC access I/O port numbers. 7032b578d3Smrg */ 7132b578d3Smrgvoid 7232b578d3SmrgATISetDACIOPorts 7332b578d3Smrg( 7432b578d3Smrg ATIPtr pATI, 7532b578d3Smrg ATICRTCType crtc 7632b578d3Smrg) 7732b578d3Smrg{ 7832b578d3Smrg switch (crtc) 7932b578d3Smrg { 8032b578d3Smrg case ATI_CRTC_VGA: 8132b578d3Smrg pATI->CPIO_DAC_DATA = VGA_DAC_DATA; 8232b578d3Smrg pATI->CPIO_DAC_MASK = VGA_DAC_MASK; 8332b578d3Smrg pATI->CPIO_DAC_READ = VGA_DAC_READ; 8432b578d3Smrg pATI->CPIO_DAC_WRITE = VGA_DAC_WRITE; 8532b578d3Smrg pATI->CPIO_DAC_WAIT = GENS1(pATI->CPIO_VGABase); 8632b578d3Smrg break; 8732b578d3Smrg 8832b578d3Smrg case ATI_CRTC_8514: 8932b578d3Smrg pATI->CPIO_DAC_DATA = IBM_DAC_DATA; 9032b578d3Smrg pATI->CPIO_DAC_MASK = IBM_DAC_MASK; 9132b578d3Smrg pATI->CPIO_DAC_READ = IBM_DAC_READ; 9232b578d3Smrg pATI->CPIO_DAC_WRITE = IBM_DAC_WRITE; 9332b578d3Smrg pATI->CPIO_DAC_WAIT = pATI->CPIO_DAC_MASK; 9432b578d3Smrg break; 9532b578d3Smrg 9632b578d3Smrg case ATI_CRTC_MACH64: 9732b578d3Smrg pATI->CPIO_DAC_DATA = ATIIOPort(DAC_REGS) + 1; 9832b578d3Smrg pATI->CPIO_DAC_MASK = ATIIOPort(DAC_REGS) + 2; 9932b578d3Smrg pATI->CPIO_DAC_READ = ATIIOPort(DAC_REGS) + 3; 10032b578d3Smrg pATI->CPIO_DAC_WRITE = ATIIOPort(DAC_REGS) + 0; 10132b578d3Smrg pATI->CPIO_DAC_WAIT = pATI->CPIOBase; 10232b578d3Smrg break; 10332b578d3Smrg 10432b578d3Smrg default: 10532b578d3Smrg break; 10632b578d3Smrg } 10732b578d3Smrg} 10832b578d3Smrg 10932b578d3Smrg#endif /* AVOID_CPIO */ 11032b578d3Smrg 11132b578d3Smrg/* 11232b578d3Smrg * ATIGetDACCmdReg -- 11332b578d3Smrg * 11432b578d3Smrg * Setup to access a RAMDAC's command register. 11532b578d3Smrg */ 11632b578d3SmrgCARD8 11732b578d3SmrgATIGetDACCmdReg 11832b578d3Smrg( 11932b578d3Smrg ATIPtr pATI 12032b578d3Smrg) 12132b578d3Smrg{ 12232b578d3Smrg 12332b578d3Smrg#ifdef AVOID_CPIO 12432b578d3Smrg 12532b578d3Smrg (void)in8(M64_DAC_WRITE); /* Reset to PEL mode */ 12632b578d3Smrg (void)in8(M64_DAC_MASK); 12732b578d3Smrg (void)in8(M64_DAC_MASK); 12832b578d3Smrg (void)in8(M64_DAC_MASK); 12932b578d3Smrg return in8(M64_DAC_MASK); 13032b578d3Smrg 13132b578d3Smrg#else /* AVOID_CPIO */ 13232b578d3Smrg 13332b578d3Smrg (void)inb(pATI->CPIO_DAC_WRITE); /* Reset to PEL mode */ 13432b578d3Smrg (void)inb(pATI->CPIO_DAC_MASK); 13532b578d3Smrg (void)inb(pATI->CPIO_DAC_MASK); 13632b578d3Smrg (void)inb(pATI->CPIO_DAC_MASK); 13732b578d3Smrg return inb(pATI->CPIO_DAC_MASK); 13832b578d3Smrg 13932b578d3Smrg#endif /* AVOID_CPIO */ 14032b578d3Smrg 14132b578d3Smrg} 14232b578d3Smrg 14332b578d3Smrg/* 14432b578d3Smrg * ATIDACPreInit -- 14532b578d3Smrg * 14632b578d3Smrg * This function initialises the fields in an ATIHWRec that relate to DACs. 14732b578d3Smrg */ 14832b578d3Smrgvoid 14932b578d3SmrgATIDACPreInit 15032b578d3Smrg( 15132b578d3Smrg ScrnInfoPtr pScreenInfo, 15232b578d3Smrg ATIPtr pATI, 15332b578d3Smrg ATIHWPtr pATIHW 15432b578d3Smrg) 15532b578d3Smrg{ 15632b578d3Smrg int Index, Index2; 15732b578d3Smrg CARD8 maxColour = (1 << pATI->rgbBits) - 1; 15832b578d3Smrg 15932b578d3Smrg pATIHW->dac_read = pATIHW->dac_write = 0x00U; 16032b578d3Smrg pATIHW->dac_mask = 0xFFU; 16132b578d3Smrg 16232b578d3Smrg /* 16332b578d3Smrg * Set colour lookup table. The first entry has already been zeroed out. 16432b578d3Smrg */ 16532b578d3Smrg if (pATI->depth > 8) 16632b578d3Smrg for (Index = 1; Index < (NumberOf(pATIHW->lut) / 3); Index++) 16732b578d3Smrg { 16832b578d3Smrg Index2 = Index * 3; 16932b578d3Smrg pATIHW->lut[Index2 + 0] = 17032b578d3Smrg pATIHW->lut[Index2 + 1] = 17132b578d3Smrg pATIHW->lut[Index2 + 2] = Index; 17232b578d3Smrg } 17332b578d3Smrg else 17432b578d3Smrg { 17532b578d3Smrg /* 17632b578d3Smrg * Initialise hardware colour map so that use of uninitialised 17732b578d3Smrg * software colour map entries can easily be seen. For 256-colour 17832b578d3Smrg * modes, this doesn't remain effective for very long... 17932b578d3Smrg */ 18032b578d3Smrg pATIHW->lut[3] = pATIHW->lut[4] = pATIHW->lut[5] = 0xFFU; 18132b578d3Smrg for (Index = 2; Index < (NumberOf(pATIHW->lut) / 3); Index++) 18232b578d3Smrg { 18332b578d3Smrg Index2 = Index * 3; 18432b578d3Smrg pATIHW->lut[Index2 + 0] = maxColour; 18532b578d3Smrg pATIHW->lut[Index2 + 1] = 0x00U; 18632b578d3Smrg pATIHW->lut[Index2 + 2] = maxColour; 18732b578d3Smrg } 18832b578d3Smrg } 18932b578d3Smrg} 19032b578d3Smrg 19132b578d3Smrg/* 19232b578d3Smrg * ATIDACSave -- 19332b578d3Smrg * 19432b578d3Smrg * This function is called to save the current RAMDAC state into an ATIHWRec 19532b578d3Smrg * structure occurrence. 19632b578d3Smrg */ 19732b578d3Smrgvoid 19832b578d3SmrgATIDACSave 19932b578d3Smrg( 20032b578d3Smrg ATIPtr pATI, 20132b578d3Smrg ATIHWPtr pATIHW 20232b578d3Smrg) 20332b578d3Smrg{ 20432b578d3Smrg int Index; 20532b578d3Smrg 20632b578d3Smrg#ifdef AVOID_CPIO 20732b578d3Smrg 20832b578d3Smrg pATIHW->dac_read = in8(M64_DAC_READ); 20932b578d3Smrg DACDelay; 21032b578d3Smrg pATIHW->dac_write = in8(M64_DAC_WRITE); 21132b578d3Smrg DACDelay; 21232b578d3Smrg pATIHW->dac_mask = in8(M64_DAC_MASK); 21332b578d3Smrg DACDelay; 21432b578d3Smrg 21532b578d3Smrg /* Save DAC's colour lookup table */ 21632b578d3Smrg out8(M64_DAC_MASK, 0xFFU); 21732b578d3Smrg DACDelay; 21832b578d3Smrg out8(M64_DAC_READ, 0x00U); 21932b578d3Smrg DACDelay; 22032b578d3Smrg for (Index = 0; Index < NumberOf(pATIHW->lut); Index++) 22132b578d3Smrg { 22232b578d3Smrg pATIHW->lut[Index] = in8(M64_DAC_DATA); 22332b578d3Smrg DACDelay; 22432b578d3Smrg } 22532b578d3Smrg 22632b578d3Smrg out8(M64_DAC_MASK, pATIHW->dac_mask); 22732b578d3Smrg DACDelay; 22832b578d3Smrg out8(M64_DAC_READ, pATIHW->dac_read); 22932b578d3Smrg DACDelay; 23032b578d3Smrg 23132b578d3Smrg#else /* AVOID_CPIO */ 23232b578d3Smrg 23332b578d3Smrg ATISetDACIOPorts(pATI, pATIHW->crtc); 23432b578d3Smrg 23532b578d3Smrg pATIHW->dac_read = inb(pATI->CPIO_DAC_READ); 23632b578d3Smrg DACDelay; 23732b578d3Smrg pATIHW->dac_write = inb(pATI->CPIO_DAC_WRITE); 23832b578d3Smrg DACDelay; 23932b578d3Smrg pATIHW->dac_mask = inb(pATI->CPIO_DAC_MASK); 24032b578d3Smrg DACDelay; 24132b578d3Smrg 24232b578d3Smrg /* Save DAC's colour lookup table */ 24332b578d3Smrg outb(pATI->CPIO_DAC_MASK, 0xFFU); 24432b578d3Smrg DACDelay; 24532b578d3Smrg outb(pATI->CPIO_DAC_READ, 0x00U); 24632b578d3Smrg DACDelay; 24732b578d3Smrg for (Index = 0; Index < NumberOf(pATIHW->lut); Index++) 24832b578d3Smrg { 24932b578d3Smrg pATIHW->lut[Index] = inb(pATI->CPIO_DAC_DATA); 25032b578d3Smrg DACDelay; 25132b578d3Smrg } 25232b578d3Smrg 25332b578d3Smrg outb(pATI->CPIO_DAC_MASK, pATIHW->dac_mask); 25432b578d3Smrg DACDelay; 25532b578d3Smrg outb(pATI->CPIO_DAC_READ, pATIHW->dac_read); 25632b578d3Smrg DACDelay; 25732b578d3Smrg 25832b578d3Smrg#endif /* AVOID_CPIO */ 25932b578d3Smrg 26032b578d3Smrg} 26132b578d3Smrg 26232b578d3Smrg/* 26332b578d3Smrg * ATIDACSet -- 26432b578d3Smrg * 26532b578d3Smrg * This function loads RAMDAC data from an ATIHWRec structure occurrence. 26632b578d3Smrg */ 26732b578d3Smrgvoid 26832b578d3SmrgATIDACSet 26932b578d3Smrg( 27032b578d3Smrg ATIPtr pATI, 27132b578d3Smrg ATIHWPtr pATIHW 27232b578d3Smrg) 27332b578d3Smrg{ 27432b578d3Smrg int Index; 27532b578d3Smrg 27632b578d3Smrg#ifdef AVOID_CPIO 27732b578d3Smrg 27832b578d3Smrg /* Load DAC's colour lookup table */ 27932b578d3Smrg out8(M64_DAC_MASK, 0xFFU); 28032b578d3Smrg DACDelay; 28132b578d3Smrg out8(M64_DAC_WRITE, 0x00U); 28232b578d3Smrg DACDelay; 28332b578d3Smrg for (Index = 0; Index < NumberOf(pATIHW->lut); Index++) 28432b578d3Smrg { 28532b578d3Smrg out8(M64_DAC_DATA, pATIHW->lut[Index]); 28632b578d3Smrg DACDelay; 28732b578d3Smrg } 28832b578d3Smrg 28932b578d3Smrg out8(M64_DAC_MASK, pATIHW->dac_mask); 29032b578d3Smrg DACDelay; 29132b578d3Smrg out8(M64_DAC_READ, pATIHW->dac_read); 29232b578d3Smrg DACDelay; 29332b578d3Smrg out8(M64_DAC_WRITE, pATIHW->dac_write); 29432b578d3Smrg DACDelay; 29532b578d3Smrg 29632b578d3Smrg#else /* AVOID_CPIO */ 29732b578d3Smrg 29832b578d3Smrg ATISetDACIOPorts(pATI, pATIHW->crtc); 29932b578d3Smrg 30032b578d3Smrg /* Load DAC's colour lookup table */ 30132b578d3Smrg outb(pATI->CPIO_DAC_MASK, 0xFFU); 30232b578d3Smrg DACDelay; 30332b578d3Smrg outb(pATI->CPIO_DAC_WRITE, 0x00U); 30432b578d3Smrg DACDelay; 30532b578d3Smrg for (Index = 0; Index < NumberOf(pATIHW->lut); Index++) 30632b578d3Smrg { 30732b578d3Smrg outb(pATI->CPIO_DAC_DATA, pATIHW->lut[Index]); 30832b578d3Smrg DACDelay; 30932b578d3Smrg } 31032b578d3Smrg 31132b578d3Smrg outb(pATI->CPIO_DAC_MASK, pATIHW->dac_mask); 31232b578d3Smrg DACDelay; 31332b578d3Smrg outb(pATI->CPIO_DAC_READ, pATIHW->dac_read); 31432b578d3Smrg DACDelay; 31532b578d3Smrg outb(pATI->CPIO_DAC_WRITE, pATIHW->dac_write); 31632b578d3Smrg DACDelay; 31732b578d3Smrg 31832b578d3Smrg#endif /* AVOID_CPIO */ 31932b578d3Smrg 32032b578d3Smrg} 32132b578d3Smrg 32232b578d3Smrg/* 32332b578d3Smrg * ATISetLUTEntry -- 32432b578d3Smrg * 32532b578d3Smrg * This function is called to set one of a DAC's LUT entries. 32632b578d3Smrg */ 32732b578d3Smrgstatic void 32832b578d3SmrgATISetLUTEntry 32932b578d3Smrg( 33032b578d3Smrg ATIPtr pATI, 33132b578d3Smrg int Index, 33232b578d3Smrg CARD8 *LUTEntry 33332b578d3Smrg) 33432b578d3Smrg{ 33532b578d3Smrg#ifdef AVOID_CPIO 33632b578d3Smrg 33732b578d3Smrg out8(M64_DAC_WRITE, Index); 33832b578d3Smrg DACDelay; 33932b578d3Smrg out8(M64_DAC_DATA, LUTEntry[0]); 34032b578d3Smrg DACDelay; 34132b578d3Smrg out8(M64_DAC_DATA, LUTEntry[1]); 34232b578d3Smrg DACDelay; 34332b578d3Smrg out8(M64_DAC_DATA, LUTEntry[2]); 34432b578d3Smrg DACDelay; 34532b578d3Smrg 34632b578d3Smrg#else /* AVOID_CPIO */ 34732b578d3Smrg 34832b578d3Smrg outb(pATI->CPIO_DAC_WRITE, Index); 34932b578d3Smrg DACDelay; 35032b578d3Smrg outb(pATI->CPIO_DAC_DATA, LUTEntry[0]); 35132b578d3Smrg DACDelay; 35232b578d3Smrg outb(pATI->CPIO_DAC_DATA, LUTEntry[1]); 35332b578d3Smrg DACDelay; 35432b578d3Smrg outb(pATI->CPIO_DAC_DATA, LUTEntry[2]); 35532b578d3Smrg DACDelay; 35632b578d3Smrg 35732b578d3Smrg#endif /* AVOID_CPIO */ 35832b578d3Smrg} 35932b578d3Smrg 36032b578d3Smrg/* 36132b578d3Smrg * ATILoadPalette -- 36232b578d3Smrg * 36332b578d3Smrg * This function updates the RAMDAC's LUT and the in-memory copy of it in 36432b578d3Smrg * NewHW. 36532b578d3Smrg */ 36632b578d3Smrgvoid 36732b578d3SmrgATILoadPalette 36832b578d3Smrg( 36932b578d3Smrg ScrnInfoPtr pScreenInfo, 37032b578d3Smrg int nColours, 37132b578d3Smrg int *Indices, 37232b578d3Smrg LOCO *Colours, 37332b578d3Smrg VisualPtr pVisual 37432b578d3Smrg) 37532b578d3Smrg{ 37632b578d3Smrg ATIPtr pATI = ATIPTR(pScreenInfo); 37732b578d3Smrg CARD8 *LUTEntry; 37832b578d3Smrg int i, j, Index; 37932b578d3Smrg 38032b578d3Smrg if (((pVisual->class | DynamicClass) == DirectColor) && 38132b578d3Smrg ((1 << pVisual->nplanes) > (SizeOf(pATI->NewHW.lut) / 3))) 38232b578d3Smrg { 38332b578d3Smrg int reds = pVisual->redMask >> pVisual->offsetRed; 38432b578d3Smrg int greens = pVisual->greenMask >> pVisual->offsetGreen; 38532b578d3Smrg int blues = pVisual->blueMask >> pVisual->offsetBlue; 38632b578d3Smrg 38732b578d3Smrg int redShift = 8 - pATI->weight.red; 38832b578d3Smrg int greenShift = 8 - pATI->weight.green; 38932b578d3Smrg int blueShift = 8 - pATI->weight.blue; 39032b578d3Smrg 39132b578d3Smrg int redMult = 3 << redShift; 39232b578d3Smrg int greenMult = 3 << greenShift; 39332b578d3Smrg int blueMult = 3 << blueShift; 39432b578d3Smrg 39532b578d3Smrg int minShift; 39632b578d3Smrg 39732b578d3Smrg CARD8 fChanged[SizeOf(pATI->NewHW.lut) / 3]; 39832b578d3Smrg 39932b578d3Smrg (void)memset(fChanged, 0, SizeOf(fChanged)); 40032b578d3Smrg 40132b578d3Smrg minShift = redShift; 40232b578d3Smrg if (minShift > greenShift) 40332b578d3Smrg minShift = greenShift; 40432b578d3Smrg if (minShift > blueShift) 40532b578d3Smrg minShift = blueShift; 40632b578d3Smrg 40732b578d3Smrg for (i = 0; i < nColours; i++) 40832b578d3Smrg { 40932b578d3Smrg if((Index = Indices[i]) < 0) 41032b578d3Smrg continue; 41132b578d3Smrg 41232b578d3Smrg if (Index <= reds) 41332b578d3Smrg { 41432b578d3Smrg j = Index * redMult; 41532b578d3Smrg pATI->NewHW.lut[j + 0] = Colours[Index].red; 41632b578d3Smrg fChanged[j / 3] = TRUE; 41732b578d3Smrg } 41832b578d3Smrg if (Index <= greens) 41932b578d3Smrg { 42032b578d3Smrg j = Index * greenMult; 42132b578d3Smrg pATI->NewHW.lut[j + 1] = Colours[Index].green; 42232b578d3Smrg fChanged[j / 3] = TRUE; 42332b578d3Smrg } 42432b578d3Smrg if (Index <= blues) 42532b578d3Smrg { 42632b578d3Smrg j = Index * blueMult; 42732b578d3Smrg pATI->NewHW.lut[j + 2] = Colours[Index].blue; 42832b578d3Smrg fChanged[j / 3] = TRUE; 42932b578d3Smrg } 43032b578d3Smrg } 43132b578d3Smrg 43232b578d3Smrg if (pScreenInfo->vtSema || pATI->currentMode) 43332b578d3Smrg { 43432b578d3Smrg /* Rewrite LUT entries that could have been changed */ 43532b578d3Smrg i = 1 << minShift; 43632b578d3Smrg LUTEntry = pATI->NewHW.lut; 43732b578d3Smrg 43832b578d3Smrg for (Index = 0; 43932b578d3Smrg Index < (SizeOf(pATI->NewHW.lut) / 3); 44032b578d3Smrg Index += i, LUTEntry += i * 3) 44132b578d3Smrg if (fChanged[Index]) 44232b578d3Smrg ATISetLUTEntry(pATI, Index, LUTEntry); 44332b578d3Smrg } 44432b578d3Smrg } 44532b578d3Smrg else 44632b578d3Smrg { 44732b578d3Smrg for (i = 0; i < nColours; i++) 44832b578d3Smrg { 44932b578d3Smrg Index = Indices[i]; 45032b578d3Smrg if ((Index < 0) || (Index >= (SizeOf(pATI->NewHW.lut) / 3))) 45132b578d3Smrg continue; 45232b578d3Smrg 45332b578d3Smrg LUTEntry = &pATI->NewHW.lut[Index * 3]; 45432b578d3Smrg LUTEntry[0] = Colours[Index].red; 45532b578d3Smrg LUTEntry[1] = Colours[Index].green; 45632b578d3Smrg LUTEntry[2] = Colours[Index].blue; 45732b578d3Smrg 45832b578d3Smrg if (pScreenInfo->vtSema || pATI->currentMode) 45932b578d3Smrg ATISetLUTEntry(pATI, Index, LUTEntry); 46032b578d3Smrg } 46132b578d3Smrg } 46232b578d3Smrg} 463