1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright (C) 2000 Keith Packard, member of The XFree86 Project, Inc.
4*4882a593Smuzhiyun * 2005 Zack Rusin, Trolltech
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Permission to use, copy, modify, distribute, and sell this software and its
7*4882a593Smuzhiyun * documentation for any purpose is hereby granted without fee, provided that
8*4882a593Smuzhiyun * the above copyright notice appear in all copies and that both that
9*4882a593Smuzhiyun * copyright notice and this permission notice appear in supporting
10*4882a593Smuzhiyun * documentation, and that the name of Keith Packard not be used in
11*4882a593Smuzhiyun * advertising or publicity pertaining to distribution of the software without
12*4882a593Smuzhiyun * specific, written prior permission. Keith Packard makes no
13*4882a593Smuzhiyun * representations about the suitability of this software for any purpose. It
14*4882a593Smuzhiyun * is provided "as is" without express or implied warranty.
15*4882a593Smuzhiyun *
16*4882a593Smuzhiyun * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
17*4882a593Smuzhiyun * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18*4882a593Smuzhiyun * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*4882a593Smuzhiyun * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20*4882a593Smuzhiyun * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
21*4882a593Smuzhiyun * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
22*4882a593Smuzhiyun * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
23*4882a593Smuzhiyun * SOFTWARE.
24*4882a593Smuzhiyun */
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #ifndef EXAPRIV_H
27*4882a593Smuzhiyun #define EXAPRIV_H
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
30*4882a593Smuzhiyun #include <dix-config.h>
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include "exa.h"
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #include <X11/X.h>
36*4882a593Smuzhiyun #include <X11/Xproto.h>
37*4882a593Smuzhiyun #ifdef MITSHM
38*4882a593Smuzhiyun #include "shmint.h"
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun #include "scrnintstr.h"
41*4882a593Smuzhiyun #include "pixmapstr.h"
42*4882a593Smuzhiyun #include "windowstr.h"
43*4882a593Smuzhiyun #include "servermd.h"
44*4882a593Smuzhiyun #include "colormapst.h"
45*4882a593Smuzhiyun #include "gcstruct.h"
46*4882a593Smuzhiyun #include "input.h"
47*4882a593Smuzhiyun #include "mipointer.h"
48*4882a593Smuzhiyun #include "mi.h"
49*4882a593Smuzhiyun #include "dix.h"
50*4882a593Smuzhiyun #include "fb.h"
51*4882a593Smuzhiyun #include "fboverlay.h"
52*4882a593Smuzhiyun #include "fbpict.h"
53*4882a593Smuzhiyun #include "glyphstr.h"
54*4882a593Smuzhiyun #include "damage.h"
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun #define DEBUG_TRACE_FALL 0
57*4882a593Smuzhiyun #define DEBUG_MIGRATE 0
58*4882a593Smuzhiyun #define DEBUG_PIXMAP 0
59*4882a593Smuzhiyun #define DEBUG_OFFSCREEN 0
60*4882a593Smuzhiyun #define DEBUG_GLYPH_CACHE 0
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun #if DEBUG_TRACE_FALL
63*4882a593Smuzhiyun #define EXA_FALLBACK(x) \
64*4882a593Smuzhiyun do { \
65*4882a593Smuzhiyun ErrorF("EXA fallback at %s: ", __FUNCTION__); \
66*4882a593Smuzhiyun ErrorF x; \
67*4882a593Smuzhiyun } while (0)
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun char
70*4882a593Smuzhiyun exaDrawableLocation(DrawablePtr pDrawable);
71*4882a593Smuzhiyun #else
72*4882a593Smuzhiyun #define EXA_FALLBACK(x)
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #if DEBUG_PIXMAP
76*4882a593Smuzhiyun #define DBG_PIXMAP(a) ErrorF a
77*4882a593Smuzhiyun #else
78*4882a593Smuzhiyun #define DBG_PIXMAP(a)
79*4882a593Smuzhiyun #endif
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #ifndef EXA_MAX_FB
82*4882a593Smuzhiyun #define EXA_MAX_FB FB_OVERLAY_MAX
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun #ifdef DEBUG
86*4882a593Smuzhiyun #define EXA_FatalErrorDebug(x) FatalError x
87*4882a593Smuzhiyun #define EXA_FatalErrorDebugWithRet(x, ret) FatalError x
88*4882a593Smuzhiyun #else
89*4882a593Smuzhiyun #define EXA_FatalErrorDebug(x) ErrorF x
90*4882a593Smuzhiyun #define EXA_FatalErrorDebugWithRet(x, ret) \
91*4882a593Smuzhiyun do { \
92*4882a593Smuzhiyun ErrorF x; \
93*4882a593Smuzhiyun return ret; \
94*4882a593Smuzhiyun } while (0)
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /**
98*4882a593Smuzhiyun * This is the list of migration heuristics supported by EXA. See
99*4882a593Smuzhiyun * exaDoMigration() for what their implementations do.
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun enum ExaMigrationHeuristic {
102*4882a593Smuzhiyun ExaMigrationGreedy,
103*4882a593Smuzhiyun ExaMigrationAlways,
104*4882a593Smuzhiyun ExaMigrationSmart
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun typedef struct {
108*4882a593Smuzhiyun unsigned char sha1[20];
109*4882a593Smuzhiyun } ExaCachedGlyphRec, *ExaCachedGlyphPtr;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun typedef struct {
112*4882a593Smuzhiyun /* The identity of the cache, statically configured at initialization */
113*4882a593Smuzhiyun unsigned int format;
114*4882a593Smuzhiyun int glyphWidth;
115*4882a593Smuzhiyun int glyphHeight;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun int size; /* Size of cache; eventually this should be dynamically determined */
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* Hash table mapping from glyph sha1 to position in the glyph; we use
120*4882a593Smuzhiyun * open addressing with a hash table size determined based on size and large
121*4882a593Smuzhiyun * enough so that we always have a good amount of free space, so we can
122*4882a593Smuzhiyun * use linear probing. (Linear probing is preferrable to double hashing
123*4882a593Smuzhiyun * here because it allows us to easily remove entries.)
124*4882a593Smuzhiyun */
125*4882a593Smuzhiyun int *hashEntries;
126*4882a593Smuzhiyun int hashSize;
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun ExaCachedGlyphPtr glyphs;
129*4882a593Smuzhiyun int glyphCount; /* Current number of glyphs */
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun PicturePtr picture; /* Where the glyphs of the cache are stored */
132*4882a593Smuzhiyun int yOffset; /* y location within the picture where the cache starts */
133*4882a593Smuzhiyun int columns; /* Number of columns the glyphs are layed out in */
134*4882a593Smuzhiyun int evictionPosition; /* Next random position to evict a glyph */
135*4882a593Smuzhiyun } ExaGlyphCacheRec, *ExaGlyphCachePtr;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun #define EXA_NUM_GLYPH_CACHES 4
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #define EXA_FALLBACK_COPYWINDOW (1 << 0)
140*4882a593Smuzhiyun #define EXA_ACCEL_COPYWINDOW (1 << 1)
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun typedef struct _ExaMigrationRec {
143*4882a593Smuzhiyun Bool as_dst;
144*4882a593Smuzhiyun Bool as_src;
145*4882a593Smuzhiyun PixmapPtr pPix;
146*4882a593Smuzhiyun RegionPtr pReg;
147*4882a593Smuzhiyun } ExaMigrationRec, *ExaMigrationPtr;
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun typedef void (*EnableDisableFBAccessProcPtr) (ScreenPtr, Bool);
150*4882a593Smuzhiyun typedef struct {
151*4882a593Smuzhiyun ExaDriverPtr info;
152*4882a593Smuzhiyun ScreenBlockHandlerProcPtr SavedBlockHandler;
153*4882a593Smuzhiyun ScreenWakeupHandlerProcPtr SavedWakeupHandler;
154*4882a593Smuzhiyun CreateGCProcPtr SavedCreateGC;
155*4882a593Smuzhiyun CloseScreenProcPtr SavedCloseScreen;
156*4882a593Smuzhiyun GetImageProcPtr SavedGetImage;
157*4882a593Smuzhiyun GetSpansProcPtr SavedGetSpans;
158*4882a593Smuzhiyun CreatePixmapProcPtr SavedCreatePixmap;
159*4882a593Smuzhiyun DestroyPixmapProcPtr SavedDestroyPixmap;
160*4882a593Smuzhiyun CopyWindowProcPtr SavedCopyWindow;
161*4882a593Smuzhiyun ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
162*4882a593Smuzhiyun BitmapToRegionProcPtr SavedBitmapToRegion;
163*4882a593Smuzhiyun CreateScreenResourcesProcPtr SavedCreateScreenResources;
164*4882a593Smuzhiyun ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader;
165*4882a593Smuzhiyun SharePixmapBackingProcPtr SavedSharePixmapBacking;
166*4882a593Smuzhiyun SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking;
167*4882a593Smuzhiyun SourceValidateProcPtr SavedSourceValidate;
168*4882a593Smuzhiyun CompositeProcPtr SavedComposite;
169*4882a593Smuzhiyun TrianglesProcPtr SavedTriangles;
170*4882a593Smuzhiyun GlyphsProcPtr SavedGlyphs;
171*4882a593Smuzhiyun TrapezoidsProcPtr SavedTrapezoids;
172*4882a593Smuzhiyun AddTrapsProcPtr SavedAddTraps;
173*4882a593Smuzhiyun void (*do_migration) (ExaMigrationPtr pixmaps, int npixmaps,
174*4882a593Smuzhiyun Bool can_accel);
175*4882a593Smuzhiyun Bool (*pixmap_has_gpu_copy) (PixmapPtr pPixmap);
176*4882a593Smuzhiyun void (*do_move_in_pixmap) (PixmapPtr pPixmap);
177*4882a593Smuzhiyun void (*do_move_out_pixmap) (PixmapPtr pPixmap);
178*4882a593Smuzhiyun void (*prepare_access_reg) (PixmapPtr pPixmap, int index, RegionPtr pReg);
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun Bool swappedOut;
181*4882a593Smuzhiyun enum ExaMigrationHeuristic migration;
182*4882a593Smuzhiyun Bool checkDirtyCorrectness;
183*4882a593Smuzhiyun unsigned disableFbCount;
184*4882a593Smuzhiyun Bool optimize_migration;
185*4882a593Smuzhiyun unsigned offScreenCounter;
186*4882a593Smuzhiyun unsigned numOffscreenAvailable;
187*4882a593Smuzhiyun CARD32 lastDefragment;
188*4882a593Smuzhiyun CARD32 nextDefragment;
189*4882a593Smuzhiyun PixmapPtr deferred_mixed_pixmap;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /* Reference counting for accessed pixmaps */
192*4882a593Smuzhiyun struct {
193*4882a593Smuzhiyun PixmapPtr pixmap;
194*4882a593Smuzhiyun int count;
195*4882a593Smuzhiyun Bool retval;
196*4882a593Smuzhiyun } access[EXA_NUM_PREPARE_INDICES];
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun /* Holds information on fallbacks that cannot be relayed otherwise. */
199*4882a593Smuzhiyun unsigned int fallback_flags;
200*4882a593Smuzhiyun unsigned int fallback_counter;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /**
205*4882a593Smuzhiyun * Regions affected by fallback composite source / mask operations.
206*4882a593Smuzhiyun */
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun RegionRec srcReg;
209*4882a593Smuzhiyun RegionRec maskReg;
210*4882a593Smuzhiyun PixmapPtr srcPix;
211*4882a593Smuzhiyun PixmapPtr maskPix;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun DevPrivateKeyRec pixmapPrivateKeyRec;
214*4882a593Smuzhiyun DevPrivateKeyRec gcPrivateKeyRec;
215*4882a593Smuzhiyun } ExaScreenPrivRec, *ExaScreenPrivPtr;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun extern DevPrivateKeyRec exaScreenPrivateKeyRec;
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun #define exaScreenPrivateKey (&exaScreenPrivateKeyRec)
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun #define ExaGetScreenPriv(s) ((ExaScreenPrivPtr)dixGetPrivateAddr(&(s)->devPrivates, exaScreenPrivateKey))
222*4882a593Smuzhiyun #define ExaScreenPriv(s) ExaScreenPrivPtr pExaScr = ExaGetScreenPriv(s)
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun #define ExaGetGCPriv(gc) ((ExaGCPrivPtr)dixGetPrivateAddr(&(gc)->devPrivates, &ExaGetScreenPriv(gc->pScreen)->gcPrivateKeyRec))
225*4882a593Smuzhiyun #define ExaGCPriv(gc) ExaGCPrivPtr pExaGC = ExaGetGCPriv(gc)
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /*
228*4882a593Smuzhiyun * Some macros to deal with function wrapping.
229*4882a593Smuzhiyun */
230*4882a593Smuzhiyun #define wrap(priv, real, mem, func) {\
231*4882a593Smuzhiyun priv->Saved##mem = real->mem; \
232*4882a593Smuzhiyun real->mem = func; \
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun #define unwrap(priv, real, mem) {\
236*4882a593Smuzhiyun real->mem = priv->Saved##mem; \
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun #ifdef HAVE_TYPEOF
240*4882a593Smuzhiyun #define swap(priv, real, mem) {\
241*4882a593Smuzhiyun typeof(real->mem) tmp = priv->Saved##mem; \
242*4882a593Smuzhiyun priv->Saved##mem = real->mem; \
243*4882a593Smuzhiyun real->mem = tmp; \
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun #else
246*4882a593Smuzhiyun #define swap(priv, real, mem) {\
247*4882a593Smuzhiyun const void *tmp = priv->Saved##mem; \
248*4882a593Smuzhiyun priv->Saved##mem = real->mem; \
249*4882a593Smuzhiyun real->mem = tmp; \
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun #endif
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun #define EXA_PRE_FALLBACK(_screen_) \
254*4882a593Smuzhiyun ExaScreenPriv(_screen_); \
255*4882a593Smuzhiyun pExaScr->fallback_counter++;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun #define EXA_POST_FALLBACK(_screen_) \
258*4882a593Smuzhiyun pExaScr->fallback_counter--;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun #define EXA_PRE_FALLBACK_GC(_gc_) \
261*4882a593Smuzhiyun ExaScreenPriv(_gc_->pScreen); \
262*4882a593Smuzhiyun ExaGCPriv(_gc_); \
263*4882a593Smuzhiyun pExaScr->fallback_counter++; \
264*4882a593Smuzhiyun swap(pExaGC, _gc_, ops);
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun #define EXA_POST_FALLBACK_GC(_gc_) \
267*4882a593Smuzhiyun pExaScr->fallback_counter--; \
268*4882a593Smuzhiyun swap(pExaGC, _gc_, ops);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun /** Align an offset to an arbitrary alignment */
271*4882a593Smuzhiyun #define EXA_ALIGN(offset, align) (((offset) + (align) - 1) - \
272*4882a593Smuzhiyun (((offset) + (align) - 1) % (align)))
273*4882a593Smuzhiyun /** Align an offset to a power-of-two alignment */
274*4882a593Smuzhiyun #define EXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_MOVE_IN 10
277*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_MAX 20
278*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_MOVE_OUT -10
279*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_MIN -20
280*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_PINNED 1000
281*4882a593Smuzhiyun #define EXA_PIXMAP_SCORE_INIT 1001
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun #define ExaGetPixmapPriv(p) ((ExaPixmapPrivPtr)dixGetPrivateAddr(&(p)->devPrivates, &ExaGetScreenPriv((p)->drawable.pScreen)->pixmapPrivateKeyRec))
284*4882a593Smuzhiyun #define ExaPixmapPriv(p) ExaPixmapPrivPtr pExaPixmap = ExaGetPixmapPriv(p)
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun #define EXA_RANGE_PITCH (1 << 0)
287*4882a593Smuzhiyun #define EXA_RANGE_WIDTH (1 << 1)
288*4882a593Smuzhiyun #define EXA_RANGE_HEIGHT (1 << 2)
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun typedef struct {
291*4882a593Smuzhiyun ExaOffscreenArea *area;
292*4882a593Smuzhiyun int score; /**< score for the move-in vs move-out heuristic */
293*4882a593Smuzhiyun Bool use_gpu_copy;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun CARD8 *sys_ptr; /**< pointer to pixmap data in system memory */
296*4882a593Smuzhiyun int sys_pitch; /**< pitch of pixmap in system memory */
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun CARD8 *fb_ptr; /**< pointer to pixmap data in framebuffer memory */
299*4882a593Smuzhiyun int fb_pitch; /**< pitch of pixmap in framebuffer memory */
300*4882a593Smuzhiyun unsigned int fb_size; /**< size of pixmap in framebuffer memory */
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /**
303*4882a593Smuzhiyun * Holds information about whether this pixmap can be used for
304*4882a593Smuzhiyun * acceleration (== 0) or not (> 0).
305*4882a593Smuzhiyun *
306*4882a593Smuzhiyun * Contains a OR'ed combination of the following values:
307*4882a593Smuzhiyun * EXA_RANGE_PITCH - set if the pixmap's pitch is out of range
308*4882a593Smuzhiyun * EXA_RANGE_WIDTH - set if the pixmap's width is out of range
309*4882a593Smuzhiyun * EXA_RANGE_HEIGHT - set if the pixmap's height is out of range
310*4882a593Smuzhiyun */
311*4882a593Smuzhiyun unsigned int accel_blocked;
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun /**
314*4882a593Smuzhiyun * The damage record contains the areas of the pixmap's current location
315*4882a593Smuzhiyun * (framebuffer or system) that have been damaged compared to the other
316*4882a593Smuzhiyun * location.
317*4882a593Smuzhiyun */
318*4882a593Smuzhiyun DamagePtr pDamage;
319*4882a593Smuzhiyun /**
320*4882a593Smuzhiyun * The valid regions mark the valid bits (at least, as they're derived from
321*4882a593Smuzhiyun * damage, which may be overreported) of a pixmap's system and FB copies.
322*4882a593Smuzhiyun */
323*4882a593Smuzhiyun RegionRec validSys, validFB;
324*4882a593Smuzhiyun /**
325*4882a593Smuzhiyun * Driver private storage per EXA pixmap
326*4882a593Smuzhiyun */
327*4882a593Smuzhiyun void *driverPriv;
328*4882a593Smuzhiyun } ExaPixmapPrivRec, *ExaPixmapPrivPtr;
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun typedef struct {
331*4882a593Smuzhiyun /* GC values from the layer below. */
332*4882a593Smuzhiyun const GCOps *Savedops;
333*4882a593Smuzhiyun const GCFuncs *Savedfuncs;
334*4882a593Smuzhiyun } ExaGCPrivRec, *ExaGCPrivPtr;
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun typedef struct {
337*4882a593Smuzhiyun PicturePtr pDst;
338*4882a593Smuzhiyun INT16 xSrc;
339*4882a593Smuzhiyun INT16 ySrc;
340*4882a593Smuzhiyun INT16 xMask;
341*4882a593Smuzhiyun INT16 yMask;
342*4882a593Smuzhiyun INT16 xDst;
343*4882a593Smuzhiyun INT16 yDst;
344*4882a593Smuzhiyun INT16 width;
345*4882a593Smuzhiyun INT16 height;
346*4882a593Smuzhiyun } ExaCompositeRectRec, *ExaCompositeRectPtr;
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun /**
349*4882a593Smuzhiyun * exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
350*4882a593Smuzhiyun * to set EXA options or hook in screen functions to handle using EXA as the AA.
351*4882a593Smuzhiyun */
352*4882a593Smuzhiyun void exaDDXDriverInit(ScreenPtr pScreen);
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun /* exa_unaccel.c */
355*4882a593Smuzhiyun void
356*4882a593Smuzhiyun exaPrepareAccessGC(GCPtr pGC);
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun void
359*4882a593Smuzhiyun exaFinishAccessGC(GCPtr pGC);
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun void
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun ExaCheckFillSpans(DrawablePtr pDrawable, GCPtr pGC, int nspans,
364*4882a593Smuzhiyun DDXPointPtr ppt, int *pwidth, int fSorted);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun void
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun ExaCheckSetSpans(DrawablePtr pDrawable, GCPtr pGC, char *psrc,
369*4882a593Smuzhiyun DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun void
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun ExaCheckPutImage(DrawablePtr pDrawable, GCPtr pGC, int depth,
374*4882a593Smuzhiyun int x, int y, int w, int h, int leftPad, int format,
375*4882a593Smuzhiyun char *bits);
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun void
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun ExaCheckCopyNtoN(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
380*4882a593Smuzhiyun BoxPtr pbox, int nbox, int dx, int dy, Bool reverse,
381*4882a593Smuzhiyun Bool upsidedown, Pixel bitplane, void *closure);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun RegionPtr
384*4882a593Smuzhiyun
385*4882a593Smuzhiyun ExaCheckCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
386*4882a593Smuzhiyun int srcx, int srcy, int w, int h, int dstx, int dsty);
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun RegionPtr
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun ExaCheckCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
391*4882a593Smuzhiyun int srcx, int srcy, int w, int h, int dstx, int dsty,
392*4882a593Smuzhiyun unsigned long bitPlane);
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun void
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun ExaCheckPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
397*4882a593Smuzhiyun DDXPointPtr pptInit);
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun void
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun ExaCheckPolylines(DrawablePtr pDrawable, GCPtr pGC,
402*4882a593Smuzhiyun int mode, int npt, DDXPointPtr ppt);
403*4882a593Smuzhiyun
404*4882a593Smuzhiyun void
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun ExaCheckPolySegment(DrawablePtr pDrawable, GCPtr pGC,
407*4882a593Smuzhiyun int nsegInit, xSegment * pSegInit);
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun void
410*4882a593Smuzhiyun ExaCheckPolyArc(DrawablePtr pDrawable, GCPtr pGC, int narcs, xArc * pArcs);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun void
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun ExaCheckPolyFillRect(DrawablePtr pDrawable, GCPtr pGC,
415*4882a593Smuzhiyun int nrect, xRectangle *prect);
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun void
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun ExaCheckImageGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
420*4882a593Smuzhiyun int x, int y, unsigned int nglyph,
421*4882a593Smuzhiyun CharInfoPtr * ppci, void *pglyphBase);
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun void
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun ExaCheckPolyGlyphBlt(DrawablePtr pDrawable, GCPtr pGC,
426*4882a593Smuzhiyun int x, int y, unsigned int nglyph,
427*4882a593Smuzhiyun CharInfoPtr * ppci, void *pglyphBase);
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun void
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun ExaCheckPushPixels(GCPtr pGC, PixmapPtr pBitmap,
432*4882a593Smuzhiyun DrawablePtr pDrawable, int w, int h, int x, int y);
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun void
435*4882a593Smuzhiyun ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun void
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
440*4882a593Smuzhiyun unsigned int format, unsigned long planeMask, char *d);
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun void
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun ExaCheckGetSpans(DrawablePtr pDrawable,
445*4882a593Smuzhiyun int wMax,
446*4882a593Smuzhiyun DDXPointPtr ppt, int *pwidth, int nspans, char *pdstStart);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun void
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun ExaCheckAddTraps(PicturePtr pPicture,
451*4882a593Smuzhiyun INT16 x_off, INT16 y_off, int ntrap, xTrap * traps);
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun /* exa_accel.c */
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun static _X_INLINE Bool
exaGCReadsDestination(DrawablePtr pDrawable,unsigned long planemask,unsigned int fillStyle,unsigned char alu,Bool clientClip)456*4882a593Smuzhiyun exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
457*4882a593Smuzhiyun unsigned int fillStyle, unsigned char alu,
458*4882a593Smuzhiyun Bool clientClip)
459*4882a593Smuzhiyun {
460*4882a593Smuzhiyun return ((alu != GXcopy && alu != GXclear && alu != GXset &&
461*4882a593Smuzhiyun alu != GXcopyInverted) || fillStyle == FillStippled ||
462*4882a593Smuzhiyun clientClip != FALSE || !EXA_PM_IS_SOLID(pDrawable, planemask));
463*4882a593Smuzhiyun }
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun void
466*4882a593Smuzhiyun exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun Bool
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun exaFillRegionTiled(DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
471*4882a593Smuzhiyun DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu,
472*4882a593Smuzhiyun Bool clientClip);
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun void
475*4882a593Smuzhiyun
476*4882a593Smuzhiyun exaGetImage(DrawablePtr pDrawable, int x, int y, int w, int h,
477*4882a593Smuzhiyun unsigned int format, unsigned long planeMask, char *d);
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun RegionPtr
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
482*4882a593Smuzhiyun int srcx, int srcy, int width, int height, int dstx, int dsty);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun Bool
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun exaHWCopyNtoN(DrawablePtr pSrcDrawable,
487*4882a593Smuzhiyun DrawablePtr pDstDrawable,
488*4882a593Smuzhiyun GCPtr pGC,
489*4882a593Smuzhiyun BoxPtr pbox,
490*4882a593Smuzhiyun int nbox, int dx, int dy, Bool reverse, Bool upsidedown);
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun void
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun exaCopyNtoN(DrawablePtr pSrcDrawable,
495*4882a593Smuzhiyun DrawablePtr pDstDrawable,
496*4882a593Smuzhiyun GCPtr pGC,
497*4882a593Smuzhiyun BoxPtr pbox,
498*4882a593Smuzhiyun int nbox,
499*4882a593Smuzhiyun int dx,
500*4882a593Smuzhiyun int dy,
501*4882a593Smuzhiyun Bool reverse, Bool upsidedown, Pixel bitplane, void *closure);
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun extern const GCOps exaOps;
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun void
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun ExaCheckComposite(CARD8 op,
508*4882a593Smuzhiyun PicturePtr pSrc,
509*4882a593Smuzhiyun PicturePtr pMask,
510*4882a593Smuzhiyun PicturePtr pDst,
511*4882a593Smuzhiyun INT16 xSrc,
512*4882a593Smuzhiyun INT16 ySrc,
513*4882a593Smuzhiyun INT16 xMask,
514*4882a593Smuzhiyun INT16 yMask,
515*4882a593Smuzhiyun INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun void
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun ExaCheckGlyphs(CARD8 op,
520*4882a593Smuzhiyun PicturePtr pSrc,
521*4882a593Smuzhiyun PicturePtr pDst,
522*4882a593Smuzhiyun PictFormatPtr maskFormat,
523*4882a593Smuzhiyun INT16 xSrc,
524*4882a593Smuzhiyun INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs);
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun /* exa_offscreen.c */
527*4882a593Smuzhiyun void
528*4882a593Smuzhiyun ExaOffscreenSwapOut(ScreenPtr pScreen);
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun void
531*4882a593Smuzhiyun ExaOffscreenSwapIn(ScreenPtr pScreen);
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun ExaOffscreenArea *ExaOffscreenDefragment(ScreenPtr pScreen);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun Bool
536*4882a593Smuzhiyun exaOffscreenInit(ScreenPtr pScreen);
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun void
539*4882a593Smuzhiyun ExaOffscreenFini(ScreenPtr pScreen);
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun /* exa.c */
542*4882a593Smuzhiyun Bool
543*4882a593Smuzhiyun ExaDoPrepareAccess(PixmapPtr pPixmap, int index);
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun void
546*4882a593Smuzhiyun exaPrepareAccess(DrawablePtr pDrawable, int index);
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun void
549*4882a593Smuzhiyun exaFinishAccess(DrawablePtr pDrawable, int index);
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun void
552*4882a593Smuzhiyun exaDestroyPixmap(PixmapPtr pPixmap);
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun void
555*4882a593Smuzhiyun exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun void
558*4882a593Smuzhiyun
559*4882a593Smuzhiyun exaGetDrawableDeltas(DrawablePtr pDrawable, PixmapPtr pPixmap,
560*4882a593Smuzhiyun int *xp, int *yp);
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun Bool
563*4882a593Smuzhiyun exaPixmapHasGpuCopy(PixmapPtr p);
564*4882a593Smuzhiyun
565*4882a593Smuzhiyun PixmapPtr
566*4882a593Smuzhiyun exaGetOffscreenPixmap(DrawablePtr pDrawable, int *xp, int *yp);
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun PixmapPtr
569*4882a593Smuzhiyun exaGetDrawablePixmap(DrawablePtr pDrawable);
570*4882a593Smuzhiyun
571*4882a593Smuzhiyun void
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun exaSetFbPitch(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
574*4882a593Smuzhiyun int w, int h, int bpp);
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun void
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun exaSetAccelBlock(ExaScreenPrivPtr pExaScr, ExaPixmapPrivPtr pExaPixmap,
579*4882a593Smuzhiyun int w, int h, int bpp);
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun void
582*4882a593Smuzhiyun exaDoMigration(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun Bool
585*4882a593Smuzhiyun exaPixmapIsPinned(PixmapPtr pPix);
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun extern const GCFuncs exaGCFuncs;
588*4882a593Smuzhiyun
589*4882a593Smuzhiyun /* exa_classic.c */
590*4882a593Smuzhiyun PixmapPtr
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth,
593*4882a593Smuzhiyun unsigned usage_hint);
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun Bool
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height,
598*4882a593Smuzhiyun int depth, int bitsPerPixel, int devKind,
599*4882a593Smuzhiyun void *pPixData);
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun Bool
602*4882a593Smuzhiyun exaDestroyPixmap_classic(PixmapPtr pPixmap);
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun Bool
605*4882a593Smuzhiyun exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap);
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun /* exa_driver.c */
608*4882a593Smuzhiyun PixmapPtr
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth,
611*4882a593Smuzhiyun unsigned usage_hint);
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun Bool
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height,
616*4882a593Smuzhiyun int depth, int bitsPerPixel, int devKind,
617*4882a593Smuzhiyun void *pPixData);
618*4882a593Smuzhiyun
619*4882a593Smuzhiyun Bool
620*4882a593Smuzhiyun exaDestroyPixmap_driver(PixmapPtr pPixmap);
621*4882a593Smuzhiyun
622*4882a593Smuzhiyun Bool
623*4882a593Smuzhiyun exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap);
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun /* exa_mixed.c */
626*4882a593Smuzhiyun PixmapPtr
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth,
629*4882a593Smuzhiyun unsigned usage_hint);
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun Bool
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth,
634*4882a593Smuzhiyun int bitsPerPixel, int devKind, void *pPixData);
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun Bool
637*4882a593Smuzhiyun exaDestroyPixmap_mixed(PixmapPtr pPixmap);
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun Bool
640*4882a593Smuzhiyun exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap);
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun /* exa_migration_mixed.c */
643*4882a593Smuzhiyun void
644*4882a593Smuzhiyun exaCreateDriverPixmap_mixed(PixmapPtr pPixmap);
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun void
647*4882a593Smuzhiyun exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun void
650*4882a593Smuzhiyun exaMoveInPixmap_mixed(PixmapPtr pPixmap);
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun void
653*4882a593Smuzhiyun exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure);
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun void
656*4882a593Smuzhiyun exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg);
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun Bool
659*4882a593Smuzhiyun exaSetSharedPixmapBacking_mixed(PixmapPtr pPixmap, void *handle);
660*4882a593Smuzhiyun Bool
661*4882a593Smuzhiyun exaSharePixmapBacking_mixed(PixmapPtr pPixmap, ScreenPtr slave, void **handle_p);
662*4882a593Smuzhiyun
663*4882a593Smuzhiyun /* exa_render.c */
664*4882a593Smuzhiyun Bool
665*4882a593Smuzhiyun exaOpReadsDestination(CARD8 op);
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun void
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun exaComposite(CARD8 op,
670*4882a593Smuzhiyun PicturePtr pSrc,
671*4882a593Smuzhiyun PicturePtr pMask,
672*4882a593Smuzhiyun PicturePtr pDst,
673*4882a593Smuzhiyun INT16 xSrc,
674*4882a593Smuzhiyun INT16 ySrc,
675*4882a593Smuzhiyun INT16 xMask,
676*4882a593Smuzhiyun INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun void
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun exaCompositeRects(CARD8 op,
681*4882a593Smuzhiyun PicturePtr Src,
682*4882a593Smuzhiyun PicturePtr pMask,
683*4882a593Smuzhiyun PicturePtr pDst, int nrect, ExaCompositeRectPtr rects);
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun void
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun exaTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
688*4882a593Smuzhiyun PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
689*4882a593Smuzhiyun int ntrap, xTrapezoid * traps);
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun void
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun exaTriangles(CARD8 op, PicturePtr pSrc, PicturePtr pDst,
694*4882a593Smuzhiyun PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
695*4882a593Smuzhiyun int ntri, xTriangle * tris);
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun /* exa_glyph.c */
698*4882a593Smuzhiyun void
699*4882a593Smuzhiyun exaGlyphsInit(ScreenPtr pScreen);
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun void
702*4882a593Smuzhiyun exaGlyphsFini(ScreenPtr pScreen);
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun void
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun exaGlyphs(CARD8 op,
707*4882a593Smuzhiyun PicturePtr pSrc,
708*4882a593Smuzhiyun PicturePtr pDst,
709*4882a593Smuzhiyun PictFormatPtr maskFormat,
710*4882a593Smuzhiyun INT16 xSrc,
711*4882a593Smuzhiyun INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr * glyphs);
712*4882a593Smuzhiyun
713*4882a593Smuzhiyun /* exa_migration_classic.c */
714*4882a593Smuzhiyun void
715*4882a593Smuzhiyun exaCopyDirtyToSys(ExaMigrationPtr migrate);
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun void
718*4882a593Smuzhiyun exaCopyDirtyToFb(ExaMigrationPtr migrate);
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun void
721*4882a593Smuzhiyun exaDoMigration_classic(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun void
724*4882a593Smuzhiyun exaPixmapSave(ScreenPtr pScreen, ExaOffscreenArea * area);
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun void
727*4882a593Smuzhiyun exaMoveOutPixmap_classic(PixmapPtr pPixmap);
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun void
730*4882a593Smuzhiyun exaMoveInPixmap_classic(PixmapPtr pPixmap);
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun void
733*4882a593Smuzhiyun exaPrepareAccessReg_classic(PixmapPtr pPixmap, int index, RegionPtr pReg);
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun #endif /* EXAPRIV_H */
736