1428 lines
57 KiB
Plaintext
1428 lines
57 KiB
Plaintext
|
|
|
|
XAA.HOWTO
|
|
|
|
This file describes how to add basic XAA support to a chipset driver.
|
|
|
|
0) What is XAA
|
|
1) XAA Initialization and Shutdown
|
|
2) The Primitives
|
|
2.0 Generic Flags
|
|
2.1 Screen to Screen Copies
|
|
2.2 Solid Fills
|
|
2.3 Solid Lines
|
|
2.4 Dashed Lines
|
|
2.5 Color Expand Fills
|
|
2.5.1 Screen to Screen Color Expansion
|
|
2.5.2 CPU to Screen Color Expansion
|
|
2.5.2.1 The Direct Method
|
|
2.5.2.2 The Indirect Method
|
|
2.6 8x8 Mono Pattern Fills
|
|
2.7 8x8 Color Pattern Fills
|
|
2.8 Image Writes
|
|
2.8.1 The Direct Method
|
|
2.8.2 The Indirect Method
|
|
2.9 Clipping
|
|
3) The Pixmap Cache
|
|
4) Offscreen Pixmaps
|
|
|
|
/********************************************************************/
|
|
|
|
0) WHAT IS XAA
|
|
|
|
XAA (the XFree86 Acceleration Architecture) is a device dependent
|
|
layer that encapsulates the unaccelerated framebuffer rendering layer,
|
|
intercepting rendering commands sent to it from higher levels of the
|
|
server. For rendering tasks where hardware acceleration is not
|
|
possible, XAA allows the requests to proceed to the software rendering
|
|
code. Otherwise, XAA breaks the sometimes complicated X primitives
|
|
into simpler primitives more suitable for hardware acceleration and
|
|
will use accelerated functions exported by the chipset driver to
|
|
render these.
|
|
|
|
XAA provides a simple, easy to use driver interface that allows
|
|
the driver to communicate its acceleration capabilities and restrictions
|
|
back to XAA. XAA will use the information provided by the driver
|
|
to determine whether or not acceleration will be possible for a
|
|
particular X primitive.
|
|
|
|
|
|
|
|
1) XAA INITIALIZATION AND SHUTDOWN
|
|
|
|
All relevant prototypes and defines are in xaa.h.
|
|
|
|
To Initialize the XAA layer, the driver should allocate an XAAInfoRec
|
|
via XAACreateInfoRec(), fill it out as described in this document
|
|
and pass it to XAAInit(). XAAInit() must be called _after_ the
|
|
framebuffer initialization (usually cfb?ScreenInit or similar) since
|
|
it is "wrapping" that layer. XAAInit() should be called _before_ the
|
|
cursor initialization (usually miDCInitialize) since the cursor
|
|
layer needs to "wrap" all the rendering code including XAA.
|
|
|
|
When shutting down, the driver should free the XAAInfoRec
|
|
structure in its CloseScreen function via XAADestroyInfoRec().
|
|
The prototypes for the functions mentioned above are as follows:
|
|
|
|
XAAInfoRecPtr XAACreateInfoRec(void);
|
|
Bool XAAInit(ScreenPtr, XAAInfoRecPtr);
|
|
void XAADestroyInfoRec(XAAInfoRec);
|
|
|
|
The driver informs XAA of it's acceleration capablities by
|
|
filling out an XAAInfoRec structure and passing it to XAAInit().
|
|
The XAAInfoRec structure contains many fields, most of which are
|
|
function pointers and flags. Each primitive will typically have
|
|
two functions and a set of flags associated with it, but it may
|
|
have more. These two functions are the "SetupFor" and "Subsequent"
|
|
functions. The "SetupFor" function tells the driver that the
|
|
hardware should be initialized for a particular type of graphics
|
|
operation. After the "SetupFor" function, one or more calls to the
|
|
"Subsequent" function will be made to indicate that an instance
|
|
of the particular primitive should be rendered by the hardware.
|
|
The details of each instance (width, height, etc...) are given
|
|
with each "Subsequent" function. The set of flags associated
|
|
with each primitive lets the driver tell XAA what its hardware
|
|
limitations are (eg. It doesn't support a planemask, it can only
|
|
do one of the raster-ops, etc...).
|
|
|
|
Of the XAAInfoRec fields, one is required. This is the
|
|
Sync function. XAA initialization will fail if this function
|
|
is not provided.
|
|
|
|
void Sync(ScrnInfoPtr pScrn) /* Required */
|
|
|
|
Sync will be called when XAA needs to be certain that all
|
|
graphics coprocessor operations are finished, such as when
|
|
the framebuffer must be written to or read from directly
|
|
and it must be certain that the accelerator will not be
|
|
overwriting the area of interest.
|
|
|
|
One needs to make certain that the Sync function not only
|
|
waits for the accelerator fifo to empty, but that it waits for
|
|
the rendering of that last operation to complete.
|
|
|
|
It is guaranteed that no direct framebuffer access will
|
|
occur after a "SetupFor" or "Subsequent" function without
|
|
the Sync function being called first.
|
|
|
|
|
|
|
|
2) THE PRIMITIVES
|
|
|
|
2.0 Generic Flags
|
|
|
|
Each primitive type has a set of flags associated with it which
|
|
allow the driver to tell XAA what the hardware limitations are.
|
|
The common ones are as follows:
|
|
|
|
/* Foreground, Background, rop and planemask restrictions */
|
|
|
|
GXCOPY_ONLY
|
|
|
|
This indicates that the accelerator only supports GXcopy
|
|
for the particular primitive.
|
|
|
|
ROP_NEEDS_SOURCE
|
|
|
|
This indicates that the accelerator doesn't supports a
|
|
particular primitive with rops that don't involve the source.
|
|
These rops are GXclear, GXnoop, GXinvert and GXset. If neither
|
|
this flag nor GXCOPY_ONLY is defined, it is assumed that the
|
|
accelerator supports all 16 raster operations (rops) for that
|
|
primitive.
|
|
|
|
NO_PLANEMASK
|
|
|
|
This indicates that the accelerator does not support a hardware
|
|
write planemask for the particular primitive.
|
|
|
|
RGB_EQUAL
|
|
|
|
This indicates that the particular primitive requires the red,
|
|
green and blue bytes of the foreground color (and background color,
|
|
if applicable) to be equal. This is useful for 24bpp when a graphics
|
|
coprocessor is used in 8bpp mode, which is not uncommon in older
|
|
hardware since some have no support for or only limited support for
|
|
acceleration at 24bpp. This way, many operations will be accelerated
|
|
for the common case of "grayscale" colors. This flag should only
|
|
be used in 24bpp.
|
|
|
|
In addition to the common ones listed above which are possible for
|
|
nearly all primitives, each primitive may have its own flags specific
|
|
to that primitive. If such flags exist they are documented in the
|
|
descriptions of those primitives below.
|
|
|
|
|
|
|
|
|
|
2.1 Screen to Screen Copies
|
|
|
|
The SetupFor and Subsequent ScreenToScreenCopy functions provide
|
|
an interface for copying rectangular areas from video memory to
|
|
video memory. To accelerate this primitive the driver should
|
|
provide both the SetupFor and Subsequent functions and indicate
|
|
the hardware restrictions via the ScreenToScreenCopyFlags. The
|
|
NO_PLANEMASK, GXCOPY_ONLY and ROP_NEEDS_SOURCE flags as described
|
|
in Section 2.0 are valid as well as the following:
|
|
|
|
NO_TRANSPARENCY
|
|
|
|
This indicates that the accelerator does not support skipping
|
|
of color keyed pixels when copying from the source to the destination.
|
|
|
|
TRANSPARENCY_GXCOPY_ONLY
|
|
|
|
This indicates that the accelerator supports skipping of color keyed
|
|
pixels only when the rop is GXcopy.
|
|
|
|
ONLY_LEFT_TO_RIGHT_BITBLT
|
|
|
|
This indicates that the hardware only accepts blitting when the
|
|
x direction is positive.
|
|
|
|
ONLY_TWO_BITBLT_DIRECTIONS
|
|
|
|
This indicates that the hardware can only cope with blitting when
|
|
the direction of x is the same as the direction in y.
|
|
|
|
|
|
void SetupForScreenToScreenCopy( ScrnInfoPtr pScrn,
|
|
int xdir, int ydir,
|
|
int rop,
|
|
unsigned int planemask,
|
|
int trans_color )
|
|
|
|
When this is called, SubsequentScreenToScreenCopy will be called
|
|
one or more times directly after. If ydir is 1, then the accelerator
|
|
should copy starting from the top (minimum y) of the source and
|
|
proceed downward. If ydir is -1, then the accelerator should copy
|
|
starting from the bottom of the source (maximum y) and proceed
|
|
upward. If xdir is 1, then the accelerator should copy each
|
|
y scanline starting from the leftmost pixel of the source. If
|
|
xdir is -1, it should start from the rightmost pixel.
|
|
If trans_color is not -1 then trans_color indicates that the
|
|
accelerator should not copy pixels with the color trans_color
|
|
from the source to the destination, but should skip them.
|
|
Trans_color is always -1 if the NO_TRANSPARENCY flag is set.
|
|
|
|
|
|
void SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn,
|
|
int x1, int y1,
|
|
int x2, int y2,
|
|
int width, int height)
|
|
|
|
Copy a rectangle "width" x "height" from the source (x1,y1) to the
|
|
destination (x2,y2) using the parameters passed by the last
|
|
SetupForScreenToScreenCopy call. (x1,y1) and (x2,y2) always denote
|
|
the upper left hand corners of the source and destination regardless
|
|
of which xdir and ydir values are given by SetupForScreenToScreenCopy.
|
|
|
|
|
|
|
|
2.2 Solid Fills
|
|
|
|
The SetupFor and Subsequent SolidFill(Rect/Trap) functions provide
|
|
an interface for filling rectangular areas of the screen with a
|
|
foreground color. To accelerate this primitive the driver should
|
|
provide both the SetupForSolidFill and SubsequentSolidFillRect
|
|
functions and indicate the hardware restrictions via the SolidFillFlags.
|
|
The driver may optionally provide a SubsequentSolidFillTrap if
|
|
it is capable of rendering the primitive correctly.
|
|
The GXCOPY_ONLY, ROP_NEEDS_SOURCE, NO_PLANEMASK and RGB_EQUAL flags
|
|
as described in Section 2.0 are valid.
|
|
|
|
|
|
void SetupForSolidFill(ScrnInfoPtr pScrn,
|
|
int color, int rop, unsigned int planemask)
|
|
|
|
SetupForSolidFill indicates that any combination of the following
|
|
may follow it.
|
|
|
|
SubsequentSolidFillRect
|
|
SubsequentSolidFillTrap
|
|
|
|
|
|
|
|
void SubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h)
|
|
|
|
Fill a rectangle of dimensions "w" by "h" with origin at (x,y)
|
|
using the color, rop and planemask given by the last
|
|
SetupForSolidFill call.
|
|
|
|
void SubsequentSolidFillTrap(ScrnInfoPtr pScrn, int y, int h,
|
|
int left, int dxL, int dyL, int eL,
|
|
int right, int dxR, int dyR, int eR)
|
|
|
|
These parameters describe a trapezoid via a version of
|
|
Bresenham's parameters. "y" is the top line. "h" is the
|
|
number of spans to be filled in the positive Y direction.
|
|
"left" and "right" indicate the starting X values of the
|
|
left and right edges. dy/dx describes the edge slope.
|
|
These are not the deltas between the beginning and ending
|
|
points on an edge. They merely describe the slope. "e" is
|
|
the initial error term. It's the relationships between dx,
|
|
dy and e that define the edge.
|
|
If your engine does not do bresenham trapezoids or does
|
|
not allow the programmer to specify the error term then
|
|
you are not expected to be able to accelerate them.
|
|
|
|
|
|
2.3 Solid Lines
|
|
|
|
XAA provides an interface for drawing thin lines. In order to
|
|
draw X lines correctly a high degree of accuracy is required.
|
|
This usually limits line acceleration to hardware which has a
|
|
Bresenham line engine, though depending on the algorithm used,
|
|
other line engines may come close if they accept 16 bit line
|
|
deltas. XAA has both a Bresenham line interface and a two-point
|
|
line interface for drawing lines of arbitrary orientation.
|
|
Additionally there is a SubsequentSolidHorVertLine which will
|
|
be used for all horizontal and vertical lines. Horizontal and
|
|
vertical lines are handled separately since hardware that doesn't
|
|
have a line engine (or has one that is unusable due to precision
|
|
problems) can usually draw these lines by some other method such
|
|
as drawing them as thin rectangles. Even for hardware that can
|
|
draw arbitrary lines via the Bresenham or two-point interfaces,
|
|
the SubsequentSolidHorVertLine is used for horizontal and vertical
|
|
lines since most hardware is able to render the horizontal lines
|
|
and sometimes the vertical lines faster by other methods (Hint:
|
|
try rendering horizontal lines as flattened rectangles). If you have
|
|
not provided a SubsequentSolidHorVertLine but you have provided
|
|
Bresenham or two-point lines, a SubsequentSolidHorVertLine function
|
|
will be supplied for you.
|
|
|
|
The flags field associated with Solid Lines is SolidLineFlags and
|
|
the GXCOPY_ONLY, ROP_NEEDS_SOURCE, NO_PLANEMASK and RGB_EQUAL flags as
|
|
described in Section 2.0 are valid restrictions.
|
|
|
|
Some line engines have line biases hardcoded to comply with
|
|
Microsoft line biasing rules. A tell-tale sign of this is the
|
|
hardware lines not matching the software lines in the zeroth and
|
|
fourth octants. The driver can set the flag:
|
|
|
|
MICROSOFT_ZERO_LINE_BIAS
|
|
|
|
in the AccelInfoRec.Flags field to adjust the software lines to
|
|
match the hardware lines. This is in the generic flags field
|
|
rather than the SolidLineFlags since this flag applies to all
|
|
software zero-width lines on the screen and not just the solid ones.
|
|
|
|
|
|
void SetupForSolidLine(ScrnInfoPtr pScrn,
|
|
int color, int rop, unsigned int planemask)
|
|
|
|
SetupForSolidLine indicates that any combination of the following
|
|
may follow it.
|
|
|
|
SubsequentSolidBresenhamLine
|
|
SubsequentSolidTwoPointLine
|
|
SubsequentSolidHorVertLine
|
|
|
|
|
|
void SubsequentSolidHorVertLine( ScrnInfoPtr pScrn,
|
|
int x, int y, int len, int dir )
|
|
|
|
All vertical and horizontal solid thin lines are rendered with
|
|
this function. The line starts at coordinate (x,y) and extends
|
|
"len" pixels inclusive. In the direction indicated by "dir."
|
|
The direction is either DEGREES_O or DEGREES_270. That is, it
|
|
always extends to the right or down.
|
|
|
|
|
|
|
|
void SubsequentSolidTwoPointLine(ScrnInfoPtr pScrn,
|
|
int x1, int y1, int x2, int y2, int flags)
|
|
|
|
Draw a line from (x1,y1) to (x2,y2). If the flags field contains
|
|
the flag OMIT_LAST, the last pixel should not be drawn. Otherwise,
|
|
the pixel at (x2,y2) should be drawn.
|
|
|
|
If you use the TwoPoint line interface there is a good possibility
|
|
that your line engine has hard-coded line biases that do not match
|
|
the default X zero-width lines. If so, you may need to set the
|
|
MICROSOFT_ZERO_LINE_BIAS flag described above. Note that since
|
|
any vertex in the 16-bit signed coordinate system is valid, your
|
|
line engine is expected to handle 16-bit values if you have hardware
|
|
line clipping enabled. If your engine cannot handle 16-bit values,
|
|
you should not use hardware line clipping.
|
|
|
|
|
|
void SubsequentSolidBresenhamLine(ScrnInfoPtr pScrn,
|
|
int x, int y, int major, int minor, int err, int len, int octant)
|
|
|
|
"X" and "y" are the starting point of the line. "Major" and "minor"
|
|
are the major and minor step constants. "Err" is the initial error
|
|
term. "Len" is the number of pixels to be drawn (inclusive). "Octant"
|
|
can be any combination of the following flags OR'd together:
|
|
|
|
Y_MAJOR Y is the major axis (X otherwise)
|
|
X_DECREASING The line is drawn from right to left
|
|
Y_DECREASING The line is drawn from bottom to top
|
|
|
|
The major, minor and err terms are the "raw" Bresenham parameters
|
|
consistent with a line engine that does:
|
|
|
|
e = err;
|
|
while(len--) {
|
|
DRAW_POINT(x,y);
|
|
e += minor;
|
|
if(e >= 0) {
|
|
e -= major;
|
|
TAKE_ONE_STEP_ALONG_MINOR_AXIS;
|
|
}
|
|
TAKE_ONE_STEP_ALONG_MAJOR_AXIS;
|
|
}
|
|
|
|
IBM 8514 style Bresenham line interfaces require their parameters
|
|
modified in the following way:
|
|
|
|
Axial = minor;
|
|
Diagonal = minor - major;
|
|
Error = minor + err;
|
|
|
|
SolidBresenhamLineErrorTermBits
|
|
|
|
This field allows the driver to tell XAA how many bits large its
|
|
Bresenham parameter registers are. Many engines have registers that
|
|
only accept 12 or 13 bit Bresenham parameters, and the parameters
|
|
for clipped lines may overflow these if they are not scaled down.
|
|
If this field is not set, XAA will assume the engine can accomodate
|
|
16 bit parameters, otherwise, it will scale the parameters to the
|
|
size specified.
|
|
|
|
|
|
2.4 Dashed Lines
|
|
|
|
The same degree of accuracy required by the solid lines is required
|
|
for drawing dashed lines as well. The dash pattern itself is a
|
|
buffer of binary data where ones are expanded into the foreground
|
|
color and zeros either correspond to the background color or
|
|
indicate transparency depending on whether or not DoubleDash or
|
|
OnOffDashes are being drawn.
|
|
|
|
The flags field associated with dashed Lines is DashedLineFlags and
|
|
the GXCOPY_ONLY, ROP_NEEDS_SOURCE, NO_PLANEMASK and RGB_EQUAL flags as
|
|
described in Section 2.0 are valid restrictions. Additionally, the
|
|
following flags are valid:
|
|
|
|
NO_TRANSPARENCY
|
|
|
|
This indicates that the driver cannot support dashed lines
|
|
with transparent backgrounds (OnOffDashes).
|
|
|
|
TRANSPARENCY_ONLY
|
|
|
|
This indicates that the driver cannot support dashes with
|
|
both a foreground and background color (DoubleDashes).
|
|
|
|
LINE_PATTERN_POWER_OF_2_ONLY
|
|
|
|
This indicates that only patterns with a power of 2 length
|
|
can be accelerated.
|
|
|
|
LINE_PATTERN_LSBFIRST_MSBJUSTIFIED
|
|
LINE_PATTERN_LSBFIRST_LSBJUSTIFIED
|
|
LINE_PATTERN_MSBFIRST_MSBJUSTIFIED
|
|
LINE_PATTERN_MSBFIRST_LSBJUSTIFIED
|
|
|
|
These describe how the line pattern should be packed.
|
|
The pattern buffer is DWORD padded. LSBFIRST indicates
|
|
that the pattern runs from the LSB end to the MSB end.
|
|
MSBFIRST indicates that the pattern runs from the MSB end
|
|
to the LSB end. When the pattern does not completely fill
|
|
the DWORD padded buffer, the pattern will be justified
|
|
towards the MSB or LSB end based on the flags above.
|
|
|
|
|
|
The following field indicates the maximum length dash pattern that
|
|
should be accelerated.
|
|
|
|
int DashPatternMaxLength
|
|
|
|
|
|
void SetupForDashedLine(ScrnInfoPtr pScrn,
|
|
int fg, int bg, int rop, unsigned int planemask,
|
|
int length, unsigned char *pattern)
|
|
|
|
|
|
SetupForDashedLine indicates that any combination of the following
|
|
may follow it.
|
|
|
|
SubsequentDashedBresenhamLine
|
|
SubsequentDashedTwoPointLine
|
|
|
|
If "bg" is -1, then the background (pixels corresponding to clear
|
|
bits in the pattern) should remain unmodified. "Bg" indicates the
|
|
background color otherwise. "Length" indicates the length of
|
|
the pattern in bits and "pattern" points to the DWORD padded buffer
|
|
holding the pattern which has been packed according to the flags
|
|
set above.
|
|
|
|
|
|
void SubsequentDashedTwoPointLine( ScrnInfoPtr pScrn,
|
|
int x1, int y1, int x2, int y2, int flags, int phase)
|
|
|
|
void SubsequentDashedBresenhamLine(ScrnInfoPtr pScrn,
|
|
int x1, int y1, int major, int minor, int err, int len, int octant,
|
|
int phase)
|
|
|
|
These are the same as the SubsequentSolidTwoPointLine and
|
|
SubsequentBresenhamLine functions except for the addition
|
|
of the "phase" field which indicates the offset into the dash
|
|
pattern that the pixel at (x1,y1) corresponds to.
|
|
|
|
As with the SubsequentBresenhamLine, there is an
|
|
|
|
int DashedBresenhamLineErrorTermBits
|
|
|
|
field which indicates the size of the error term registers
|
|
used with dashed lines. This is usually the same value as
|
|
the field for the solid lines (because it's usually the same
|
|
register).
|
|
|
|
|
|
|
|
2.5 Color Expansion Fills
|
|
|
|
When filling a color expansion rectangle, the accelerator
|
|
paints each pixel depending on whether or not a bit in a
|
|
corresponding bitmap is set or clear. Opaque expansions are
|
|
when a set bit corresponds to the foreground color and a clear
|
|
bit corresponds to the background color. A transparent expansion
|
|
is when a set bit corresponds to the foreground color and a
|
|
clear bit indicates that the pixel should remain unmodified.
|
|
|
|
The graphics accelerator usually has access to the source
|
|
bitmap in one of two ways: 1) the bitmap data is sent serially
|
|
to the accelerator by the CPU through some memory mapped aperture
|
|
or 2) the accelerator reads the source bitmap out of offscreen
|
|
video memory. Some types of primitives are better suited towards
|
|
one method or the other. Type 2 is useful for reusable patterns
|
|
such as stipples which can be cached in offscreen memory. The
|
|
aperature method can be used for stippling but the CPU must pass
|
|
the data across the bus each time a stippled fill is to be performed.
|
|
For expanding 1bpp client pixmaps or text strings to the screen,
|
|
the aperature method is usually superior because the intermediate
|
|
copy in offscreen memory needed by the second method would only be
|
|
used once. Unfortunately, many accelerators can only do one of these
|
|
methods and not both.
|
|
|
|
XAA provides both ScreenToScreen and CPUToScreen color expansion
|
|
interfaces for doing color expansion fills. The ScreenToScreen
|
|
functions can only be used with hardware that supports reading
|
|
of source bitmaps from offscreen video memory, and these are only
|
|
used for cacheable patterns such as stipples. There are two
|
|
variants of the CPUToScreen routines - a direct method intended
|
|
for hardware that has a transfer aperature, and an indirect method
|
|
intended for hardware without transfer aperatures or hardware
|
|
with unusual transfer requirements. Hardware that can only expand
|
|
bitmaps from video memory should supply ScreenToScreen routines
|
|
but also ScanlineCPUToScreen (indirect) routines to optimize transfers
|
|
of non-cacheable data. Hardware that can only accept source bitmaps
|
|
through an aperature should supply CPUToScreen (or ScanlineCPUToScreen)
|
|
routines. Hardware that can do both should provide both ScreenToScreen
|
|
and CPUToScreen routines.
|
|
|
|
For both ScreenToScreen and CPUToScreen interfaces, the GXCOPY_ONLY,
|
|
ROP_NEEDS_SOURCE, NO_PLANEMASK and RGB_EQUAL flags described in
|
|
Section 2.0 are valid as well as the following:
|
|
|
|
/* bit order requirements (one of these must be set) */
|
|
|
|
BIT_ORDER_IN_BYTE_LSBFIRST
|
|
|
|
This indicates that least significant bit in each byte of the source
|
|
data corresponds to the leftmost of that block of 8 pixels. This
|
|
is the prefered format.
|
|
|
|
BIT_ORDER_IN_BYTE_MSBFIRST
|
|
|
|
This indicates that most significant bit in each byte of the source
|
|
data corresponds to the leftmost of that block of 8 pixels.
|
|
|
|
/* transparency restrictions */
|
|
|
|
NO_TRANSPARENCY
|
|
|
|
This indicates that the accelerator cannot do a transparent expansion.
|
|
|
|
TRANSPARENCY_ONLY
|
|
|
|
This indicates that the accelerator cannot do an opaque expansion.
|
|
In cases where where the background needs to be filled, XAA will
|
|
render the primitive in two passes when using the CPUToScreen
|
|
interface, but will not do so with the ScreenToScreen interface
|
|
since that would require caching of two patterns. Some
|
|
ScreenToScreen hardware may be able to render two passes at the
|
|
driver level and remove the TRANSPARENCY_ONLY restriction if
|
|
it can render pixels corresponding to the zero bits.
|
|
|
|
|
|
|
|
2.5.1 Screen To Screen Color Expansion
|
|
|
|
The ScreenToScreenColorExpandFill routines provide an interface
|
|
for doing expansion blits from source patterns stored in offscreen
|
|
video memory.
|
|
|
|
void SetupForScreenToScreenColorExpandFill (ScrnInfoPtr pScrn,
|
|
int fg, int bg,
|
|
int rop, unsigned int planemask)
|
|
|
|
|
|
Ones in the source bitmap will correspond to the fg color.
|
|
Zeros in the source bitmap will correspond to the bg color
|
|
unless bg = -1. In that case the pixels corresponding to the
|
|
zeros in the bitmap shall be left unmodified by the accelerator.
|
|
|
|
For hardware that doesn't allow an easy implementation of skipleft, the
|
|
driver can replace CacheMonoStipple function with one that stores multiple
|
|
rotated copies of the stipple and select between them. In this case the
|
|
driver should set CacheColorExpandDensity to tell XAA how many copies of
|
|
the pattern are stored in the width of a cache slot. For instance if the
|
|
hardware can specify the starting address in bytes, then 8 rotated copies
|
|
of the stipple are needed and CacheColorExpandDensity should be set to 8.
|
|
|
|
void SubsequentScreenToScreenColorExpandFill( ScrnInfoPtr pScrn,
|
|
int x, int y, int w, int h,
|
|
int srcx, int srcy, int offset )
|
|
|
|
|
|
Fill a rectangle "w" x "h" at location (x,y). The source pitch
|
|
between scanlines is the framebuffer pitch (pScrn->displayWidth
|
|
pixels) and srcx and srcy indicate the start of the source pattern
|
|
in units of framebuffer pixels. "Offset" indicates the bit offset
|
|
into the pattern that corresponds to the pixel being painted at
|
|
"x" on the screen. Some hardware accepts source coordinates in
|
|
units of bits which makes implementation of the offset trivial.
|
|
In that case, the bit address of the source bit corresponding to
|
|
the pixel painted at (x,y) would be:
|
|
|
|
(srcy * pScrn->displayWidth + srcx) * pScrn->bitsPerPixel + offset
|
|
|
|
It should be noted that the offset assumes LSBFIRST hardware.
|
|
For MSBFIRST hardware, the driver may need to implement the
|
|
offset by bliting only from byte boundaries and hardware clipping.
|
|
|
|
|
|
|
|
2.5.2 CPU To Screen Color Expansion
|
|
|
|
|
|
The CPUToScreenColorExpandFill routines provide an interface for
|
|
doing expansion blits from source patterns stored in system memory.
|
|
There are two varieties of this primitive, a CPUToScreenColorExpandFill
|
|
and a ScanlineCPUToScreenColorExpandFill. With the
|
|
CPUToScreenColorExpandFill method, the source data is sent serially
|
|
through a memory mapped aperature. With the Scanline version, the
|
|
data is rendered scanline at a time into intermediate buffers with
|
|
a call to SubsequentColorExpandScanline following each scanline.
|
|
|
|
These two methods have separate flags fields, the
|
|
CPUToScreenColorExpandFillFlags and ScanlineCPUToScreenColorExpandFillFlags
|
|
respectively. Flags specific to one method or the other are described
|
|
in sections 2.5.2.1 and 2.5.2.2 but for both cases the bit order and
|
|
transparency restrictions listed at the beginning of section 2.5 are
|
|
valid as well as the following:
|
|
|
|
/* clipping (optional) */
|
|
|
|
LEFT_EDGE_CLIPPING
|
|
|
|
This indicates that the accelerator supports omission of up to
|
|
31 pixels on the left edge of the rectangle to be filled. This
|
|
is beneficial since it allows transfer of the source bitmap to
|
|
always occur from DWORD boundaries.
|
|
|
|
LEFT_EDGE_CLIPPING_NEGATIVE_X
|
|
|
|
This flag indicates that the accelerator can render color expansion
|
|
rectangles even if the value of x origin is negative (off of
|
|
the screen on the left edge).
|
|
|
|
/* misc */
|
|
|
|
TRIPLE_BITS_24BPP
|
|
|
|
When enabled (must be in 24bpp mode), color expansion functions
|
|
are expected to require three times the amount of bits to be
|
|
transferred so that 24bpp grayscale colors can be used with color
|
|
expansion in 8bpp coprocessor mode. Each bit is expanded to 3
|
|
bits when writing the monochrome data.
|
|
|
|
|
|
2.5.1 The Direct Method
|
|
|
|
|
|
Using the direct method of color expansion XAA will send all
|
|
bitmap data to the accelerator serially through an memory mapped
|
|
transfer window defined by the following two fields:
|
|
|
|
unsigned char *ColorExpandBase
|
|
|
|
This indicates the memory address of the beginning of the aperture.
|
|
|
|
int ColorExpandRange
|
|
|
|
This indicates the size in bytes of the aperture.
|
|
|
|
The driver should specify how the transfered data should be padded.
|
|
There are options for both the padding of each Y scanline and for the
|
|
total transfer to the aperature.
|
|
One of the following two flags must be set:
|
|
|
|
CPU_TRANSFER_PAD_DWORD
|
|
|
|
This indicates that the total transfer (sum of all scanlines) sent
|
|
to the aperature must be DWORD padded. This is the default behavior.
|
|
|
|
CPU_TRANSFER_PAD_QWORD
|
|
|
|
This indicates that the total transfer (sum of all scanlines) sent
|
|
to the aperature must be QWORD padded. With this set, XAA will send
|
|
an extra DWORD to the aperature when needed to ensure that only
|
|
an even number of DWORDs are sent.
|
|
|
|
And then there are the flags for padding of each scanline:
|
|
|
|
SCANLINE_PAD_DWORD
|
|
|
|
This indicates that each Y scanline should be DWORD padded.
|
|
This is the only option available and is the default.
|
|
|
|
Finally, there is the CPU_TRANSFER_BASE_FIXED flag which indicates
|
|
that the aperture is a single register rather than a range of
|
|
registers, and XAA should write all of the data to the first DWORD.
|
|
If the ColorExpandRange is not large enough to accomodate scanlines
|
|
the width of the screen, this option will be forced. That is, the
|
|
ColorExpandRange must be:
|
|
|
|
((virtualX + 31)/32) * 4 bytes or more.
|
|
|
|
((virtualX + 62)/32 * 4) if LEFT_EDGE_CLIPPING_NEGATIVE_X is set.
|
|
|
|
If the TRIPLE_BITS_24BPP flag is set, the required area should be
|
|
multiplied by three.
|
|
|
|
|
|
void SetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
|
|
int fg, int bg,
|
|
int rop,
|
|
unsigned int planemask)
|
|
|
|
|
|
|
|
Ones in the source bitmap will correspond to the fg color.
|
|
Zeros in the source bitmap will correspond to the bg color
|
|
unless bg = -1. In that case the pixels corresponding to the
|
|
zeros in the bitmap shall be left unmodified by the accelerator.
|
|
|
|
|
|
void SubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
|
|
int x, int y, int w, int h,
|
|
int skipleft )
|
|
|
|
When this function is called, the accelerator should be setup
|
|
to fill a rectangle of dimension "w" by "h" with origin at (x,y)
|
|
in the fill style prescribed by the last call to
|
|
SetupForCPUToScreenColorExpandFill. XAA will pass the data to
|
|
the aperture immediately after this function is called. If the
|
|
skipleft is non-zero (and LEFT_EDGE_CLIPPING has been enabled), then
|
|
the accelerator _should_not_ render skipleft pixels on the leftmost
|
|
edge of the rectangle. Some engines have an alignment feature
|
|
like this built in, some others can do this using a clipping
|
|
window.
|
|
|
|
It can be arranged for XAA to call Sync() after it is through
|
|
calling the Subsequent function by setting SYNC_AFTER_COLOR_EXPAND
|
|
in the CPUToScreenColorExpandFillFlags. This can provide the driver
|
|
with an oportunity to reset a clipping window if needed.
|
|
|
|
|
|
2.5.2 The Indirect Method
|
|
|
|
Using the indirect method, XAA will render the bitmap data scanline
|
|
at a time to one or more buffers. These buffers may be memory
|
|
mapped apertures or just intermediate storage.
|
|
|
|
int NumScanlineColorExpandBuffers
|
|
|
|
This indicates the number of buffers available.
|
|
|
|
unsigned char **ScanlineColorExpandBuffers
|
|
|
|
This is an array of pointers to the memory locations of each buffer.
|
|
Each buffer is expected to be large enough to accommodate scanlines
|
|
the width of the screen. That is:
|
|
|
|
((virtualX + 31)/32) * 4 bytes or more.
|
|
|
|
((virtualX + 62)/32 * 4) if LEFT_EDGE_CLIPPING_NEGATIVE_X is set.
|
|
|
|
Scanlines are always DWORD padded.
|
|
If the TRIPLE_BITS_24BPP flag is set, the required area should be
|
|
multiplied by three.
|
|
|
|
|
|
void SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
|
|
int fg, int bg,
|
|
int rop,
|
|
unsigned int planemask)
|
|
|
|
Ones in the source bitmap will correspond to the fg color.
|
|
Zeros in the source bitmap will correspond to the bg color
|
|
unless bg = -1. In that case the pixels corresponding to the
|
|
zeros in the bitmap shall be left unmodified by the accelerator.
|
|
|
|
|
|
void SubsequentScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
|
|
int x, int y, int w, int h,
|
|
int skipleft )
|
|
|
|
void SubsequentColorExpandScanline(ScrnInfoPtr pScrn, int bufno)
|
|
|
|
|
|
When SubsequentScanlineCPUToScreenColorExpandFill is called, XAA
|
|
will begin transfering the source data scanline at a time, calling
|
|
SubsequentColorExpandScanline after each scanline. If more than
|
|
one buffer is available, XAA will cycle through the buffers.
|
|
Subsequent scanlines will use the next buffer and go back to the
|
|
buffer 0 again when the last buffer is reached. The index into
|
|
the ScanlineColorExpandBuffers array is presented as "bufno"
|
|
with each SubsequentColorExpandScanline call.
|
|
|
|
The skipleft field is the same as for the direct method.
|
|
|
|
The indirect method can be use to send the source data directly
|
|
to a memory mapped aperture represented by a single color expand
|
|
buffer, scanline at a time, but more commonly it is used to place
|
|
the data into offscreen video memory so that the accelerator can
|
|
blit it to the visible screen from there. In the case where the
|
|
accelerator permits rendering into offscreen video memory while
|
|
the accelerator is active, several buffers can be used so that
|
|
XAA can be placing source data into the next buffer while the
|
|
accelerator is blitting the current buffer. For cases where
|
|
the accelerator requires some special manipulation of the source
|
|
data first, the buffers can be in system memory. The CPU can
|
|
manipulate these buffers and then send the data to the accelerator.
|
|
|
|
|
|
|
|
2.6 8x8 Mono Pattern Fills
|
|
|
|
XAA provides support for two types of 8x8 hardware patterns -
|
|
"Mono" patterns and "Color" patterns. Mono pattern data is
|
|
64 bits of color expansion data with ones indicating the
|
|
foreground color and zeros indicating the background color.
|
|
The source bitmaps for the 8x8 mono patterns can be presented
|
|
to the graphics accelerator in one of two ways. They can be
|
|
passed as two DWORDS to the 8x8 mono pattern functions or
|
|
they can be cached in offscreen memory and their locations
|
|
passed to the 8x8 mono pattern functions. In addition to the
|
|
GXCOPY_ONLY, ROP_NEEDS_SOURCE, NO_PLANEMASK and RGB_EQUAL flags
|
|
defined in Section 2.0, the following are defined for the
|
|
Mono8x8PatternFillFlags:
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS
|
|
|
|
This indicates that the 8x8 patterns should be packed into two
|
|
DWORDS and passed to the 8x8 mono pattern functions. The default
|
|
behavior is to cache the patterns in offscreen video memory and
|
|
pass the locations of these patterns to the functions instead.
|
|
The pixmap cache must be enabled for the default behavior (8x8
|
|
pattern caching) to work. See Section 3 for how to enable the
|
|
pixmap cache. The pixmap cache is not necessary for
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS.
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN
|
|
|
|
If the hardware supports programmable pattern offsets then
|
|
this option should be set. See the table below for further
|
|
infomation.
|
|
|
|
HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
|
|
Some hardware wants the pattern offset specified with respect to the
|
|
upper left-hand corner of the primitive being drawn. Other hardware
|
|
needs the option HARDWARE_PATTERN_SCREEN_ORIGIN set to indicate that
|
|
all pattern offsets should be referenced to the upper left-hand
|
|
corner of the screen. HARDWARE_PATTERN_SCREEN_ORIGIN is preferable
|
|
since this is more natural for the X-Window system and offsets will
|
|
have to be recalculated for each Subsequent function otherwise.
|
|
|
|
BIT_ORDER_IN_BYTE_MSBFIRST
|
|
BIT_ORDER_IN_BYTE_LSBFIRST
|
|
|
|
As with other color expansion routines this indicates whether the
|
|
most or the least significant bit in each byte from the pattern is
|
|
the leftmost on the screen.
|
|
|
|
TRANSPARENCY_ONLY
|
|
NO_TRANSPARENCY
|
|
|
|
This means the same thing as for the color expansion rect routines
|
|
except that for TRANSPARENCY_ONLY XAA will not render the primitive
|
|
in two passes since this is more easily handled by the driver.
|
|
It is recommended that TRANSPARENCY_ONLY hardware handle rendering
|
|
of opaque patterns in two passes (the background can be filled as
|
|
a rectangle in GXcopy) in the Subsequent function so that the
|
|
TRANSPARENCY_ONLY restriction can be removed.
|
|
|
|
|
|
|
|
Additional information about cached patterns...
|
|
For the case where HARDWARE_PATTERN_PROGRAMMED_BITS is not set and
|
|
the pattern must be cached in offscreen memory, the first pattern
|
|
starts at the cache slot boundary which is set by the
|
|
CachePixelGranularity field used to configure the pixmap cache.
|
|
One should ensure that the CachePixelGranularity reflects any
|
|
alignment restrictions that the accelerator may put on 8x8 pattern
|
|
storage locations. When HARDWARE_PATTERN_PROGRAMMED_ORIGIN is set
|
|
there is only one pattern stored. When this flag is not set,
|
|
all 64 pre-rotated copies of the pattern are cached in offscreen memory.
|
|
The MonoPatternPitch field can be used to specify the X position pixel
|
|
granularity that each of these patterns must align on. If the
|
|
MonoPatternPitch is not supplied, the patterns will be densely packed
|
|
within the cache slot. The behavior of the default XAA 8x8 pattern
|
|
caching mechanism to store all 8x8 patterns linearly in video memory.
|
|
If the accelerator needs the patterns stored in a more unusual fashion,
|
|
the driver will need to provide its own 8x8 mono pattern caching
|
|
routines for XAA to use.
|
|
|
|
The following table describes the meanings of the "patx" and "paty"
|
|
fields in both the SetupFor and Subsequent functions.
|
|
|
|
With HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
-----------------------------------
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS and HARDWARE_PATTERN_PROGRAMMED_ORIGIN
|
|
|
|
SetupFor: patx and paty are the first and second DWORDS of the
|
|
8x8 mono pattern.
|
|
|
|
Subsequent: patx and paty are the x,y offset into that pattern.
|
|
All Subsequent calls will have the same offset in
|
|
the case of HARDWARE_PATTERN_SCREEN_ORIGIN so only
|
|
the offset specified by the first Subsequent call
|
|
after a SetupFor call will need to be observed.
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS only
|
|
|
|
SetupFor: patx and paty hold the first and second DWORDS of
|
|
the 8x8 mono pattern pre-rotated to match the desired
|
|
offset.
|
|
|
|
Subsequent: These just hold the same patterns and can be ignored.
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN only
|
|
|
|
SetupFor: patx and paty hold the x,y coordinates of the offscreen
|
|
memory location where the 8x8 pattern is stored. The
|
|
bits are stored linearly in memory at that location.
|
|
|
|
Subsequent: patx and paty hold the offset into the pattern.
|
|
All Subsequent calls will have the same offset in
|
|
the case of HARDWARE_PATTERN_SCREEN_ORIGIN so only
|
|
the offset specified by the first Subsequent call
|
|
after a SetupFor call will need to be observed.
|
|
|
|
Neither programmed bits or origin
|
|
|
|
SetupFor: patx and paty hold the x,y coordinates of the offscreen
|
|
memory location where the pre-rotated 8x8 pattern is
|
|
stored.
|
|
|
|
Subsequent: patx and paty are the same as in the SetupFor function
|
|
and can be ignored.
|
|
|
|
|
|
Without HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
--------------------------------------
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS and HARDWARE_PATTERN_PROGRAMMED_ORIGIN
|
|
|
|
SetupFor: patx and paty are the first and second DWORDS of the
|
|
8x8 mono pattern.
|
|
|
|
Subsequent: patx and paty are the x,y offset into that pattern.
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_BITS only
|
|
|
|
SetupFor: patx and paty holds the first and second DWORDS of
|
|
the unrotated 8x8 mono pattern. This can be ignored.
|
|
|
|
Subsequent: patx and paty hold the rotated 8x8 pattern to be
|
|
rendered.
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN only
|
|
|
|
SetupFor: patx and paty hold the x,y coordinates of the offscreen
|
|
memory location where the 8x8 pattern is stored. The
|
|
bits are stored linearly in memory at that location.
|
|
|
|
Subsequent: patx and paty hold the offset into the pattern.
|
|
|
|
Neither programmed bits or origin
|
|
|
|
SetupFor: patx and paty hold the x,y coordinates of the offscreen
|
|
memory location where the unrotated 8x8 pattern is
|
|
stored. This can be ignored.
|
|
|
|
Subsequent: patx and paty hold the x,y coordinates of the
|
|
rotated 8x8 pattern to be rendered.
|
|
|
|
|
|
|
|
void SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
|
|
int fg, int bg, int rop, unsigned int planemask)
|
|
|
|
SetupForMono8x8PatternFill indicates that any combination of the
|
|
following may follow it.
|
|
|
|
SubsequentMono8x8PatternFillRect
|
|
SubsequentMono8x8PatternFillTrap
|
|
|
|
The fg, bg, rop and planemask fields have the same meaning as the
|
|
ones used for the other color expansion routines. Patx's and paty's
|
|
meaning can be determined from the table above.
|
|
|
|
|
|
void SubsequentMono8x8PatternFillRect( ScrnInfoPtr pScrn,
|
|
int patx, int paty, int x, int y, int w, int h)
|
|
|
|
Fill a rectangle of dimensions "w" by "h" with origin at (x,y)
|
|
using the parameters give by the last SetupForMono8x8PatternFill
|
|
call. The meanings of patx and paty can be determined by the
|
|
table above.
|
|
|
|
void SubsequentMono8x8PatternFillTrap( ScrnInfoPtr pScrn,
|
|
int patx, int paty, int y, int h,
|
|
int left, int dxL, int dyL, int eL,
|
|
int right, int dxR, int dyR, int eR )
|
|
|
|
The meanings of patx and paty can be determined by the table above.
|
|
The rest of the fields have the same meanings as those in the
|
|
SubsequentSolidFillTrap function.
|
|
|
|
|
|
|
|
2.7 8x8 Color Pattern Fills
|
|
|
|
8x8 color pattern data is 64 pixels of full color data that
|
|
is stored linearly in offscreen video memory. 8x8 color patterns
|
|
are useful as a substitute for 8x8 mono patterns when tiling,
|
|
doing opaque stipples, or in the case where transperency is
|
|
supported, regular stipples. 8x8 color pattern fills also have
|
|
the additional benefit of being able to tile full color 8x8
|
|
patterns instead of just 2 color ones like the mono patterns.
|
|
However, full color 8x8 patterns aren't used very often in the
|
|
X Window system so you might consider passing this primitive
|
|
by if you already can do mono patterns, especially if they
|
|
require alot of cache area. Color8x8PatternFillFlags is
|
|
the flags field for this primitive and the GXCOPY_ONLY,
|
|
ROP_NEEDS_SOURCE and NO_PLANEMASK flags as described in
|
|
Section 2.0 are valid as well as the following:
|
|
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN
|
|
|
|
If the hardware supports programmable pattern offsets then
|
|
this option should be set.
|
|
|
|
HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
|
|
Some hardware wants the pattern offset specified with respect to the
|
|
upper left-hand corner of the primitive being drawn. Other hardware
|
|
needs the option HARDWARE_PATTERN_SCREEN_ORIGIN set to indicate that
|
|
all pattern offsets should be referenced to the upper left-hand
|
|
corner of the screen. HARDWARE_PATTERN_SCREEN_ORIGIN is preferable
|
|
since this is more natural for the X-Window system and offsets will
|
|
have to be recalculated for each Subsequent function otherwise.
|
|
|
|
NO_TRANSPARENCY
|
|
TRANSPARENCY_GXCOPY_ONLY
|
|
|
|
These mean the same as for the ScreenToScreenCopy functions.
|
|
|
|
|
|
The following table describes the meanings of patx and paty passed
|
|
to the SetupFor and Subsequent fields:
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN && HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
|
|
SetupFor: patx and paty hold the x,y location of the unrotated
|
|
pattern.
|
|
|
|
Subsequent: patx and paty hold the pattern offset. For the case
|
|
of HARDWARE_PATTERN_SCREEN_ORIGIN all Subsequent calls
|
|
have the same offset so only the first call will need
|
|
to be observed.
|
|
|
|
|
|
HARDWARE_PATTERN_PROGRAMMED_ORIGIN only
|
|
|
|
SetupFor: patx and paty hold the x,y location of the unrotated
|
|
pattern.
|
|
|
|
Subsequent: patx and paty hold the pattern offset.
|
|
|
|
HARDWARE_PATTERN_SCREEN_ORIGIN
|
|
|
|
SetupFor: patx and paty hold the x,y location of the rotated pattern.
|
|
|
|
Subsequent: patx and paty hold the same location as the SetupFor
|
|
function so these can be ignored.
|
|
|
|
neither flag
|
|
|
|
SetupFor: patx and paty hold the x,y location of the unrotated
|
|
pattern. This can be ignored.
|
|
|
|
Subsequent: patx and paty hold the x,y location of the rotated
|
|
pattern.
|
|
|
|
Additional information about cached patterns...
|
|
All 8x8 color patterns are cached in offscreen video memory so
|
|
the pixmap cache must be enabled to use them. The first pattern
|
|
starts at the cache slot boundary which is set by the
|
|
CachePixelGranularity field used to configure the pixmap cache.
|
|
One should ensure that the CachePixelGranularity reflects any
|
|
alignment restrictions that the accelerator may put on 8x8 pattern
|
|
storage locations. When HARDWARE_PATTERN_PROGRAMMED_ORIGIN is set
|
|
there is only one pattern stored. When this flag is not set,
|
|
all 64 rotations off the pattern are accessible but it is assumed
|
|
that the accelerator is capable of accessing data stored on 8
|
|
pixel boundaries. If the accelerator has stricter alignment
|
|
requirements than this the dirver will need to provide its own
|
|
8x8 color pattern caching routines.
|
|
|
|
|
|
void SetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty,
|
|
int rop, unsigned int planemask, int trans_color)
|
|
|
|
SetupForColor8x8PatternFill indicates that any combination of the
|
|
following may follow it.
|
|
|
|
SubsequentColor8x8PatternFillRect
|
|
SubsequentColor8x8PatternFillTrap (not implemented yet)
|
|
|
|
For the meanings of patx and paty, see the table above. Trans_color
|
|
means the same as for the ScreenToScreenCopy functions.
|
|
|
|
|
|
|
|
void SubsequentColor8x8PatternFillRect( ScrnInfoPtr pScrn,
|
|
int patx, int paty, int x, int y, int w, int h)
|
|
|
|
Fill a rectangle of dimensions "w" by "h" with origin at (x,y)
|
|
using the parameters give by the last SetupForColor8x8PatternFill
|
|
call. The meanings of patx and paty can be determined by the
|
|
table above.
|
|
|
|
void SubsequentColor8x8PatternFillTrap( ScrnInfoPtr pScrn,
|
|
int patx, int paty, int y, int h,
|
|
int left, int dxL, int dyL, int eL,
|
|
int right, int dxR, int dyR, int eR )
|
|
|
|
For the meanings of patx and paty, see the table above.
|
|
The rest of the fields have the same meanings as those in the
|
|
SubsequentSolidFillTrap function.
|
|
|
|
|
|
|
|
2.8 Image Writes
|
|
|
|
XAA provides a mechanism for transfering full color pixel data from
|
|
system memory to video memory through the accelerator. This is
|
|
useful for dealing with alignment issues and performing raster ops
|
|
on the data when writing it to the framebuffer. As with color
|
|
expansion rectangles, there is a direct and indirect method. The
|
|
direct method sends all data through a memory mapped aperature.
|
|
The indirect method sends the data to an intermediated buffer scanline
|
|
at a time.
|
|
|
|
The direct and indirect methods have separate flags fields, the
|
|
ImageWriteFlags and ScanlineImageWriteFlags respectively.
|
|
Flags specific to one method or the other are described in sections
|
|
2.8.1 and 2.8.2 but for both cases the GXCOPY_ONLY, ROP_NEEDS_SOURCE
|
|
and NO_PLANEMASK flags described in Section 2.0 are valid as well as
|
|
the following:
|
|
|
|
NO_GXCOPY
|
|
|
|
In order to have accelerated image transfers faster than the
|
|
software versions for GXcopy, the engine needs to support clipping,
|
|
be using the direct method and have a large enough image transfer
|
|
range so that CPU_TRANSFER_BASE_FIXED doesn't need to be set.
|
|
If these are not supported, then it is unlikely that transfering
|
|
the data through the accelerator will be of any advantage for the
|
|
simple case of GXcopy. In fact, it may be much slower. For such
|
|
cases it's probably best to set the NO_GXCOPY flag so that
|
|
Image writes will only be used for the more complicated rops.
|
|
|
|
/* transparency restrictions */
|
|
|
|
NO_TRANSPARENCY
|
|
|
|
This indicates that the accelerator does not support skipping
|
|
of color keyed pixels when copying from the source to the destination.
|
|
|
|
TRANSPARENCY_GXCOPY_ONLY
|
|
|
|
This indicates that the accelerator supports skipping of color keyed
|
|
pixels only when the rop is GXcopy.
|
|
|
|
/* clipping (optional) */
|
|
|
|
LEFT_EDGE_CLIPPING
|
|
|
|
This indicates that the accelerator supports omission of up to
|
|
3 pixels on the left edge of the rectangle to be filled. This
|
|
is beneficial since it allows transfer from the source pixmap to
|
|
always occur from DWORD boundaries.
|
|
|
|
LEFT_EDGE_CLIPPING_NEGATIVE_X
|
|
|
|
This flag indicates that the accelerator can fill areas with
|
|
image write data even if the value of x origin is negative (off of
|
|
the screen on the left edge).
|
|
|
|
|
|
2.8.1 The Direct Method
|
|
|
|
Using the direct method of ImageWrite XAA will send all
|
|
bitmap data to the accelerator serially through an memory mapped
|
|
transfer window defined by the following two fields:
|
|
|
|
unsigned char *ImageWriteBase
|
|
|
|
This indicates the memory address of the beginning of the aperture.
|
|
|
|
int ImageWriteRange
|
|
|
|
This indicates the size in bytes of the aperture.
|
|
|
|
The driver should specify how the transfered data should be padded.
|
|
There are options for both the padding of each Y scanline and for the
|
|
total transfer to the aperature.
|
|
One of the following two flags must be set:
|
|
|
|
CPU_TRANSFER_PAD_DWORD
|
|
|
|
This indicates that the total transfer (sum of all scanlines) sent
|
|
to the aperature must be DWORD padded. This is the default behavior.
|
|
|
|
CPU_TRANSFER_PAD_QWORD
|
|
|
|
This indicates that the total transfer (sum of all scanlines) sent
|
|
to the aperature must be QWORD padded. With this set, XAA will send
|
|
an extra DWORD to the aperature when needed to ensure that only
|
|
an even number of DWORDs are sent.
|
|
|
|
And then there are the flags for padding of each scanline:
|
|
|
|
SCANLINE_PAD_DWORD
|
|
|
|
This indicates that each Y scanline should be DWORD padded.
|
|
This is the only option available and is the default.
|
|
|
|
Finally, there is the CPU_TRANSFER_BASE_FIXED flag which indicates
|
|
that the aperture is a single register rather than a range of
|
|
registers, and XAA should write all of the data to the first DWORD.
|
|
XAA will automatically select CPU_TRANSFER_BASE_FIXED if the
|
|
ImageWriteRange is not large enough to accomodate an entire scanline.
|
|
|
|
|
|
void SetupForImageWrite(ScrnInfoPtr pScrn, int rop, unsigned int planemask,
|
|
int trans_color, int bpp, int depth)
|
|
|
|
If trans_color is not -1 then trans_color indicates the transparency
|
|
color key and pixels with color trans_color passed through the
|
|
aperature should not be transfered to the screen but should be
|
|
skipped. Bpp and depth indicate the bits per pixel and depth of
|
|
the source pixmap. Trans_color is always -1 if the NO_TRANSPARENCY
|
|
flag is set.
|
|
|
|
|
|
void SubsequentImageWriteRect(ScrnInfoPtr pScrn,
|
|
int x, int y, int w, int h, int skipleft)
|
|
|
|
|
|
Data passed through the aperature should be copied to a rectangle
|
|
of width "w" and height "h" with origin (x,y). If LEFT_EDGE_CLIPPING
|
|
has been enabled, skipleft will correspond to the number of pixels
|
|
on the left edge that should not be drawn. Skipleft is zero
|
|
otherwise.
|
|
|
|
It can be arranged for XAA to call Sync() after it is through
|
|
calling the Subsequent functions by setting SYNC_AFTER_IMAGE_WRITE
|
|
in the ImageWriteFlags. This can provide the driver with an
|
|
oportunity to reset a clipping window if needed.
|
|
|
|
2.8.2 The Indirect Method
|
|
|
|
Using the indirect method, XAA will render the pixel data scanline
|
|
at a time to one or more buffers. These buffers may be memory
|
|
mapped apertures or just intermediate storage.
|
|
|
|
int NumScanlineImageWriteBuffers
|
|
|
|
This indicates the number of buffers available.
|
|
|
|
unsigned char **ScanlineImageWriteBuffers
|
|
|
|
This is an array of pointers to the memory locations of each buffer.
|
|
Each buffer is expected to be large enough to accommodate scanlines
|
|
the width of the screen. That is:
|
|
|
|
pScrn->VirtualX * pScreen->bitsPerPixel/8 bytes or more.
|
|
|
|
If LEFT_EDGE_CLIPPING_NEGATIVE_X is set, add an additional 4
|
|
bytes to that requirement in 8 and 16bpp, 12 bytes in 24bpp.
|
|
|
|
Scanlines are always DWORD padded.
|
|
|
|
void SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop,
|
|
unsigned int planemask, int trans_color,
|
|
int bpp, int depth)
|
|
|
|
If trans_color is not -1 then trans_color indicates the transparency
|
|
color key and pixels with color trans_color in the buffer should not
|
|
be transfered to the screen but should be skipped. Bpp and depth
|
|
indicate the bits per pixel and depth of the source bitmap.
|
|
Trans_color is always -1 if the NO_TRANSPARENCY flag is set.
|
|
|
|
|
|
void SubsequentImageWriteRect(ScrnInfoPtr pScrn,
|
|
int x, int y, int w, int h, int skipleft)
|
|
|
|
|
|
void SubsequentImageWriteScanline(ScrnInfoPtr pScrn, int bufno)
|
|
|
|
|
|
When SubsequentImageWriteRect is called, XAA will begin
|
|
transfering the source data scanline at a time, calling
|
|
SubsequentImageWriteScanline after each scanline. If more than
|
|
one buffer is available, XAA will cycle through the buffers.
|
|
Subsequent scanlines will use the next buffer and go back to the
|
|
buffer 0 again when the last buffer is reached. The index into
|
|
the ScanlineImageWriteBuffers array is presented as "bufno"
|
|
with each SubsequentImageWriteScanline call.
|
|
|
|
The skipleft field is the same as for the direct method.
|
|
|
|
The indirect method can be use to send the source data directly
|
|
to a memory mapped aperture represented by a single image write
|
|
buffer, scanline at a time, but more commonly it is used to place
|
|
the data into offscreen video memory so that the accelerator can
|
|
blit it to the visible screen from there. In the case where the
|
|
accelerator permits rendering into offscreen video memory while
|
|
the accelerator is active, several buffers can be used so that
|
|
XAA can be placing source data into the next buffer while the
|
|
accelerator is blitting the current buffer. For cases where
|
|
the accelerator requires some special manipulation of the source
|
|
data first, the buffers can be in system memory. The CPU can
|
|
manipulate these buffers and then send the data to the accelerator.
|
|
|
|
|
|
2.9 Clipping
|
|
|
|
XAA supports hardware clipping rectangles. To use clipping
|
|
in this way it is expected that the graphics accelerator can
|
|
clip primitives with verticies anywhere in the 16 bit signed
|
|
coordinate system.
|
|
|
|
void SetClippingRectangle ( ScrnInfoPtr pScrn,
|
|
int left, int top, int right, int bottom)
|
|
|
|
void DisableClipping (ScrnInfoPtr pScrn)
|
|
|
|
When SetClippingRectangle is called, all hardware rendering
|
|
following it should be clipped to the rectangle specified
|
|
until DisableClipping is called.
|
|
|
|
The ClippingFlags field indicates which operations this sort
|
|
of Set/Disable pairing can be used with. Any of the following
|
|
flags may be OR'd together.
|
|
|
|
HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND
|
|
HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY
|
|
HARDWARE_CLIP_MONO_8x8_FILL
|
|
HARDWARE_CLIP_COLOR_8x8_FILL
|
|
HARDWARE_CLIP_SOLID_FILL
|
|
HARDWARE_CLIP_DASHED_LINE
|
|
HARDWARE_CLIP_SOLID_LINE
|
|
|
|
|
|
|
|
3) XAA PIXMAP CACHE
|
|
|
|
/* NOTE: XAA has no knowledge of framebuffer particulars so until
|
|
the framebuffer is able to render into offscreen memory, usage
|
|
of the pixmap cache requires that the driver provide ImageWrite
|
|
routines or a WritePixmap or WritePixmapToCache replacement so
|
|
that patterns can even be placed in the cache.
|
|
|
|
ADDENDUM: XAA can now load the pixmap cache without requiring
|
|
that the driver supply an ImageWrite function, but this can
|
|
only be done on linear framebuffers. If you have a linear
|
|
framebuffer, set LINEAR_FRAMEBUFFER in the XAAInfoRec.Flags
|
|
field and XAA will then be able to upload pixmaps into the
|
|
cache without the driver providing functions to do so.
|
|
*/
|
|
|
|
|
|
The XAA pixmap cache provides a mechanism for caching of patterns
|
|
in offscreen video memory so that tiled fills and in some cases
|
|
stippling can be done by blitting the source patterns from offscreen
|
|
video memory. The pixmap cache also provides the mechanism for caching
|
|
of 8x8 color and mono hardware patterns. Any unused offscreen video
|
|
memory gets used for the pixmap cache and that information is
|
|
provided by the XFree86 Offscreen Memory Manager. XAA registers a
|
|
callback with the manager so that it can be informed of any changes
|
|
in the offscreen memory configuration. The driver writer does not
|
|
need to deal with any of this since it is all automatic. The driver
|
|
merely needs to initialize the Offscreen Memory Manager as described
|
|
in the DESIGN document and set the PIXMAP_CACHE flag in the
|
|
XAAInfoRec.Flags field. The Offscreen Memory Manager initialization
|
|
must occur before XAA is initialized or else pixmap cache
|
|
initialization will fail.
|
|
|
|
PixmapCacheFlags is an XAAInfoRec field which allows the driver to
|
|
control pixmap cache behavior to some extent. Currently only one
|
|
flag is defined:
|
|
|
|
DO_NOT_BLIT_STIPPLES
|
|
|
|
This indicates that the stippling should not be done by blitting
|
|
from the pixmap cache. This does not apply to 8x8 pattern fills.
|
|
|
|
|
|
CachePixelGranularity is an optional field. If the hardware requires
|
|
that a 8x8 patterns have some particular pixel alignment it should
|
|
be reflected in this field. Ignoring this field or setting it to
|
|
zero or one means there are no alignment issues.
|
|
|
|
|
|
4) OFFSCREEN PIXMAPS
|
|
|
|
XAA has the ability to store pixmap drawables in offscreen video
|
|
memory and render into them with full hardware acceleration. Placement
|
|
of pixmaps in the cache is done automatically on a first-come basis and
|
|
only if there is room. To enable this feature, set the OFFSCREEN_PIXMAPS
|
|
flag in the XAAInfoRec.Flags field. This is only available when a
|
|
ScreenToScreenCopy function is provided, when the Offscreen memory
|
|
manager has been initialized and when the LINEAR_FRAMEBUFFER flag is
|
|
also set.
|
|
|
|
int maxOffPixWidth
|
|
int maxOffPixHeight
|
|
|
|
These two fields allow the driver to limit the maximum dimensions
|
|
of an offscreen pixmap. If one of these is not set, it is assumed
|
|
that there is no limit on that dimension. Note that if an offscreen
|
|
pixmap with a particular dimension is allowed, then your driver will be
|
|
expected to render primitives as large as that pixmap.
|
|
|
|
$XFree86: xc/programs/Xserver/hw/xfree86/xaa/XAA.HOWTO,v 1.12 2000/04/12 14:44:42 tsi Exp $
|