629 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			629 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| #ifdef HAVE_XORG_CONFIG_H
 | |
| #include <xorg-config.h>
 | |
| #endif
 | |
| 
 | |
| #include "misc.h"
 | |
| #include "xf86.h"
 | |
| #include "xf86_OSproc.h"
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include "scrnintstr.h"
 | |
| #include "pixmapstr.h"
 | |
| #include "windowstr.h"
 | |
| #include "xf86str.h"
 | |
| #include "mi.h"
 | |
| #include "miline.h"
 | |
| #include "xaa.h"
 | |
| #include "xaalocal.h"
 | |
| #include "xaawrap.h"
 | |
| #include "xf86fbman.h"
 | |
| #include "servermd.h"
 | |
| #ifdef COMPOSITE
 | |
| #include "cw.h"
 | |
| #endif
 | |
| 
 | |
| #define MAX_PREALLOC_MEM	65536	/* MUST be >= 1024 */
 | |
| 
 | |
| #define MIN_OFFPIX_SIZE		(320*200)
 | |
| 
 | |
| static Bool XAACloseScreen(int i, ScreenPtr pScreen);
 | |
| static void XAAGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h,
 | |
| 			unsigned int format, unsigned long planemask,
 | |
| 			char *pdstLine);
 | |
| static void XAAGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt,
 | |
| 			int *pwidth, int nspans, char *pdstStart);
 | |
| static PixmapPtr XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
 | |
| 				 unsigned usage_hint);
 | |
| static Bool XAADestroyPixmap(PixmapPtr pPixmap);
 | |
| static Bool XAAEnterVT (int index, int flags);
 | |
| static void XAALeaveVT (int index, int flags);
 | |
| static int  XAASetDGAMode(int index, int num, DGADevicePtr devRet);
 | |
| static void XAAEnableDisableFBAccess (int index, Bool enable);
 | |
| static Bool XAAChangeWindowAttributes (WindowPtr pWin, unsigned long mask);
 | |
| 
 | |
| static int XAAScreenKeyIndex;
 | |
| static DevPrivateKey XAAScreenKey = &XAAScreenKeyIndex;
 | |
| static int XAAGCKeyIndex;
 | |
| static DevPrivateKey XAAGCKey = &XAAGCKeyIndex;
 | |
| static int XAAPixmapKeyIndex;
 | |
| static DevPrivateKey XAAPixmapKey = &XAAPixmapKeyIndex;
 | |
| 
 | |
| DevPrivateKey XAAGetScreenKey(void) {
 | |
|     return XAAScreenKey;
 | |
| }
 | |
| 
 | |
| DevPrivateKey XAAGetGCKey(void) {
 | |
|     return XAAGCKey;
 | |
| }
 | |
| 
 | |
| DevPrivateKey XAAGetPixmapKey(void) {
 | |
|     return XAAPixmapKey;
 | |
| }
 | |
| 
 | |
| /* temp kludge */
 | |
| static Bool SwitchedOut = FALSE;
 | |
| 
 | |
| XAAInfoRecPtr
 | |
| XAACreateInfoRec()
 | |
| {
 | |
|     XAAInfoRecPtr infoRec;
 | |
| 
 | |
|     infoRec = xcalloc(1, sizeof(XAAInfoRec));
 | |
|     if(infoRec)
 | |
| 	infoRec->CachePixelGranularity = -1;
 | |
| 
 | |
|     return infoRec;
 | |
| }
 | |
| 
 | |
| void
 | |
| XAADestroyInfoRec(XAAInfoRecPtr infoRec)
 | |
| {
 | |
|     if(!infoRec) return;
 | |
| 
 | |
|     if(infoRec->ClosePixmapCache)
 | |
| 	(*infoRec->ClosePixmapCache)(infoRec->pScrn->pScreen);
 | |
|    
 | |
|     if(infoRec->PreAllocMem)
 | |
| 	xfree(infoRec->PreAllocMem);
 | |
| 
 | |
|     if(infoRec->PixmapCachePrivate)
 | |
| 	xfree(infoRec->PixmapCachePrivate);
 | |
| 
 | |
|     xfree(infoRec);
 | |
| }
 | |
| 
 | |
| 
 | |
| Bool
 | |
| XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec)
 | |
| {
 | |
|     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
 | |
|     XAAScreenPtr pScreenPriv;
 | |
|     int i;
 | |
| #ifdef RENDER
 | |
|     PictureScreenPtr    ps = GetPictureScreenIfSet(pScreen);
 | |
| #endif
 | |
| 
 | |
|     /* Return successfully if no acceleration wanted */
 | |
|     if (!infoRec)
 | |
| 	return TRUE;
 | |
|     
 | |
|     if (!dixRequestPrivate(XAAGCKey, sizeof(XAAGCRec)))
 | |
| 	return FALSE;
 | |
| 
 | |
|     if (!dixRequestPrivate(XAAPixmapKey, sizeof(XAAPixmapRec)))
 | |
| 	return FALSE;
 | |
| 
 | |
|     if (!(pScreenPriv = xalloc(sizeof(XAAScreenRec))))
 | |
| 	return FALSE;
 | |
| 
 | |
|     dixSetPrivate(&pScreen->devPrivates, XAAScreenKey, pScreenPriv);
 | |
| 
 | |
|     if(!xf86FBManagerRunning(pScreen))
 | |
| 	infoRec->Flags &= ~(PIXMAP_CACHE | OFFSCREEN_PIXMAPS);
 | |
|     if(!(infoRec->Flags & LINEAR_FRAMEBUFFER))
 | |
| 	infoRec->Flags &= ~OFFSCREEN_PIXMAPS;
 | |
|    
 | |
|     if(!infoRec->FullPlanemask) { /* for backwards compatibility */
 | |
| 	infoRec->FullPlanemask =  (1 << pScrn->depth) - 1;
 | |
| 	infoRec->FullPlanemasks[pScrn->depth - 1] = infoRec->FullPlanemask;
 | |
|     }
 | |
| 
 | |
|     for(i = 0; i < 32; i++) {
 | |
| 	if(!infoRec->FullPlanemasks[i]) /* keep any set by caller */
 | |
| 	    infoRec->FullPlanemasks[i] = (1 << (i+1)) - 1;	
 | |
|     }
 | |
| 
 | |
|     if(!XAAInitAccel(pScreen, infoRec)) return FALSE;
 | |
|     pScreenPriv->AccelInfoRec = infoRec;
 | |
|     infoRec->ScratchGC.pScreen = pScreen;
 | |
| 
 | |
|     
 | |
|     if(!infoRec->GetImage)
 | |
| 	infoRec->GetImage = XAAGetImage;
 | |
|     if(!infoRec->GetSpans)
 | |
| 	infoRec->GetSpans = XAAGetSpans;
 | |
|     if(!infoRec->CopyWindow)
 | |
| 	infoRec->CopyWindow = XAACopyWindow;
 | |
| 
 | |
|     pScreenPriv->CreateGC = pScreen->CreateGC;
 | |
|     pScreen->CreateGC = XAACreateGC;
 | |
|     pScreenPriv->CloseScreen = pScreen->CloseScreen;
 | |
|     pScreen->CloseScreen = XAACloseScreen;
 | |
|     pScreenPriv->GetImage = pScreen->GetImage;
 | |
|     pScreen->GetImage = infoRec->GetImage;
 | |
|     pScreenPriv->GetSpans = pScreen->GetSpans;
 | |
|     pScreen->GetSpans = infoRec->GetSpans;
 | |
|     pScreenPriv->CopyWindow = pScreen->CopyWindow;
 | |
|     pScreen->CopyWindow = infoRec->CopyWindow;
 | |
|     pScreenPriv->CreatePixmap = pScreen->CreatePixmap;
 | |
|     pScreen->CreatePixmap = XAACreatePixmap;
 | |
|     pScreenPriv->DestroyPixmap = pScreen->DestroyPixmap;
 | |
|     pScreen->DestroyPixmap = XAADestroyPixmap;
 | |
|     pScreenPriv->ChangeWindowAttributes = pScreen->ChangeWindowAttributes;
 | |
|     pScreen->ChangeWindowAttributes = XAAChangeWindowAttributes;
 | |
| 
 | |
|     pScreenPriv->EnterVT = pScrn->EnterVT;
 | |
|     pScrn->EnterVT = XAAEnterVT; 
 | |
|     pScreenPriv->LeaveVT = pScrn->LeaveVT;
 | |
|     pScrn->LeaveVT = XAALeaveVT;
 | |
|     pScreenPriv->SetDGAMode = pScrn->SetDGAMode;
 | |
|     pScrn->SetDGAMode = XAASetDGAMode;
 | |
|     pScreenPriv->EnableDisableFBAccess = pScrn->EnableDisableFBAccess;
 | |
|     pScrn->EnableDisableFBAccess = XAAEnableDisableFBAccess;
 | |
| 
 | |
|     pScreenPriv->WindowExposures = pScreen->WindowExposures;
 | |
| #ifdef RENDER
 | |
|     if (ps)
 | |
|     {
 | |
| 	pScreenPriv->Composite = ps->Composite;
 | |
| 	ps->Composite = XAAComposite;
 | |
| 	pScreenPriv->Glyphs = ps->Glyphs;
 | |
| 	ps->Glyphs = XAAGlyphs;
 | |
|     }
 | |
| #endif    
 | |
|     if(pScrn->overlayFlags & OVERLAY_8_32_PLANAR)
 | |
|         XAASetupOverlay8_32Planar(pScreen);
 | |
| 
 | |
|     infoRec->PreAllocMem = xalloc(MAX_PREALLOC_MEM);
 | |
|     if(infoRec->PreAllocMem)
 | |
|     	infoRec->PreAllocSize = MAX_PREALLOC_MEM;
 | |
| 
 | |
|     if(infoRec->Flags & PIXMAP_CACHE) 
 | |
| 	xf86RegisterFreeBoxCallback(pScreen, infoRec->InitPixmapCache,
 | |
| 						(pointer)infoRec);
 | |
| 
 | |
|     if(infoRec->Flags & MICROSOFT_ZERO_LINE_BIAS)
 | |
| 	miSetZeroLineBias(pScreen, OCTANT1 | OCTANT2 | OCTANT3 | OCTANT4);
 | |
| 
 | |
| #ifdef COMPOSITE
 | |
|     /* Initialize the composite wrapper.  This needs to happen after the
 | |
|      * wrapping above (so it comes before us), but before all other extensions,
 | |
|      * so it doesn't confuse them. (particularly damage).
 | |
|      */
 | |
|     miInitializeCompositeWrapper(pScreen);
 | |
| #endif
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static Bool
 | |
| XAACloseScreen (int i, ScreenPtr pScreen)
 | |
| {
 | |
|     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
 | |
|     XAAScreenPtr pScreenPriv = 
 | |
| 	(XAAScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XAAScreenKey);
 | |
| 
 | |
|     pScrn->EnterVT = pScreenPriv->EnterVT; 
 | |
|     pScrn->LeaveVT = pScreenPriv->LeaveVT; 
 | |
|     pScrn->EnableDisableFBAccess = pScreenPriv->EnableDisableFBAccess;
 | |
|    
 | |
|     pScreen->CreateGC = pScreenPriv->CreateGC;
 | |
|     pScreen->CloseScreen = pScreenPriv->CloseScreen;
 | |
|     pScreen->GetImage = pScreenPriv->GetImage;
 | |
|     pScreen->GetSpans = pScreenPriv->GetSpans;
 | |
|     pScreen->CopyWindow = pScreenPriv->CopyWindow;
 | |
|     pScreen->WindowExposures = pScreenPriv->WindowExposures;
 | |
|     pScreen->CreatePixmap = pScreenPriv->CreatePixmap;
 | |
|     pScreen->DestroyPixmap = pScreenPriv->DestroyPixmap;
 | |
|     pScreen->ChangeWindowAttributes = pScreenPriv->ChangeWindowAttributes;
 | |
| 
 | |
|     /* We leave it up to the client to free the XAAInfoRec */
 | |
| 
 | |
|     xfree ((pointer) pScreenPriv);
 | |
| 
 | |
|     return (*pScreen->CloseScreen) (i, pScreen);
 | |
| }
 | |
| 
 | |
| static void
 | |
| XAAGetImage (
 | |
|     DrawablePtr pDraw,
 | |
|     int	sx, int sy, int w, int h,
 | |
|     unsigned int    format,
 | |
|     unsigned long   planemask,
 | |
|     char	    *pdstLine 
 | |
| )
 | |
| {
 | |
|     ScreenPtr pScreen = pDraw->pScreen;
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     ScrnInfoPtr pScrn = infoRec->pScrn;
 | |
| 
 | |
|     if(pScrn->vtSema && 
 | |
| 	((pDraw->type == DRAWABLE_WINDOW) || IS_OFFSCREEN_PIXMAP(pDraw))) 
 | |
|     {
 | |
| 	if(infoRec->ReadPixmap && (format == ZPixmap) && 
 | |
| 	   ((planemask & infoRec->FullPlanemasks[pDraw->depth - 1]) == 
 | |
|                            infoRec->FullPlanemasks[pDraw->depth - 1]) &&
 | |
| 	   (pDraw->bitsPerPixel == BitsPerPixel(pDraw->depth)))
 | |
| 	{
 | |
| 	    (*infoRec->ReadPixmap)(pScrn, 
 | |
| 		   sx + pDraw->x, sy + pDraw->y, w, h,
 | |
| 		   (unsigned char *)pdstLine,
 | |
| 		   PixmapBytePad(w, pDraw->depth), 
 | |
| 		   pDraw->bitsPerPixel, pDraw->depth);
 | |
| 	    return;
 | |
| 	}
 | |
| 	SYNC_CHECK(pDraw);
 | |
|     }
 | |
| 
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, GetImage);
 | |
|     (*pScreen->GetImage) (pDraw, sx, sy, w, h, format, planemask, pdstLine);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, GetImage, XAAGetImage);
 | |
| }
 | |
| 
 | |
| static void
 | |
| XAAGetSpans (
 | |
|     DrawablePtr pDraw,
 | |
|     int		wMax,
 | |
|     DDXPointPtr	ppt,
 | |
|     int		*pwidth,
 | |
|     int		nspans,
 | |
|     char	*pdstStart
 | |
| )
 | |
| {
 | |
|     ScreenPtr pScreen = pDraw->pScreen;
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, GetSpans);
 | |
|     if(xf86Screens[pScreen->myNum]->vtSema && 
 | |
| 	((pDraw->type == DRAWABLE_WINDOW) || IS_OFFSCREEN_PIXMAP(pDraw))) {
 | |
| 	SYNC_CHECK(pDraw);
 | |
|     }
 | |
|     (*pScreen->GetSpans) (pDraw, wMax, ppt, pwidth, nspans, pdstStart);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, GetSpans, XAAGetSpans);
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| XAAPixmapBPP (ScreenPtr pScreen, int depth)
 | |
| {
 | |
|     PixmapPtr	pPix;
 | |
|     int		bpp;
 | |
|     DestroyPixmapProcPtr    destroyPixmap;
 | |
|     
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
 | |
|     pPix = (*pScreen->CreatePixmap) (pScreen, 1, 1, depth,
 | |
| 				     CREATE_PIXMAP_USAGE_SCRATCH);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
 | |
|     if (!pPix)
 | |
| 	return 0;
 | |
|     bpp = pPix->drawable.bitsPerPixel;
 | |
|     destroyPixmap = pScreen->DestroyPixmap;
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, DestroyPixmap);
 | |
|     (*pScreen->DestroyPixmap) (pPix);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, DestroyPixmap, destroyPixmap);
 | |
|     return bpp;
 | |
| }
 | |
| 
 | |
| static void
 | |
| XAAInitializeOffscreenDepths (ScreenPtr pScreen)
 | |
| {
 | |
|     XAAInfoRecPtr   infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     ScrnInfoPtr	    pScrn = xf86Screens[pScreen->myNum];
 | |
|     int		    d, dep;
 | |
|     
 | |
|     infoRec->offscreenDepthsInitialized = TRUE;
 | |
|     infoRec->offscreenDepths = 0;
 | |
|     if (infoRec->Flags & OFFSCREEN_PIXMAPS) {
 | |
| 	for (d = 0; d < pScreen->numDepths; d++) {
 | |
| 	    dep = pScreen->allowedDepths[d].depth;
 | |
| 	    if (XAAPixmapBPP (pScreen, dep) == pScrn->bitsPerPixel)
 | |
| 		infoRec->offscreenDepths |= (1 << (dep - 1));
 | |
| 	}
 | |
|     }
 | |
| }
 | |
| 
 | |
| static PixmapPtr 
 | |
| XAACreatePixmap(ScreenPtr pScreen, int w, int h, int depth, unsigned usage_hint)
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
 | |
|     XAAPixmapPtr pPriv;
 | |
|     PixmapPtr pPix = NULL;
 | |
|     int size = w * h;
 | |
| 
 | |
|     if (w > 32767 || h > 32767)
 | |
| 	return NullPixmap;
 | |
|     
 | |
|     if (!infoRec->offscreenDepthsInitialized)
 | |
| 	XAAInitializeOffscreenDepths (pScreen);
 | |
| 
 | |
|     if(pScrn->vtSema &&
 | |
| 	(usage_hint != CREATE_PIXMAP_USAGE_GLYPH_PICTURE) &&
 | |
| 	(infoRec->offscreenDepths & (1 << (depth - 1))) &&
 | |
| 	(size >= MIN_OFFPIX_SIZE) && !SwitchedOut &&
 | |
| 	(!infoRec->maxOffPixWidth || (w <= infoRec->maxOffPixWidth)) &&
 | |
| 	(!infoRec->maxOffPixHeight || (h <= infoRec->maxOffPixHeight)) )
 | |
|     {
 | |
|         PixmapLinkPtr pLink;
 | |
| 	PixmapPtr pScreenPix;
 | |
|         FBAreaPtr area;
 | |
|         int gran = 0;
 | |
| 
 | |
| 	switch(pScrn->bitsPerPixel) {
 | |
|         case 24: 
 | |
|         case 8:  gran = 4;  break;
 | |
|         case 16: gran = 2;  break;
 | |
|         case 32: gran = 1;  break;
 | |
|         default: break;
 | |
|         }
 | |
| 
 | |
|         if(BITMAP_SCANLINE_PAD == 64)
 | |
|            gran *= 2;
 | |
| 
 | |
|         if(!(area = xf86AllocateOffscreenArea(pScreen, w, h, gran, 0,
 | |
|                                 XAARemoveAreaCallback, NULL))) {
 | |
| 	    goto BAILOUT;
 | |
| 	}
 | |
| 
 | |
|         if(!(pLink = xalloc(sizeof(PixmapLink)))) {
 | |
|             xf86FreeOffscreenArea(area);
 | |
| 	    goto BAILOUT;
 | |
| 	}
 | |
| 
 | |
| 	XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
 | |
| 	pPix = (*pScreen->CreatePixmap) (pScreen, 0, 0, depth, usage_hint);
 | |
| 	XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
 | |
| 
 | |
| 	if (!pPix) {
 | |
| 	    xfree (pLink);
 | |
|             xf86FreeOffscreenArea(area);
 | |
| 	    goto BAILOUT;
 | |
| 	}
 | |
| 	
 | |
| 	pScreenPix = (*pScreen->GetScreenPixmap)(pScreen);
 | |
| 
 | |
| 	pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
 | |
| 	pPix->drawable.x = area->box.x1;
 | |
| 	pPix->drawable.y = area->box.y1;
 | |
| 	pPix->drawable.width = w;
 | |
| 	pPix->drawable.height = h;
 | |
| 	pPix->drawable.bitsPerPixel = pScrn->bitsPerPixel;
 | |
| 	pPix->devKind = pScreenPix->devKind;
 | |
| 	pPix->devPrivate.ptr = pScreenPix->devPrivate.ptr;
 | |
| 	area->devPrivate.ptr = pPix;
 | |
| 
 | |
| 	pPriv->flags = OFFSCREEN;
 | |
| 	pPriv->offscreenArea = area;
 | |
|  	pPriv->freeData = FALSE;
 | |
| 	    
 | |
| 	pLink->next = infoRec->OffscreenPixmaps;
 | |
| 	pLink->pPix = pPix;
 | |
| 	infoRec->OffscreenPixmaps = pLink;
 | |
| 	return pPix;
 | |
|     }
 | |
| BAILOUT:
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, CreatePixmap);
 | |
|     pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, CreatePixmap, XAACreatePixmap);
 | |
| 
 | |
|     if(pPix) {
 | |
|        pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
 | |
|        pPriv->flags = 0;
 | |
|        pPriv->offscreenArea = NULL;
 | |
|        pPriv->freeData = FALSE;
 | |
|        if(!w || !h) /* either scratch or shared memory */
 | |
| 	    pPriv->flags |= SHARED_PIXMAP;
 | |
|     }
 | |
| 
 | |
|     return pPix;
 | |
| }
 | |
| 
 | |
| static Bool 
 | |
| XAADestroyPixmap(PixmapPtr pPix)
 | |
| {
 | |
|     ScreenPtr pScreen = pPix->drawable.pScreen;
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     XAAPixmapPtr pPriv = XAA_GET_PIXMAP_PRIVATE(pPix);
 | |
|     Bool ret;
 | |
| 
 | |
|     if(pPix->refcnt == 1) {
 | |
|         if(pPriv->flags & OFFSCREEN) {
 | |
| 	    if(pPriv->flags & DGA_PIXMAP)
 | |
| 	        xfree(pPriv->offscreenArea);
 | |
|             else {
 | |
| 	        FBAreaPtr area = pPriv->offscreenArea;
 | |
| 		PixmapLinkPtr pLink = infoRec->OffscreenPixmaps;
 | |
| 	        PixmapLinkPtr prev = NULL;
 | |
| 
 | |
| 		while(pLink->pPix != pPix) {
 | |
| 		    prev = pLink;
 | |
| 		    pLink = pLink->next;
 | |
| 		}
 | |
| 
 | |
| 	        if(prev) prev->next = pLink->next;
 | |
| 		else infoRec->OffscreenPixmaps = pLink->next;
 | |
| 
 | |
| 	        if(!area) area = pLink->area;
 | |
| 
 | |
| 	        xf86FreeOffscreenArea(area);
 | |
| 	        pPriv->offscreenArea = NULL;
 | |
| 	        xfree(pLink);
 | |
| 	    } 
 | |
|         }
 | |
| 
 | |
|         if(pPriv->freeData) { /* pixmaps that were once in video ram */
 | |
| 	    xfree(pPix->devPrivate.ptr);
 | |
| 	    pPix->devPrivate.ptr = NULL;
 | |
| 	}
 | |
|     }
 | |
|     
 | |
|     XAA_SCREEN_PROLOGUE (pScreen, DestroyPixmap);
 | |
|     ret = (*pScreen->DestroyPixmap) (pPix);
 | |
|     XAA_SCREEN_EPILOGUE (pScreen, DestroyPixmap, XAADestroyPixmap);
 | |
|  
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| static Bool
 | |
| XAAChangeWindowAttributes (WindowPtr pWin, unsigned long mask)
 | |
| {
 | |
|    ScreenPtr pScreen = pWin->drawable.pScreen;
 | |
|    Bool ret;
 | |
| 
 | |
|    XAA_SCREEN_PROLOGUE (pScreen, ChangeWindowAttributes);
 | |
|    ret = (*pScreen->ChangeWindowAttributes) (pWin, mask);
 | |
|    XAA_SCREEN_EPILOGUE (pScreen, ChangeWindowAttributes, XAAChangeWindowAttributes);
 | |
| 
 | |
|    /* we have to assume that shared memory pixmaps are dirty
 | |
|       because we can't wrap operations on them */
 | |
| 
 | |
|    if((mask & CWBackPixmap) && (pWin->backgroundState == BackgroundPixmap) &&
 | |
|       PIXMAP_IS_SHARED(pWin->background.pixmap))
 | |
|    {
 | |
|         XAAPixmapPtr pPixPriv = XAA_GET_PIXMAP_PRIVATE(pWin->background.pixmap);
 | |
| 	pPixPriv->flags |= DIRTY;
 | |
|    }
 | |
|    if((mask & CWBorderPixmap) && !(pWin->borderIsPixel) &&
 | |
|       PIXMAP_IS_SHARED(pWin->border.pixmap))
 | |
|    {
 | |
|         XAAPixmapPtr pPixPriv = XAA_GET_PIXMAP_PRIVATE(pWin->border.pixmap);
 | |
|         pPixPriv->flags |= DIRTY;
 | |
|    }
 | |
| 
 | |
|    return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| /*  These two aren't really needed for anything */
 | |
| 
 | |
| static Bool 
 | |
| XAAEnterVT(int index, int flags)
 | |
| {
 | |
|     ScreenPtr pScreen = screenInfo.screens[index];
 | |
|     XAAScreenPtr pScreenPriv = 
 | |
| 	(XAAScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XAAScreenKey);
 | |
| 
 | |
|     return((*pScreenPriv->EnterVT)(index, flags));
 | |
| }
 | |
| 
 | |
| static void 
 | |
| XAALeaveVT(int index, int flags)
 | |
| {
 | |
|     ScreenPtr pScreen = screenInfo.screens[index];
 | |
|     XAAScreenPtr pScreenPriv = 
 | |
| 	(XAAScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XAAScreenKey);
 | |
|     XAAInfoRecPtr infoRec = pScreenPriv->AccelInfoRec;
 | |
| 
 | |
|     if(infoRec->NeedToSync) {
 | |
|         (*infoRec->Sync)(infoRec->pScrn);
 | |
|         infoRec->NeedToSync = FALSE;
 | |
|     }
 | |
| 
 | |
|     (*pScreenPriv->LeaveVT)(index, flags);
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|    Bool UsingPixmapCache;
 | |
|    Bool CanDoColor8x8;
 | |
|    Bool CanDoMono8x8;
 | |
| } SavedCacheState, *SavedCacheStatePtr;
 | |
| 
 | |
| static int  
 | |
| XAASetDGAMode(int index, int num, DGADevicePtr devRet)
 | |
| {
 | |
|     ScreenPtr pScreen = screenInfo.screens[index];
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     XAAScreenPtr pScreenPriv = 
 | |
| 	(XAAScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XAAScreenKey);
 | |
|     int ret;
 | |
| 
 | |
|     if (!num && infoRec->dgaSaves) { /* restore old pixmap cache state */
 | |
| 	SavedCacheStatePtr state = (SavedCacheStatePtr)infoRec->dgaSaves;
 | |
| 	
 | |
| 	infoRec->UsingPixmapCache = state->UsingPixmapCache;	
 | |
| 	infoRec->CanDoColor8x8 = state->CanDoColor8x8;	
 | |
| 	infoRec->CanDoMono8x8 = state->CanDoMono8x8;
 | |
| 	xfree(infoRec->dgaSaves);
 | |
| 	infoRec->dgaSaves = NULL;
 | |
|     }
 | |
| 
 | |
|     ret = (*pScreenPriv->SetDGAMode)(index, num, devRet);
 | |
|     if(ret != Success) return ret;
 | |
| 
 | |
|     if(num && devRet->pPix) {  /* accelerate this pixmap */
 | |
| 	XAAPixmapPtr pixPriv = XAA_GET_PIXMAP_PRIVATE(devRet->pPix);
 | |
| 	FBAreaPtr area;
 | |
| 
 | |
| 	if((area = xalloc(sizeof(FBArea)))) {
 | |
| 	    area->pScreen = pScreen;
 | |
| 	    area->box.x1 = 0;
 | |
| 	    area->box.x2 = 0;
 | |
| 	    area->box.y1 = devRet->mode->pixmapWidth;
 | |
| 	    area->box.y2 = devRet->mode->pixmapHeight;
 | |
| 	    area->granularity = 0;
 | |
| 	    area->MoveAreaCallback = 0;
 | |
| 	    area->RemoveAreaCallback = 0;
 | |
| 	    area->devPrivate.ptr = 0;	
 | |
| 
 | |
| 	    pixPriv->flags |= OFFSCREEN | DGA_PIXMAP;
 | |
| 	    pixPriv->offscreenArea = area;
 | |
| 
 | |
| 	    if(!infoRec->dgaSaves) { /* save pixmap cache state */
 | |
| 		SavedCacheStatePtr state = xalloc(sizeof(SavedCacheState));
 | |
| 	
 | |
| 		state->UsingPixmapCache = infoRec->UsingPixmapCache;	
 | |
| 		state->CanDoColor8x8 = infoRec->CanDoColor8x8;	
 | |
| 		state->CanDoMono8x8 = infoRec->CanDoMono8x8;	
 | |
| 		infoRec->dgaSaves = (char*)state;
 | |
| 
 | |
| 		infoRec->UsingPixmapCache = FALSE;
 | |
| 		if(infoRec->PixmapCacheFlags & CACHE_MONO_8x8)
 | |
| 		    infoRec->CanDoMono8x8 = FALSE;
 | |
| 		if(infoRec->PixmapCacheFlags & CACHE_COLOR_8x8)
 | |
| 		    infoRec->CanDoColor8x8 = FALSE;
 | |
| 	    }
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| static void
 | |
| XAAEnableDisableFBAccess (int index, Bool enable)
 | |
| {
 | |
|     ScreenPtr pScreen = screenInfo.screens[index];
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
 | |
|     XAAScreenPtr pScreenPriv = 
 | |
| 	(XAAScreenPtr)dixLookupPrivate(&pScreen->devPrivates, XAAScreenKey);
 | |
| 
 | |
|     if(!enable) {
 | |
| 	if((infoRec->Flags & OFFSCREEN_PIXMAPS) && (infoRec->OffscreenPixmaps))
 | |
| 	    XAAMoveOutOffscreenPixmaps(pScreen);
 | |
| 	if(infoRec->Flags & PIXMAP_CACHE)
 | |
| 	    XAAInvalidatePixmapCache(pScreen);
 | |
| 	SwitchedOut = TRUE;
 | |
|     }
 | |
| 
 | |
|     (*pScreenPriv->EnableDisableFBAccess)(index, enable);
 | |
| 
 | |
|     if(enable) {
 | |
| 	if((infoRec->Flags & OFFSCREEN_PIXMAPS) && (infoRec->OffscreenPixmaps))
 | |
| 	    XAAMoveInOffscreenPixmaps(pScreen);
 | |
| 	SwitchedOut = FALSE;
 | |
|     }
 | |
| }
 |