Add more doxygen documentation, including notes on WaitMarker() and
MarkSync() that I noticed were needed while reading the VIA driver.
This commit is contained in:
		
							parent
							
								
									693e42114f
								
							
						
					
					
						commit
						a90cff266c
					
				| 
						 | 
				
			
			@ -1,3 +1,10 @@
 | 
			
		|||
2006-03-14  Eric Anholt  <anholt@FreeBSD.org>
 | 
			
		||||
 | 
			
		||||
	* exa/exa.c:
 | 
			
		||||
	* exa/exa.h:
 | 
			
		||||
	Add more doxygen documentation, including notes on WaitMarker() and
 | 
			
		||||
	MarkSync() that I noticed were needed while reading the VIA driver.
 | 
			
		||||
 | 
			
		||||
2006-03-14  Eric Anholt  <anholt@FreeBSD.org>
 | 
			
		||||
 | 
			
		||||
	* exa/exa.c: (exaDriverInit):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										64
									
								
								exa/exa.c
								
								
								
								
							
							
						
						
									
										64
									
								
								exa/exa.c
								
								
								
								
							| 
						 | 
				
			
			@ -146,6 +146,14 @@ exaDestroyPixmap (PixmapPtr pPixmap)
 | 
			
		|||
    return fbDestroyPixmap (pPixmap);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaCreatePixmap() creates a new pixmap.
 | 
			
		||||
 *
 | 
			
		||||
 * If width and height are 0, this won't be a full-fledged pixmap and it will
 | 
			
		||||
 * get ModifyPixmapHeader() called on it later.  So, we mark it as pinned, because
 | 
			
		||||
 * ModifyPixmapHeader() would break migration.  These types of pixmaps are used
 | 
			
		||||
 * for scratch pixmaps, or to represent the visible screen.
 | 
			
		||||
 */
 | 
			
		||||
static PixmapPtr
 | 
			
		||||
exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -174,6 +182,18 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
 | 
			
		|||
    return pPixmap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaPixmapIsOffscreen() is used to determine if a pixmap is in offscreen
 | 
			
		||||
 * memory, meaning that acceleration could probably be done to it, and that it
 | 
			
		||||
 * will need to be wrapped by PrepareAccess()/FinishAccess() when accessing it
 | 
			
		||||
 * with the CPU.
 | 
			
		||||
 *
 | 
			
		||||
 * Note that except for UploadToScreen()/DownloadFromScreen() (which explicitly
 | 
			
		||||
 * deal with moving pixmaps in and out of system memory), EXA will give drivers
 | 
			
		||||
 * pixmaps as arguments for which exaPixmapIsOffscreen() is TRUE.
 | 
			
		||||
 *
 | 
			
		||||
 * @return TRUE if the given drawable is in framebuffer memory.
 | 
			
		||||
 */
 | 
			
		||||
Bool
 | 
			
		||||
exaPixmapIsOffscreen(PixmapPtr p)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -185,12 +205,20 @@ exaPixmapIsOffscreen(PixmapPtr p)
 | 
			
		|||
	    pExaScr->info->memorySize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaDrawableIsOffscreen() is a convenience wrapper for exaPixmapIsOffscreen().
 | 
			
		||||
 */
 | 
			
		||||
Bool
 | 
			
		||||
exaDrawableIsOffscreen (DrawablePtr pDrawable)
 | 
			
		||||
{
 | 
			
		||||
    return exaPixmapIsOffscreen (exaGetDrawablePixmap (pDrawable));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the pixmap which backs a drawable, and the offsets to add to
 | 
			
		||||
 * coordinates to make them address the same bits in the backing drawable.
 | 
			
		||||
 * These coordinates are nonzero only for redirected windows.
 | 
			
		||||
 */
 | 
			
		||||
PixmapPtr
 | 
			
		||||
exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -221,6 +249,12 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp)
 | 
			
		|||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaPrepareAccess() is EXA's wrapper for the driver's PrepareAccess() handler.
 | 
			
		||||
 *
 | 
			
		||||
 * It deals with waiting for synchronization with the card, determining if
 | 
			
		||||
 * PrepareAccess() is necessary, and working around PrepareAccess() failure.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
exaPrepareAccess(DrawablePtr pDrawable, int index)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -246,6 +280,12 @@ exaPrepareAccess(DrawablePtr pDrawable, int index)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaFinishAccess() is EXA's wrapper for the driver's FinishAccess() handler.
 | 
			
		||||
 *
 | 
			
		||||
 * It deals with marking drawables as dirty, and calling the driver's
 | 
			
		||||
 * FinishAccess() only if necessary.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
exaFinishAccess(DrawablePtr pDrawable, int index)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -266,6 +306,22 @@ exaFinishAccess(DrawablePtr pDrawable, int index)
 | 
			
		|||
    (*pExaScr->info->FinishAccess) (pPixmap, index);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaValidateGC() chooses between the accelerated and unaccelerated GC Ops
 | 
			
		||||
 * vectors.
 | 
			
		||||
 *
 | 
			
		||||
 * The unaccelerated (exaAsyncPixmapGCOps) vector is chosen if the drawable is
 | 
			
		||||
 * offscreen.  This means that operations that affect only that drawable will
 | 
			
		||||
 * not result in migration of the pixmap.  However, exaAsyncPixmapGCOps does use
 | 
			
		||||
 * the accelerated operations for the Copy* functions, because the other
 | 
			
		||||
 * drawable involved might be in framebuffer and require synchronization before
 | 
			
		||||
 * accessing it.  This means that for the Copy* functions, even using
 | 
			
		||||
 * exaAsyncPixmapGCOps may result in migration, and therefore acceleration.
 | 
			
		||||
 *
 | 
			
		||||
 * Because of how nonintuitive exaAsyncPixmapGCOps is, and the fact that its
 | 
			
		||||
 * only use is for dubious performance reasons (and probably just historical
 | 
			
		||||
 * reasons), it is likely to go away in the future.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
exaValidateGC (GCPtr pGC, Mask changes, DrawablePtr pDrawable)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -287,6 +343,10 @@ static GCFuncs	exaGCFuncs = {
 | 
			
		|||
    miCopyClip
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaCreateGC makes a new GC and hooks up its funcs handler, so that
 | 
			
		||||
 * exaValidateGC() will get called.
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
exaCreateGC (GCPtr pGC)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -298,6 +358,10 @@ exaCreateGC (GCPtr pGC)
 | 
			
		|||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's
 | 
			
		||||
 * screen private, before calling down to the next CloseSccreen.
 | 
			
		||||
 */
 | 
			
		||||
static Bool
 | 
			
		||||
exaCloseScreen(int i, ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -564,6 +564,11 @@ typedef struct _ExaDriver {
 | 
			
		|||
     * data with the CPU, but is not important in the current incarnation of
 | 
			
		||||
     * EXA.
 | 
			
		||||
     *
 | 
			
		||||
     * Note that drivers should call exaMarkSync() when they have done some
 | 
			
		||||
     * acceleration, rather than their own MarkSync() handler, as otherwise EXA
 | 
			
		||||
     * will be unaware of the driver's acceleration and not sync to it during
 | 
			
		||||
     * fallbacks.
 | 
			
		||||
     *
 | 
			
		||||
     * MarkSync() is optional.
 | 
			
		||||
     */
 | 
			
		||||
    int		(*MarkSync)   (ScreenPtr pScreen);
 | 
			
		||||
| 
						 | 
				
			
			@ -574,6 +579,10 @@ typedef struct _ExaDriver {
 | 
			
		|||
     * meaningless, and all rendering by the hardware should be completed before
 | 
			
		||||
     * WaitMarker() returns.
 | 
			
		||||
     *
 | 
			
		||||
     * Note that drivers should call exaWaitSync() to wait for all acceleration
 | 
			
		||||
     * to finish, as otherwise EXA will be unaware of the driver having
 | 
			
		||||
     * synchronized, resulting in excessive WaitMarker() calls.
 | 
			
		||||
     *
 | 
			
		||||
     * WaitMarker() is required of all drivers.
 | 
			
		||||
     */
 | 
			
		||||
    void	(*WaitMarker) (ScreenPtr pScreen, int marker);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue