xf86VGAarbiter.c revision 35c4bbdf
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 39static GCFuncs VGAarbiterGCFuncs = { 40 VGAarbiterValidateGC, VGAarbiterChangeGC, VGAarbiterCopyGC, 41 VGAarbiterDestroyGC, VGAarbiterChangeClip, VGAarbiterDestroyClip, 42 VGAarbiterCopyClip 43}; 44 45static 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 55static miPointerSpriteFuncRec VGAarbiterSpriteFuncs = { 56 VGAarbiterSpriteRealizeCursor, VGAarbiterSpriteUnrealizeCursor, 57 VGAarbiterSpriteSetCursor, VGAarbiterSpriteMoveCursor, 58 VGAarbiterDeviceCursorInitialize, VGAarbiterDeviceCursorCleanup 59}; 60 61static DevPrivateKeyRec VGAarbiterScreenKeyRec; 62 63#define VGAarbiterScreenKey (&VGAarbiterScreenKeyRec) 64static DevPrivateKeyRec VGAarbiterGCKeyRec; 65 66#define VGAarbiterGCKey (&VGAarbiterGCKeyRec) 67 68static int vga_no_arb = 0; 69void 70xf86VGAarbiterInit(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 79void 80xf86VGAarbiterFini(void) 81{ 82 if (vga_no_arb) 83 return; 84 pci_device_vgaarb_fini(); 85} 86 87void 88xf86VGAarbiterLock(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 96void 97xf86VGAarbiterUnlock(ScrnInfoPtr pScrn) 98{ 99 if (vga_no_arb) 100 return; 101 pci_device_vgaarb_unlock(); 102} 103 104Bool 105xf86VGAarbiterAllowDRI(ScreenPtr pScreen) 106{ 107 int vga_count; 108 int rsrc_decodes; 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 123void 124xf86VGAarbiterScrnInit(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 140void 141xf86VGAarbiterDeviceDecodes(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 149Bool 150xf86VGAarbiterWrapFunctions(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 */ 223static Bool 224VGAarbiterCloseScreen(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 267static void 268VGAarbiterBlockHandler(ScreenPtr pScreen, 269 void *pTimeout, void *pReadmask) 270{ 271 SCREEN_PROLOG(BlockHandler); 272 VGAGet(pScreen); 273 pScreen->BlockHandler(pScreen, pTimeout, pReadmask); 274 VGAPut(); 275 SCREEN_EPILOG(BlockHandler, VGAarbiterBlockHandler); 276} 277 278static void 279VGAarbiterWakeupHandler(ScreenPtr pScreen, unsigned long result, 280 void *pReadmask) 281{ 282 SCREEN_PROLOG(WakeupHandler); 283 VGAGet(pScreen); 284 pScreen->WakeupHandler(pScreen, result, pReadmask); 285 VGAPut(); 286 SCREEN_EPILOG(WakeupHandler, VGAarbiterWakeupHandler); 287} 288 289static void 290VGAarbiterGetImage(DrawablePtr pDrawable, 291 int sx, int sy, int w, int h, 292 unsigned int format, unsigned long planemask, char *pdstLine) 293{ 294 ScreenPtr pScreen = pDrawable->pScreen; 295 296 SCREEN_PROLOG(GetImage); 297 VGAGet(pScreen); 298 (*pScreen->GetImage) (pDrawable, sx, sy, w, h, format, planemask, pdstLine); 299 VGAPut(); 300 SCREEN_EPILOG(GetImage, VGAarbiterGetImage); 301} 302 303static void 304VGAarbiterGetSpans(DrawablePtr pDrawable, 305 int wMax, 306 DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart) 307{ 308 ScreenPtr pScreen = pDrawable->pScreen; 309 310 SCREEN_PROLOG(GetSpans); 311 VGAGet(pScreen); 312 (*pScreen->GetSpans) (pDrawable, wMax, ppt, pwidth, nspans, pdstStart); 313 VGAPut(); 314 SCREEN_EPILOG(GetSpans, VGAarbiterGetSpans); 315} 316 317static void 318VGAarbiterSourceValidate(DrawablePtr pDrawable, 319 int x, int y, int width, int height, 320 unsigned int subWindowMode) 321{ 322 ScreenPtr pScreen = pDrawable->pScreen; 323 324 SCREEN_PROLOG(SourceValidate); 325 VGAGet(pScreen); 326 if (pScreen->SourceValidate) 327 (*pScreen->SourceValidate) (pDrawable, x, y, width, height, 328 subWindowMode); 329 VGAPut(); 330 SCREEN_EPILOG(SourceValidate, VGAarbiterSourceValidate); 331} 332 333static void 334VGAarbiterCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) 335{ 336 ScreenPtr pScreen = pWin->drawable.pScreen; 337 338 SCREEN_PROLOG(CopyWindow); 339 VGAGet(pScreen); 340 (*pScreen->CopyWindow) (pWin, ptOldOrg, prgnSrc); 341 VGAPut(); 342 SCREEN_EPILOG(CopyWindow, VGAarbiterCopyWindow); 343} 344 345static void 346VGAarbiterClearToBackground(WindowPtr pWin, 347 int x, int y, int w, int h, Bool generateExposures) 348{ 349 ScreenPtr pScreen = pWin->drawable.pScreen; 350 351 SCREEN_PROLOG(ClearToBackground); 352 VGAGet(pScreen); 353 (*pScreen->ClearToBackground) (pWin, x, y, w, h, generateExposures); 354 VGAPut(); 355 SCREEN_EPILOG(ClearToBackground, VGAarbiterClearToBackground); 356} 357 358static PixmapPtr 359VGAarbiterCreatePixmap(ScreenPtr pScreen, int w, int h, int depth, 360 unsigned usage_hint) 361{ 362 PixmapPtr pPix; 363 364 SCREEN_PROLOG(CreatePixmap); 365 VGAGet(pScreen); 366 pPix = (*pScreen->CreatePixmap) (pScreen, w, h, depth, usage_hint); 367 VGAPut(); 368 SCREEN_EPILOG(CreatePixmap, VGAarbiterCreatePixmap); 369 370 return pPix; 371} 372 373static Bool 374VGAarbiterSaveScreen(ScreenPtr pScreen, Bool unblank) 375{ 376 Bool val; 377 378 SCREEN_PROLOG(SaveScreen); 379 VGAGet(pScreen); 380 val = (*pScreen->SaveScreen) (pScreen, unblank); 381 VGAPut(); 382 SCREEN_EPILOG(SaveScreen, VGAarbiterSaveScreen); 383 384 return val; 385} 386 387static void 388VGAarbiterStoreColors(ColormapPtr pmap, int ndef, xColorItem * pdefs) 389{ 390 ScreenPtr pScreen = pmap->pScreen; 391 392 SCREEN_PROLOG(StoreColors); 393 VGAGet(pScreen); 394 (*pScreen->StoreColors) (pmap, ndef, pdefs); 395 VGAPut(); 396 SCREEN_EPILOG(StoreColors, VGAarbiterStoreColors); 397} 398 399static void 400VGAarbiterRecolorCursor(DeviceIntPtr pDev, 401 ScreenPtr pScreen, CursorPtr pCurs, Bool displayed) 402{ 403 SCREEN_PROLOG(RecolorCursor); 404 VGAGet(pScreen); 405 (*pScreen->RecolorCursor) (pDev, pScreen, pCurs, displayed); 406 VGAPut(); 407 SCREEN_EPILOG(RecolorCursor, VGAarbiterRecolorCursor); 408} 409 410static Bool 411VGAarbiterRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) 412{ 413 Bool val; 414 415 SCREEN_PROLOG(RealizeCursor); 416 VGAGet(pScreen); 417 val = (*pScreen->RealizeCursor) (pDev, pScreen, pCursor); 418 VGAPut(); 419 SCREEN_EPILOG(RealizeCursor, VGAarbiterRealizeCursor); 420 return val; 421} 422 423static Bool 424VGAarbiterUnrealizeCursor(DeviceIntPtr pDev, 425 ScreenPtr pScreen, CursorPtr pCursor) 426{ 427 Bool val; 428 429 SCREEN_PROLOG(UnrealizeCursor); 430 VGAGet(pScreen); 431 val = (*pScreen->UnrealizeCursor) (pDev, pScreen, pCursor); 432 VGAPut(); 433 SCREEN_EPILOG(UnrealizeCursor, VGAarbiterUnrealizeCursor); 434 return val; 435} 436 437static Bool 438VGAarbiterDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) 439{ 440 Bool val; 441 442 SCREEN_PROLOG(DisplayCursor); 443 VGAGet(pScreen); 444 val = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor); 445 VGAPut(); 446 SCREEN_EPILOG(DisplayCursor, VGAarbiterDisplayCursor); 447 return val; 448} 449 450static Bool 451VGAarbiterSetCursorPosition(DeviceIntPtr pDev, 452 ScreenPtr pScreen, int x, int y, Bool generateEvent) 453{ 454 Bool val; 455 456 SCREEN_PROLOG(SetCursorPosition); 457 VGAGet(pScreen); 458 val = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent); 459 VGAPut(); 460 SCREEN_EPILOG(SetCursorPosition, VGAarbiterSetCursorPosition); 461 return val; 462} 463 464static void 465VGAarbiterAdjustFrame(ScrnInfoPtr pScrn, int x, int y) 466{ 467 ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 468 VGAarbiterScreenPtr pScreenPriv = 469 (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 470 VGAarbiterScreenKey); 471 472 VGAGet(pScreen); 473 (*pScreenPriv->AdjustFrame) (pScrn, x, y); 474 VGAPut(); 475} 476 477static Bool 478VGAarbiterSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode) 479{ 480 Bool val; 481 ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 482 VGAarbiterScreenPtr pScreenPriv = 483 (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 484 VGAarbiterScreenKey); 485 486 VGAGet(pScreen); 487 val = (*pScreenPriv->SwitchMode) (pScrn, mode); 488 VGAPut(); 489 return val; 490} 491 492static Bool 493VGAarbiterEnterVT(ScrnInfoPtr pScrn) 494{ 495 Bool val; 496 ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 497 VGAarbiterScreenPtr pScreenPriv = 498 (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 499 VGAarbiterScreenKey); 500 501 VGAGet(pScreen); 502 pScrn->EnterVT = pScreenPriv->EnterVT; 503 val = (*pScrn->EnterVT) (pScrn); 504 pScreenPriv->EnterVT = pScrn->EnterVT; 505 pScrn->EnterVT = VGAarbiterEnterVT; 506 VGAPut(); 507 return val; 508} 509 510static void 511VGAarbiterLeaveVT(ScrnInfoPtr pScrn) 512{ 513 ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 514 VGAarbiterScreenPtr pScreenPriv = 515 (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 516 VGAarbiterScreenKey); 517 518 VGAGet(pScreen); 519 pScrn->LeaveVT = pScreenPriv->LeaveVT; 520 (*pScreenPriv->LeaveVT) (pScrn); 521 pScreenPriv->LeaveVT = pScrn->LeaveVT; 522 pScrn->LeaveVT = VGAarbiterLeaveVT; 523 VGAPut(); 524} 525 526static void 527VGAarbiterFreeScreen(ScrnInfoPtr pScrn) 528{ 529 ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 530 VGAarbiterScreenPtr pScreenPriv = 531 (VGAarbiterScreenPtr) dixLookupPrivate(&pScreen->devPrivates, 532 VGAarbiterScreenKey); 533 534 VGAGet(pScreen); 535 (*pScreenPriv->FreeScreen) (pScrn); 536 VGAPut(); 537} 538 539static Bool 540VGAarbiterCreateGC(GCPtr pGC) 541{ 542 ScreenPtr pScreen = pGC->pScreen; 543 VGAarbiterGCPtr pGCPriv = 544 (VGAarbiterGCPtr) dixLookupPrivate(&pGC->devPrivates, VGAarbiterGCKey); 545 Bool ret; 546 547 SCREEN_PROLOG(CreateGC); 548 ret = (*pScreen->CreateGC) (pGC); 549 GC_WRAP(pGC); 550 SCREEN_EPILOG(CreateGC, VGAarbiterCreateGC); 551 552 return ret; 553} 554 555/* GC funcs */ 556static void 557VGAarbiterValidateGC(GCPtr pGC, unsigned long changes, DrawablePtr pDraw) 558{ 559 GC_UNWRAP(pGC); 560 (*pGC->funcs->ValidateGC) (pGC, changes, pDraw); 561 GC_WRAP(pGC); 562} 563 564static void 565VGAarbiterDestroyGC(GCPtr pGC) 566{ 567 GC_UNWRAP(pGC); 568 (*pGC->funcs->DestroyGC) (pGC); 569 GC_WRAP(pGC); 570} 571 572static void 573VGAarbiterChangeGC(GCPtr pGC, unsigned long mask) 574{ 575 GC_UNWRAP(pGC); 576 (*pGC->funcs->ChangeGC) (pGC, mask); 577 GC_WRAP(pGC); 578} 579 580static void 581VGAarbiterCopyGC(GCPtr pGCSrc, unsigned long mask, GCPtr pGCDst) 582{ 583 GC_UNWRAP(pGCDst); 584 (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst); 585 GC_WRAP(pGCDst); 586} 587 588static void 589VGAarbiterChangeClip(GCPtr pGC, int type, void *pvalue, int nrects) 590{ 591 GC_UNWRAP(pGC); 592 (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects); 593 GC_WRAP(pGC); 594} 595 596static void 597VGAarbiterCopyClip(GCPtr pgcDst, GCPtr pgcSrc) 598{ 599 GC_UNWRAP(pgcDst); 600 (*pgcDst->funcs->CopyClip) (pgcDst, pgcSrc); 601 GC_WRAP(pgcDst); 602} 603 604static void 605VGAarbiterDestroyClip(GCPtr pGC) 606{ 607 GC_UNWRAP(pGC); 608 (*pGC->funcs->DestroyClip) (pGC); 609 GC_WRAP(pGC); 610} 611 612/* GC Ops */ 613static void 614VGAarbiterFillSpans(DrawablePtr pDraw, 615 GC * pGC, 616 int nInit, 617 DDXPointPtr pptInit, int *pwidthInit, int fSorted) 618{ 619 ScreenPtr pScreen = pGC->pScreen; 620 621 GC_UNWRAP(pGC); 622 VGAGet(pScreen); 623 (*pGC->ops->FillSpans) (pDraw, pGC, nInit, pptInit, pwidthInit, fSorted); 624 VGAPut(); 625 GC_WRAP(pGC); 626} 627 628static void 629VGAarbiterSetSpans(DrawablePtr pDraw, 630 GCPtr pGC, 631 char *pcharsrc, 632 register DDXPointPtr ppt, 633 int *pwidth, int nspans, int fSorted) 634{ 635 ScreenPtr pScreen = pGC->pScreen; 636 637 GC_UNWRAP(pGC); 638 VGAGet(pScreen); 639 (*pGC->ops->SetSpans) (pDraw, pGC, pcharsrc, ppt, pwidth, nspans, fSorted); 640 VGAPut(); 641 GC_WRAP(pGC); 642} 643 644static void 645VGAarbiterPutImage(DrawablePtr pDraw, 646 GCPtr pGC, 647 int depth, 648 int x, int y, int w, int h, 649 int leftPad, int format, char *pImage) 650{ 651 ScreenPtr pScreen = pGC->pScreen; 652 653 GC_UNWRAP(pGC); 654 VGAGet(pScreen); 655 (*pGC->ops->PutImage) (pDraw, pGC, depth, x, y, w, h, 656 leftPad, format, pImage); 657 VGAPut(); 658 GC_WRAP(pGC); 659} 660 661static RegionPtr 662VGAarbiterCopyArea(DrawablePtr pSrc, 663 DrawablePtr pDst, 664 GC * pGC, 665 int srcx, int srcy, 666 int width, int height, int dstx, int dsty) 667{ 668 RegionPtr ret; 669 ScreenPtr pScreen = pGC->pScreen; 670 671 GC_UNWRAP(pGC); 672 VGAGet(pScreen); 673 ret = (*pGC->ops->CopyArea) (pSrc, pDst, 674 pGC, srcx, srcy, width, height, dstx, dsty); 675 VGAPut(); 676 GC_WRAP(pGC); 677 return ret; 678} 679 680static RegionPtr 681VGAarbiterCopyPlane(DrawablePtr pSrc, 682 DrawablePtr pDst, 683 GCPtr pGC, 684 int srcx, int srcy, 685 int width, int height, 686 int dstx, int dsty, unsigned long bitPlane) 687{ 688 RegionPtr ret; 689 ScreenPtr pScreen = pGC->pScreen; 690 691 GC_UNWRAP(pGC); 692 VGAGet(pScreen); 693 ret = (*pGC->ops->CopyPlane) (pSrc, pDst, pGC, srcx, srcy, 694 width, height, dstx, dsty, bitPlane); 695 VGAPut(); 696 GC_WRAP(pGC); 697 return ret; 698} 699 700static void 701VGAarbiterPolyPoint(DrawablePtr pDraw, 702 GCPtr pGC, int mode, int npt, xPoint * pptInit) 703{ 704 ScreenPtr pScreen = pGC->pScreen; 705 706 GC_UNWRAP(pGC); 707 VGAGet(pScreen); 708 (*pGC->ops->PolyPoint) (pDraw, pGC, mode, npt, pptInit); 709 VGAPut(); 710 GC_WRAP(pGC); 711} 712 713static void 714VGAarbiterPolylines(DrawablePtr pDraw, 715 GCPtr pGC, int mode, int npt, DDXPointPtr pptInit) 716{ 717 ScreenPtr pScreen = pGC->pScreen; 718 719 GC_UNWRAP(pGC); 720 VGAGet(pScreen); 721 (*pGC->ops->Polylines) (pDraw, pGC, mode, npt, pptInit); 722 VGAPut(); 723 GC_WRAP(pGC); 724} 725 726static void 727VGAarbiterPolySegment(DrawablePtr pDraw, GCPtr pGC, int nseg, xSegment * pSeg) 728{ 729 ScreenPtr pScreen = pGC->pScreen; 730 731 GC_UNWRAP(pGC); 732 VGAGet(pScreen); 733 (*pGC->ops->PolySegment) (pDraw, pGC, nseg, pSeg); 734 VGAPut(); 735 GC_WRAP(pGC); 736} 737 738static void 739VGAarbiterPolyRectangle(DrawablePtr pDraw, 740 GCPtr pGC, int nRectsInit, xRectangle *pRectsInit) 741{ 742 ScreenPtr pScreen = pGC->pScreen; 743 744 GC_UNWRAP(pGC); 745 VGAGet(pScreen); 746 (*pGC->ops->PolyRectangle) (pDraw, pGC, nRectsInit, pRectsInit); 747 VGAPut(); 748 GC_WRAP(pGC); 749} 750 751static void 752VGAarbiterPolyArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs) 753{ 754 ScreenPtr pScreen = pGC->pScreen; 755 756 GC_UNWRAP(pGC); 757 VGAGet(pScreen); 758 (*pGC->ops->PolyArc) (pDraw, pGC, narcs, parcs); 759 VGAPut(); 760 GC_WRAP(pGC); 761} 762 763static void 764VGAarbiterFillPolygon(DrawablePtr pDraw, 765 GCPtr pGC, 766 int shape, int mode, int count, DDXPointPtr ptsIn) 767{ 768 ScreenPtr pScreen = pGC->pScreen; 769 770 GC_UNWRAP(pGC); 771 VGAGet(pScreen); 772 (*pGC->ops->FillPolygon) (pDraw, pGC, shape, mode, count, ptsIn); 773 VGAPut(); 774 GC_WRAP(pGC); 775} 776 777static void 778VGAarbiterPolyFillRect(DrawablePtr pDraw, 779 GCPtr pGC, int nrectFill, xRectangle *prectInit) 780{ 781 ScreenPtr pScreen = pGC->pScreen; 782 783 GC_UNWRAP(pGC); 784 VGAGet(pScreen); 785 (*pGC->ops->PolyFillRect) (pDraw, pGC, nrectFill, prectInit); 786 VGAPut(); 787 GC_WRAP(pGC); 788} 789 790static void 791VGAarbiterPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc * parcs) 792{ 793 ScreenPtr pScreen = pGC->pScreen; 794 795 GC_UNWRAP(pGC); 796 VGAGet(pScreen); 797 (*pGC->ops->PolyFillArc) (pDraw, pGC, narcs, parcs); 798 VGAPut(); 799 GC_WRAP(pGC); 800} 801 802static int 803VGAarbiterPolyText8(DrawablePtr pDraw, 804 GCPtr pGC, int x, int y, int count, char *chars) 805{ 806 int ret; 807 ScreenPtr pScreen = pGC->pScreen; 808 809 GC_UNWRAP(pGC); 810 VGAGet(pScreen); 811 ret = (*pGC->ops->PolyText8) (pDraw, pGC, x, y, count, chars); 812 VGAPut(); 813 GC_WRAP(pGC); 814 return ret; 815} 816 817static int 818VGAarbiterPolyText16(DrawablePtr pDraw, 819 GCPtr pGC, int x, int y, int count, unsigned short *chars) 820{ 821 int ret; 822 ScreenPtr pScreen = pGC->pScreen; 823 824 GC_UNWRAP(pGC); 825 VGAGet(pScreen); 826 ret = (*pGC->ops->PolyText16) (pDraw, pGC, x, y, count, chars); 827 VGAPut(); 828 GC_WRAP(pGC); 829 return ret; 830} 831 832static void 833VGAarbiterImageText8(DrawablePtr pDraw, 834 GCPtr pGC, int x, int y, int count, char *chars) 835{ 836 ScreenPtr pScreen = pGC->pScreen; 837 838 GC_UNWRAP(pGC); 839 VGAGet(pScreen); 840 (*pGC->ops->ImageText8) (pDraw, pGC, x, y, count, chars); 841 VGAPut(); 842 GC_WRAP(pGC); 843} 844 845static void 846VGAarbiterImageText16(DrawablePtr pDraw, 847 GCPtr pGC, int x, int y, int count, unsigned short *chars) 848{ 849 ScreenPtr pScreen = pGC->pScreen; 850 851 GC_UNWRAP(pGC); 852 VGAGet(pScreen); 853 (*pGC->ops->ImageText16) (pDraw, pGC, x, y, count, chars); 854 VGAPut(); 855 GC_WRAP(pGC); 856} 857 858static void 859VGAarbiterImageGlyphBlt(DrawablePtr pDraw, 860 GCPtr pGC, 861 int xInit, int yInit, 862 unsigned int nglyph, 863 CharInfoPtr * ppci, void *pglyphBase) 864{ 865 ScreenPtr pScreen = pGC->pScreen; 866 867 GC_UNWRAP(pGC); 868 VGAGet(pScreen); 869 (*pGC->ops->ImageGlyphBlt) (pDraw, pGC, xInit, yInit, 870 nglyph, ppci, pglyphBase); 871 VGAPut(); 872 GC_WRAP(pGC); 873} 874 875static void 876VGAarbiterPolyGlyphBlt(DrawablePtr pDraw, 877 GCPtr pGC, 878 int xInit, int yInit, 879 unsigned int nglyph, 880 CharInfoPtr * ppci, void *pglyphBase) 881{ 882 ScreenPtr pScreen = pGC->pScreen; 883 884 GC_UNWRAP(pGC); 885 VGAGet(pScreen); 886 (*pGC->ops->PolyGlyphBlt) (pDraw, pGC, xInit, yInit, 887 nglyph, ppci, pglyphBase); 888 VGAPut(); 889 GC_WRAP(pGC); 890} 891 892static void 893VGAarbiterPushPixels(GCPtr pGC, 894 PixmapPtr pBitMap, 895 DrawablePtr pDraw, int dx, int dy, int xOrg, int yOrg) 896{ 897 ScreenPtr pScreen = pGC->pScreen; 898 899 GC_UNWRAP(pGC); 900 VGAGet(pScreen); 901 (*pGC->ops->PushPixels) (pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg); 902 VGAPut(); 903 GC_WRAP(pGC); 904} 905 906/* miSpriteFuncs */ 907static Bool 908VGAarbiterSpriteRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 909 CursorPtr pCur) 910{ 911 Bool val; 912 913 SPRITE_PROLOG; 914 VGAGet(pScreen); 915 val = PointPriv->spriteFuncs->RealizeCursor(pDev, pScreen, pCur); 916 VGAPut(); 917 SPRITE_EPILOG; 918 return val; 919} 920 921static Bool 922VGAarbiterSpriteUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, 923 CursorPtr pCur) 924{ 925 Bool val; 926 927 SPRITE_PROLOG; 928 VGAGet(pScreen); 929 val = PointPriv->spriteFuncs->UnrealizeCursor(pDev, pScreen, pCur); 930 VGAPut(); 931 SPRITE_EPILOG; 932 return val; 933} 934 935static void 936VGAarbiterSpriteSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCur, 937 int x, int y) 938{ 939 SPRITE_PROLOG; 940 VGAGet(pScreen); 941 PointPriv->spriteFuncs->SetCursor(pDev, pScreen, pCur, x, y); 942 VGAPut(); 943 SPRITE_EPILOG; 944} 945 946static void 947VGAarbiterSpriteMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y) 948{ 949 SPRITE_PROLOG; 950 VGAGet(pScreen); 951 PointPriv->spriteFuncs->MoveCursor(pDev, pScreen, x, y); 952 VGAPut(); 953 SPRITE_EPILOG; 954} 955 956static Bool 957VGAarbiterDeviceCursorInitialize(DeviceIntPtr pDev, ScreenPtr pScreen) 958{ 959 Bool val; 960 961 SPRITE_PROLOG; 962 VGAGet(pScreen); 963 val = PointPriv->spriteFuncs->DeviceCursorInitialize(pDev, pScreen); 964 VGAPut(); 965 SPRITE_EPILOG; 966 return val; 967} 968 969static void 970VGAarbiterDeviceCursorCleanup(DeviceIntPtr pDev, ScreenPtr pScreen) 971{ 972 SPRITE_PROLOG; 973 VGAGet(pScreen); 974 PointPriv->spriteFuncs->DeviceCursorCleanup(pDev, pScreen); 975 VGAPut(); 976 SPRITE_EPILOG; 977} 978 979static void 980VGAarbiterComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, 981 PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, 982 INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, 983 CARD16 height) 984{ 985 ScreenPtr pScreen = pDst->pDrawable->pScreen; 986 PictureScreenPtr ps = GetPictureScreen(pScreen); 987 988 PICTURE_PROLOGUE(Composite); 989 990 VGAGet(pScreen); 991 (*ps->Composite) (op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, 992 yDst, width, height); 993 VGAPut(); 994 PICTURE_EPILOGUE(Composite, VGAarbiterComposite); 995} 996 997static void 998VGAarbiterGlyphs(CARD8 op, PicturePtr pSrc, PicturePtr pDst, 999 PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc, int nlist, 1000 GlyphListPtr list, GlyphPtr * glyphs) 1001{ 1002 ScreenPtr pScreen = pDst->pDrawable->pScreen; 1003 PictureScreenPtr ps = GetPictureScreen(pScreen); 1004 1005 PICTURE_PROLOGUE(Glyphs); 1006 1007 VGAGet(pScreen); 1008 (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); 1009 VGAPut(); 1010 PICTURE_EPILOGUE(Glyphs, VGAarbiterGlyphs); 1011} 1012 1013static void 1014VGAarbiterCompositeRects(CARD8 op, PicturePtr pDst, xRenderColor * color, 1015 int nRect, xRectangle *rects) 1016{ 1017 ScreenPtr pScreen = pDst->pDrawable->pScreen; 1018 PictureScreenPtr ps = GetPictureScreen(pScreen); 1019 1020 PICTURE_PROLOGUE(CompositeRects); 1021 1022 VGAGet(pScreen); 1023 (*ps->CompositeRects) (op, pDst, color, nRect, rects); 1024 VGAPut(); 1025 PICTURE_EPILOGUE(CompositeRects, VGAarbiterCompositeRects); 1026} 1027