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