16747b715Smrg/* 26747b715Smrg * Copyright (c) 2009 Tiago Vignatti 36747b715Smrg * 46747b715Smrg * Permission is hereby granted, free of charge, to any person 56747b715Smrg * obtaining a copy of this software and associated documentation 66747b715Smrg * files (the "Software"), to deal in the Software without 76747b715Smrg * restriction, including without limitation the rights to use, 86747b715Smrg * copy, modify, merge, publish, distribute, sublicense, and/or sell 96747b715Smrg * copies of the Software, and to permit persons to whom the 106747b715Smrg * Software is furnished to do so, subject to the following 116747b715Smrg * conditions: 126747b715Smrg * 136747b715Smrg * The above copyright notice and this permission notice shall be 146747b715Smrg * included in all copies or substantial portions of the Software. 156747b715Smrg * 166747b715Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 176747b715Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 186747b715Smrg * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 196747b715Smrg * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 206747b715Smrg * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 216747b715Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 226747b715Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 236747b715Smrg * OTHER DEALINGS IN THE SOFTWARE. 246747b715Smrg * 256747b715Smrg */ 266747b715Smrg 276747b715Smrg#ifdef HAVE_XORG_CONFIG_H 286747b715Smrg#include <xorg-config.h> 296747b715Smrg#endif 306747b715Smrg 316747b715Smrg#include "misc.h" 326747b715Smrg#include "xf86.h" 336747b715Smrg#include "xf86_OSproc.h" 346747b715Smrg#include <X11/X.h> 356747b715Smrg#include "colormapst.h" 366747b715Smrg#include "scrnintstr.h" 376747b715Smrg#include "screenint.h" 386747b715Smrg#include "gcstruct.h" 396747b715Smrg#include "pixmapstr.h" 406747b715Smrg#include "pixmap.h" 416747b715Smrg#include "windowstr.h" 426747b715Smrg#include "window.h" 436747b715Smrg#include "xf86str.h" 446747b715Smrg#include "mipointer.h" 456747b715Smrg#include "mipointrst.h" 4635c4bbdfSmrg#include "picturestr.h" 476747b715Smrg 486747b715Smrg#define WRAP_SCREEN(x,y) {pScreenPriv->x = pScreen->x; pScreen->x = y;} 496747b715Smrg 506747b715Smrg#define UNWRAP_SCREEN(x) pScreen->x = pScreenPriv->x 516747b715Smrg 5235c4bbdfSmrg#define SCREEN_PRIV() ((VGAarbiterScreenPtr) dixLookupPrivate(&(pScreen)->devPrivates, VGAarbiterScreenKey)) 5335c4bbdfSmrg 5435c4bbdfSmrg#define SCREEN_PROLOG(x) (pScreen->x = SCREEN_PRIV()->x) 556747b715Smrg 5635c4bbdfSmrg#define SCREEN_EPILOG(x,y) do { \ 5735c4bbdfSmrg SCREEN_PRIV()->x = pScreen->x; \ 5835c4bbdfSmrg pScreen->x = y; \ 5935c4bbdfSmrg } while (0) 606747b715Smrg 616747b715Smrg#define WRAP_PICT(x,y) if (ps) {pScreenPriv->x = ps->x;\ 626747b715Smrg ps->x = y;} 636747b715Smrg 646747b715Smrg#define UNWRAP_PICT(x) if (ps) {ps->x = pScreenPriv->x;} 656747b715Smrg 666747b715Smrg#define PICTURE_PROLOGUE(field) ps->field = \ 676747b715Smrg ((VGAarbiterScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, \ 686747b715Smrg VGAarbiterScreenKey))->field 696747b715Smrg 706747b715Smrg#define PICTURE_EPILOGUE(field, wrap) ps->field = wrap 716747b715Smrg 726747b715Smrg#define WRAP_SCREEN_INFO(x,y) do {pScreenPriv->x = pScrn->x; pScrn->x = y;} while(0) 736747b715Smrg 746747b715Smrg#define UNWRAP_SCREEN_INFO(x) pScrn->x = pScreenPriv->x 756747b715Smrg 761b5d61b8Smrg#define SPRITE_PROLOG \ 771b5d61b8Smrg miPointerScreenPtr PointPriv; \ 781b5d61b8Smrg VGAarbiterScreenPtr pScreenPriv; \ 791b5d61b8Smrg input_lock(); \ 801b5d61b8Smrg PointPriv = dixLookupPrivate(&pScreen->devPrivates, \ 811b5d61b8Smrg miPointerScreenKey); \ 821b5d61b8Smrg pScreenPriv = dixLookupPrivate(&(pScreen)->devPrivates, \ 831b5d61b8Smrg VGAarbiterScreenKey); \ 841b5d61b8Smrg PointPriv->spriteFuncs = pScreenPriv->miSprite; \ 851b5d61b8Smrg 861b5d61b8Smrg#define SPRITE_EPILOG \ 871b5d61b8Smrg pScreenPriv->miSprite = PointPriv->spriteFuncs; \ 881b5d61b8Smrg PointPriv->spriteFuncs = &VGAarbiterSpriteFuncs; \ 891b5d61b8Smrg input_unlock(); 906747b715Smrg 916747b715Smrg#define WRAP_SPRITE do { pScreenPriv->miSprite = PointPriv->spriteFuncs;\ 926747b715Smrg PointPriv->spriteFuncs = &VGAarbiterSpriteFuncs; \ 936747b715Smrg } while (0) 946747b715Smrg 956747b715Smrg#define UNWRAP_SPRITE PointPriv->spriteFuncs = pScreenPriv->miSprite 966747b715Smrg 976747b715Smrg#define GC_WRAP(x) pGCPriv->wrapOps = (x)->ops;\ 986747b715Smrg pGCPriv->wrapFuncs = (x)->funcs; (x)->ops = &VGAarbiterGCOps;\ 996747b715Smrg (x)->funcs = &VGAarbiterGCFuncs; 1006747b715Smrg 1016747b715Smrg#define GC_UNWRAP(x) VGAarbiterGCPtr pGCPriv = \ 1026747b715Smrg (VGAarbiterGCPtr)dixLookupPrivate(&(x)->devPrivates, VGAarbiterGCKey);\ 1036747b715Smrg (x)->ops = pGCPriv->wrapOps; (x)->funcs = pGCPriv->wrapFuncs; 1046747b715Smrg 1059ace9065Smrgstatic inline void 10635c4bbdfSmrgVGAGet(ScreenPtr pScreen) 10735c4bbdfSmrg{ 10835c4bbdfSmrg pci_device_vgaarb_set_target(xf86ScreenToScrn(pScreen)->vgaDev); 1096747b715Smrg pci_device_vgaarb_lock(); 1109ace9065Smrg} 1116747b715Smrg 1129ace9065Smrgstatic inline void 11335c4bbdfSmrgVGAPut(void) 11435c4bbdfSmrg{ 1156747b715Smrg pci_device_vgaarb_unlock(); 1169ace9065Smrg} 1176747b715Smrg 1186747b715Smrgtypedef struct _VGAarbiterScreen { 11935c4bbdfSmrg CreateGCProcPtr CreateGC; 12035c4bbdfSmrg CloseScreenProcPtr CloseScreen; 12135c4bbdfSmrg ScreenBlockHandlerProcPtr BlockHandler; 12235c4bbdfSmrg ScreenWakeupHandlerProcPtr WakeupHandler; 12335c4bbdfSmrg GetImageProcPtr GetImage; 12435c4bbdfSmrg GetSpansProcPtr GetSpans; 12535c4bbdfSmrg SourceValidateProcPtr SourceValidate; 12635c4bbdfSmrg CopyWindowProcPtr CopyWindow; 12735c4bbdfSmrg ClearToBackgroundProcPtr ClearToBackground; 12835c4bbdfSmrg CreatePixmapProcPtr CreatePixmap; 12935c4bbdfSmrg SaveScreenProcPtr SaveScreen; 1306747b715Smrg /* Colormap */ 13135c4bbdfSmrg StoreColorsProcPtr StoreColors; 1326747b715Smrg /* Cursor */ 13335c4bbdfSmrg DisplayCursorProcPtr DisplayCursor; 13435c4bbdfSmrg RealizeCursorProcPtr RealizeCursor; 13535c4bbdfSmrg UnrealizeCursorProcPtr UnrealizeCursor; 13635c4bbdfSmrg RecolorCursorProcPtr RecolorCursor; 13735c4bbdfSmrg SetCursorPositionProcPtr SetCursorPosition; 13835c4bbdfSmrg void (*AdjustFrame) (ScrnInfoPtr, int, int); 13935c4bbdfSmrg Bool (*SwitchMode) (ScrnInfoPtr, DisplayModePtr); 14035c4bbdfSmrg Bool (*EnterVT) (ScrnInfoPtr); 14135c4bbdfSmrg void (*LeaveVT) (ScrnInfoPtr); 14235c4bbdfSmrg void (*FreeScreen) (ScrnInfoPtr); 14335c4bbdfSmrg miPointerSpriteFuncPtr miSprite; 14435c4bbdfSmrg CompositeProcPtr Composite; 14535c4bbdfSmrg GlyphsProcPtr Glyphs; 14635c4bbdfSmrg CompositeRectsProcPtr CompositeRects; 1476747b715Smrg} VGAarbiterScreenRec, *VGAarbiterScreenPtr; 1486747b715Smrg 1496747b715Smrgtypedef struct _VGAarbiterGC { 15035c4bbdfSmrg const GCOps *wrapOps; 15135c4bbdfSmrg const GCFuncs *wrapFuncs; 1526747b715Smrg} VGAarbiterGCRec, *VGAarbiterGCPtr; 1536747b715Smrg 1546747b715Smrg/* Screen funcs */ 1551b5d61b8Smrgstatic void VGAarbiterBlockHandler(ScreenPtr pScreen, void *pTimeout); 1561b5d61b8Smrgstatic void VGAarbiterWakeupHandler(ScreenPtr pScreen, int result); 15735c4bbdfSmrgstatic Bool VGAarbiterCloseScreen(ScreenPtr pScreen); 15835c4bbdfSmrgstatic void VGAarbiterGetImage(DrawablePtr pDrawable, int sx, int sy, int w, 15935c4bbdfSmrg int h, unsigned int format, 16035c4bbdfSmrg unsigned long planemask, char *pdstLine); 16135c4bbdfSmrgstatic void VGAarbiterGetSpans(DrawablePtr pDrawable, int wMax, DDXPointPtr ppt, 16235c4bbdfSmrg int *pwidth, int nspans, char *pdstStart); 16335c4bbdfSmrgstatic void VGAarbiterSourceValidate(DrawablePtr pDrawable, int x, int y, 16435c4bbdfSmrg int width, int height, 16535c4bbdfSmrg unsigned int subWindowMode); 1666747b715Smrgstatic void VGAarbiterCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, 16735c4bbdfSmrg RegionPtr prgnSrc); 16835c4bbdfSmrgstatic void VGAarbiterClearToBackground(WindowPtr pWin, int x, int y, int w, 16935c4bbdfSmrg int h, Bool generateExposures); 1706747b715Smrgstatic PixmapPtr VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, 17135c4bbdfSmrg int depth, unsigned int usage_hint); 17235c4bbdfSmrgstatic Bool VGAarbiterCreateGC(GCPtr pGC); 1736747b715Smrgstatic Bool VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank); 17435c4bbdfSmrgstatic void VGAarbiterStoreColors(ColormapPtr pmap, int ndef, xColorItem 17535c4bbdfSmrg * pdefs); 17635c4bbdfSmrgstatic void VGAarbiterRecolorCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 17735c4bbdfSmrg CursorPtr pCurs, Bool displayed); 17835c4bbdfSmrgstatic Bool VGAarbiterRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 17935c4bbdfSmrg CursorPtr pCursor); 18035c4bbdfSmrgstatic Bool VGAarbiterUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 18135c4bbdfSmrg CursorPtr pCursor); 18235c4bbdfSmrgstatic Bool VGAarbiterDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 18335c4bbdfSmrg CursorPtr pCursor); 18435c4bbdfSmrgstatic Bool VGAarbiterSetCursorPosition(DeviceIntPtr pDev, ScreenPtr 18535c4bbdfSmrg pScreen, int x, int y, 18635c4bbdfSmrg Bool generateEvent); 18735c4bbdfSmrgstatic void VGAarbiterAdjustFrame(ScrnInfoPtr pScrn, int x, int y); 18835c4bbdfSmrgstatic Bool VGAarbiterSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode); 18935c4bbdfSmrgstatic Bool VGAarbiterEnterVT(ScrnInfoPtr pScrn); 19035c4bbdfSmrgstatic void VGAarbiterLeaveVT(ScrnInfoPtr pScrn); 19135c4bbdfSmrgstatic void VGAarbiterFreeScreen(ScrnInfoPtr pScrn); 1926747b715Smrg 1936747b715Smrg/* GC funcs */ 1946747b715Smrgstatic void VGAarbiterValidateGC(GCPtr pGC, unsigned long changes, 19535c4bbdfSmrg DrawablePtr pDraw); 1966747b715Smrgstatic void VGAarbiterChangeGC(GCPtr pGC, unsigned long mask); 1976747b715Smrgstatic void VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst); 1986747b715Smrgstatic void VGAarbiterDestroyGC(GCPtr pGC); 19935c4bbdfSmrgstatic void VGAarbiterChangeClip(GCPtr pGC, int type, void *pvalue, 20035c4bbdfSmrg int nrects); 2016747b715Smrgstatic void VGAarbiterDestroyClip(GCPtr pGC); 2026747b715Smrgstatic void VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc); 2036747b715Smrg 2046747b715Smrg/* GC ops */ 20535c4bbdfSmrgstatic void VGAarbiterFillSpans(DrawablePtr pDraw, GC * pGC, int nInit, 20635c4bbdfSmrg DDXPointPtr pptInit, int *pwidthInit, 20735c4bbdfSmrg int fSorted); 2086747b715Smrgstatic void VGAarbiterSetSpans(DrawablePtr pDraw, GCPtr pGC, char *pcharsrc, 20935c4bbdfSmrg register DDXPointPtr ppt, int *pwidth, 21035c4bbdfSmrg int nspans, int fSorted); 21135c4bbdfSmrgstatic void VGAarbiterPutImage(DrawablePtr pDraw, GCPtr pGC, int depth, int x, 21235c4bbdfSmrg int y, int w, int h, int leftPad, int format, 21335c4bbdfSmrg char *pImage); 2146747b715Smrgstatic RegionPtr VGAarbiterCopyArea(DrawablePtr pSrc, DrawablePtr pDst, 21535c4bbdfSmrg GC * pGC, int srcx, int srcy, int width, 21635c4bbdfSmrg int height, int dstx, int dsty); 2176747b715Smrgstatic RegionPtr VGAarbiterCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, 21835c4bbdfSmrg GCPtr pGC, int srcx, int srcy, int width, 21935c4bbdfSmrg int height, int dstx, int dsty, 22035c4bbdfSmrg unsigned long bitPlane); 22135c4bbdfSmrgstatic void VGAarbiterPolyPoint(DrawablePtr pDraw, GCPtr pGC, int mode, int npt, 22235c4bbdfSmrg xPoint * pptInit); 22335c4bbdfSmrgstatic void VGAarbiterPolylines(DrawablePtr pDraw, GCPtr pGC, int mode, int npt, 22435c4bbdfSmrg DDXPointPtr pptInit); 2256747b715Smrgstatic void VGAarbiterPolySegment(DrawablePtr pDraw, GCPtr pGC, int nseg, 22635c4bbdfSmrg xSegment * pSeg); 2276747b715Smrgstatic void VGAarbiterPolyRectangle(DrawablePtr pDraw, GCPtr pGC, 22835c4bbdfSmrg int nRectsInit, xRectangle *pRectsInit); 2296747b715Smrgstatic void VGAarbiterPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, 23035c4bbdfSmrg xArc * parcs); 2316747b715Smrgstatic void VGAarbiterFillPolygon(DrawablePtr pDraw, GCPtr pGC, int shape, 23235c4bbdfSmrg int mode, int count, DDXPointPtr ptsIn); 23335c4bbdfSmrgstatic void VGAarbiterPolyFillRect(DrawablePtr pDraw, GCPtr pGC, int nrectFill, 23435c4bbdfSmrg xRectangle *prectInit); 2356747b715Smrgstatic void VGAarbiterPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcs, 23635c4bbdfSmrg xArc * parcs); 2376747b715Smrgstatic int VGAarbiterPolyText8(DrawablePtr pDraw, GCPtr pGC, int x, int y, 23835c4bbdfSmrg int count, char *chars); 2396747b715Smrgstatic int VGAarbiterPolyText16(DrawablePtr pDraw, GCPtr pGC, int x, int y, 24035c4bbdfSmrg int count, unsigned short *chars); 2416747b715Smrgstatic void VGAarbiterImageText8(DrawablePtr pDraw, GCPtr pGC, int x, int y, 24235c4bbdfSmrg int count, char *chars); 2436747b715Smrgstatic void VGAarbiterImageText16(DrawablePtr pDraw, GCPtr pGC, int x, int y, 24435c4bbdfSmrg int count, unsigned short *chars); 2456747b715Smrgstatic void VGAarbiterImageGlyphBlt(DrawablePtr pDraw, GCPtr pGC, int xInit, 24635c4bbdfSmrg int yInit, unsigned int nglyph, 24735c4bbdfSmrg CharInfoPtr * ppci, void *pglyphBase); 2486747b715Smrgstatic void VGAarbiterPolyGlyphBlt(DrawablePtr pDraw, GCPtr pGC, int xInit, 24935c4bbdfSmrg int yInit, unsigned int nglyph, 25035c4bbdfSmrg CharInfoPtr * ppci, void *pglyphBase); 2516747b715Smrgstatic void VGAarbiterPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr 25235c4bbdfSmrg pDraw, int dx, int dy, int xOrg, int yOrg); 2536747b715Smrg 2546747b715Smrg/* miSpriteFuncs */ 2556747b715Smrgstatic Bool VGAarbiterSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr 25635c4bbdfSmrg pScreen, CursorPtr pCur); 2576747b715Smrgstatic Bool VGAarbiterSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr 25835c4bbdfSmrg pScreen, CursorPtr pCur); 2596747b715Smrgstatic void VGAarbiterSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 26035c4bbdfSmrg CursorPtr pCur, int x, int y); 2616747b715Smrgstatic void VGAarbiterSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 26235c4bbdfSmrg int x, int y); 26335c4bbdfSmrgstatic Bool VGAarbiterDeviceCursorInitialize(DeviceIntPtr pDev, 26435c4bbdfSmrg ScreenPtr pScreen); 2656747b715Smrgstatic void VGAarbiterDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen); 2666747b715Smrg 2676747b715Smrgstatic void VGAarbiterComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, 26835c4bbdfSmrg PicturePtr pDst, INT16 xSrc, INT16 ySrc, 26935c4bbdfSmrg INT16 xMask, INT16 yMask, INT16 xDst, 27035c4bbdfSmrg INT16 yDst, CARD16 width, CARD16 height); 2716747b715Smrgstatic void VGAarbiterGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst, 27235c4bbdfSmrg PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, 27335c4bbdfSmrg int nlist, GlyphListPtr list, GlyphPtr * glyphs); 27435c4bbdfSmrgstatic void VGAarbiterCompositeRects(CARD8 op, PicturePtr pDst, 27535c4bbdfSmrg xRenderColor * color, int nRect, 27635c4bbdfSmrg xRectangle *rects); 277