VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/x11include/xorg-server-1.6.0/exa_priv.h@ 36300

最後變更 在這個檔案從36300是 17471,由 vboxsync 提交於 16 年 前

export to OSE

  • 屬性 svn:eol-style 設為 native
檔案大小: 13.6 KB
 
1/*
2 *
3 * Copyright (C) 2000 Keith Packard, member of The XFree86 Project, Inc.
4 * 2005 Zack Rusin, Trolltech
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of Keith Packard not be used in
11 * advertising or publicity pertaining to distribution of the software without
12 * specific, written prior permission. Keith Packard makes no
13 * representations about the suitability of this software for any purpose. It
14 * is provided "as is" without express or implied warranty.
15 *
16 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
17 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
21 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
22 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
23 * SOFTWARE.
24 */
25
26#ifndef EXAPRIV_H
27#define EXAPRIV_H
28
29#ifdef HAVE_DIX_CONFIG_H
30#include <dix-config.h>
31#endif
32
33#include "exa.h"
34
35#include <X11/X.h>
36#define NEED_EVENTS
37#include <X11/Xproto.h>
38#ifdef MITSHM
39#include "shmint.h"
40#endif
41#include "scrnintstr.h"
42#include "pixmapstr.h"
43#include "windowstr.h"
44#include "servermd.h"
45#include "mibstore.h"
46#include "colormapst.h"
47#include "gcstruct.h"
48#include "input.h"
49#include "mipointer.h"
50#include "mi.h"
51#include "dix.h"
52#include "fb.h"
53#include "fboverlay.h"
54#ifdef RENDER
55#include "fbpict.h"
56#include "glyphstr.h"
57#endif
58#include "damage.h"
59
60#define DEBUG_TRACE_FALL 0
61#define DEBUG_MIGRATE 0
62#define DEBUG_PIXMAP 0
63#define DEBUG_OFFSCREEN 0
64#define DEBUG_GLYPH_CACHE 0
65
66#if DEBUG_TRACE_FALL
67#define EXA_FALLBACK(x) \
68do { \
69 ErrorF("EXA fallback at %s: ", __FUNCTION__); \
70 ErrorF x; \
71} while (0)
72
73char
74exaDrawableLocation(DrawablePtr pDrawable);
75#else
76#define EXA_FALLBACK(x)
77#endif
78
79#if DEBUG_PIXMAP
80#define DBG_PIXMAP(a) ErrorF a
81#else
82#define DBG_PIXMAP(a)
83#endif
84
85#ifndef EXA_MAX_FB
86#define EXA_MAX_FB FB_OVERLAY_MAX
87#endif
88
89/**
90 * This is the list of migration heuristics supported by EXA. See
91 * exaDoMigration() for what their implementations do.
92 */
93enum ExaMigrationHeuristic {
94 ExaMigrationGreedy,
95 ExaMigrationAlways,
96 ExaMigrationSmart
97};
98
99typedef struct {
100 unsigned char sha1[20];
101} ExaCachedGlyphRec, *ExaCachedGlyphPtr;
102
103typedef struct {
104 /* The identity of the cache, statically configured at initialization */
105 unsigned int format;
106 int glyphWidth;
107 int glyphHeight;
108
109 int size; /* Size of cache; eventually this should be dynamically determined */
110
111 /* Hash table mapping from glyph sha1 to position in the glyph; we use
112 * open addressing with a hash table size determined based on size and large
113 * enough so that we always have a good amount of free space, so we can
114 * use linear probing. (Linear probing is preferrable to double hashing
115 * here because it allows us to easily remove entries.)
116 */
117 int *hashEntries;
118 int hashSize;
119
120 ExaCachedGlyphPtr glyphs;
121 int glyphCount; /* Current number of glyphs */
122
123 PicturePtr picture; /* Where the glyphs of the cache are stored */
124 int yOffset; /* y location within the picture where the cache starts */
125 int columns; /* Number of columns the glyphs are layed out in */
126 int evictionPosition; /* Next random position to evict a glyph */
127} ExaGlyphCacheRec, *ExaGlyphCachePtr;
128
129#define EXA_NUM_GLYPH_CACHES 4
130
131typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
132typedef struct {
133 ExaDriverPtr info;
134 CreateGCProcPtr SavedCreateGC;
135 CloseScreenProcPtr SavedCloseScreen;
136 GetImageProcPtr SavedGetImage;
137 GetSpansProcPtr SavedGetSpans;
138 CreatePixmapProcPtr SavedCreatePixmap;
139 DestroyPixmapProcPtr SavedDestroyPixmap;
140 CopyWindowProcPtr SavedCopyWindow;
141 ChangeWindowAttributesProcPtr SavedChangeWindowAttributes;
142 BitmapToRegionProcPtr SavedBitmapToRegion;
143 CreateScreenResourcesProcPtr SavedCreateScreenResources;
144 ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader;
145#ifdef RENDER
146 CompositeProcPtr SavedComposite;
147 TrianglesProcPtr SavedTriangles;
148 GlyphsProcPtr SavedGlyphs;
149 TrapezoidsProcPtr SavedTrapezoids;
150 AddTrapsProcPtr SavedAddTraps;
151#endif
152
153 Bool swappedOut;
154 enum ExaMigrationHeuristic migration;
155 Bool checkDirtyCorrectness;
156 unsigned disableFbCount;
157 Bool optimize_migration;
158 unsigned offScreenCounter;
159
160 ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES];
161} ExaScreenPrivRec, *ExaScreenPrivPtr;
162
163/*
164 * This is the only completely portable way to
165 * compute this info.
166 */
167#ifndef BitsPerPixel
168#define BitsPerPixel(d) (\
169 PixmapWidthPaddingInfo[d].notPower2 ? \
170 (PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
171 ((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
172 (PixmapWidthPaddingInfo[d].padRoundUp+1)))
173#endif
174
175extern DevPrivateKey exaScreenPrivateKey;
176extern DevPrivateKey exaPixmapPrivateKey;
177#define ExaGetScreenPriv(s) ((ExaScreenPrivPtr)dixLookupPrivate(&(s)->devPrivates, exaScreenPrivateKey))
178#define ExaScreenPriv(s) ExaScreenPrivPtr pExaScr = ExaGetScreenPriv(s)
179
180/** Align an offset to an arbitrary alignment */
181#define EXA_ALIGN(offset, align) (((offset) + (align) - 1) - \
182 (((offset) + (align) - 1) % (align)))
183/** Align an offset to a power-of-two alignment */
184#define EXA_ALIGN2(offset, align) (((offset) + (align) - 1) & ~((align) - 1))
185
186#define EXA_PIXMAP_SCORE_MOVE_IN 10
187#define EXA_PIXMAP_SCORE_MAX 20
188#define EXA_PIXMAP_SCORE_MOVE_OUT -10
189#define EXA_PIXMAP_SCORE_MIN -20
190#define EXA_PIXMAP_SCORE_PINNED 1000
191#define EXA_PIXMAP_SCORE_INIT 1001
192
193#define ExaGetPixmapPriv(p) ((ExaPixmapPrivPtr)dixLookupPrivate(&(p)->devPrivates, exaPixmapPrivateKey))
194#define ExaSetPixmapPriv(p,a) dixSetPrivate(&(p)->devPrivates, exaPixmapPrivateKey, a)
195#define ExaPixmapPriv(p) ExaPixmapPrivPtr pExaPixmap = ExaGetPixmapPriv(p)
196
197#define EXA_RANGE_PITCH (1 << 0)
198#define EXA_RANGE_WIDTH (1 << 1)
199#define EXA_RANGE_HEIGHT (1 << 2)
200
201typedef struct {
202 ExaOffscreenArea *area;
203 int score; /**< score for the move-in vs move-out heuristic */
204 Bool offscreen;
205
206 CARD8 *sys_ptr; /**< pointer to pixmap data in system memory */
207 int sys_pitch; /**< pitch of pixmap in system memory */
208
209 CARD8 *fb_ptr; /**< pointer to pixmap data in framebuffer memory */
210 int fb_pitch; /**< pitch of pixmap in framebuffer memory */
211 unsigned int fb_size; /**< size of pixmap in framebuffer memory */
212
213 /**
214 * Holds information about whether this pixmap can be used for
215 * acceleration (== 0) or not (> 0).
216 *
217 * Contains a OR'ed combination of the following values:
218 * EXA_RANGE_PITCH - set if the pixmap's pitch is out of range
219 * EXA_RANGE_WIDTH - set if the pixmap's width is out of range
220 * EXA_RANGE_HEIGHT - set if the pixmap's height is out of range
221 */
222 unsigned int accel_blocked;
223
224 /**
225 * The damage record contains the areas of the pixmap's current location
226 * (framebuffer or system) that have been damaged compared to the other
227 * location.
228 */
229 DamagePtr pDamage;
230 /**
231 * The valid regions mark the valid bits (at least, as they're derived from
232 * damage, which may be overreported) of a pixmap's system and FB copies.
233 */
234 RegionRec validSys, validFB;
235 /**
236 * Driver private storage per EXA pixmap
237 */
238 void *driverPriv;
239} ExaPixmapPrivRec, *ExaPixmapPrivPtr;
240
241typedef struct _ExaMigrationRec {
242 Bool as_dst;
243 Bool as_src;
244 PixmapPtr pPix;
245 RegionPtr pReg;
246} ExaMigrationRec, *ExaMigrationPtr;
247
248typedef struct {
249 INT16 xSrc;
250 INT16 ySrc;
251 INT16 xDst;
252 INT16 yDst;
253 INT16 width;
254 INT16 height;
255} ExaCompositeRectRec, *ExaCompositeRectPtr;
256
257/**
258 * exaDDXDriverInit must be implemented by the DDX using EXA, and is the place
259 * to set EXA options or hook in screen functions to handle using EXA as the AA.
260 */
261void exaDDXDriverInit (ScreenPtr pScreen);
262
263/* exa_unaccel.c */
264void
265exaPrepareAccessGC(GCPtr pGC);
266
267void
268exaFinishAccessGC(GCPtr pGC);
269
270void
271ExaCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,
272 DDXPointPtr ppt, int *pwidth, int fSorted);
273
274void
275ExaCheckSetSpans (DrawablePtr pDrawable, GCPtr pGC, char *psrc,
276 DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
277
278void
279ExaCheckPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth,
280 int x, int y, int w, int h, int leftPad, int format,
281 char *bits);
282
283RegionPtr
284ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
285 int srcx, int srcy, int w, int h, int dstx, int dsty);
286
287RegionPtr
288ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
289 int srcx, int srcy, int w, int h, int dstx, int dsty,
290 unsigned long bitPlane);
291
292void
293ExaCheckPolyPoint (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
294 DDXPointPtr pptInit);
295
296void
297ExaCheckPolylines (DrawablePtr pDrawable, GCPtr pGC,
298 int mode, int npt, DDXPointPtr ppt);
299
300void
301ExaCheckPolySegment (DrawablePtr pDrawable, GCPtr pGC,
302 int nsegInit, xSegment *pSegInit);
303
304void
305ExaCheckPolyArc (DrawablePtr pDrawable, GCPtr pGC,
306 int narcs, xArc *pArcs);
307
308void
309ExaCheckPolyFillRect (DrawablePtr pDrawable, GCPtr pGC,
310 int nrect, xRectangle *prect);
311
312void
313ExaCheckImageGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
314 int x, int y, unsigned int nglyph,
315 CharInfoPtr *ppci, pointer pglyphBase);
316
317void
318ExaCheckPolyGlyphBlt (DrawablePtr pDrawable, GCPtr pGC,
319 int x, int y, unsigned int nglyph,
320 CharInfoPtr *ppci, pointer pglyphBase);
321
322void
323ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap,
324 DrawablePtr pDrawable,
325 int w, int h, int x, int y);
326
327void
328ExaCheckGetSpans (DrawablePtr pDrawable,
329 int wMax,
330 DDXPointPtr ppt,
331 int *pwidth,
332 int nspans,
333 char *pdstStart);
334
335void
336ExaCheckAddTraps (PicturePtr pPicture,
337 INT16 x_off,
338 INT16 y_off,
339 int ntrap,
340 xTrap *traps);
341
342/* exa_accel.c */
343
344static _X_INLINE Bool
345exaGCReadsDestination(DrawablePtr pDrawable, unsigned long planemask,
346 unsigned int fillStyle, unsigned char alu)
347{
348 return ((alu != GXcopy && alu != GXclear &&alu != GXset &&
349 alu != GXcopyInverted) || fillStyle == FillStippled ||
350 !EXA_PM_IS_SOLID(pDrawable, planemask));
351}
352
353void
354exaCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc);
355
356Bool
357exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile,
358 DDXPointPtr pPatOrg, CARD32 planemask, CARD32 alu);
359
360void
361exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h,
362 unsigned int format, unsigned long planeMask, char *d);
363
364extern const GCOps exaOps;
365
366#ifdef RENDER
367void
368ExaCheckComposite (CARD8 op,
369 PicturePtr pSrc,
370 PicturePtr pMask,
371 PicturePtr pDst,
372 INT16 xSrc,
373 INT16 ySrc,
374 INT16 xMask,
375 INT16 yMask,
376 INT16 xDst,
377 INT16 yDst,
378 CARD16 width,
379 CARD16 height);
380#endif
381
382/* exa_offscreen.c */
383void
384ExaOffscreenSwapOut (ScreenPtr pScreen);
385
386void
387ExaOffscreenSwapIn (ScreenPtr pScreen);
388
389Bool
390exaOffscreenInit(ScreenPtr pScreen);
391
392void
393ExaOffscreenFini (ScreenPtr pScreen);
394
395/* exa.c */
396void
397ExaDoPrepareAccess(DrawablePtr pDrawable, int index);
398
399void
400exaPrepareAccessReg(DrawablePtr pDrawable, int index, RegionPtr pReg);
401
402void
403exaPrepareAccess(DrawablePtr pDrawable, int index);
404
405void
406exaFinishAccess(DrawablePtr pDrawable, int index);
407
408void
409exaPixmapDirty(PixmapPtr pPix, int x1, int y1, int x2, int y2);
410
411void
412exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap,
413 int *xp, int *yp);
414
415Bool
416exaPixmapIsOffscreen(PixmapPtr p);
417
418PixmapPtr
419exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp);
420
421PixmapPtr
422exaGetDrawablePixmap(DrawablePtr pDrawable);
423
424RegionPtr
425exaCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC,
426 int srcx, int srcy, int width, int height, int dstx, int dsty);
427
428void
429exaCopyNtoN (DrawablePtr pSrcDrawable,
430 DrawablePtr pDstDrawable,
431 GCPtr pGC,
432 BoxPtr pbox,
433 int nbox,
434 int dx,
435 int dy,
436 Bool reverse,
437 Bool upsidedown,
438 Pixel bitplane,
439 void *closure);
440
441/* exa_render.c */
442Bool
443exaOpReadsDestination (CARD8 op);
444
445void
446exaComposite(CARD8 op,
447 PicturePtr pSrc,
448 PicturePtr pMask,
449 PicturePtr pDst,
450 INT16 xSrc,
451 INT16 ySrc,
452 INT16 xMask,
453 INT16 yMask,
454 INT16 xDst,
455 INT16 yDst,
456 CARD16 width,
457 CARD16 height);
458
459void
460exaCompositeRects(CARD8 op,
461 PicturePtr Src,
462 PicturePtr pDst,
463 int nrect,
464 ExaCompositeRectPtr rects);
465
466void
467exaTrapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
468 PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
469 int ntrap, xTrapezoid *traps);
470
471void
472exaTriangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst,
473 PictFormatPtr maskFormat, INT16 xSrc, INT16 ySrc,
474 int ntri, xTriangle *tris);
475
476/* exa_glyph.c */
477void
478exaGlyphsInit(ScreenPtr pScreen);
479
480void
481exaGlyphsFini (ScreenPtr pScreen);
482
483void
484exaGlyphs (CARD8 op,
485 PicturePtr pSrc,
486 PicturePtr pDst,
487 PictFormatPtr maskFormat,
488 INT16 xSrc,
489 INT16 ySrc,
490 int nlist,
491 GlyphListPtr list,
492 GlyphPtr *glyphs);
493
494/* exa_migration.c */
495void
496exaDoMigration (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel);
497
498void
499exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area);
500
501#endif /* EXAPRIV_H */
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette