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 }