1572 lines
59 KiB
C
1572 lines
59 KiB
C
#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"
|
|
|
|
/*
|
|
* XAA Config options
|
|
*/
|
|
|
|
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, /* requires the video driver ABI */
|
|
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;
|
|
|
|
/* must have a Sync function */
|
|
if (!infoRec->Sync)
|
|
return FALSE;
|
|
for (i = 0; i < pScrn->numEntities; i++) {
|
|
if (xf86IsEntityShared(pScrn->entityList[i]))
|
|
is_shared = 1;
|
|
}
|
|
|
|
/* If this PCI entity has IS_SHARED_ACCEL set in entityProp
|
|
* then a RestoreAccelState function is required
|
|
*/
|
|
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");
|
|
|
|
/************** Low Level *************/
|
|
|
|
if (!infoRec->SetClippingRectangle || !infoRec->DisableClipping) {
|
|
infoRec->ClippingFlags = 0;
|
|
infoRec->SetClippingRectangle = NULL;
|
|
infoRec->DisableClipping = NULL;
|
|
}
|
|
|
|
/**** CopyArea ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Solid Filled Rects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Solid lines ****/
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
/* XXX Should this also check for XAAOPT_SOLID_HORVERT_LINE? */
|
|
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;
|
|
|
|
/* Disable all if nothing left over */
|
|
if (!HaveSolidTwoPointLine &&
|
|
!HaveSolidBresenhamLine && !HaveSolidHorVertLine) {
|
|
infoRec->SolidLineFlags = 0;
|
|
infoRec->SetupForSolidLine = NULL;
|
|
}
|
|
|
|
/**** 8x8 Mono Pattern Filled Rects ****/
|
|
|
|
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 { /* others require caching */
|
|
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;
|
|
}
|
|
|
|
/**** Dashed lines ****/
|
|
|
|
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;
|
|
|
|
/* Disable all if nothing left over */
|
|
if (!HaveDashedTwoPointLine && !HaveDashedBresenhamLine) {
|
|
infoRec->DashedLineFlags = 0;
|
|
infoRec->SetupForDashedLine = NULL;
|
|
}
|
|
|
|
/**** 8x8 Color Pattern Filled Rects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Color Expansion ****/
|
|
|
|
if (infoRec->SetupForCPUToScreenColorExpandFill &&
|
|
infoRec->ColorExpandBase &&
|
|
infoRec->SubsequentCPUToScreenColorExpandFill &&
|
|
!xf86ReturnOptValBool(options, XAAOPT_CPU_TO_SCREEN_COL_EXP_FILL,
|
|
FALSE)) {
|
|
int dwordsNeeded = pScrn->virtualX;
|
|
|
|
infoRec->ColorExpandRange >>= 2; /* convert to DWORDS */
|
|
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;
|
|
}
|
|
|
|
/**** Scanline Color Expansion ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Screen to Screen Color Expansion ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Image Writes ****/
|
|
|
|
if (infoRec->SetupForImageWrite && infoRec->ImageWriteBase &&
|
|
infoRec->SubsequentImageWriteRect &&
|
|
!xf86ReturnOptValBool(options, XAAOPT_IMAGE_WRITE_RECT, FALSE)) {
|
|
|
|
infoRec->ImageWriteRange >>= 2; /* convert to DWORDS */
|
|
if (infoRec->ImageWriteFlags & CPU_TRANSFER_BASE_FIXED)
|
|
infoRec->ImageWriteRange = 0;
|
|
HaveImageWriteRect = TRUE;
|
|
}
|
|
else {
|
|
infoRec->ImageWriteFlags = 0;
|
|
infoRec->SetupForImageWrite = NULL;
|
|
infoRec->SubsequentImageWriteRect = NULL;
|
|
}
|
|
|
|
/**** Scanline Image Writes ****/
|
|
|
|
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__
|
|
/* XAA makes some unaligned accesses when clipping is not available */
|
|
#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;
|
|
}
|
|
|
|
/************** Mid Level *************/
|
|
|
|
/**** ScreenToScreenBitBlt ****/
|
|
|
|
if (infoRec->ScreenToScreenBitBlt) {
|
|
XAAMSG("\tDriver provided ScreenToScreenBitBlt replacement\n");
|
|
}
|
|
else if (HaveScreenToScreenCopy) {
|
|
infoRec->ScreenToScreenBitBlt = XAAScreenToScreenBitBlt;
|
|
infoRec->ScreenToScreenBitBltFlags = infoRec->ScreenToScreenCopyFlags;
|
|
}
|
|
|
|
/**** FillSolidRects ****/
|
|
|
|
if (infoRec->FillSolidRects) {
|
|
XAAMSG("\tDriver provided FillSolidRects replacement\n");
|
|
}
|
|
else if (HaveSolidFillRect) {
|
|
infoRec->FillSolidRects = XAAFillSolidRects;
|
|
infoRec->FillSolidRectsFlags = infoRec->SolidFillFlags;
|
|
}
|
|
|
|
/**** FillSolidSpans ****/
|
|
|
|
if (infoRec->FillSolidSpans) {
|
|
XAAMSG("\tDriver provided FillSolidSpans replacement\n");
|
|
}
|
|
else if (HaveSolidFillRect) {
|
|
infoRec->FillSolidSpans = XAAFillSolidSpans;
|
|
infoRec->FillSolidSpansFlags = infoRec->SolidFillFlags;
|
|
}
|
|
|
|
/**** FillMono8x8PatternRects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillMono8x8PatternSpans ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillColor8x8Rects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillColor8x8Spans ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillCacheBltRects ****/
|
|
|
|
if (infoRec->FillCacheBltRects) {
|
|
XAAMSG("\tDriver provided FillCacheBltRects replacement\n");
|
|
}
|
|
else if (HaveScreenToScreenCopy) {
|
|
infoRec->FillCacheBltRects = XAAFillCacheBltRects;
|
|
infoRec->FillCacheBltRectsFlags = infoRec->ScreenToScreenCopyFlags;
|
|
}
|
|
|
|
/**** FillCacheBltSpans ****/
|
|
|
|
if (infoRec->FillCacheBltSpans) {
|
|
XAAMSG("\tDriver provided FillCacheBltSpans replacement\n");
|
|
}
|
|
else if (HaveScreenToScreenCopy) {
|
|
infoRec->FillCacheBltSpans = XAAFillCacheBltSpans;
|
|
infoRec->FillCacheBltSpansFlags = infoRec->ScreenToScreenCopyFlags;
|
|
}
|
|
|
|
/**** FillCacheExpandRects ****/
|
|
|
|
if (infoRec->FillCacheExpandRects) {
|
|
XAAMSG("\tDriver provided FillCacheExpandRects replacement\n");
|
|
}
|
|
else if (HaveScreenToScreenColorExpandFill) {
|
|
infoRec->FillCacheExpandRects = XAAFillCacheExpandRects;
|
|
infoRec->FillCacheExpandRectsFlags =
|
|
infoRec->ScreenToScreenColorExpandFillFlags;
|
|
}
|
|
|
|
/**** FillCacheExpandSpans ****/
|
|
|
|
if (infoRec->FillCacheExpandSpans) {
|
|
XAAMSG("\tDriver provided FillCacheExpandSpans replacement\n");
|
|
}
|
|
else if (HaveScreenToScreenColorExpandFill) {
|
|
infoRec->FillCacheExpandSpans = XAAFillCacheExpandSpans;
|
|
infoRec->FillCacheExpandSpansFlags =
|
|
infoRec->ScreenToScreenColorExpandFillFlags;
|
|
}
|
|
|
|
/**** FillColorExpandRects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillColorExpandSpans ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** FillImageWriteRects ****/
|
|
|
|
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;
|
|
}
|
|
|
|
/**** WriteBitmap ****/
|
|
|
|
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;
|
|
|
|
/**** TE Glyphs ****/
|
|
|
|
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");
|
|
}
|
|
}
|
|
|
|
/**** NonTE Glyphs ****/
|
|
|
|
if (infoRec->NonTEGlyphRenderer) {
|
|
XAAMSG("\tDriver provided NonTEGlyphRenderer replacement\n");
|
|
}
|
|
else if (infoRec->WriteBitmap &&
|
|
!(infoRec->WriteBitmapFlags & NO_TRANSPARENCY)) {
|
|
infoRec->NonTEGlyphRenderer = XAANonTEGlyphRenderer;
|
|
infoRec->NonTEGlyphRendererFlags = infoRec->WriteBitmapFlags;
|
|
}
|
|
|
|
/**** WritePixmap ****/
|
|
|
|
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;
|
|
|
|
/**** ReadPixmap ****/
|
|
|
|
if (infoRec->ReadPixmap) {
|
|
XAAMSG("\tDriver provided ReadPixmap replacement\n");
|
|
}
|
|
|
|
/************** GC Level *************/
|
|
|
|
/**** CopyArea ****/
|
|
|
|
if (infoRec->CopyArea) {
|
|
XAAMSG("\tDriver provided GC level CopyArea replacement\n");
|
|
}
|
|
else if (infoRec->ScreenToScreenBitBlt) {
|
|
infoRec->CopyArea = XAACopyArea;
|
|
infoRec->CopyAreaFlags = infoRec->ScreenToScreenBitBltFlags;
|
|
|
|
/* most GC level primitives use one mid-level primitive so
|
|
the GC level primitive gets the mid-level primitive flag
|
|
and we use that at GC validation time. But CopyArea uses
|
|
more than one mid-level primitive so we have to essentially
|
|
do a GC validation every time that primitive is used.
|
|
The CopyAreaFlags would only be used for filtering out the
|
|
common denominators. Here we assume that if you don't do
|
|
ScreenToScreenBitBlt you aren't going to do the others.
|
|
We also assume that ScreenToScreenBitBlt has the least
|
|
restrictions. */
|
|
}
|
|
|
|
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;
|
|
|
|
/* See comment for CopyArea above. But here we make fewer
|
|
assumptions. The driver can provide the PutImageFlags if
|
|
it wants too */
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
/************ Validation Functions **************/
|
|
|
|
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;
|
|
}
|
|
|
|
/* By default XAA assumes the FillSpans, PolyFillRects, FillPolygon
|
|
and PolyFillArcs have the same restrictions. If you supply GC
|
|
level replacements for any of these and alter this relationship
|
|
you may need to supply replacement validation routines */
|
|
|
|
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;
|
|
}
|
|
|
|
/* By default XAA only provides Validations for the GlyphBlt
|
|
functions and not the text higher up. This is because the
|
|
Text8/16 and GlyphBlt are linked. If you break this linkage,
|
|
you may need to have the driver supply its own Validation
|
|
routines */
|
|
|
|
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;
|
|
}
|
|
|
|
/* By default XAA only provides a Validation function for the
|
|
Polylines and does segments and polylines at the same time */
|
|
|
|
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;
|
|
}
|
|
|
|
/**** Fill choosers ****/
|
|
|
|
if (!infoRec->StippledFillChooser)
|
|
infoRec->StippledFillChooser = XAAStippledFillChooser;
|
|
|
|
if (!infoRec->OpaqueStippledFillChooser)
|
|
infoRec->OpaqueStippledFillChooser = XAAOpaqueStippledFillChooser;
|
|
|
|
if (!infoRec->TiledFillChooser)
|
|
infoRec->TiledFillChooser = XAATiledFillChooser;
|
|
|
|
/**** Setup the pixmap cache ****/
|
|
|
|
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;
|
|
}
|