xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

xf86VGAarbiter.c (27479B)


      1 /*
      2  * This code was stolen from RAC and adapted to control the legacy vga
      3  * interface.
      4  *
      5  *
      6  * Copyright (c) 2007 Paulo R. Zanoni, Tiago Vignatti
      7  *
      8  * Permission is hereby granted, free of charge, to any person
      9  * obtaining a copy of this software and associated documentation
     10  * files (the "Software"), to deal in the Software without
     11  * restriction, including without limitation the rights to use,
     12  * copy, modify, merge, publish, distribute, sublicense, and/or sell
     13  * copies of the Software, and to permit persons to whom the
     14  * Software is furnished to do so, subject to the following
     15  * conditions:
     16  *
     17  * The above copyright notice and this permission notice shall be
     18  * included in all copies or substantial portions of the Software.
     19  *
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
     22  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     24  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     25  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     26  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     27  * OTHER DEALINGS IN THE SOFTWARE.
     28  *
     29  */
     30 
     31 #include "xorg-config.h"
     32 
     33 #include "xf86VGAarbiter.h"
     34 #include "xf86VGAarbiterPriv.h"
     35 #include "xf86Bus.h"
     36 #include "xf86Priv.h"
     37 #include "pciaccess.h"
     38 
     39 static GCFuncs VGAarbiterGCFuncs = {
     40     VGAarbiterValidateGC, VGAarbiterChangeGC, VGAarbiterCopyGC,
     41     VGAarbiterDestroyGC, VGAarbiterChangeClip, VGAarbiterDestroyClip,
     42     VGAarbiterCopyClip
     43 };
     44 
     45 static GCOps VGAarbiterGCOps = {
     46     VGAarbiterFillSpans, VGAarbiterSetSpans, VGAarbiterPutImage,
     47     VGAarbiterCopyArea, VGAarbiterCopyPlane, VGAarbiterPolyPoint,
     48     VGAarbiterPolylines, VGAarbiterPolySegment, VGAarbiterPolyRectangle,
     49     VGAarbiterPolyArc, VGAarbiterFillPolygon, VGAarbiterPolyFillRect,
     50     VGAarbiterPolyFillArc, VGAarbiterPolyText8, VGAarbiterPolyText16,
     51     VGAarbiterImageText8, VGAarbiterImageText16, VGAarbiterImageGlyphBlt,
     52     VGAarbiterPolyGlyphBlt, VGAarbiterPushPixels,
     53 };
     54 
     55 static miPointerSpriteFuncRec VGAarbiterSpriteFuncs = {
     56     VGAarbiterSpriteRealizeCursor, VGAarbiterSpriteUnrealizeCursor,
     57     VGAarbiterSpriteSetCursor, VGAarbiterSpriteMoveCursor,
     58     VGAarbiterDeviceCursorInitialize, VGAarbiterDeviceCursorCleanup
     59 };
     60 
     61 static DevPrivateKeyRec VGAarbiterScreenKeyRec;
     62 
     63 #define VGAarbiterScreenKey (&VGAarbiterScreenKeyRec)
     64 static DevPrivateKeyRec VGAarbiterGCKeyRec;
     65 
     66 #define VGAarbiterGCKey (&VGAarbiterGCKeyRec)
     67 
     68 static int vga_no_arb = 0;
     69 void
     70 xf86VGAarbiterInit(void)
     71 {
     72     if (pci_device_vgaarb_init() != 0) {
     73         vga_no_arb = 1;
     74         xf86Msg(X_WARNING,
     75                 "VGA arbiter: cannot open kernel arbiter, no multi-card support\n");
     76     }
     77 }
     78 
     79 void
     80 xf86VGAarbiterFini(void)
     81 {
     82     if (vga_no_arb)
     83         return;
     84     pci_device_vgaarb_fini();
     85 }
     86 
     87 void
     88 xf86VGAarbiterLock(ScrnInfoPtr pScrn)
     89 {
     90     if (vga_no_arb)
     91         return;
     92     pci_device_vgaarb_set_target(pScrn->vgaDev);
     93     pci_device_vgaarb_lock();
     94 }
     95 
     96 void
     97 xf86VGAarbiterUnlock(ScrnInfoPtr pScrn)
     98 {
     99     if (vga_no_arb)
    100         return;
    101     pci_device_vgaarb_unlock();
    102 }
    103 
    104 Bool
    105 xf86VGAarbiterAllowDRI(ScreenPtr pScreen)
    106 {
    107     int vga_count;
    108     int rsrc_decodes = 0;
    109     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    110 
    111     if (vga_no_arb)
    112         return TRUE;
    113 
    114     pci_device_vgaarb_get_info(pScrn->vgaDev, &vga_count, &rsrc_decodes);
    115     if (vga_count > 1) {
    116         if (rsrc_decodes) {
    117             return FALSE;
    118         }
    119     }
    120     return TRUE;
    121 }
    122 
    123 void
    124 xf86VGAarbiterScrnInit(ScrnInfoPtr pScrn)
    125 {
    126     struct pci_device *dev;
    127     EntityPtr pEnt;
    128 
    129     if (vga_no_arb)
    130         return;
    131 
    132     pEnt = xf86Entities[pScrn->entityList[0]];
    133     if (pEnt->bus.type != BUS_PCI)
    134         return;
    135 
    136     dev = pEnt->bus.id.pci;
    137     pScrn->vgaDev = dev;
    138 }
    139 
    140 void
    141 xf86VGAarbiterDeviceDecodes(ScrnInfoPtr pScrn, int rsrc)
    142 {
    143     if (vga_no_arb)
    144         return;
    145     pci_device_vgaarb_set_target(pScrn->vgaDev);
    146     pci_device_vgaarb_decodes(rsrc);
    147 }
    148 
    149 Bool
    150 xf86VGAarbiterWrapFunctions(void)
    151 {
    152     ScrnInfoPtr pScrn;
    153     VGAarbiterScreenPtr pScreenPriv;
    154     miPointerScreenPtr PointPriv;
    155     PictureScreenPtr ps;
    156     ScreenPtr pScreen;
    157     int vga_count, i;
    158 
    159     if (vga_no_arb)
    160         return FALSE;
    161 
    162     /*
    163      * we need to wrap the arbiter if we have more than
    164      * one VGA card - hotplug cries.
    165      */
    166     pci_device_vgaarb_get_info(NULL, &vga_count, NULL);
    167     if (vga_count < 2 || !xf86Screens)
    168         return FALSE;
    169 
    170     xf86Msg(X_INFO, "Found %d VGA devices: arbiter wrapping enabled\n",
    171             vga_count);
    172 
    173     for (i = 0; i < xf86NumScreens; i++) {
    174         pScreen = xf86Screens[i]->pScreen;
    175         ps = GetPictureScreenIfSet(pScreen);
    176         pScrn = xf86ScreenToScrn(pScreen);
    177         PointPriv = dixLookupPrivate(&pScreen->devPrivates, miPointerScreenKey);
    178 
    179         if (!dixRegisterPrivateKey
    180             (&VGAarbiterGCKeyRec, PRIVATE_GC, sizeof(VGAarbiterGCRec)))
    181             return FALSE;
    182 
    183         if (!dixRegisterPrivateKey(&VGAarbiterScreenKeyRec, PRIVATE_SCREEN, 0))
    184             return FALSE;
    185 
    186         if (!(pScreenPriv = malloc(sizeof(VGAarbiterScreenRec))))
    187             return FALSE;
    188 
    189         dixSetPrivate(&pScreen->devPrivates, VGAarbiterScreenKey, pScreenPriv);
    190 
    191         WRAP_SCREEN(CloseScreen, VGAarbiterCloseScreen);
    192         WRAP_SCREEN(SaveScreen, VGAarbiterSaveScreen);
    193         WRAP_SCREEN(WakeupHandler, VGAarbiterWakeupHandler);
    194         WRAP_SCREEN(BlockHandler, VGAarbiterBlockHandler);
    195         WRAP_SCREEN(CreateGC, VGAarbiterCreateGC);
    196         WRAP_SCREEN(GetImage, VGAarbiterGetImage);
    197         WRAP_SCREEN(GetSpans, VGAarbiterGetSpans);
    198         WRAP_SCREEN(SourceValidate, VGAarbiterSourceValidate);
    199         WRAP_SCREEN(CopyWindow, VGAarbiterCopyWindow);
    200         WRAP_SCREEN(ClearToBackground, VGAarbiterClearToBackground);
    201         WRAP_SCREEN(CreatePixmap, VGAarbiterCreatePixmap);
    202         WRAP_SCREEN(StoreColors, VGAarbiterStoreColors);
    203         WRAP_SCREEN(DisplayCursor, VGAarbiterDisplayCursor);
    204         WRAP_SCREEN(RealizeCursor, VGAarbiterRealizeCursor);
    205         WRAP_SCREEN(UnrealizeCursor, VGAarbiterUnrealizeCursor);
    206         WRAP_SCREEN(RecolorCursor, VGAarbiterRecolorCursor);
    207         WRAP_SCREEN(SetCursorPosition, VGAarbiterSetCursorPosition);
    208         WRAP_PICT(Composite, VGAarbiterComposite);
    209         WRAP_PICT(Glyphs, VGAarbiterGlyphs);
    210         WRAP_PICT(CompositeRects, VGAarbiterCompositeRects);
    211         WRAP_SCREEN_INFO(AdjustFrame, VGAarbiterAdjustFrame);
    212         WRAP_SCREEN_INFO(SwitchMode, VGAarbiterSwitchMode);
    213         WRAP_SCREEN_INFO(EnterVT, VGAarbiterEnterVT);
    214         WRAP_SCREEN_INFO(LeaveVT, VGAarbiterLeaveVT);
    215         WRAP_SCREEN_INFO(FreeScreen, VGAarbiterFreeScreen);
    216         WRAP_SPRITE;
    217     }
    218 
    219     return TRUE;
    220 }
    221 
    222 /* Screen funcs */
    223 static Bool
    224 VGAarbiterCloseScreen(ScreenPtr pScreen)
    225 {
    226     Bool val;
    227     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
    228     VGAarbiterScreenPtr pScreenPriv =
    229         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    230                                                VGAarbiterScreenKey);
    231     miPointerScreenPtr PointPriv =
    232         (miPointerScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    233                                               miPointerScreenKey);
    234     PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
    235 
    236     UNWRAP_SCREEN(CreateGC);
    237     UNWRAP_SCREEN(CloseScreen);
    238     UNWRAP_SCREEN(GetImage);
    239     UNWRAP_SCREEN(GetSpans);
    240     UNWRAP_SCREEN(SourceValidate);
    241     UNWRAP_SCREEN(CopyWindow);
    242     UNWRAP_SCREEN(ClearToBackground);
    243     UNWRAP_SCREEN(SaveScreen);
    244     UNWRAP_SCREEN(StoreColors);
    245     UNWRAP_SCREEN(DisplayCursor);
    246     UNWRAP_SCREEN(RealizeCursor);
    247     UNWRAP_SCREEN(UnrealizeCursor);
    248     UNWRAP_SCREEN(RecolorCursor);
    249     UNWRAP_SCREEN(SetCursorPosition);
    250     UNWRAP_PICT(Composite);
    251     UNWRAP_PICT(Glyphs);
    252     UNWRAP_PICT(CompositeRects);
    253     UNWRAP_SCREEN_INFO(AdjustFrame);
    254     UNWRAP_SCREEN_INFO(SwitchMode);
    255     UNWRAP_SCREEN_INFO(EnterVT);
    256     UNWRAP_SCREEN_INFO(LeaveVT);
    257     UNWRAP_SCREEN_INFO(FreeScreen);
    258     UNWRAP_SPRITE;
    259 
    260     free((void *) pScreenPriv);
    261     xf86VGAarbiterLock(xf86ScreenToScrn(pScreen));
    262     val = (*pScreen->CloseScreen) (pScreen);
    263     xf86VGAarbiterUnlock(xf86ScreenToScrn(pScreen));
    264     return val;
    265 }
    266 
    267 static void
    268 VGAarbiterBlockHandler(ScreenPtr pScreen, void *pTimeout)
    269 {
    270     SCREEN_PROLOG(BlockHandler);
    271     VGAGet(pScreen);
    272     pScreen->BlockHandler(pScreen, pTimeout);
    273     VGAPut();
    274     SCREEN_EPILOG(BlockHandler, VGAarbiterBlockHandler);
    275 }
    276 
    277 static void
    278 VGAarbiterWakeupHandler(ScreenPtr pScreen, int result)
    279 {
    280     SCREEN_PROLOG(WakeupHandler);
    281     VGAGet(pScreen);
    282     pScreen->WakeupHandler(pScreen, result);
    283     VGAPut();
    284     SCREEN_EPILOG(WakeupHandler, VGAarbiterWakeupHandler);
    285 }
    286 
    287 static void
    288 VGAarbiterGetImage(DrawablePtr pDrawable,
    289                    int sx, int sy, int w, int h,
    290                    unsigned int format, unsigned long planemask, char *pdstLine)
    291 {
    292     ScreenPtr pScreen = pDrawable->pScreen;
    293 
    294     SCREEN_PROLOG(GetImage);
    295     VGAGet(pScreen);
    296     (*pScreen->GetImage) (pDrawable, sx, sy, w, h, format, planemask, pdstLine);
    297     VGAPut();
    298     SCREEN_EPILOG(GetImage, VGAarbiterGetImage);
    299 }
    300 
    301 static void
    302 VGAarbiterGetSpans(DrawablePtr pDrawable,
    303                    int wMax,
    304                    DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart)
    305 {
    306     ScreenPtr pScreen = pDrawable->pScreen;
    307 
    308     SCREEN_PROLOG(GetSpans);
    309     VGAGet(pScreen);
    310     (*pScreen->GetSpans) (pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
    311     VGAPut();
    312     SCREEN_EPILOG(GetSpans, VGAarbiterGetSpans);
    313 }
    314 
    315 static void
    316 VGAarbiterSourceValidate(DrawablePtr pDrawable,
    317                          int x, int y, int width, int height,
    318                          unsigned int subWindowMode)
    319 {
    320     ScreenPtr pScreen = pDrawable->pScreen;
    321 
    322     SCREEN_PROLOG(SourceValidate);
    323     VGAGet(pScreen);
    324     (*pScreen->SourceValidate) (pDrawable, x, y, width, height,
    325                                 subWindowMode);
    326     VGAPut();
    327     SCREEN_EPILOG(SourceValidate, VGAarbiterSourceValidate);
    328 }
    329 
    330 static void
    331 VGAarbiterCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
    332 {
    333     ScreenPtr pScreen = pWin->drawable.pScreen;
    334 
    335     SCREEN_PROLOG(CopyWindow);
    336     VGAGet(pScreen);
    337     (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc);
    338     VGAPut();
    339     SCREEN_EPILOG(CopyWindow, VGAarbiterCopyWindow);
    340 }
    341 
    342 static void
    343 VGAarbiterClearToBackground(WindowPtr pWin,
    344                             int x, int y, int w, int h, Bool generateExposures)
    345 {
    346     ScreenPtr pScreen = pWin->drawable.pScreen;
    347 
    348     SCREEN_PROLOG(ClearToBackground);
    349     VGAGet(pScreen);
    350     (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures);
    351     VGAPut();
    352     SCREEN_EPILOG(ClearToBackground, VGAarbiterClearToBackground);
    353 }
    354 
    355 static PixmapPtr
    356 VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, int depth,
    357                        unsigned usage_hint)
    358 {
    359     PixmapPtr pPix;
    360 
    361     SCREEN_PROLOG(CreatePixmap);
    362     VGAGet(pScreen);
    363     pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint);
    364     VGAPut();
    365     SCREEN_EPILOG(CreatePixmap, VGAarbiterCreatePixmap);
    366 
    367     return pPix;
    368 }
    369 
    370 static Bool
    371 VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank)
    372 {
    373     Bool val;
    374 
    375     SCREEN_PROLOG(SaveScreen);
    376     VGAGet(pScreen);
    377     val = (*pScreen->SaveScreen) (pScreen, unblank);
    378     VGAPut();
    379     SCREEN_EPILOG(SaveScreen, VGAarbiterSaveScreen);
    380 
    381     return val;
    382 }
    383 
    384 static void
    385 VGAarbiterStoreColors(ColormapPtr pmap, int ndef, xColorItem * pdefs)
    386 {
    387     ScreenPtr pScreen = pmap->pScreen;
    388 
    389     SCREEN_PROLOG(StoreColors);
    390     VGAGet(pScreen);
    391     (*pScreen->StoreColors) (pmap, ndef, pdefs);
    392     VGAPut();
    393     SCREEN_EPILOG(StoreColors, VGAarbiterStoreColors);
    394 }
    395 
    396 static void
    397 VGAarbiterRecolorCursor(DeviceIntPtr pDev,
    398                         ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
    399 {
    400     SCREEN_PROLOG(RecolorCursor);
    401     VGAGet(pScreen);
    402     (*pScreen->RecolorCursor) (pDev, pScreen, pCurs, displayed);
    403     VGAPut();
    404     SCREEN_EPILOG(RecolorCursor, VGAarbiterRecolorCursor);
    405 }
    406 
    407 static Bool
    408 VGAarbiterRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
    409 {
    410     Bool val;
    411 
    412     SCREEN_PROLOG(RealizeCursor);
    413     VGAGet(pScreen);
    414     val = (*pScreen->RealizeCursor) (pDev, pScreen, pCursor);
    415     VGAPut();
    416     SCREEN_EPILOG(RealizeCursor, VGAarbiterRealizeCursor);
    417     return val;
    418 }
    419 
    420 static Bool
    421 VGAarbiterUnrealizeCursor(DeviceIntPtr pDev,
    422                           ScreenPtr pScreen, CursorPtr pCursor)
    423 {
    424     Bool val;
    425 
    426     SCREEN_PROLOG(UnrealizeCursor);
    427     VGAGet(pScreen);
    428     val = (*pScreen->UnrealizeCursor) (pDev, pScreen, pCursor);
    429     VGAPut();
    430     SCREEN_EPILOG(UnrealizeCursor, VGAarbiterUnrealizeCursor);
    431     return val;
    432 }
    433 
    434 static Bool
    435 VGAarbiterDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
    436 {
    437     Bool val;
    438 
    439     SCREEN_PROLOG(DisplayCursor);
    440     VGAGet(pScreen);
    441     val = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
    442     VGAPut();
    443     SCREEN_EPILOG(DisplayCursor, VGAarbiterDisplayCursor);
    444     return val;
    445 }
    446 
    447 static Bool
    448 VGAarbiterSetCursorPosition(DeviceIntPtr pDev,
    449                             ScreenPtr pScreen, int x, int y, Bool generateEvent)
    450 {
    451     Bool val;
    452 
    453     SCREEN_PROLOG(SetCursorPosition);
    454     VGAGet(pScreen);
    455     val = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
    456     VGAPut();
    457     SCREEN_EPILOG(SetCursorPosition, VGAarbiterSetCursorPosition);
    458     return val;
    459 }
    460 
    461 static void
    462 VGAarbiterAdjustFrame(ScrnInfoPtr pScrn, int x, int y)
    463 {
    464     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
    465     VGAarbiterScreenPtr pScreenPriv =
    466         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    467                                                VGAarbiterScreenKey);
    468 
    469     VGAGet(pScreen);
    470     (*pScreenPriv->AdjustFrame) (pScrn, x, y);
    471     VGAPut();
    472 }
    473 
    474 static Bool
    475 VGAarbiterSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
    476 {
    477     Bool val;
    478     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
    479     VGAarbiterScreenPtr pScreenPriv =
    480         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    481                                                VGAarbiterScreenKey);
    482 
    483     VGAGet(pScreen);
    484     val = (*pScreenPriv->SwitchMode) (pScrn, mode);
    485     VGAPut();
    486     return val;
    487 }
    488 
    489 static Bool
    490 VGAarbiterEnterVT(ScrnInfoPtr pScrn)
    491 {
    492     Bool val;
    493     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
    494     VGAarbiterScreenPtr pScreenPriv =
    495         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    496                                                VGAarbiterScreenKey);
    497 
    498     VGAGet(pScreen);
    499     pScrn->EnterVT = pScreenPriv->EnterVT;
    500     val = (*pScrn->EnterVT) (pScrn);
    501     pScreenPriv->EnterVT = pScrn->EnterVT;
    502     pScrn->EnterVT = VGAarbiterEnterVT;
    503     VGAPut();
    504     return val;
    505 }
    506 
    507 static void
    508 VGAarbiterLeaveVT(ScrnInfoPtr pScrn)
    509 {
    510     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
    511     VGAarbiterScreenPtr pScreenPriv =
    512         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    513                                                VGAarbiterScreenKey);
    514 
    515     VGAGet(pScreen);
    516     pScrn->LeaveVT = pScreenPriv->LeaveVT;
    517     (*pScreenPriv->LeaveVT) (pScrn);
    518     pScreenPriv->LeaveVT = pScrn->LeaveVT;
    519     pScrn->LeaveVT = VGAarbiterLeaveVT;
    520     VGAPut();
    521 }
    522 
    523 static void
    524 VGAarbiterFreeScreen(ScrnInfoPtr pScrn)
    525 {
    526     ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
    527     VGAarbiterScreenPtr pScreenPriv =
    528         (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
    529                                                VGAarbiterScreenKey);
    530 
    531     VGAGet(pScreen);
    532     (*pScreenPriv->FreeScreen) (pScrn);
    533     VGAPut();
    534 }
    535 
    536 static Bool
    537 VGAarbiterCreateGC(GCPtr pGC)
    538 {
    539     ScreenPtr pScreen = pGC->pScreen;
    540     VGAarbiterGCPtr pGCPriv =
    541         (VGAarbiterGCPtr) dixLookupPrivate(&pGC->devPrivates, VGAarbiterGCKey);
    542     Bool ret;
    543 
    544     SCREEN_PROLOG(CreateGC);
    545     ret = (*pScreen->CreateGC) (pGC);
    546     GC_WRAP(pGC);
    547     SCREEN_EPILOG(CreateGC, VGAarbiterCreateGC);
    548 
    549     return ret;
    550 }
    551 
    552 /* GC funcs */
    553 static void
    554 VGAarbiterValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDraw)
    555 {
    556     GC_UNWRAP(pGC);
    557     (*pGC->funcs->ValidateGC) (pGC, changes, pDraw);
    558     GC_WRAP(pGC);
    559 }
    560 
    561 static void
    562 VGAarbiterDestroyGC(GCPtr pGC)
    563 {
    564     GC_UNWRAP(pGC);
    565     (*pGC->funcs->DestroyGC) (pGC);
    566     GC_WRAP(pGC);
    567 }
    568 
    569 static void
    570 VGAarbiterChangeGC(GCPtr pGC, unsigned long mask)
    571 {
    572     GC_UNWRAP(pGC);
    573     (*pGC->funcs->ChangeGC) (pGC, mask);
    574     GC_WRAP(pGC);
    575 }
    576 
    577 static void
    578 VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst)
    579 {
    580     GC_UNWRAP(pGCDst);
    581     (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
    582     GC_WRAP(pGCDst);
    583 }
    584 
    585 static void
    586 VGAarbiterChangeClip(GCPtr pGC, int type, void *pvalue, int nrects)
    587 {
    588     GC_UNWRAP(pGC);
    589     (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
    590     GC_WRAP(pGC);
    591 }
    592 
    593 static void
    594 VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
    595 {
    596     GC_UNWRAP(pgcDst);
    597     (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc);
    598     GC_WRAP(pgcDst);
    599 }
    600 
    601 static void
    602 VGAarbiterDestroyClip(GCPtr pGC)
    603 {
    604     GC_UNWRAP(pGC);
    605     (*pGC->funcs->DestroyClip) (pGC);
    606     GC_WRAP(pGC);
    607 }
    608 
    609 /* GC Ops */
    610 static void
    611 VGAarbiterFillSpans(DrawablePtr pDraw,
    612                     GC * pGC,
    613                     int nInit,
    614                     DDXPointPtr pptInit, int *pwidthInit, int fSorted)
    615 {
    616     ScreenPtr pScreen = pGC->pScreen;
    617 
    618     GC_UNWRAP(pGC);
    619     VGAGet(pScreen);
    620     (*pGC->ops->FillSpans) (pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
    621     VGAPut();
    622     GC_WRAP(pGC);
    623 }
    624 
    625 static void
    626 VGAarbiterSetSpans(DrawablePtr pDraw,
    627                    GCPtr pGC,
    628                    char *pcharsrc,
    629                    register DDXPointPtr ppt,
    630                    int *pwidth, int nspans, int fSorted)
    631 {
    632     ScreenPtr pScreen = pGC->pScreen;
    633 
    634     GC_UNWRAP(pGC);
    635     VGAGet(pScreen);
    636     (*pGC->ops->SetSpans) (pDraw, pGC, pcharsrc, ppt, pwidth, nspans, fSorted);
    637     VGAPut();
    638     GC_WRAP(pGC);
    639 }
    640 
    641 static void
    642 VGAarbiterPutImage(DrawablePtr pDraw,
    643                    GCPtr pGC,
    644                    int depth,
    645                    int x, int y, int w, int h,
    646                    int leftPad, int format, char *pImage)
    647 {
    648     ScreenPtr pScreen = pGC->pScreen;
    649 
    650     GC_UNWRAP(pGC);
    651     VGAGet(pScreen);
    652     (*pGC->ops->PutImage) (pDraw, pGC, depth, x, y, w, h,
    653                            leftPad, format, pImage);
    654     VGAPut();
    655     GC_WRAP(pGC);
    656 }
    657 
    658 static RegionPtr
    659 VGAarbiterCopyArea(DrawablePtr pSrc,
    660                    DrawablePtr pDst,
    661                    GC * pGC,
    662                    int srcx, int srcy,
    663                    int width, int height, int dstx, int dsty)
    664 {
    665     RegionPtr ret;
    666     ScreenPtr pScreen = pGC->pScreen;
    667 
    668     GC_UNWRAP(pGC);
    669     VGAGet(pScreen);
    670     ret = (*pGC->ops->CopyArea) (pSrc, pDst,
    671                                  pGC, srcx, srcy, width, height, dstx, dsty);
    672     VGAPut();
    673     GC_WRAP(pGC);
    674     return ret;
    675 }
    676 
    677 static RegionPtr
    678 VGAarbiterCopyPlane(DrawablePtr pSrc,
    679                     DrawablePtr pDst,
    680                     GCPtr pGC,
    681                     int srcx, int srcy,
    682                     int width, int height,
    683                     int dstx, int dsty, unsigned long bitPlane)
    684 {
    685     RegionPtr ret;
    686     ScreenPtr pScreen = pGC->pScreen;
    687 
    688     GC_UNWRAP(pGC);
    689     VGAGet(pScreen);
    690     ret = (*pGC->ops->CopyPlane) (pSrc, pDst, pGC, srcx, srcy,
    691                                   width, height, dstx, dsty, bitPlane);
    692     VGAPut();
    693     GC_WRAP(pGC);
    694     return ret;
    695 }
    696 
    697 static void
    698 VGAarbiterPolyPoint(DrawablePtr pDraw,
    699                     GCPtr pGC, int mode, int npt, xPoint * pptInit)
    700 {
    701     ScreenPtr pScreen = pGC->pScreen;
    702 
    703     GC_UNWRAP(pGC);
    704     VGAGet(pScreen);
    705     (*pGC->ops->PolyPoint) (pDraw, pGC, mode, npt, pptInit);
    706     VGAPut();
    707     GC_WRAP(pGC);
    708 }
    709 
    710 static void
    711 VGAarbiterPolylines(DrawablePtr pDraw,
    712                     GCPtr pGC, int mode, int npt, DDXPointPtr pptInit)
    713 {
    714     ScreenPtr pScreen = pGC->pScreen;
    715 
    716     GC_UNWRAP(pGC);
    717     VGAGet(pScreen);
    718     (*pGC->ops->Polylines) (pDraw, pGC, mode, npt, pptInit);
    719     VGAPut();
    720     GC_WRAP(pGC);
    721 }
    722 
    723 static void
    724 VGAarbiterPolySegment(DrawablePtr pDraw, GCPtr pGC, int nseg, xSegment * pSeg)
    725 {
    726     ScreenPtr pScreen = pGC->pScreen;
    727 
    728     GC_UNWRAP(pGC);
    729     VGAGet(pScreen);
    730     (*pGC->ops->PolySegment) (pDraw, pGC, nseg, pSeg);
    731     VGAPut();
    732     GC_WRAP(pGC);
    733 }
    734 
    735 static void
    736 VGAarbiterPolyRectangle(DrawablePtr pDraw,
    737                         GCPtr pGC, int nRectsInit, xRectangle *pRectsInit)
    738 {
    739     ScreenPtr pScreen = pGC->pScreen;
    740 
    741     GC_UNWRAP(pGC);
    742     VGAGet(pScreen);
    743     (*pGC->ops->PolyRectangle) (pDraw, pGC, nRectsInit, pRectsInit);
    744     VGAPut();
    745     GC_WRAP(pGC);
    746 }
    747 
    748 static void
    749 VGAarbiterPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
    750 {
    751     ScreenPtr pScreen = pGC->pScreen;
    752 
    753     GC_UNWRAP(pGC);
    754     VGAGet(pScreen);
    755     (*pGC->ops->PolyArc) (pDraw, pGC, narcs, parcs);
    756     VGAPut();
    757     GC_WRAP(pGC);
    758 }
    759 
    760 static void
    761 VGAarbiterFillPolygon(DrawablePtr pDraw,
    762                       GCPtr pGC,
    763                       int shape, int mode, int count, DDXPointPtr ptsIn)
    764 {
    765     ScreenPtr pScreen = pGC->pScreen;
    766 
    767     GC_UNWRAP(pGC);
    768     VGAGet(pScreen);
    769     (*pGC->ops->FillPolygon) (pDraw, pGC, shape, mode, count, ptsIn);
    770     VGAPut();
    771     GC_WRAP(pGC);
    772 }
    773 
    774 static void
    775 VGAarbiterPolyFillRect(DrawablePtr pDraw,
    776                        GCPtr pGC, int nrectFill, xRectangle *prectInit)
    777 {
    778     ScreenPtr pScreen = pGC->pScreen;
    779 
    780     GC_UNWRAP(pGC);
    781     VGAGet(pScreen);
    782     (*pGC->ops->PolyFillRect) (pDraw, pGC, nrectFill, prectInit);
    783     VGAPut();
    784     GC_WRAP(pGC);
    785 }
    786 
    787 static void
    788 VGAarbiterPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs)
    789 {
    790     ScreenPtr pScreen = pGC->pScreen;
    791 
    792     GC_UNWRAP(pGC);
    793     VGAGet(pScreen);
    794     (*pGC->ops->PolyFillArc) (pDraw, pGC, narcs, parcs);
    795     VGAPut();
    796     GC_WRAP(pGC);
    797 }
    798 
    799 static int
    800 VGAarbiterPolyText8(DrawablePtr pDraw,
    801                     GCPtr pGC, int x, int y, int count, char *chars)
    802 {
    803     int ret;
    804     ScreenPtr pScreen = pGC->pScreen;
    805 
    806     GC_UNWRAP(pGC);
    807     VGAGet(pScreen);
    808     ret = (*pGC->ops->PolyText8) (pDraw, pGC, x, y, count, chars);
    809     VGAPut();
    810     GC_WRAP(pGC);
    811     return ret;
    812 }
    813 
    814 static int
    815 VGAarbiterPolyText16(DrawablePtr pDraw,
    816                      GCPtr pGC, int x, int y, int count, unsigned short *chars)
    817 {
    818     int ret;
    819     ScreenPtr pScreen = pGC->pScreen;
    820 
    821     GC_UNWRAP(pGC);
    822     VGAGet(pScreen);
    823     ret = (*pGC->ops->PolyText16) (pDraw, pGC, x, y, count, chars);
    824     VGAPut();
    825     GC_WRAP(pGC);
    826     return ret;
    827 }
    828 
    829 static void
    830 VGAarbiterImageText8(DrawablePtr pDraw,
    831                      GCPtr pGC, int x, int y, int count, char *chars)
    832 {
    833     ScreenPtr pScreen = pGC->pScreen;
    834 
    835     GC_UNWRAP(pGC);
    836     VGAGet(pScreen);
    837     (*pGC->ops->ImageText8) (pDraw, pGC, x, y, count, chars);
    838     VGAPut();
    839     GC_WRAP(pGC);
    840 }
    841 
    842 static void
    843 VGAarbiterImageText16(DrawablePtr pDraw,
    844                       GCPtr pGC, int x, int y, int count, unsigned short *chars)
    845 {
    846     ScreenPtr pScreen = pGC->pScreen;
    847 
    848     GC_UNWRAP(pGC);
    849     VGAGet(pScreen);
    850     (*pGC->ops->ImageText16) (pDraw, pGC, x, y, count, chars);
    851     VGAPut();
    852     GC_WRAP(pGC);
    853 }
    854 
    855 static void
    856 VGAarbiterImageGlyphBlt(DrawablePtr pDraw,
    857                         GCPtr pGC,
    858                         int xInit, int yInit,
    859                         unsigned int nglyph,
    860                         CharInfoPtr * ppci, void *pglyphBase)
    861 {
    862     ScreenPtr pScreen = pGC->pScreen;
    863 
    864     GC_UNWRAP(pGC);
    865     VGAGet(pScreen);
    866     (*pGC->ops->ImageGlyphBlt) (pDraw, pGC, xInit, yInit,
    867                                 nglyph, ppci, pglyphBase);
    868     VGAPut();
    869     GC_WRAP(pGC);
    870 }
    871 
    872 static void
    873 VGAarbiterPolyGlyphBlt(DrawablePtr pDraw,
    874                        GCPtr pGC,
    875                        int xInit, int yInit,
    876                        unsigned int nglyph,
    877                        CharInfoPtr * ppci, void *pglyphBase)
    878 {
    879     ScreenPtr pScreen = pGC->pScreen;
    880 
    881     GC_UNWRAP(pGC);
    882     VGAGet(pScreen);
    883     (*pGC->ops->PolyGlyphBlt) (pDraw, pGC, xInit, yInit,
    884                                nglyph, ppci, pglyphBase);
    885     VGAPut();
    886     GC_WRAP(pGC);
    887 }
    888 
    889 static void
    890 VGAarbiterPushPixels(GCPtr pGC,
    891                      PixmapPtr pBitMap,
    892                      DrawablePtr pDraw, int dx, int dy, int xOrg, int yOrg)
    893 {
    894     ScreenPtr pScreen = pGC->pScreen;
    895 
    896     GC_UNWRAP(pGC);
    897     VGAGet(pScreen);
    898     (*pGC->ops->PushPixels) (pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
    899     VGAPut();
    900     GC_WRAP(pGC);
    901 }
    902 
    903 /* miSpriteFuncs */
    904 static Bool
    905 VGAarbiterSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
    906                               CursorPtr pCur)
    907 {
    908     Bool val;
    909 
    910     SPRITE_PROLOG;
    911     VGAGet(pScreen);
    912     val = PointPriv->spriteFuncs->RealizeCursor(pDev, pScreen, pCur);
    913     VGAPut();
    914     SPRITE_EPILOG;
    915     return val;
    916 }
    917 
    918 static Bool
    919 VGAarbiterSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
    920                                 CursorPtr pCur)
    921 {
    922     Bool val;
    923 
    924     SPRITE_PROLOG;
    925     VGAGet(pScreen);
    926     val = PointPriv->spriteFuncs->UnrealizeCursor(pDev, pScreen, pCur);
    927     VGAPut();
    928     SPRITE_EPILOG;
    929     return val;
    930 }
    931 
    932 static void
    933 VGAarbiterSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCur,
    934                           int x, int y)
    935 {
    936     SPRITE_PROLOG;
    937     VGAGet(pScreen);
    938     PointPriv->spriteFuncs->SetCursor(pDev, pScreen, pCur, x, y);
    939     VGAPut();
    940     SPRITE_EPILOG;
    941 }
    942 
    943 static void
    944 VGAarbiterSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
    945 {
    946     SPRITE_PROLOG;
    947     VGAGet(pScreen);
    948     PointPriv->spriteFuncs->MoveCursor(pDev, pScreen, x, y);
    949     VGAPut();
    950     SPRITE_EPILOG;
    951 }
    952 
    953 static Bool
    954 VGAarbiterDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
    955 {
    956     Bool val;
    957 
    958     SPRITE_PROLOG;
    959     VGAGet(pScreen);
    960     val = PointPriv->spriteFuncs->DeviceCursorInitialize(pDev, pScreen);
    961     VGAPut();
    962     SPRITE_EPILOG;
    963     return val;
    964 }
    965 
    966 static void
    967 VGAarbiterDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
    968 {
    969     SPRITE_PROLOG;
    970     VGAGet(pScreen);
    971     PointPriv->spriteFuncs->DeviceCursorCleanup(pDev, pScreen);
    972     VGAPut();
    973     SPRITE_EPILOG;
    974 }
    975 
    976 static void
    977 VGAarbiterComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask,
    978                     PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask,
    979                     INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width,
    980                     CARD16 height)
    981 {
    982     ScreenPtr pScreen = pDst->pDrawable->pScreen;
    983     PictureScreenPtr ps = GetPictureScreen(pScreen);
    984 
    985     PICTURE_PROLOGUE(Composite);
    986 
    987     VGAGet(pScreen);
    988     (*ps->Composite) (op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst,
    989                       yDst, width, height);
    990     VGAPut();
    991     PICTURE_EPILOGUE(Composite, VGAarbiterComposite);
    992 }
    993 
    994 static void
    995 VGAarbiterGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
    996                  PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, int nlist,
    997                  GlyphListPtr list, GlyphPtr * glyphs)
    998 {
    999     ScreenPtr pScreen = pDst->pDrawable->pScreen;
   1000     PictureScreenPtr ps = GetPictureScreen(pScreen);
   1001 
   1002     PICTURE_PROLOGUE(Glyphs);
   1003 
   1004     VGAGet(pScreen);
   1005     (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
   1006     VGAPut();
   1007     PICTURE_EPILOGUE(Glyphs, VGAarbiterGlyphs);
   1008 }
   1009 
   1010 static void
   1011 VGAarbiterCompositeRects(CARD8 op, PicturePtr pDst, xRenderColor * color,
   1012                          int nRect, xRectangle *rects)
   1013 {
   1014     ScreenPtr pScreen = pDst->pDrawable->pScreen;
   1015     PictureScreenPtr ps = GetPictureScreen(pScreen);
   1016 
   1017     PICTURE_PROLOGUE(CompositeRects);
   1018 
   1019     VGAGet(pScreen);
   1020     (*ps->CompositeRects) (op, pDst, color, nRect, rects);
   1021     VGAPut();
   1022     PICTURE_EPILOGUE(CompositeRects, VGAarbiterCompositeRects);
   1023 }