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 $
 |