#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include <string.h>
#include "misc.h"
#include "xf86.h"
#include "xf86_OSproc.h"
#include <X11/X.h>
#include "scrnintstr.h"
#include "xf86str.h"
#include "xaa.h"
#include "xaalocal.h"
#include "xf86fbman.h"
#include "servermd.h"
typedef enum {
XAAOPT_SCREEN_TO_SCREEN_COPY,
XAAOPT_SOLID_FILL_RECT,
XAAOPT_SOLID_FILL_TRAP,
XAAOPT_SOLID_TWO_POINT_LINE,
XAAOPT_SOLID_BRESENHAM_LINE,
XAAOPT_SOLID_HORVERT_LINE,
XAAOPT_DASHED_TWO_POINT_LINE,
XAAOPT_DASHED_BRESENHAM_LINE,
XAAOPT_MONO_8x8_PATTERN_FILL_RECT,
XAAOPT_MONO_8x8_PATTERN_FILL_TRAP,
XAAOPT_COL_8x8_PATTERN_FILL_RECT,
XAAOPT_COL_8x8_PATTERN_FILL_TRAP,
XAAOPT_CPU_TO_SCREEN_COL_EXP_FILL,
XAAOPT_SCANLINE_CPU_TO_SCREEN_COL_EXP_FILL,
XAAOPT_SCREEN_TO_SCREEN_COL_EXP_FILL,
XAAOPT_IMAGE_WRITE_RECT,
XAAOPT_SCANLINE_IMAGE_WRITE_RECT,
XAAOPT_WRITE_BITMAP,
XAAOPT_WRITE_PIXMAP,
XAAOPT_PIXMAP_CACHE,
XAAOPT_OFFSCREEN_PIXMAPS,
XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE
} XAAOpts;
static const OptionInfoRec XAAOptions[] = {
{XAAOPT_SCREEN_TO_SCREEN_COPY, "XaaNoScreenToScreenCopy",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SOLID_FILL_RECT, "XaaNoSolidFillRect",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SOLID_FILL_TRAP, "XaaNoSolidFillTrap",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SOLID_TWO_POINT_LINE, "XaaNoSolidTwoPointLine",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SOLID_BRESENHAM_LINE, "XaaNoSolidBresenhamLine",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SOLID_HORVERT_LINE, "XaaNoSolidHorVertLine",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_DASHED_TWO_POINT_LINE, "XaaNoDashedTwoPointLine",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_DASHED_BRESENHAM_LINE, "XaaNoDashedBresenhamLine",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_MONO_8x8_PATTERN_FILL_RECT, "XaaNoMono8x8PatternFillRect",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_MONO_8x8_PATTERN_FILL_TRAP, "XaaNoMono8x8PatternFillTrap",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_COL_8x8_PATTERN_FILL_RECT, "XaaNoColor8x8PatternFillRect",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_COL_8x8_PATTERN_FILL_TRAP, "XaaNoColor8x8PatternFillTrap",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_CPU_TO_SCREEN_COL_EXP_FILL, "XaaNoCPUToScreenColorExpandFill",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SCANLINE_CPU_TO_SCREEN_COL_EXP_FILL,"XaaNoScanlineCPUToScreenColorExpandFill",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SCREEN_TO_SCREEN_COL_EXP_FILL, "XaaNoScreenToScreenColorExpandFill",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_IMAGE_WRITE_RECT, "XaaNoImageWriteRect",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_SCANLINE_IMAGE_WRITE_RECT, "XaaNoScanlineImageWriteRect",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_WRITE_BITMAP, "XaaNoWriteBitmap",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_WRITE_PIXMAP, "XaaNoWritePixmap",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_PIXMAP_CACHE, "XaaNoPixmapCache",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_OFFSCREEN_PIXMAPS, "XaaNoOffscreenPixmaps",
OPTV_BOOLEAN, {0}, FALSE },
{XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE, "XaaOffscreenPixmaps",
OPTV_BOOLEAN, {0}, FALSE },
{ -1, NULL,
OPTV_NONE, {0}, FALSE }
};
static XF86ModuleVersionInfo xaaVersRec =
{
"xaa",
MODULEVENDORSTRING,
MODINFOSTRING1,
MODINFOSTRING2,
XORG_VERSION_CURRENT,
XAA_VERSION_MAJOR,
XAA_VERSION_MINOR,
XAA_VERSION_RELEASE,
ABI_CLASS_VIDEODRV,
ABI_VIDEODRV_VERSION,
MOD_CLASS_NONE,
{0,0,0,0}
};
_X_EXPORT XF86ModuleData xaaModuleData = { &xaaVersRec, NULL, NULL };
Bool
XAAInitAccel(ScreenPtr pScreen, XAAInfoRecPtr infoRec)
{
int index = pScreen->myNum;
ScrnInfoPtr pScrn = xf86Screens[index];
Bool HaveScreenToScreenCopy = FALSE;
Bool HaveColorExpansion = FALSE;
Bool HaveScanlineColorExpansion = FALSE;
Bool HaveSolidFillRect = FALSE;
Bool HaveMono8x8PatternFillRect = FALSE;
Bool HaveColor8x8PatternFillRect = FALSE;
Bool HaveSolidFillTrap = FALSE;
Bool HaveMono8x8PatternFillTrap = FALSE;
Bool HaveColor8x8PatternFillTrap = FALSE;
Bool HaveSolidTwoPointLine = FALSE;
Bool HaveSolidBresenhamLine = FALSE;
Bool HaveSolidHorVertLine = FALSE;
Bool HaveDashedTwoPointLine = FALSE;
Bool HaveDashedBresenhamLine = FALSE;
Bool HaveImageWriteRect = FALSE;
Bool HaveScanlineImageWriteRect = FALSE;
Bool HaveScreenToScreenColorExpandFill = FALSE;
OptionInfoPtr options;
int is_shared = 0;
int i;
options = xnfalloc(sizeof(XAAOptions));
(void)memcpy(options, XAAOptions, sizeof(XAAOptions));
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
infoRec->pScrn = pScrn;
infoRec->NeedToSync = FALSE;
if(!infoRec->Sync) return FALSE;
for(i = 0; i < pScrn->numEntities; i++) {
if(xf86IsEntityShared(pScrn->entityList[i])) is_shared = 1;
}
if(!infoRec->RestoreAccelState && is_shared) return FALSE;
if(infoRec->RestoreAccelState) {
if(!XAAInitStateWrap(pScreen, infoRec)) return FALSE;
}
if (serverGeneration == 1)
xf86DrvMsg(index, X_INFO,
"Using XFree86 Acceleration Architecture (XAA)\n");
if(!infoRec->SetClippingRectangle || !infoRec->DisableClipping) {
infoRec->ClippingFlags = 0;
infoRec->SetClippingRectangle = NULL;
infoRec->DisableClipping = NULL;
}
if(infoRec->SetupForScreenToScreenCopy &&
infoRec->SubsequentScreenToScreenCopy &&
!xf86ReturnOptValBool(options, XAAOPT_SCREEN_TO_SCREEN_COPY, FALSE)) {
HaveScreenToScreenCopy = TRUE;
} else {
infoRec->ScreenToScreenCopyFlags = 0;
infoRec->SetupForScreenToScreenCopy = NULL;
infoRec->SubsequentScreenToScreenCopy = NULL;
}
if(infoRec->SetupForSolidFill && infoRec->SubsequentSolidFillRect &&
!xf86ReturnOptValBool(options, XAAOPT_SOLID_FILL_RECT, FALSE)) {
HaveSolidFillRect = TRUE;
if(infoRec->SubsequentSolidFillTrap &&
!xf86ReturnOptValBool(options, XAAOPT_SOLID_FILL_TRAP, FALSE))
HaveSolidFillTrap = TRUE;
else
infoRec->SubsequentSolidFillTrap = NULL;
} else {
infoRec->SolidFillFlags = 0;
infoRec->SetupForSolidFill = NULL;
infoRec->SubsequentSolidFillRect = NULL;
infoRec->SubsequentSolidFillTrap = NULL;
}
if(infoRec->SetupForSolidLine) {
if(infoRec->SubsequentSolidTwoPointLine &&
!xf86ReturnOptValBool(options,
XAAOPT_SOLID_TWO_POINT_LINE, FALSE))
HaveSolidTwoPointLine = TRUE;
if(infoRec->SubsequentSolidBresenhamLine &&
!xf86ReturnOptValBool(options, XAAOPT_SOLID_BRESENHAM_LINE, FALSE)) {
HaveSolidBresenhamLine = TRUE;
if(infoRec->SolidBresenhamLineErrorTermBits)
infoRec->SolidBresenhamLineErrorTermBits =
~((1 << infoRec->SolidBresenhamLineErrorTermBits) - 1);
}
if(infoRec->SubsequentSolidHorVertLine &&
!xf86ReturnOptValBool(options,
XAAOPT_SOLID_HORVERT_LINE, FALSE))
HaveSolidHorVertLine = TRUE;
else if(HaveSolidTwoPointLine) {
infoRec->SubsequentSolidHorVertLine =
XAASolidHorVertLineAsTwoPoint;
HaveSolidHorVertLine = TRUE;
} else if(HaveSolidBresenhamLine) {
infoRec->SubsequentSolidHorVertLine =
XAASolidHorVertLineAsBresenham;
HaveSolidHorVertLine = TRUE;
}
}
if (!HaveSolidTwoPointLine &&
!HaveSolidBresenhamLine &&
!HaveSolidHorVertLine &&
HaveSolidFillRect) {
infoRec->SetupForSolidLine = infoRec->SetupForSolidFill;
infoRec->SubsequentSolidHorVertLine = XAASolidHorVertLineAsRects;
infoRec->SolidLineFlags = infoRec->SolidFillFlags;
HaveSolidHorVertLine = TRUE;
}
if (!HaveSolidTwoPointLine)
infoRec->SubsequentSolidTwoPointLine = NULL;
if (!HaveSolidBresenhamLine)
infoRec->SubsequentSolidBresenhamLine = NULL;
if (!HaveSolidHorVertLine)
infoRec->SubsequentSolidHorVertLine = NULL;
if (!HaveSolidTwoPointLine &&
!HaveSolidBresenhamLine &&
!HaveSolidHorVertLine) {
infoRec->SolidLineFlags = 0;
infoRec->SetupForSolidLine = NULL;
}
if(infoRec->SetupForMono8x8PatternFill &&
infoRec->SubsequentMono8x8PatternFillRect &&
!xf86ReturnOptValBool(options,
XAAOPT_MONO_8x8_PATTERN_FILL_RECT,
FALSE)) {
HaveMono8x8PatternFillRect = TRUE;
if(infoRec->SubsequentMono8x8PatternFillTrap &&
!xf86ReturnOptValBool(options,
XAAOPT_MONO_8x8_PATTERN_FILL_TRAP,
FALSE))
HaveMono8x8PatternFillTrap = TRUE;
if(infoRec->Mono8x8PatternFillFlags &
HARDWARE_PATTERN_PROGRAMMED_BITS) {
infoRec->CanDoMono8x8 = TRUE;
} else {
int min_pitch;
infoRec->PixmapCacheFlags |= CACHE_MONO_8x8;
switch(pScrn->bitsPerPixel) {
case 32: min_pitch = 2; break;
case 24: min_pitch = 3; break;
case 16: min_pitch = 4; break;
default: min_pitch = 8; break;
}
if(min_pitch > infoRec->MonoPatternPitch)
infoRec->MonoPatternPitch = min_pitch;
if(infoRec->Mono8x8PatternFillFlags &
HARDWARE_PATTERN_PROGRAMMED_ORIGIN) {
if(!infoRec->CacheWidthMono8x8Pattern ||
!infoRec->CacheHeightMono8x8Pattern) {
infoRec->CacheWidthMono8x8Pattern =
infoRec->MonoPatternPitch;
infoRec->CacheHeightMono8x8Pattern = 1;
}
} else {
int numPerLine = 128/infoRec->MonoPatternPitch;
if(!infoRec->CacheWidthMono8x8Pattern ||
!infoRec->CacheHeightMono8x8Pattern) {
infoRec->CacheWidthMono8x8Pattern =
numPerLine * infoRec->MonoPatternPitch;
infoRec->CacheHeightMono8x8Pattern =
(64 + numPerLine - 1)/numPerLine;
}
}
}
} else {
infoRec->Mono8x8PatternFillFlags = 0;
infoRec->SetupForMono8x8PatternFill = NULL;
infoRec->SubsequentMono8x8PatternFillRect = NULL;
}
if(infoRec->SetupForDashedLine && infoRec->DashPatternMaxLength) {
if(infoRec->SubsequentDashedTwoPointLine &&
!xf86ReturnOptValBool(options, XAAOPT_DASHED_TWO_POINT_LINE,
FALSE))
HaveDashedTwoPointLine = TRUE;
if(infoRec->SubsequentDashedBresenhamLine &&
!xf86ReturnOptValBool(options, XAAOPT_DASHED_BRESENHAM_LINE,
FALSE)) {
HaveDashedBresenhamLine = TRUE;
if(infoRec->DashedBresenhamLineErrorTermBits)
infoRec->DashedBresenhamLineErrorTermBits =
~((1 << infoRec->DashedBresenhamLineErrorTermBits) - 1);
}
}
if (!HaveDashedTwoPointLine)
infoRec->SubsequentDashedTwoPointLine = NULL;
if (!HaveDashedBresenhamLine)
infoRec->SubsequentDashedBresenhamLine = NULL;
if (!HaveDashedTwoPointLine && !HaveDashedBresenhamLine) {
infoRec->DashedLineFlags = 0;
infoRec->SetupForDashedLine = NULL;
}
if(infoRec->SetupForColor8x8PatternFill &&
infoRec->SubsequentColor8x8PatternFillRect &&
!xf86ReturnOptValBool(options, XAAOPT_COL_8x8_PATTERN_FILL_RECT, FALSE)) {
HaveColor8x8PatternFillRect = TRUE;
if(infoRec->SubsequentColor8x8PatternFillTrap &&
!xf86ReturnOptValBool(options, XAAOPT_COL_8x8_PATTERN_FILL_TRAP,
FALSE))
HaveColor8x8PatternFillTrap = TRUE;
else
infoRec->SubsequentColor8x8PatternFillTrap = NULL;
infoRec->PixmapCacheFlags |= CACHE_COLOR_8x8;
if(infoRec->Color8x8PatternFillFlags &
HARDWARE_PATTERN_PROGRAMMED_ORIGIN) {
if(!infoRec->CacheWidthColor8x8Pattern ||
!infoRec->CacheHeightColor8x8Pattern) {
infoRec->CacheWidthColor8x8Pattern = 64;
infoRec->CacheHeightColor8x8Pattern = 1;
}
} else {
if(!infoRec->CacheWidthColor8x8Pattern ||
!infoRec->CacheHeightColor8x8Pattern) {
infoRec->CacheWidthColor8x8Pattern = 128;
infoRec->CacheHeightColor8x8Pattern = 8;
}
}
} else {
infoRec->Color8x8PatternFillFlags = 0;
infoRec->SetupForColor8x8PatternFill = NULL;
infoRec->SubsequentColor8x8PatternFillRect = NULL;
infoRec->SubsequentColor8x8PatternFillTrap = NULL;
}
if(infoRec->SetupForCPUToScreenColorExpandFill &&
infoRec->ColorExpandBase &&
infoRec->SubsequentCPUToScreenColorExpandFill &&
!xf86ReturnOptValBool(options, XAAOPT_CPU_TO_SCREEN_COL_EXP_FILL,
FALSE)) {
int dwordsNeeded = pScrn->virtualX;
infoRec->ColorExpandRange >>= 2;
HaveColorExpansion = TRUE;
if(infoRec->CPUToScreenColorExpandFillFlags &
LEFT_EDGE_CLIPPING_NEGATIVE_X)
dwordsNeeded += 31;
dwordsNeeded = (dwordsNeeded + 31) >> 5;
if(dwordsNeeded > infoRec->ColorExpandRange)
infoRec->CPUToScreenColorExpandFillFlags |= CPU_TRANSFER_BASE_FIXED;
} else {
infoRec->CPUToScreenColorExpandFillFlags = 0;
infoRec->SetupForCPUToScreenColorExpandFill = NULL;
infoRec->SubsequentCPUToScreenColorExpandFill = NULL;
}
if(infoRec->SetupForScanlineCPUToScreenColorExpandFill &&
infoRec->SubsequentScanlineCPUToScreenColorExpandFill &&
infoRec->SubsequentColorExpandScanline &&
infoRec->ScanlineColorExpandBuffers &&
(infoRec->NumScanlineColorExpandBuffers > 0) &&
!xf86ReturnOptValBool(options,
XAAOPT_SCANLINE_CPU_TO_SCREEN_COL_EXP_FILL,
FALSE)) {
HaveScanlineColorExpansion = TRUE;
} else {
infoRec->ScanlineCPUToScreenColorExpandFillFlags = 0;
infoRec->SetupForScanlineCPUToScreenColorExpandFill = NULL;
infoRec->SubsequentScanlineCPUToScreenColorExpandFill = NULL;
infoRec->SubsequentColorExpandScanline = NULL;
}
if(infoRec->SetupForScreenToScreenColorExpandFill &&
infoRec->SubsequentScreenToScreenColorExpandFill &&
!xf86ReturnOptValBool(options, XAAOPT_SCREEN_TO_SCREEN_COL_EXP_FILL,
FALSE)) {
HaveScreenToScreenColorExpandFill = TRUE;
if (!infoRec->CacheColorExpandDensity)
infoRec->CacheColorExpandDensity = 1;
} else {
infoRec->ScreenToScreenColorExpandFillFlags = 0;
infoRec->SetupForScreenToScreenColorExpandFill = NULL;
infoRec->SubsequentScreenToScreenColorExpandFill = NULL;
}
if(infoRec->SetupForImageWrite && infoRec->ImageWriteBase &&
infoRec->SubsequentImageWriteRect &&
!xf86ReturnOptValBool(options, XAAOPT_IMAGE_WRITE_RECT, FALSE)) {
infoRec->ImageWriteRange >>= 2;
if(infoRec->ImageWriteFlags & CPU_TRANSFER_BASE_FIXED)
infoRec->ImageWriteRange = 0;
HaveImageWriteRect = TRUE;
} else {
infoRec->ImageWriteFlags = 0;
infoRec->SetupForImageWrite = NULL;
infoRec->SubsequentImageWriteRect = NULL;
}
if(infoRec->SetupForScanlineImageWrite &&
infoRec->SubsequentScanlineImageWriteRect &&
infoRec->SubsequentImageWriteScanline &&
infoRec->ScanlineImageWriteBuffers &&
(infoRec->NumScanlineImageWriteBuffers > 0) &&
!xf86ReturnOptValBool(options, XAAOPT_SCANLINE_IMAGE_WRITE_RECT,
FALSE)) {
HaveScanlineImageWriteRect = TRUE;
} else {
infoRec->ScanlineImageWriteFlags = 0;
infoRec->SetupForScanlineImageWrite = NULL;
infoRec->SubsequentScanlineImageWriteRect = NULL;
infoRec->SubsequentImageWriteScanline = NULL;
}
#ifndef __i386__
# define CLIP_FLAGS (LEFT_EDGE_CLIPPING | LEFT_EDGE_CLIPPING_NEGATIVE_X)
if(HaveImageWriteRect &&
((infoRec->ImageWriteFlags & CLIP_FLAGS) != CLIP_FLAGS))
{
HaveImageWriteRect = FALSE;
}
if(HaveScanlineImageWriteRect &&
((infoRec->ScanlineImageWriteFlags & CLIP_FLAGS) != CLIP_FLAGS))
{
HaveScanlineImageWriteRect = FALSE;
}
#endif
if (serverGeneration == 1) {
if(HaveScreenToScreenCopy)
xf86ErrorF("\tScreen to screen bit blits\n");
if(HaveSolidFillRect)
xf86ErrorF("\tSolid filled rectangles\n");
if(HaveSolidFillTrap)
xf86ErrorF("\tSolid filled trapezoids\n");
if(HaveMono8x8PatternFillRect)
xf86ErrorF("\t8x8 mono pattern filled rectangles\n");
if(HaveMono8x8PatternFillTrap)
xf86ErrorF("\t8x8 mono pattern filled trapezoids\n");
if(HaveColor8x8PatternFillRect)
xf86ErrorF("\t8x8 color pattern filled rectangles\n");
if(HaveColor8x8PatternFillTrap)
xf86ErrorF("\t8x8 color pattern filled trapezoids\n");
if(HaveColorExpansion)
xf86ErrorF("\tCPU to Screen color expansion\n");
else if(HaveScanlineColorExpansion)
xf86ErrorF("\tIndirect CPU to Screen color expansion\n");
if(HaveScreenToScreenColorExpandFill)
xf86ErrorF("\tScreen to Screen color expansion\n");
if(HaveSolidTwoPointLine || HaveSolidBresenhamLine)
xf86ErrorF("\tSolid Lines\n");
else if(HaveSolidHorVertLine)
xf86ErrorF("\tSolid Horizontal and Vertical Lines\n");
if(HaveDashedTwoPointLine || HaveDashedBresenhamLine)
xf86ErrorF("\tDashed Lines\n");
if(HaveImageWriteRect)
xf86ErrorF("\tImage Writes\n");
else if(HaveScanlineImageWriteRect)
xf86ErrorF("\tScanline Image Writes\n");
}
#define XAAMSG(s) do { if (serverGeneration == 1) xf86ErrorF(s); } while (0)
if((infoRec->Flags & OFFSCREEN_PIXMAPS) && HaveScreenToScreenCopy &&
xf86ReturnOptValBool(options,
XAAOPT_HAS_DUMB_INVERTED_OPTION_SENSE,
FALSE))
{
XAAMSG("\tOffscreen Pixmaps\n");
} else {
infoRec->Flags &= ~OFFSCREEN_PIXMAPS;
}
if(infoRec->ScreenToScreenBitBlt) {
XAAMSG("\tDriver provided ScreenToScreenBitBlt replacement\n");
} else if(HaveScreenToScreenCopy) {
infoRec->ScreenToScreenBitBlt = XAAScreenToScreenBitBlt;
infoRec->ScreenToScreenBitBltFlags = infoRec->ScreenToScreenCopyFlags;
}
if(infoRec->FillSolidRects) {
XAAMSG("\tDriver provided FillSolidRects replacement\n");
} else if(HaveSolidFillRect) {
infoRec->FillSolidRects = XAAFillSolidRects;
infoRec->FillSolidRectsFlags = infoRec->SolidFillFlags;
}
if(infoRec->FillSolidSpans) {
XAAMSG("\tDriver provided FillSolidSpans replacement\n");
} else if(HaveSolidFillRect) {
infoRec->FillSolidSpans = XAAFillSolidSpans;
infoRec->FillSolidSpansFlags = infoRec->SolidFillFlags;
}
if(infoRec->FillMono8x8PatternRects) {
XAAMSG("\tDriver provided FillMono8x8PatternRects replacement\n");
} else if(HaveMono8x8PatternFillRect) {
infoRec->FillMono8x8PatternRects =
(infoRec->Mono8x8PatternFillFlags & HARDWARE_PATTERN_SCREEN_ORIGIN) ?
XAAFillMono8x8PatternRectsScreenOrigin :
XAAFillMono8x8PatternRects;
infoRec->FillMono8x8PatternRectsFlags =
infoRec->Mono8x8PatternFillFlags;
}
if(infoRec->FillMono8x8PatternSpans) {
XAAMSG("\tDriver provided FillMono8x8PatternSpans replacement\n");
} else if(HaveMono8x8PatternFillRect) {
infoRec->FillMono8x8PatternSpans =
(infoRec->Mono8x8PatternFillFlags & HARDWARE_PATTERN_SCREEN_ORIGIN) ?
XAAFillMono8x8PatternSpansScreenOrigin:
XAAFillMono8x8PatternSpans;
infoRec->FillMono8x8PatternSpansFlags =
infoRec->Mono8x8PatternFillFlags;
}
if(infoRec->FillColor8x8PatternRects) {
XAAMSG("\tDriver provided FillColor8x8PatternRects replacement\n");
} else if(HaveColor8x8PatternFillRect) {
infoRec->FillColor8x8PatternRects =
(infoRec->Color8x8PatternFillFlags & HARDWARE_PATTERN_SCREEN_ORIGIN) ?
XAAFillColor8x8PatternRectsScreenOrigin :
XAAFillColor8x8PatternRects;
infoRec->FillColor8x8PatternRectsFlags =
infoRec->Color8x8PatternFillFlags;
}
if(infoRec->FillColor8x8PatternSpans) {
XAAMSG("\tDriver provided FillColor8x8PatternSpans replacement\n");
} else if(HaveColor8x8PatternFillRect) {
infoRec->FillColor8x8PatternSpans =
(infoRec->Color8x8PatternFillFlags & HARDWARE_PATTERN_SCREEN_ORIGIN) ?
XAAFillColor8x8PatternSpansScreenOrigin:
XAAFillColor8x8PatternSpans;
infoRec->FillColor8x8PatternSpansFlags =
infoRec->Color8x8PatternFillFlags;
}
if(infoRec->FillCacheBltRects) {
XAAMSG("\tDriver provided FillCacheBltRects replacement\n");
} else if(HaveScreenToScreenCopy) {
infoRec->FillCacheBltRects = XAAFillCacheBltRects;
infoRec->FillCacheBltRectsFlags = infoRec->ScreenToScreenCopyFlags;
}
if(infoRec->FillCacheBltSpans) {
XAAMSG("\tDriver provided FillCacheBltSpans replacement\n");
} else if(HaveScreenToScreenCopy) {
infoRec->FillCacheBltSpans = XAAFillCacheBltSpans;
infoRec->FillCacheBltSpansFlags = infoRec->ScreenToScreenCopyFlags;
}
if(infoRec->FillCacheExpandRects) {
XAAMSG("\tDriver provided FillCacheExpandRects replacement\n");
} else if(HaveScreenToScreenColorExpandFill) {
infoRec->FillCacheExpandRects = XAAFillCacheExpandRects;
infoRec->FillCacheExpandRectsFlags =
infoRec->ScreenToScreenColorExpandFillFlags;
}
if(infoRec->FillCacheExpandSpans) {
XAAMSG("\tDriver provided FillCacheExpandSpans replacement\n");
} else if(HaveScreenToScreenColorExpandFill) {
infoRec->FillCacheExpandSpans = XAAFillCacheExpandSpans;
infoRec->FillCacheExpandSpansFlags =
infoRec->ScreenToScreenColorExpandFillFlags;
}
if(infoRec->FillColorExpandRects) {
XAAMSG("\tDriver provided FillColorExpandRects replacement\n");
} else if(HaveColorExpansion) {
if (infoRec->CPUToScreenColorExpandFillFlags & TRIPLE_BITS_24BPP) {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandRects =
XAAFillColorExpandRects3MSBFirstFixedBase;
else
infoRec->FillColorExpandRects =
XAAFillColorExpandRects3MSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandRects =
XAAFillColorExpandRects3LSBFirstFixedBase;
else
infoRec->FillColorExpandRects =
XAAFillColorExpandRects3LSBFirst;
}
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandRects =
XAAFillColorExpandRectsMSBFirstFixedBase;
else
infoRec->FillColorExpandRects =
XAAFillColorExpandRectsMSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandRects =
XAAFillColorExpandRectsLSBFirstFixedBase;
else
infoRec->FillColorExpandRects =
XAAFillColorExpandRectsLSBFirst;
}
}
infoRec->FillColorExpandRectsFlags =
infoRec->CPUToScreenColorExpandFillFlags;
} else if(HaveScanlineColorExpansion) {
if (infoRec->ScanlineCPUToScreenColorExpandFillFlags &
TRIPLE_BITS_24BPP) {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->FillColorExpandRects =
XAAFillScanlineColorExpandRects3MSBFirst;
else
infoRec->FillColorExpandRects =
XAAFillScanlineColorExpandRects3LSBFirst;
} else {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->FillColorExpandRects =
XAAFillScanlineColorExpandRectsMSBFirst;
else
infoRec->FillColorExpandRects =
XAAFillScanlineColorExpandRectsLSBFirst;
}
infoRec->FillColorExpandRectsFlags =
infoRec->ScanlineCPUToScreenColorExpandFillFlags;
}
if(infoRec->FillColorExpandSpans) {
XAAMSG("\tDriver provided FillColorExpandSpans replacement\n");
} else if(HaveColorExpansion) {
if (infoRec->CPUToScreenColorExpandFillFlags & TRIPLE_BITS_24BPP) {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpans3MSBFirstFixedBase;
else
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpans3MSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpans3LSBFirstFixedBase;
else
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpans3LSBFirst;
}
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpansMSBFirstFixedBase;
else
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpansMSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpansLSBFirstFixedBase;
else
infoRec->FillColorExpandSpans =
XAAFillColorExpandSpansLSBFirst;
}
}
infoRec->FillColorExpandSpansFlags =
infoRec->CPUToScreenColorExpandFillFlags;
} else if(HaveScanlineColorExpansion) {
if (infoRec->ScanlineCPUToScreenColorExpandFillFlags &
TRIPLE_BITS_24BPP) {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->FillColorExpandSpans =
XAAFillScanlineColorExpandSpans3MSBFirst;
else
infoRec->FillColorExpandSpans =
XAAFillScanlineColorExpandSpans3LSBFirst;
} else {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->FillColorExpandSpans =
XAAFillScanlineColorExpandSpansMSBFirst;
else
infoRec->FillColorExpandSpans =
XAAFillScanlineColorExpandSpansLSBFirst;
}
infoRec->FillColorExpandSpansFlags =
infoRec->ScanlineCPUToScreenColorExpandFillFlags;
}
if(infoRec->FillImageWriteRects) {
XAAMSG("\tDriver provided FillImageWriteRects replacement\n");
} else if(HaveImageWriteRect &&
(infoRec->ImageWriteFlags & LEFT_EDGE_CLIPPING_NEGATIVE_X) &&
(infoRec->ImageWriteFlags & LEFT_EDGE_CLIPPING)) {
infoRec->FillImageWriteRects = XAAFillImageWriteRects;
infoRec->FillImageWriteRectsFlags = infoRec->ImageWriteFlags;
}
if(infoRec->WriteBitmap &&
!xf86ReturnOptValBool(options, XAAOPT_WRITE_BITMAP, FALSE)) {
XAAMSG("\tDriver provided WriteBitmap replacement\n");
} else if(HaveColorExpansion) {
if (infoRec->CPUToScreenColorExpandFillFlags & TRIPLE_BITS_24BPP) {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->WriteBitmap =
XAAWriteBitmapColorExpand3MSBFirstFixedBase;
else
infoRec->WriteBitmap = XAAWriteBitmapColorExpand3MSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->WriteBitmap =
XAAWriteBitmapColorExpand3LSBFirstFixedBase;
else
infoRec->WriteBitmap = XAAWriteBitmapColorExpand3LSBFirst;
}
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST) {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->WriteBitmap =
XAAWriteBitmapColorExpandMSBFirstFixedBase;
else
infoRec->WriteBitmap = XAAWriteBitmapColorExpandMSBFirst;
} else {
if(infoRec->CPUToScreenColorExpandFillFlags &
CPU_TRANSFER_BASE_FIXED)
infoRec->WriteBitmap =
XAAWriteBitmapColorExpandLSBFirstFixedBase;
else
infoRec->WriteBitmap = XAAWriteBitmapColorExpandLSBFirst;
}
}
infoRec->WriteBitmapFlags = infoRec->CPUToScreenColorExpandFillFlags;
} else if(HaveScanlineColorExpansion) {
if (infoRec->ScanlineCPUToScreenColorExpandFillFlags &
TRIPLE_BITS_24BPP) {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->WriteBitmap =
XAAWriteBitmapScanlineColorExpand3MSBFirst;
else
infoRec->WriteBitmap =
XAAWriteBitmapScanlineColorExpand3LSBFirst;
} else {
if(infoRec->ScanlineCPUToScreenColorExpandFillFlags &
BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->WriteBitmap =
XAAWriteBitmapScanlineColorExpandMSBFirst;
else
infoRec->WriteBitmap =
XAAWriteBitmapScanlineColorExpandLSBFirst;
}
infoRec->WriteBitmapFlags =
infoRec->ScanlineCPUToScreenColorExpandFillFlags;
} else
infoRec->WriteBitmap = NULL;
if (infoRec->TEGlyphRenderer) {
XAAMSG("\tDriver provided TEGlyphRenderer replacement\n");
} else if (HaveColorExpansion) {
infoRec->TEGlyphRendererFlags =
infoRec->CPUToScreenColorExpandFillFlags;
if (infoRec->TEGlyphRendererFlags & TRIPLE_BITS_24BPP) {
if (infoRec->TEGlyphRendererFlags & BIT_ORDER_IN_BYTE_MSBFIRST) {
if (infoRec->TEGlyphRendererFlags & CPU_TRANSFER_BASE_FIXED)
infoRec->TEGlyphRenderer =
XAATEGlyphRenderer3MSBFirstFixedBase;
else
infoRec->TEGlyphRenderer = XAATEGlyphRenderer3MSBFirst;
} else {
if (infoRec->TEGlyphRendererFlags & CPU_TRANSFER_BASE_FIXED)
infoRec->TEGlyphRenderer =
XAATEGlyphRenderer3LSBFirstFixedBase;
else
infoRec->TEGlyphRenderer = XAATEGlyphRenderer3LSBFirst;
}
if (!HaveSolidFillRect &&
(infoRec->TEGlyphRendererFlags & RGB_EQUAL)) {
infoRec->TEGlyphRendererFlags &= ~RGB_EQUAL;
XAAMSG("WARNING: TEGlyphRenderer cannot support RGB_EQUAL"
" without solid fills\n");
}
} else {
if (infoRec->TEGlyphRendererFlags & BIT_ORDER_IN_BYTE_MSBFIRST) {
if (infoRec->TEGlyphRendererFlags & CPU_TRANSFER_BASE_FIXED)
infoRec->TEGlyphRenderer =
XAATEGlyphRendererMSBFirstFixedBase;
else
infoRec->TEGlyphRenderer = XAATEGlyphRendererMSBFirst;
} else {
if (infoRec->TEGlyphRendererFlags & CPU_TRANSFER_BASE_FIXED)
infoRec->TEGlyphRenderer =
XAATEGlyphRendererLSBFirstFixedBase;
else
infoRec->TEGlyphRenderer = XAATEGlyphRendererLSBFirst;
}
}
if (!HaveSolidFillRect &&
(infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY)) {
infoRec->TEGlyphRendererFlags &= ~TRANSPARENCY_ONLY;
XAAMSG("WARNING: TEGlyphRenderer cannot support TRANPARENCY_ONLY"
" without solid fills\n");
}
} else if (HaveScanlineColorExpansion) {
infoRec->TEGlyphRendererFlags =
infoRec->ScanlineCPUToScreenColorExpandFillFlags;
if (infoRec->TEGlyphRendererFlags & TRIPLE_BITS_24BPP) {
if (infoRec->TEGlyphRendererFlags & BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->TEGlyphRenderer = XAATEGlyphRendererScanline3MSBFirst;
else
infoRec->TEGlyphRenderer = XAATEGlyphRendererScanline3LSBFirst;
if (!HaveSolidFillRect &&
(infoRec->TEGlyphRendererFlags & RGB_EQUAL)) {
infoRec->TEGlyphRendererFlags &= ~RGB_EQUAL;
XAAMSG("WARNING: TEGlyphRenderer cannot support RGB_EQUAL"
" without solid fills\n");
}
} else {
if (infoRec->TEGlyphRendererFlags & BIT_ORDER_IN_BYTE_MSBFIRST)
infoRec->TEGlyphRenderer = XAATEGlyphRendererScanlineMSBFirst;
else
infoRec->TEGlyphRenderer = XAATEGlyphRendererScanlineLSBFirst;
}
if (!HaveSolidFillRect &&
(infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY)) {
infoRec->TEGlyphRendererFlags &= ~TRANSPARENCY_ONLY;
XAAMSG("WARNING: TEGlyphRenderer cannot support TRANPARENCY_ONLY"
" without solid fills\n");
}
}
if(infoRec->NonTEGlyphRenderer) {
XAAMSG("\tDriver provided NonTEGlyphRenderer replacement\n");
} else if(infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & NO_TRANSPARENCY)) {
infoRec->NonTEGlyphRenderer = XAANonTEGlyphRenderer;
infoRec->NonTEGlyphRendererFlags = infoRec->WriteBitmapFlags;
}
if(infoRec->WritePixmap &&
!xf86ReturnOptValBool(options, XAAOPT_WRITE_PIXMAP, FALSE)) {
XAAMSG("\tDriver provided WritePixmap replacement\n");
} else if(HaveImageWriteRect) {
infoRec->WritePixmap = XAAWritePixmap;
infoRec->WritePixmapFlags =
infoRec->ImageWriteFlags | CONVERT_32BPP_TO_24BPP;
} else if(HaveScanlineImageWriteRect) {
infoRec->WritePixmap = XAAWritePixmapScanline;
infoRec->WritePixmapFlags = infoRec->ScanlineImageWriteFlags;
} else
infoRec->WritePixmap = NULL;
if(infoRec->ReadPixmap) {
XAAMSG("\tDriver provided ReadPixmap replacement\n");
}
if(infoRec->CopyArea) {
XAAMSG("\tDriver provided GC level CopyArea replacement\n");
} else if(infoRec->ScreenToScreenBitBlt) {
infoRec->CopyArea = XAACopyArea;
infoRec->CopyAreaFlags = infoRec->ScreenToScreenBitBltFlags;
}
if(infoRec->CopyPlane) {
XAAMSG("\tDriver provided GC level CopyPlane replacement\n");
} else if(infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY)) {
infoRec->CopyPlane = XAACopyPlaneColorExpansion;
infoRec->CopyPlaneFlags = infoRec->WriteBitmapFlags;
}
if(infoRec->PushPixelsSolid) {
XAAMSG("\tDriver provided GC level PushPixelsSolid replacement\n");
} else if(infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & NO_TRANSPARENCY)) {
infoRec->PushPixelsSolid = XAAPushPixelsSolidColorExpansion;
infoRec->PushPixelsFlags = infoRec->WriteBitmapFlags;
}
if(infoRec->FillSolidRects) {
if(!infoRec->PolyFillRectSolid) {
infoRec->PolyFillRectSolid = XAAPolyFillRect;
infoRec->PolyFillRectSolidFlags = infoRec->FillSolidRectsFlags;
}
}
if(infoRec->FillSolidSpans) {
if(!infoRec->FillSpansSolid) {
infoRec->FillSpansSolid = XAAFillSpans;
infoRec->FillSpansSolidFlags = infoRec->FillSolidSpansFlags;
}
}
if(infoRec->FillMono8x8PatternRects || infoRec->FillColor8x8PatternRects ||
infoRec->FillCacheBltRects || infoRec->FillColorExpandRects ||
infoRec->FillCacheExpandRects) {
if(!infoRec->PolyFillRectStippled) {
infoRec->PolyFillRectStippled = XAAPolyFillRect;
infoRec->PolyFillRectStippledFlags = 0;
}
}
if(infoRec->FillMono8x8PatternSpans || infoRec->FillColor8x8PatternSpans ||
infoRec->FillCacheBltSpans || infoRec->FillColorExpandSpans ||
infoRec->FillCacheExpandSpans) {
if(!infoRec->FillSpansStippled) {
infoRec->FillSpansStippled = XAAFillSpans;
infoRec->FillSpansStippledFlags = 0;
}
}
if(infoRec->FillMono8x8PatternRects || infoRec->FillColor8x8PatternRects ||
infoRec->FillCacheBltRects || infoRec->FillColorExpandRects ||
infoRec->FillCacheExpandRects) {
if(!infoRec->PolyFillRectOpaqueStippled) {
infoRec->PolyFillRectOpaqueStippled = XAAPolyFillRect;
infoRec->PolyFillRectOpaqueStippledFlags = 0;
}
}
if(infoRec->FillMono8x8PatternSpans || infoRec->FillColor8x8PatternSpans ||
infoRec->FillCacheBltSpans || infoRec->FillColorExpandSpans ||
infoRec->FillCacheExpandSpans) {
if(!infoRec->FillSpansOpaqueStippled) {
infoRec->FillSpansOpaqueStippled = XAAFillSpans;
infoRec->FillSpansOpaqueStippledFlags = 0;
}
}
if(infoRec->FillMono8x8PatternRects || infoRec->FillColor8x8PatternRects ||
infoRec->FillCacheBltRects || infoRec->FillImageWriteRects) {
if(!infoRec->PolyFillRectTiled) {
infoRec->PolyFillRectTiled = XAAPolyFillRect;
infoRec->PolyFillRectTiledFlags = 0;
}
}
if(infoRec->FillMono8x8PatternSpans || infoRec->FillColor8x8PatternSpans ||
infoRec->FillCacheBltSpans) {
if(!infoRec->FillSpansTiled) {
infoRec->FillSpansTiled = XAAFillSpans;
infoRec->FillSpansTiledFlags = 0;
}
}
if(infoRec->TEGlyphRenderer &&
!(infoRec->TEGlyphRendererFlags & NO_TRANSPARENCY)) {
if(!infoRec->PolyText8TE) {
infoRec->PolyText8TE = XAAPolyText8TEColorExpansion;
infoRec->PolyText8TEFlags = infoRec->TEGlyphRendererFlags;
}
if(!infoRec->PolyText16TE) {
infoRec->PolyText16TE = XAAPolyText16TEColorExpansion;
infoRec->PolyText16TEFlags = infoRec->TEGlyphRendererFlags;
}
if(!infoRec->PolyGlyphBltTE) {
infoRec->PolyGlyphBltTE = XAAPolyGlyphBltTEColorExpansion;
infoRec->PolyGlyphBltTEFlags = infoRec->TEGlyphRendererFlags;
}
}
if(infoRec->TEGlyphRenderer &&
!(infoRec->TEGlyphRendererFlags & TRANSPARENCY_ONLY)) {
if(!infoRec->ImageText8TE) {
infoRec->ImageText8TE = XAAImageText8TEColorExpansion;
infoRec->ImageText8TEFlags = infoRec->TEGlyphRendererFlags;
}
if(!infoRec->ImageText16TE) {
infoRec->ImageText16TE = XAAImageText16TEColorExpansion;
infoRec->ImageText16TEFlags = infoRec->TEGlyphRendererFlags;
}
if(!infoRec->ImageGlyphBltTE) {
infoRec->ImageGlyphBltTE = XAAImageGlyphBltTEColorExpansion;
infoRec->ImageGlyphBltTEFlags = infoRec->TEGlyphRendererFlags;
}
}
if(infoRec->NonTEGlyphRenderer) {
if(!infoRec->PolyText8NonTE) {
infoRec->PolyText8NonTE = XAAPolyText8NonTEColorExpansion;
infoRec->PolyText8NonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
if(!infoRec->PolyText16NonTE) {
infoRec->PolyText16NonTE = XAAPolyText16NonTEColorExpansion;
infoRec->PolyText16NonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
if(!infoRec->PolyGlyphBltNonTE) {
infoRec->PolyGlyphBltNonTE = XAAPolyGlyphBltNonTEColorExpansion;
infoRec->PolyGlyphBltNonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
}
if(infoRec->NonTEGlyphRenderer && HaveSolidFillRect) {
if(!infoRec->ImageText8NonTE) {
infoRec->ImageText8NonTE = XAAImageText8NonTEColorExpansion;
infoRec->ImageText8NonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
if(!infoRec->ImageText16NonTE) {
infoRec->ImageText16NonTE = XAAImageText16NonTEColorExpansion;
infoRec->ImageText16NonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
if(!infoRec->ImageGlyphBltNonTE) {
infoRec->ImageGlyphBltNonTE = XAAImageGlyphBltNonTEColorExpansion;
infoRec->ImageGlyphBltNonTEFlags = infoRec->NonTEGlyphRendererFlags;
}
}
if(!infoRec->PolyRectangleThinSolid && HaveSolidHorVertLine) {
infoRec->PolyRectangleThinSolid = XAAPolyRectangleThinSolid;
infoRec->PolyRectangleThinSolidFlags = infoRec->SolidLineFlags;
}
if(!infoRec->FillPolygonSolid && HaveSolidFillRect) {
infoRec->FillPolygonSolid = XAAFillPolygonSolid;
infoRec->FillPolygonSolidFlags = infoRec->SolidFillFlags;
}
if(!infoRec->FillPolygonStippled && (HaveMono8x8PatternFillRect ||
HaveScreenToScreenColorExpandFill || HaveScreenToScreenCopy)) {
infoRec->FillPolygonStippled = XAAFillPolygonStippled;
infoRec->FillPolygonStippledFlags = infoRec->SolidFillFlags;
}
if(!infoRec->FillPolygonOpaqueStippled && (HaveMono8x8PatternFillRect ||
HaveScreenToScreenColorExpandFill || HaveScreenToScreenCopy)) {
infoRec->FillPolygonOpaqueStippled = XAAFillPolygonStippled;
infoRec->FillPolygonOpaqueStippledFlags = infoRec->SolidFillFlags;
}
if(!infoRec->FillPolygonTiled && (HaveMono8x8PatternFillRect ||
HaveScreenToScreenColorExpandFill || HaveScreenToScreenCopy)) {
infoRec->FillPolygonTiled = XAAFillPolygonTiled;
infoRec->FillPolygonTiledFlags = infoRec->SolidFillFlags;
}
if(!infoRec->PolyFillArcSolid && HaveSolidFillRect) {
infoRec->PolyFillArcSolid = XAAPolyFillArcSolid;
infoRec->PolyFillArcSolidFlags = infoRec->SolidFillFlags;
}
if(!infoRec->PolylinesWideSolid && HaveSolidFillRect) {
infoRec->PolylinesWideSolid = XAAPolylinesWideSolid;
infoRec->PolylinesWideSolidFlags =
infoRec->SolidFillFlags | GXCOPY_ONLY;
}
if(!infoRec->PutImage && (infoRec->WritePixmap ||
(infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY)))) {
infoRec->PutImage = XAAPutImage;
}
if(HaveSolidHorVertLine &&
(HaveSolidBresenhamLine || (HaveSolidTwoPointLine &&
(infoRec->ClippingFlags & HARDWARE_CLIP_SOLID_LINE)))){
if(!infoRec->PolylinesThinSolid) {
infoRec->PolylinesThinSolid = XAAPolyLines;
infoRec->PolylinesThinSolidFlags = infoRec->SolidLineFlags;
}
if(!infoRec->PolySegmentThinSolid) {
infoRec->PolySegmentThinSolid = XAAPolySegment;
infoRec->PolySegmentThinSolidFlags = infoRec->SolidLineFlags;
}
}
if(HaveDashedBresenhamLine || (HaveDashedTwoPointLine &&
(infoRec->ClippingFlags & HARDWARE_CLIP_DASHED_LINE))){
if(!infoRec->PolylinesThinDashed) {
infoRec->PolylinesThinDashed = XAAPolyLinesDashed;
infoRec->PolylinesThinDashedFlags = infoRec->DashedLineFlags;
}
if(!infoRec->PolySegmentThinDashed) {
infoRec->PolySegmentThinDashed = XAAPolySegmentDashed;
infoRec->PolySegmentThinDashedFlags = infoRec->DashedLineFlags;
}
}
if(infoRec->PolylinesThinDashed || infoRec->PolySegmentThinDashed) {
if(!infoRec->ComputeDash)
infoRec->ComputeDash = XAAComputeDash;
}
{
Bool haveTexture = infoRec->CPUToScreenTextureFormats &&
infoRec->CPUToScreenTextureDstFormats &&
infoRec->SetupForCPUToScreenTexture2 &&
infoRec->SubsequentCPUToScreenTexture;
Bool haveAlphaTexture = infoRec->CPUToScreenAlphaTextureFormats &&
infoRec->CPUToScreenAlphaTextureDstFormats &&
infoRec->SetupForCPUToScreenAlphaTexture2 &&
infoRec->SubsequentCPUToScreenAlphaTexture;
if(!infoRec->Composite && (haveTexture || haveAlphaTexture))
infoRec->Composite = XAADoComposite;
if(!infoRec->Glyphs && infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & NO_TRANSPARENCY))
{
infoRec->Glyphs = XAADoGlyphs;
}
}
if(!infoRec->ValidateCopyArea && infoRec->CopyArea) {
infoRec->CopyAreaMask = GCWhenForced;
if((infoRec->CopyAreaFlags & GXCOPY_ONLY) ||
(infoRec->CopyAreaFlags & ROP_NEEDS_SOURCE))
infoRec->CopyAreaMask |= GCFunction;
if(infoRec->CopyAreaFlags & NO_PLANEMASK)
infoRec->CopyAreaMask |= GCPlaneMask;
infoRec->ValidateCopyArea = XAAValidateCopyArea;
}
if(!infoRec->ValidateCopyPlane && infoRec->CopyPlane) {
infoRec->CopyPlaneMask = GCWhenForced;
if((infoRec->CopyPlaneFlags & GXCOPY_ONLY) ||
(infoRec->CopyPlaneFlags & ROP_NEEDS_SOURCE))
infoRec->CopyPlaneMask |= GCFunction;
if(infoRec->CopyPlaneFlags & NO_PLANEMASK)
infoRec->CopyPlaneMask |= GCPlaneMask;
if(infoRec->CopyPlaneFlags & RGB_EQUAL)
infoRec->CopyPlaneMask |= GCForeground | GCBackground;
infoRec->ValidateCopyPlane = XAAValidateCopyPlane;
}
if(!infoRec->ValidatePutImage && infoRec->PutImage) {
infoRec->PutImageMask = GCWhenForced;
if((infoRec->PutImageFlags & GXCOPY_ONLY) ||
(infoRec->PutImageFlags & ROP_NEEDS_SOURCE))
infoRec->PutImageMask |= GCFunction;
if(infoRec->PutImageFlags & NO_PLANEMASK)
infoRec->PutImageMask |= GCPlaneMask;
if(infoRec->PutImageFlags & RGB_EQUAL)
infoRec->PutImageMask |= GCForeground | GCBackground;
infoRec->ValidatePutImage = XAAValidatePutImage;
}
if(!infoRec->ValidatePushPixels && infoRec->PushPixelsSolid) {
infoRec->PushPixelsMask = GCFillStyle;
if((infoRec->PushPixelsFlags & GXCOPY_ONLY) ||
(infoRec->PushPixelsFlags & ROP_NEEDS_SOURCE) ||
(infoRec->PushPixelsFlags & TRANSPARENCY_GXCOPY_ONLY))
infoRec->PushPixelsMask |= GCFunction;
if(infoRec->PushPixelsFlags & NO_PLANEMASK)
infoRec->PushPixelsMask |= GCPlaneMask;
if(infoRec->PushPixelsFlags & RGB_EQUAL)
infoRec->PushPixelsMask |= GCForeground;
infoRec->ValidatePushPixels = XAAValidatePushPixels;
}
if(!infoRec->ValidateFillSpans &&
(infoRec->FillSpansSolid || infoRec->FillSpansStippled ||
infoRec->FillSpansOpaqueStippled || infoRec->FillSpansTiled)) {
int compositeFlags = infoRec->FillSpansSolidFlags |
infoRec->FillSpansStippledFlags |
infoRec->FillSpansOpaqueStippledFlags |
infoRec->FillSpansTiledFlags;
infoRec->FillSpansMask = GCFillStyle | GCTile | GCStipple;
if((compositeFlags & GXCOPY_ONLY) ||
(compositeFlags & ROP_NEEDS_SOURCE))
infoRec->FillSpansMask |= GCFunction;
if(compositeFlags & NO_PLANEMASK)
infoRec->FillSpansMask |= GCPlaneMask;
if(compositeFlags & RGB_EQUAL)
infoRec->FillSpansMask |= GCForeground;
infoRec->ValidateFillSpans = XAAValidateFillSpans;
}
if(!infoRec->ValidatePolyGlyphBlt &&
(infoRec->PolyGlyphBltTE || infoRec->PolyGlyphBltNonTE)) {
int compositeFlags = infoRec->PolyGlyphBltTEFlags |
infoRec->PolyGlyphBltNonTEFlags;
infoRec->PolyGlyphBltMask = GCFillStyle | GCFont;
if((compositeFlags & GXCOPY_ONLY) ||
(compositeFlags & ROP_NEEDS_SOURCE) ||
(infoRec->PolyGlyphBltNonTEFlags & TRANSPARENCY_GXCOPY_ONLY))
infoRec->PolyGlyphBltMask |= GCFunction;
if(compositeFlags & NO_PLANEMASK)
infoRec->PolyGlyphBltMask |= GCPlaneMask;
if(compositeFlags & RGB_EQUAL)
infoRec->PolyGlyphBltMask |= GCForeground;
infoRec->ValidatePolyGlyphBlt = XAAValidatePolyGlyphBlt;
}
if(!infoRec->ValidateImageGlyphBlt &&
(infoRec->ImageGlyphBltTE || infoRec->ImageGlyphBltNonTE)) {
int compositeFlags = infoRec->ImageGlyphBltTEFlags |
infoRec->ImageGlyphBltNonTEFlags;
if(infoRec->ImageGlyphBltNonTE)
compositeFlags |= infoRec->SolidFillFlags;
infoRec->ImageGlyphBltMask = GCFont;
if(compositeFlags & NO_PLANEMASK)
infoRec->ImageGlyphBltMask |= GCPlaneMask;
if(compositeFlags & RGB_EQUAL)
infoRec->ImageGlyphBltMask |= GCForeground | GCBackground;
infoRec->ValidateImageGlyphBlt = XAAValidateImageGlyphBlt;
}
if(!infoRec->ValidatePolylines && infoRec->ValidateFillSpans) {
int compositeFlags = infoRec->PolyRectangleThinSolidFlags |
infoRec->PolylinesWideSolidFlags |
infoRec->PolylinesThinSolidFlags |
infoRec->PolySegmentThinSolidFlags |
infoRec->PolySegmentThinDashedFlags |
infoRec->PolylinesThinDashedFlags;
infoRec->ValidatePolylines = XAAValidatePolylines;
infoRec->PolylinesMask =
infoRec->FillSpansMask | GCLineStyle | GCLineWidth;
if(infoRec->PolySegmentThinDashed || infoRec->PolylinesThinDashed)
infoRec->PolylinesMask |= GCDashList;
if(compositeFlags & NO_PLANEMASK)
infoRec->PolylinesMask |= GCPlaneMask;
if((compositeFlags & GXCOPY_ONLY) ||
(compositeFlags & ROP_NEEDS_SOURCE))
infoRec->PolylinesMask |= GCFunction;
if(compositeFlags & RGB_EQUAL)
infoRec->PolylinesMask |= GCForeground;
}
if(!infoRec->StippledFillChooser)
infoRec->StippledFillChooser = XAAStippledFillChooser;
if(!infoRec->OpaqueStippledFillChooser)
infoRec->OpaqueStippledFillChooser = XAAOpaqueStippledFillChooser;
if(!infoRec->TiledFillChooser)
infoRec->TiledFillChooser = XAATiledFillChooser;
if(infoRec->WriteBitmapToCache) {}
else if(infoRec->WriteBitmap &&
!(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY))
infoRec->WriteBitmapToCache = XAAWriteBitmapToCache;
else if(infoRec->Flags & LINEAR_FRAMEBUFFER)
infoRec->WriteBitmapToCache = XAAWriteBitmapToCacheLinear;
else
infoRec->PixmapCacheFlags |= DO_NOT_BLIT_STIPPLES;
if(infoRec->WritePixmapToCache) {}
else if(infoRec->WritePixmap && !(infoRec->WritePixmapFlags & NO_GXCOPY))
infoRec->WritePixmapToCache = XAAWritePixmapToCache;
else if(infoRec->Flags & LINEAR_FRAMEBUFFER)
infoRec->WritePixmapToCache = XAAWritePixmapToCacheLinear;
else
infoRec->Flags &= ~PIXMAP_CACHE;
if (xf86ReturnOptValBool(options, XAAOPT_PIXMAP_CACHE, FALSE))
infoRec->Flags &= ~PIXMAP_CACHE;
if(infoRec->WriteMono8x8PatternToCache) {}
else if(infoRec->PixmapCacheFlags & CACHE_MONO_8x8) {
if(infoRec->WritePixmapToCache)
infoRec->WriteMono8x8PatternToCache = XAAWriteMono8x8PatternToCache;
else
infoRec->PixmapCacheFlags &= ~CACHE_MONO_8x8;
}
if(infoRec->WriteColor8x8PatternToCache) {}
else if(infoRec->PixmapCacheFlags & CACHE_COLOR_8x8) {
if(infoRec->WritePixmapToCache && infoRec->WriteBitmapToCache)
infoRec->WriteColor8x8PatternToCache = XAAWriteColor8x8PatternToCache;
else
infoRec->PixmapCacheFlags &= ~CACHE_COLOR_8x8;
}
if(infoRec->CachePixelGranularity < 0) {
switch(pScrn->bitsPerPixel) {
case 24:
case 8: infoRec->CachePixelGranularity = 4; break;
case 16: infoRec->CachePixelGranularity = 2; break;
case 32: infoRec->CachePixelGranularity = 1; break;
default: break;
}
if(BITMAP_SCANLINE_PAD == 64)
infoRec->CachePixelGranularity *= 2;
}
free(options);
if(!infoRec->CacheTile && infoRec->WritePixmapToCache)
infoRec->CacheTile = XAACacheTile;
if(!infoRec->CacheMonoStipple && infoRec->WritePixmapToCache)
infoRec->CacheMonoStipple = XAACacheMonoStipple;
if(!infoRec->CacheStipple && infoRec->WriteBitmapToCache)
infoRec->CacheStipple = XAACacheStipple;
if(!infoRec->CacheMono8x8Pattern && infoRec->WriteMono8x8PatternToCache)
infoRec->CacheMono8x8Pattern = XAACacheMono8x8Pattern;
if(!infoRec->CacheColor8x8Pattern && infoRec->WriteColor8x8PatternToCache)
infoRec->CacheColor8x8Pattern = XAACacheColor8x8Pattern;
if((infoRec->Flags & PIXMAP_CACHE) && !infoRec->InitPixmapCache) {
infoRec->InitPixmapCache = XAAInitPixmapCache;
infoRec->ClosePixmapCache = XAAClosePixmapCache;
}
return TRUE;
}