exa.h revision 35c4bbdf
1/* 2 * 3 * Copyright (C) 2000 Keith Packard 4 * 2004 Eric Anholt 5 * 2005 Zack Rusin 6 * 7 * Permission to use, copy, modify, distribute, and sell this software and its 8 * documentation for any purpose is hereby granted without fee, provided that 9 * the above copyright notice appear in all copies and that both that 10 * copyright notice and this permission notice appear in supporting 11 * documentation, and that the name of copyright holders not be used in 12 * advertising or publicity pertaining to distribution of the software without 13 * specific, written prior permission. Copyright holders make no 14 * representations about the suitability of this software for any purpose. It 15 * is provided "as is" without express or implied warranty. 16 * 17 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 18 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 19 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 21 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 22 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 23 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 24 * SOFTWARE. 25 */ 26 27/** @file 28 * This is the header containing the public API of EXA for exa drivers. 29 */ 30 31#ifndef EXA_H 32#define EXA_H 33 34#include "scrnintstr.h" 35#include "pixmapstr.h" 36#include "windowstr.h" 37#include "gcstruct.h" 38#include "picturestr.h" 39#include "fb.h" 40 41#define EXA_VERSION_MAJOR 2 42#define EXA_VERSION_MINOR 6 43#define EXA_VERSION_RELEASE 0 44 45typedef struct _ExaOffscreenArea ExaOffscreenArea; 46 47typedef void (*ExaOffscreenSaveProc) (ScreenPtr pScreen, 48 ExaOffscreenArea * area); 49 50typedef enum _ExaOffscreenState { 51 ExaOffscreenAvail, 52 ExaOffscreenRemovable, 53 ExaOffscreenLocked 54} ExaOffscreenState; 55 56struct _ExaOffscreenArea { 57 int base_offset; /* allocation base */ 58 int offset; /* aligned offset */ 59 int size; /* total allocation size */ 60 unsigned last_use; 61 void *privData; 62 63 ExaOffscreenSaveProc save; 64 65 ExaOffscreenState state; 66 67 ExaOffscreenArea *next; 68 69 unsigned eviction_cost; 70 71 ExaOffscreenArea *prev; /* Double-linked list for defragmentation */ 72 int align; /* required alignment */ 73}; 74 75/** 76 * The ExaDriver structure is allocated through exaDriverAlloc(), and then 77 * fllled in by drivers. 78 */ 79typedef struct _ExaDriver { 80 /** 81 * exa_major and exa_minor should be set by the driver to the version of 82 * EXA which the driver was compiled for (or configures itself at runtime 83 * to support). This allows EXA to extend the structure for new features 84 * without breaking ABI for drivers compiled against older versions. 85 */ 86 int exa_major, exa_minor; 87 88 /** 89 * memoryBase is the address of the beginning of framebuffer memory. 90 * The visible screen should be within memoryBase to memoryBase + 91 * memorySize. 92 */ 93 CARD8 *memoryBase; 94 95 /** 96 * offScreenBase is the offset from memoryBase of the beginning of the area 97 * to be managed by EXA's linear offscreen memory manager. 98 * 99 * In XFree86 DDX drivers, this is probably: 100 * (pScrn->displayWidth * cpp * pScrn->virtualY) 101 */ 102 unsigned long offScreenBase; 103 104 /** 105 * memorySize is the length (in bytes) of framebuffer memory beginning 106 * from memoryBase. 107 * 108 * The offscreen memory manager will manage the area beginning at 109 * (memoryBase + offScreenBase), with a length of (memorySize - 110 * offScreenBase) 111 * 112 * In XFree86 DDX drivers, this is probably (pScrn->videoRam * 1024) 113 */ 114 unsigned long memorySize; 115 116 /** 117 * pixmapOffsetAlign is the byte alignment necessary for pixmap offsets 118 * within framebuffer. 119 * 120 * Hardware typically has a required alignment of offsets, which may or may 121 * not be a power of two. EXA will ensure that pixmaps managed by the 122 * offscreen memory manager meet this alignment requirement. 123 */ 124 int pixmapOffsetAlign; 125 126 /** 127 * pixmapPitchAlign is the byte alignment necessary for pixmap pitches 128 * within the framebuffer. 129 * 130 * Hardware typically has a required alignment of pitches for acceleration. 131 * For 3D hardware, Composite acceleration often requires that source and 132 * mask pixmaps (textures) have a power-of-two pitch, which can be demanded 133 * using EXA_OFFSCREEN_ALIGN_POT. These pitch requirements only apply to 134 * pixmaps managed by the offscreen memory manager. Thus, it is up to the 135 * driver to ensure that the visible screen has an appropriate pitch for 136 * acceleration. 137 */ 138 int pixmapPitchAlign; 139 140 /** 141 * The flags field is bitfield of boolean values controlling EXA's behavior. 142 * 143 * The flags in clude EXA_OFFSCREEN_PIXMAPS, EXA_OFFSCREEN_ALIGN_POT, and 144 * EXA_TWO_BITBLT_DIRECTIONS. 145 */ 146 int flags; 147 148 /** @{ */ 149 /** 150 * maxX controls the X coordinate limitation for rendering from the card. 151 * The driver should never receive a request for rendering beyond maxX 152 * in the X direction from the origin of a pixmap. 153 */ 154 int maxX; 155 156 /** 157 * maxY controls the Y coordinate limitation for rendering from the card. 158 * The driver should never receive a request for rendering beyond maxY 159 * in the Y direction from the origin of a pixmap. 160 */ 161 int maxY; 162 /** @} */ 163 164 /* private */ 165 ExaOffscreenArea *offScreenAreas; 166 Bool needsSync; 167 int lastMarker; 168 169 /** @name Solid 170 * @{ 171 */ 172 /** 173 * PrepareSolid() sets up the driver for doing a solid fill. 174 * @param pPixmap Destination pixmap 175 * @param alu raster operation 176 * @param planemask write mask for the fill 177 * @param fg "foreground" color for the fill 178 * 179 * This call should set up the driver for doing a series of solid fills 180 * through the Solid() call. The alu raster op is one of the GX* 181 * graphics functions listed in X.h, and typically maps to a similar 182 * single-byte "ROP" setting in all hardware. The planemask controls 183 * which bits of the destination should be affected, and will only represent 184 * the bits up to the depth of pPixmap. The fg is the pixel value of the 185 * foreground color referred to in ROP descriptions. 186 * 187 * Note that many drivers will need to store some of the data in the driver 188 * private record, for sending to the hardware with each drawing command. 189 * 190 * The PrepareSolid() call is required of all drivers, but it may fail for any 191 * reason. Failure results in a fallback to software rendering. 192 */ 193 Bool (*PrepareSolid) (PixmapPtr pPixmap, 194 int alu, Pixel planemask, Pixel fg); 195 196 /** 197 * Solid() performs a solid fill set up in the last PrepareSolid() call. 198 * 199 * @param pPixmap destination pixmap 200 * @param x1 left coordinate 201 * @param y1 top coordinate 202 * @param x2 right coordinate 203 * @param y2 bottom coordinate 204 * 205 * Performs the fill set up by the last PrepareSolid() call, covering the 206 * area from (x1,y1) to (x2,y2) in pPixmap. Note that the coordinates are 207 * in the coordinate space of the destination pixmap, so the driver will 208 * need to set up the hardware's offset and pitch for the destination 209 * coordinates according to the pixmap's offset and pitch within 210 * framebuffer. This likely means using exaGetPixmapOffset() and 211 * exaGetPixmapPitch(). 212 * 213 * This call is required if PrepareSolid() ever succeeds. 214 */ 215 void (*Solid) (PixmapPtr pPixmap, int x1, int y1, int x2, int y2); 216 217 /** 218 * DoneSolid() finishes a set of solid fills. 219 * 220 * @param pPixmap destination pixmap. 221 * 222 * The DoneSolid() call is called at the end of a series of consecutive 223 * Solid() calls following a successful PrepareSolid(). This allows drivers 224 * to finish up emitting drawing commands that were buffered, or clean up 225 * state from PrepareSolid(). 226 * 227 * This call is required if PrepareSolid() ever succeeds. 228 */ 229 void (*DoneSolid) (PixmapPtr pPixmap); 230 /** @} */ 231 232 /** @name Copy 233 * @{ 234 */ 235 /** 236 * PrepareCopy() sets up the driver for doing a copy within video 237 * memory. 238 * 239 * @param pSrcPixmap source pixmap 240 * @param pDstPixmap destination pixmap 241 * @param dx X copy direction 242 * @param dy Y copy direction 243 * @param alu raster operation 244 * @param planemask write mask for the fill 245 * 246 * This call should set up the driver for doing a series of copies from the 247 * the pSrcPixmap to the pDstPixmap. The dx flag will be positive if the 248 * hardware should do the copy from the left to the right, and dy will be 249 * positive if the copy should be done from the top to the bottom. This 250 * is to deal with self-overlapping copies when pSrcPixmap == pDstPixmap. 251 * If your hardware can only support blits that are (left to right, top to 252 * bottom) or (right to left, bottom to top), then you should set 253 * #EXA_TWO_BITBLT_DIRECTIONS, and EXA will break down Copy operations to 254 * ones that meet those requirements. The alu raster op is one of the GX* 255 * graphics functions listed in X.h, and typically maps to a similar 256 * single-byte "ROP" setting in all hardware. The planemask controls which 257 * bits of the destination should be affected, and will only represent the 258 * bits up to the depth of pPixmap. 259 * 260 * Note that many drivers will need to store some of the data in the driver 261 * private record, for sending to the hardware with each drawing command. 262 * 263 * The PrepareCopy() call is required of all drivers, but it may fail for any 264 * reason. Failure results in a fallback to software rendering. 265 */ 266 Bool (*PrepareCopy) (PixmapPtr pSrcPixmap, 267 PixmapPtr pDstPixmap, 268 int dx, int dy, int alu, Pixel planemask); 269 270 /** 271 * Copy() performs a copy set up in the last PrepareCopy call. 272 * 273 * @param pDstPixmap destination pixmap 274 * @param srcX source X coordinate 275 * @param srcY source Y coordinate 276 * @param dstX destination X coordinate 277 * @param dstY destination Y coordinate 278 * @param width width of the rectangle to be copied 279 * @param height height of the rectangle to be copied. 280 * 281 * Performs the copy set up by the last PrepareCopy() call, copying the 282 * rectangle from (srcX, srcY) to (srcX + width, srcY + width) in the source 283 * pixmap to the same-sized rectangle at (dstX, dstY) in the destination 284 * pixmap. Those rectangles may overlap in memory, if 285 * pSrcPixmap == pDstPixmap. Note that this call does not receive the 286 * pSrcPixmap as an argument -- if it's needed in this function, it should 287 * be stored in the driver private during PrepareCopy(). As with Solid(), 288 * the coordinates are in the coordinate space of each pixmap, so the driver 289 * will need to set up source and destination pitches and offsets from those 290 * pixmaps, probably using exaGetPixmapOffset() and exaGetPixmapPitch(). 291 * 292 * This call is required if PrepareCopy ever succeeds. 293 */ 294 void (*Copy) (PixmapPtr pDstPixmap, 295 int srcX, 296 int srcY, int dstX, int dstY, int width, int height); 297 298 /** 299 * DoneCopy() finishes a set of copies. 300 * 301 * @param pPixmap destination pixmap. 302 * 303 * The DoneCopy() call is called at the end of a series of consecutive 304 * Copy() calls following a successful PrepareCopy(). This allows drivers 305 * to finish up emitting drawing commands that were buffered, or clean up 306 * state from PrepareCopy(). 307 * 308 * This call is required if PrepareCopy() ever succeeds. 309 */ 310 void (*DoneCopy) (PixmapPtr pDstPixmap); 311 /** @} */ 312 313 /** @name Composite 314 * @{ 315 */ 316 /** 317 * CheckComposite() checks to see if a composite operation could be 318 * accelerated. 319 * 320 * @param op Render operation 321 * @param pSrcPicture source Picture 322 * @param pMaskPicture mask picture 323 * @param pDstPicture destination Picture 324 * 325 * The CheckComposite() call checks if the driver could handle acceleration 326 * of op with the given source, mask, and destination pictures. This allows 327 * drivers to check source and destination formats, supported operations, 328 * transformations, and component alpha state, and send operations it can't 329 * support to software rendering early on. This avoids costly pixmap 330 * migration to the wrong places when the driver can't accelerate 331 * operations. Note that because migration hasn't happened, the driver 332 * can't know during CheckComposite() what the offsets and pitches of the 333 * pixmaps are going to be. 334 * 335 * See PrepareComposite() for more details on likely issues that drivers 336 * will have in accelerating Composite operations. 337 * 338 * The CheckComposite() call is recommended if PrepareComposite() is 339 * implemented, but is not required. 340 */ 341 Bool (*CheckComposite) (int op, 342 PicturePtr pSrcPicture, 343 PicturePtr pMaskPicture, PicturePtr pDstPicture); 344 345 /** 346 * PrepareComposite() sets up the driver for doing a Composite operation 347 * described in the Render extension protocol spec. 348 * 349 * @param op Render operation 350 * @param pSrcPicture source Picture 351 * @param pMaskPicture mask picture 352 * @param pDstPicture destination Picture 353 * @param pSrc source pixmap 354 * @param pMask mask pixmap 355 * @param pDst destination pixmap 356 * 357 * This call should set up the driver for doing a series of Composite 358 * operations, as described in the Render protocol spec, with the given 359 * pSrcPicture, pMaskPicture, and pDstPicture. The pSrc, pMask, and 360 * pDst are the pixmaps containing the pixel data, and should be used for 361 * setting the offset and pitch used for the coordinate spaces for each of 362 * the Pictures. 363 * 364 * Notes on interpreting Picture structures: 365 * - The Picture structures will always have a valid pDrawable. 366 * - The Picture structures will never have alphaMap set. 367 * - The mask Picture (and therefore pMask) may be NULL, in which case the 368 * operation is simply src OP dst instead of src IN mask OP dst, and 369 * mask coordinates should be ignored. 370 * - pMarkPicture may have componentAlpha set, which greatly changes 371 * the behavior of the Composite operation. componentAlpha has no effect 372 * when set on pSrcPicture or pDstPicture. 373 * - The source and mask Pictures may have a transformation set 374 * (Picture->transform != NULL), which means that the source coordinates 375 * should be transformed by that transformation, resulting in scaling, 376 * rotation, etc. The PictureTransformPoint() call can transform 377 * coordinates for you. Transforms have no effect on Pictures when used 378 * as a destination. 379 * - The source and mask pictures may have a filter set. PictFilterNearest 380 * and PictFilterBilinear are defined in the Render protocol, but others 381 * may be encountered, and must be handled correctly (usually by 382 * PrepareComposite failing, and falling back to software). Filters have 383 * no effect on Pictures when used as a destination. 384 * - The source and mask Pictures may have repeating set, which must be 385 * respected. Many chipsets will be unable to support repeating on 386 * pixmaps that have a width or height that is not a power of two. 387 * 388 * If your hardware can't support source pictures (textures) with 389 * non-power-of-two pitches, you should set #EXA_OFFSCREEN_ALIGN_POT. 390 * 391 * Note that many drivers will need to store some of the data in the driver 392 * private record, for sending to the hardware with each drawing command. 393 * 394 * The PrepareComposite() call is not required. However, it is highly 395 * recommended for performance of antialiased font rendering and performance 396 * of cairo applications. Failure results in a fallback to software 397 * rendering. 398 */ 399 Bool (*PrepareComposite) (int op, 400 PicturePtr pSrcPicture, 401 PicturePtr pMaskPicture, 402 PicturePtr pDstPicture, 403 PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); 404 405 /** 406 * Composite() performs a Composite operation set up in the last 407 * PrepareComposite() call. 408 * 409 * @param pDstPixmap destination pixmap 410 * @param srcX source X coordinate 411 * @param srcY source Y coordinate 412 * @param maskX source X coordinate 413 * @param maskY source Y coordinate 414 * @param dstX destination X coordinate 415 * @param dstY destination Y coordinate 416 * @param width destination rectangle width 417 * @param height destination rectangle height 418 * 419 * Performs the Composite operation set up by the last PrepareComposite() 420 * call, to the rectangle from (dstX, dstY) to (dstX + width, dstY + height) 421 * in the destination Pixmap. Note that if a transformation was set on 422 * the source or mask Pictures, the source rectangles may not be the same 423 * size as the destination rectangles and filtering. Getting the coordinate 424 * transformation right at the subpixel level can be tricky, and rendercheck 425 * can test this for you. 426 * 427 * This call is required if PrepareComposite() ever succeeds. 428 */ 429 void (*Composite) (PixmapPtr pDst, 430 int srcX, 431 int srcY, 432 int maskX, 433 int maskY, int dstX, int dstY, int width, int height); 434 435 /** 436 * DoneComposite() finishes a set of Composite operations. 437 * 438 * @param pPixmap destination pixmap. 439 * 440 * The DoneComposite() call is called at the end of a series of consecutive 441 * Composite() calls following a successful PrepareComposite(). This allows 442 * drivers to finish up emitting drawing commands that were buffered, or 443 * clean up state from PrepareComposite(). 444 * 445 * This call is required if PrepareComposite() ever succeeds. 446 */ 447 void (*DoneComposite) (PixmapPtr pDst); 448 /** @} */ 449 450 /** 451 * UploadToScreen() loads a rectangle of data from src into pDst. 452 * 453 * @param pDst destination pixmap 454 * @param x destination X coordinate. 455 * @param y destination Y coordinate 456 * @param width width of the rectangle to be copied 457 * @param height height of the rectangle to be copied 458 * @param src pointer to the beginning of the source data 459 * @param src_pitch pitch (in bytes) of the lines of source data. 460 * 461 * UploadToScreen() copies data in system memory beginning at src (with 462 * pitch src_pitch) into the destination pixmap from (x, y) to 463 * (x + width, y + height). This is typically done with hostdata uploads, 464 * where the CPU sets up a blit command on the hardware with instructions 465 * that the blit data will be fed through some sort of aperture on the card. 466 * 467 * If UploadToScreen() is performed asynchronously, it is up to the driver 468 * to call exaMarkSync(). This is in contrast to most other acceleration 469 * calls in EXA. 470 * 471 * UploadToScreen() can aid in pixmap migration, but is most important for 472 * the performance of exaGlyphs() (antialiased font drawing) by allowing 473 * pipelining of data uploads, avoiding a sync of the card after each glyph. 474 * 475 * @return TRUE if the driver successfully uploaded the data. FALSE 476 * indicates that EXA should fall back to doing the upload in software. 477 * 478 * UploadToScreen() is not required, but is recommended if Composite 479 * acceleration is supported. 480 */ 481 Bool (*UploadToScreen) (PixmapPtr pDst, 482 int x, 483 int y, int w, int h, char *src, int src_pitch); 484 485 /** 486 * UploadToScratch() is no longer used and will be removed next time the EXA 487 * major version needs to be bumped. 488 */ 489 Bool (*UploadToScratch) (PixmapPtr pSrc, PixmapPtr pDst); 490 491 /** 492 * DownloadFromScreen() loads a rectangle of data from pSrc into dst 493 * 494 * @param pSrc source pixmap 495 * @param x source X coordinate. 496 * @param y source Y coordinate 497 * @param width width of the rectangle to be copied 498 * @param height height of the rectangle to be copied 499 * @param dst pointer to the beginning of the destination data 500 * @param dst_pitch pitch (in bytes) of the lines of destination data. 501 * 502 * DownloadFromScreen() copies data from offscreen memory in pSrc from 503 * (x, y) to (x + width, y + height), to system memory starting at 504 * dst (with pitch dst_pitch). This would usually be done 505 * using scatter-gather DMA, supported by a DRM call, or by blitting to AGP 506 * and then synchronously reading from AGP. Because the implementation 507 * might be synchronous, EXA leaves it up to the driver to call 508 * exaMarkSync() if DownloadFromScreen() was asynchronous. This is in 509 * contrast to most other acceleration calls in EXA. 510 * 511 * DownloadFromScreen() can aid in the largest bottleneck in pixmap 512 * migration, which is the read from framebuffer when evicting pixmaps from 513 * framebuffer memory. Thus, it is highly recommended, even though 514 * implementations are typically complicated. 515 * 516 * @return TRUE if the driver successfully downloaded the data. FALSE 517 * indicates that EXA should fall back to doing the download in software. 518 * 519 * DownloadFromScreen() is not required, but is highly recommended. 520 */ 521 Bool (*DownloadFromScreen) (PixmapPtr pSrc, 522 int x, int y, 523 int w, int h, char *dst, int dst_pitch); 524 525 /** 526 * MarkSync() requests that the driver mark a synchronization point, 527 * returning an driver-defined integer marker which could be requested for 528 * synchronization to later in WaitMarker(). This might be used in the 529 * future to avoid waiting for full hardware stalls before accessing pixmap 530 * data with the CPU, but is not important in the current incarnation of 531 * EXA. 532 * 533 * Note that drivers should call exaMarkSync() when they have done some 534 * acceleration, rather than their own MarkSync() handler, as otherwise EXA 535 * will be unaware of the driver's acceleration and not sync to it during 536 * fallbacks. 537 * 538 * MarkSync() is optional. 539 */ 540 int (*MarkSync) (ScreenPtr pScreen); 541 542 /** 543 * WaitMarker() waits for all rendering before the given marker to have 544 * completed. If the driver does not implement MarkSync(), marker is 545 * meaningless, and all rendering by the hardware should be completed before 546 * WaitMarker() returns. 547 * 548 * Note that drivers should call exaWaitSync() to wait for all acceleration 549 * to finish, as otherwise EXA will be unaware of the driver having 550 * synchronized, resulting in excessive WaitMarker() calls. 551 * 552 * WaitMarker() is required of all drivers. 553 */ 554 void (*WaitMarker) (ScreenPtr pScreen, int marker); 555 556 /** @{ */ 557 /** 558 * PrepareAccess() is called before CPU access to an offscreen pixmap. 559 * 560 * @param pPix the pixmap being accessed 561 * @param index the index of the pixmap being accessed. 562 * 563 * PrepareAccess() will be called before CPU access to an offscreen pixmap. 564 * This can be used to set up hardware surfaces for byteswapping or 565 * untiling, or to adjust the pixmap's devPrivate.ptr for the purpose of 566 * making CPU access use a different aperture. 567 * 568 * The index is one of #EXA_PREPARE_DEST, #EXA_PREPARE_SRC, 569 * #EXA_PREPARE_MASK, #EXA_PREPARE_AUX_DEST, #EXA_PREPARE_AUX_SRC, or 570 * #EXA_PREPARE_AUX_MASK. Since only up to #EXA_NUM_PREPARE_INDICES pixmaps 571 * will have PrepareAccess() called on them per operation, drivers can have 572 * a small, statically-allocated space to maintain state for PrepareAccess() 573 * and FinishAccess() in. Note that PrepareAccess() is only called once per 574 * pixmap and operation, regardless of whether the pixmap is used as a 575 * destination and/or source, and the index may not reflect the usage. 576 * 577 * PrepareAccess() may fail. An example might be the case of hardware that 578 * can set up 1 or 2 surfaces for CPU access, but not 3. If PrepareAccess() 579 * fails, EXA will migrate the pixmap to system memory. 580 * DownloadFromScreen() must be implemented and must not fail if a driver 581 * wishes to fail in PrepareAccess(). PrepareAccess() must not fail when 582 * pPix is the visible screen, because the visible screen can not be 583 * migrated. 584 * 585 * @return TRUE if PrepareAccess() successfully prepared the pixmap for CPU 586 * drawing. 587 * @return FALSE if PrepareAccess() is unsuccessful and EXA should use 588 * DownloadFromScreen() to migate the pixmap out. 589 */ 590 Bool (*PrepareAccess) (PixmapPtr pPix, int index); 591 592 /** 593 * FinishAccess() is called after CPU access to an offscreen pixmap. 594 * 595 * @param pPix the pixmap being accessed 596 * @param index the index of the pixmap being accessed. 597 * 598 * FinishAccess() will be called after finishing CPU access of an offscreen 599 * pixmap set up by PrepareAccess(). Note that the FinishAccess() will not be 600 * called if PrepareAccess() failed and the pixmap was migrated out. 601 */ 602 void (*FinishAccess) (PixmapPtr pPix, int index); 603 604 /** 605 * PixmapIsOffscreen() is an optional driver replacement to 606 * exaPixmapHasGpuCopy(). Set to NULL if you want the standard behaviour 607 * of exaPixmapHasGpuCopy(). 608 * 609 * @param pPix the pixmap 610 * @return TRUE if the given drawable is in framebuffer memory. 611 * 612 * exaPixmapHasGpuCopy() is used to determine if a pixmap is in offscreen 613 * memory, meaning that acceleration could probably be done to it, and that it 614 * will need to be wrapped by PrepareAccess()/FinishAccess() when accessing it 615 * with the CPU. 616 * 617 * 618 */ 619 Bool (*PixmapIsOffscreen) (PixmapPtr pPix); 620 621 /** @name PrepareAccess() and FinishAccess() indices 622 * @{ 623 */ 624 /** 625 * EXA_PREPARE_DEST is the index for a pixmap that may be drawn to or 626 * read from. 627 */ 628#define EXA_PREPARE_DEST 0 629 /** 630 * EXA_PREPARE_SRC is the index for a pixmap that may be read from 631 */ 632#define EXA_PREPARE_SRC 1 633 /** 634 * EXA_PREPARE_SRC is the index for a second pixmap that may be read 635 * from. 636 */ 637#define EXA_PREPARE_MASK 2 638 /** 639 * EXA_PREPARE_AUX* are additional indices for other purposes, e.g. 640 * separate alpha maps with Composite operations. 641 */ 642#define EXA_PREPARE_AUX_DEST 3 643#define EXA_PREPARE_AUX_SRC 4 644#define EXA_PREPARE_AUX_MASK 5 645#define EXA_NUM_PREPARE_INDICES 6 646 /** @} */ 647 648 /** 649 * maxPitchPixels controls the pitch limitation for rendering from 650 * the card. 651 * The driver should never receive a request for rendering a pixmap 652 * that has a pitch (in pixels) beyond maxPitchPixels. 653 * 654 * Setting this field is optional -- if your hardware doesn't have 655 * a pitch limitation in pixels, don't set this. If neither this value 656 * nor maxPitchBytes is set, then maxPitchPixels is set to maxX. 657 * If set, it must not be smaller than maxX. 658 * 659 * @sa maxPitchBytes 660 */ 661 int maxPitchPixels; 662 663 /** 664 * maxPitchBytes controls the pitch limitation for rendering from 665 * the card. 666 * The driver should never receive a request for rendering a pixmap 667 * that has a pitch (in bytes) beyond maxPitchBytes. 668 * 669 * Setting this field is optional -- if your hardware doesn't have 670 * a pitch limitation in bytes, don't set this. 671 * If set, it must not be smaller than maxX * 4. 672 * There's no default value for maxPitchBytes. 673 * 674 * @sa maxPitchPixels 675 */ 676 int maxPitchBytes; 677 678 /* Hooks to allow driver to its own pixmap memory management */ 679 void *(*CreatePixmap) (ScreenPtr pScreen, int size, int align); 680 void (*DestroyPixmap) (ScreenPtr pScreen, void *driverPriv); 681 /** 682 * Returning a pixmap with non-NULL devPrivate.ptr implies a pixmap which is 683 * not offscreen, which will never be accelerated and Prepare/FinishAccess won't 684 * be called. 685 */ 686 Bool (*ModifyPixmapHeader) (PixmapPtr pPixmap, int width, int height, 687 int depth, int bitsPerPixel, int devKind, 688 void *pPixData); 689 690 /* hooks for drivers with tiling support: 691 * driver MUST fill out new_fb_pitch with valid pitch of pixmap 692 */ 693 void *(*CreatePixmap2) (ScreenPtr pScreen, int width, int height, 694 int depth, int usage_hint, int bitsPerPixel, 695 int *new_fb_pitch); 696 /** @} */ 697 Bool (*SharePixmapBacking)(PixmapPtr pPixmap, ScreenPtr slave, void **handle_p); 698 699 Bool (*SetSharedPixmapBacking)(PixmapPtr pPixmap, void *handle); 700 701} ExaDriverRec, *ExaDriverPtr; 702 703/** @name EXA driver flags 704 * @{ 705 */ 706/** 707 * EXA_OFFSCREEN_PIXMAPS indicates to EXA that the driver can support 708 * offscreen pixmaps. 709 */ 710#define EXA_OFFSCREEN_PIXMAPS (1 << 0) 711 712/** 713 * EXA_OFFSCREEN_ALIGN_POT indicates to EXA that the driver needs pixmaps 714 * to have a power-of-two pitch. 715 */ 716#define EXA_OFFSCREEN_ALIGN_POT (1 << 1) 717 718/** 719 * EXA_TWO_BITBLT_DIRECTIONS indicates to EXA that the driver can only 720 * support copies that are (left-to-right, top-to-bottom) or 721 * (right-to-left, bottom-to-top). 722 */ 723#define EXA_TWO_BITBLT_DIRECTIONS (1 << 2) 724 725/** 726 * EXA_HANDLES_PIXMAPS indicates to EXA that the driver can handle 727 * all pixmap addressing and migration. 728 */ 729#define EXA_HANDLES_PIXMAPS (1 << 3) 730 731/** 732 * EXA_SUPPORTS_PREPARE_AUX indicates to EXA that the driver can handle the 733 * EXA_PREPARE_AUX* indices in the Prepare/FinishAccess hooks. If there are no 734 * such hooks, this flag has no effect. 735 */ 736#define EXA_SUPPORTS_PREPARE_AUX (1 << 4) 737 738/** 739 * EXA_SUPPORTS_OFFSCREEN_OVERLAPS indicates to EXA that the driver Copy hooks 740 * can handle the source and destination occupying overlapping offscreen memory 741 * areas. This allows the offscreen memory defragmentation code to defragment 742 * areas where the defragmented position overlaps the fragmented position. 743 * 744 * Typically this is supported by traditional 2D engines but not by 3D engines. 745 */ 746#define EXA_SUPPORTS_OFFSCREEN_OVERLAPS (1 << 5) 747 748/** 749 * EXA_MIXED_PIXMAPS will hide unacceleratable pixmaps from drivers and manage the 750 * problem known software fallbacks like trapezoids. This only migrates pixmaps one way 751 * into a driver pixmap and then pins it. 752 */ 753#define EXA_MIXED_PIXMAPS (1 << 6) 754 755/** @} */ 756 757/* in exa.c */ 758extern _X_EXPORT ExaDriverPtr exaDriverAlloc(void); 759 760extern _X_EXPORT Bool 761 exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo); 762 763extern _X_EXPORT void 764 exaDriverFini(ScreenPtr pScreen); 765 766extern _X_EXPORT void 767 exaMarkSync(ScreenPtr pScreen); 768extern _X_EXPORT void 769 exaWaitSync(ScreenPtr pScreen); 770 771extern _X_EXPORT unsigned long 772 exaGetPixmapOffset(PixmapPtr pPix); 773 774extern _X_EXPORT unsigned long 775 exaGetPixmapPitch(PixmapPtr pPix); 776 777extern _X_EXPORT unsigned long 778 exaGetPixmapSize(PixmapPtr pPix); 779 780extern _X_EXPORT void *exaGetPixmapDriverPrivate(PixmapPtr p); 781 782/* in exa_offscreen.c */ 783extern _X_EXPORT ExaOffscreenArea *exaOffscreenAlloc(ScreenPtr pScreen, 784 int size, int align, 785 Bool locked, 786 ExaOffscreenSaveProc save, 787 void *privData); 788 789extern _X_EXPORT ExaOffscreenArea *exaOffscreenFree(ScreenPtr pScreen, 790 ExaOffscreenArea * area); 791 792extern _X_EXPORT void 793 ExaOffscreenMarkUsed(PixmapPtr pPixmap); 794 795extern _X_EXPORT void 796 exaEnableDisableFBAccess(ScreenPtr pScreen, Bool enable); 797 798extern _X_EXPORT Bool 799 exaDrawableIsOffscreen(DrawablePtr pDrawable); 800 801/* in exa.c */ 802extern _X_EXPORT void 803 exaMoveInPixmap(PixmapPtr pPixmap); 804 805extern _X_EXPORT void 806 exaMoveOutPixmap(PixmapPtr pPixmap); 807 808/* in exa_unaccel.c */ 809extern _X_EXPORT CARD32 810 exaGetPixmapFirstPixel(PixmapPtr pPixmap); 811 812/** 813 * Returns TRUE if the given planemask covers all the significant bits in the 814 * pixel values for pDrawable. 815 */ 816#define EXA_PM_IS_SOLID(_pDrawable, _pm) \ 817 (((_pm) & FbFullMask((_pDrawable)->depth)) == \ 818 FbFullMask((_pDrawable)->depth)) 819 820#endif /* EXA_H */ 821