Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / common / xf86VGAarbiter.c
CommitLineData
a09e091a
JB
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((pointer) 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 pointer pTimeout, pointer 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 pointer 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, pointer 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, pointer 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, pointer 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}