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.13 2001/05/22 18:51:09 mvojkovi Exp $
 |