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