EXA driver doc cleanups and additions.

This commit is contained in:
Jesse Barnes 2006-02-25 20:26:49 +00:00
parent f41ec003f3
commit 6b08a5013b

View File

@ -2,34 +2,33 @@ Adding EXA support to your X.Org video driver
--------------------------------------------- ---------------------------------------------
EXA (for EXcellent Architecture or Ex-kaa aXeleration Architecture or EXA (for EXcellent Architecture or Ex-kaa aXeleration Architecture or
whatever) aims to extend the life of the venerable XFree86 video drivers by whatever) aims to extend the life of the venerable XFree86 video drivers by
introducing hooks that they can implement to more efficiently accelerate the X introducing a new set of acceleration hooks that efficiently accelerate the X
Render extension: solid fills, blits within screen memory and to and from Render extension, including solid fills, blits within screen memory and to and
system memory, and Porter-Duff compositing and transform operations. from system memory, and Porter-Duff compositing and transform operations.
Globals Configuration
------- -------------
A new config file option, AccelMethod, should be added to your driver, to allow
the user to select between the EXA and XAA acceleration APIs.
Some drivers implement a per-instance useEXA flag to track whether EXA is
active or not. It can be helpful to also conditionalize XAA support with an
ifdef so that it can easily be turned off/removed in the future.
Setting the flag and checking for AccelMethod can be done in the driver's
Options parsing routine.
Global symbols
--------------
XF86EXA will be defined to a nonzero value if your X server codebase supports XF86EXA will be defined to a nonzero value if your X server codebase supports
the EXA API. Use it to conditionalize your new EXA code if your driver is the EXA API. Use it to conditionalize your new EXA code if your driver is
shared with a non-EXA codebases. If present, necessary functions, structures shared with a non-EXA codebases. If present, necessary functions, structures
and defines will be located in "exa.h". and defines will be located in "exa.h".
AccelMethod EXA library functions
----------- ---------------------
A new config file option, AccelMethod, should be used in your driver to select Use the following functions to initialize your driver's EXA hooks, check the
between the EXA and XAA acceleration APIs. The default should be XAA for version, allocate memory, etc.
6.9/7.0 drivers.
Some drivers implement a per-instance useEXA flag to track whether EXA is
active or not. It can be helpful to also conditionalize XAA support so that
it can easily be turned off/removed in the future. Setting the flag and
checking for AccelMethod can be done in the driver's Options routine (a
friendly printf is be a nice way of letting the user know which method is in
use).
Core EXA functions
------------------
The following functions are provided, for use by your driver, to do
allocation, initialization, version checking, etc.
/** /**
* exaGetVersion - retrieve EXA version number from server * exaGetVersion - retrieve EXA version number from server
@ -42,13 +41,13 @@ allocation, initialization, version checking, etc.
/** /**
* exaDriverInit - tell EXA about a new EXA driver * exaDriverInit - tell EXA about a new EXA driver
* @pScreen - current screen * @pScreen - current screen
* @pScreenInfo - driver structure * @driverPtr - driver structure
* *
* Tell EXA about the driver described by @pScreenInfo. * Tell EXA about the driver described by @pScreenInfo.
* *
* Returns TRUE for success, FALSE for failure. * Returns TRUE for success, FALSE for failure.
*/ */
Bool exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo) Bool exaDriverInit(ScreenPtr pScreen, ExaDriverPtr driverPtr)
/** /**
* exaDriverFini - teardown an EXA driver * exaDriverFini - teardown an EXA driver
@ -58,7 +57,6 @@ allocation, initialization, version checking, etc.
*/ */
void exaDriverFini(ScreenPtr pScreen) void exaDriverFini(ScreenPtr pScreen)
/** /**
* exaOffscreenAlloc - allocate offscreen memory * exaOffscreenAlloc - allocate offscreen memory
* @pScreen: current screen * @pScreen: current screen
@ -118,11 +116,6 @@ allocation, initialization, version checking, etc.
* %EXA_OFFSCREEN_PIXMAPS - offscreen pixmaps are supported * %EXA_OFFSCREEN_PIXMAPS - offscreen pixmaps are supported
* %EXA_OFFSCREEN_ALIGN_POT - offscreen objects must hve a power of two * %EXA_OFFSCREEN_ALIGN_POT - offscreen objects must hve a power of two
* alignment of their pitch * alignment of their pitch
*
* This routine is just a macro, and so it can't fail (unless it causes a
* compile failure).
*
* [This macro appears broken in the current tree, s/Sync/needsSync/.]
*/ */
void exaInitCard(EXADriverPtr *exa, Bool sync, CARD8 *memory_base, void exaInitCard(EXADriverPtr *exa, Bool sync, CARD8 *memory_base,
unsigned longoff_screen_base, unsigned long memory_size, unsigned longoff_screen_base, unsigned long memory_size,
@ -156,9 +149,6 @@ allocation, initialization, version checking, etc.
*/ */
Bool exaOffscreenInit(ScreenPtr pScreen) Bool exaOffscreenInit(ScreenPtr pScreen)
Some helper functions are also available to make common EXA related functions
easier.
/** /**
* exaGetPixmapPitch - return the pitch for a pixmap * exaGetPixmapPitch - return the pitch for a pixmap
* @p: pixmap * @p: pixmap
@ -176,16 +166,21 @@ easier.
*/ */
unsigned int exaGetPixmapOffset(PixmapPtr p) unsigned int exaGetPixmapOffset(PixmapPtr p)
Driver EXA routines EXA driver hooks
------------------- ----------------
EXA requires the addition of new routines to your driver's acceleration EXA requires the addition of new routines to your driver's acceleration
implementation. The following structure defines the EXA acceleration API, implementation. The following structure defines the EXA acceleration API,
some are required to be implemented in your driver, others are optional. some hooks are required to be implemented in your driver, others are optional.
Each of these routines has an associated function pointer in the ExaAccelInfo
structure. At a minimum, your driver must allocate an ExaDriverRec struture,
fill out the ExaCardInfoRec member structure, and define the miminum required
functions (described below) and hook them into the ExaAccelInfo member
structure.
Note that for routines that take a source and destination pixmap, the pitches Note that for routines that take a source and destination pixmap, the pitches
may be different. may be different.
typedef struct _ExaAccelInfo {
/** /**
* PrepareSolid - setup for solid fill * PrepareSolid - setup for solid fill
* @pPixmap: Pixmap destination * @pPixmap: Pixmap destination
@ -340,7 +335,7 @@ may be different.
* can't accelerate the operation (e.g. if the pixmaps are incompatible with * can't accelerate the operation (e.g. if the pixmaps are incompatible with
* acceleration). * acceleration).
* *
* Optional. * Optional but recommended.
*/ */
Bool (*PrepareComposite)(int op, PicturePtr pSrcPicture, Bool (*PrepareComposite)(int op, PicturePtr pSrcPicture,
PicturePtr pMaskPicture, PicturePtr pDstPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture,
@ -362,7 +357,7 @@ may be different.
* *
* Must not fail. * Must not fail.
* *
* Optional. * Optional but recommended.
*/ */
void (*Composite)(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, void (*Composite)(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
int dstX, int dstY, int width, int height); int dstX, int dstY, int width, int height);
@ -465,10 +460,6 @@ may be different.
* Required. * Required.
*/ */
void (*WaitMarker)(ScreenPtr pScreen, int marker); void (*WaitMarker)(ScreenPtr pScreen, int marker);
} ExaAccelInfoRec, *ExaAccelInfoPtr;
This is an extra, optional routine, used as a callback to the offscreen
allocation function.
/** /**
* ScratchSave - save the scratch area, or just throw it away * ScratchSave - save the scratch area, or just throw it away
@ -490,24 +481,16 @@ allocation function.
*/ */
void ScratchSave(ScreenPtr pScreen, ExaOffscreenArea *area); void ScratchSave(ScreenPtr pScreen, ExaOffscreenArea *area);
EXA driver fields
-----------------
Each driver record structure also needs a few additional fields if EXA
support is to be used, e.g.:
#if XF86EXA
/* Container structure, describes card and accel. hooks */
ExaDriverPtr EXADriverPtr;
#endif
EXA initialization EXA initialization
------------------ ------------------
Your driver's AccelInit routine has to initialize the EXADriverPtr if EXA Your driver's AccelInit routine must initialize an ExaDriverRec structure if
support is enabled, with appropriate error handling (i.e. NoAccel and EXA support is enabled, with appropriate error handling (i.e. NoAccel and
NoXvideo should be set to true if EXA fails to initialize for whatever NoXvideo should be set to true if EXA fails to initialize for whatever
reason). reason).
A few, card specific fields need to be initialized: A few, card specific fields need to be initialized (assuming your driver uses
a variable named EXADriverPtr pointing to where your ExaDriverRec is
allocated):
/* /*
* EXA uses memoryBase to access the framebuffer, while memorySize and * EXA uses memoryBase to access the framebuffer, while memorySize and
@ -519,12 +502,13 @@ A few, card specific fields need to be initialized:
EXADriverPtr->card.memorySize = ? /* end of offscreen memory */ EXADriverPtr->card.memorySize = ? /* end of offscreen memory */
/* offset of offscreen memory relative to memoryBase */ /* offset of offscreen memory relative to memoryBase */
EXADriverPtr->card.offScreenBase = ? EXADriverPtr->card.offScreenBase = ?
/* /*
* If your offscreen memory is just after your framebuffer, which is at the * If your offscreen memory is just after your framebuffer, which is at the
* start of memory, it may be something like: * start of memory, offScreenBase may be something like:
* pScrn->virtualX * pScrn->virtualY * ((pScrn->bitsPerPixel * + 7) / 8) * pScrn->virtualX * pScrn->virtualY * ((pScrn->bitsPerPixel + 7) / 8)
* should use the X value from the adjusted width based on virtualX, after * (the + 7 / 8 causes the integer division to round up instead of
* accounting for the accelerator's pitch alignment constraints * round down).
*/ */
/* /*
@ -532,13 +516,12 @@ A few, card specific fields need to be initialized:
* them. Not applied to all pixmaps--the visible screen is an exception, * them. Not applied to all pixmaps--the visible screen is an exception,
* and thus Prepare* acceleration hooks should test for these and fail * and thus Prepare* acceleration hooks should test for these and fail
* appropriately. pixmapOffsetAlign is the value that the pixmap's offset * appropriately. pixmapOffsetAlign is the value that the pixmap's offset
* from the beginning of the framebuffer must be aligned to. pixmapPitchAlign * from the beginning of the framebuffer must be aligned to.
* is the value that the pitch of a pixmap must be aligned to (along with * pixmapPitchAlign is the value that the pitch of a pixmap must be aligned
* ALIGN_POT). * to (along with ALIGN_POT).
*/ */
EXADriverPtr->card.pixmapOffsetAlign = ? EXADriverPtr->card.pixmapOffsetAlign = ?
/* also called stride */ EXADriverPtr->card.pixmapPitchAlign = ? /* also called stride */
EXADriverPtr->card.pixmapPitchAlign = ?
/* Max screen size supported by the card? */ /* Max screen size supported by the card? */
EXADriverPtr->card.maxX = ? EXADriverPtr->card.maxX = ?
@ -575,12 +558,11 @@ out (don't forget to check for errors as that routine can fail).
If your driver doesn't support UploadToScreen, you should allocate some If your driver doesn't support UploadToScreen, you should allocate some
scratch space for use by commonly used pixmaps (e.g. glyphs). Note that it's scratch space for use by commonly used pixmaps (e.g. glyphs). Note that it's
much better to implement UploadToScreen than to allocate scratch space, but if much better to implement UploadToScreen than to allocate scratch space, but if
necessary allocate about as much as you'd need for a line of text. necessary allocate about as much as you'd need for a line of text. E.g.
pDrv->exa_scratch = exaOffscreenAlloc(pScreen, 128 * 1024, 16, TRUE, pDrv->exa_scratch = exaOffscreenAlloc(pScreen, 128 * 1024, 16, TRUE,
ScratchSave, pDrv); ScratchSave, pDrv);
/* Why is this required? Shouldn't exaOffscreenAlloc take care of it? */
if(pDrv->exa_scratch) { if(pDrv->exa_scratch) {
pDrv->exa_scratch_next = pDrv->exa_scratch->offset; pDrv->exa_scratch_next = pDrv->exa_scratch->offset;
pDrv->EXADriverPtr->accel.UploadToScratch = UploadToScratch; pDrv->EXADriverPtr->accel.UploadToScratch = UploadToScratch;
@ -601,7 +583,7 @@ call at setup time.
EXA teardown EXA teardown
------------ ------------
At screen close time, EXA drivers should, call exaDriverFini with their screen At screen close time, EXA drivers should call exaDriverFini with their screen
pointer, free their EXADriver structure, and do any other necessary teardown. pointer, free their EXADriver structure, and do any other necessary teardown.
EXA misc. EXA misc.