1 /* 2 * Copyright 2010 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrContext_DEFINED 9 #define GrContext_DEFINED 10 11 #include "GrClipData.h" 12 #include "GrColor.h" 13 #include "GrPaint.h" 14 #include "GrPathRendererChain.h" 15 #include "GrRenderTarget.h" 16 #include "GrTexture.h" 17 #include "SkMatrix.h" 18 #include "SkPathEffect.h" 19 #include "SkTypes.h" 20 21 class GrAARectRenderer; 22 class GrAutoScratchTexture; 23 class GrDrawState; 24 class GrDrawTarget; 25 class GrFontCache; 26 class GrFragmentProcessor; 27 class GrGpu; 28 class GrGpuTraceMarker; 29 class GrIndexBuffer; 30 class GrIndexBufferAllocPool; 31 class GrInOrderDrawBuffer; 32 class GrLayerCache; 33 class GrOvalRenderer; 34 class GrPath; 35 class GrPathRenderer; 36 class GrResourceEntry; 37 class GrResourceCache; 38 class GrResourceCache2; 39 class GrStencilBuffer; 40 class GrTestTarget; 41 class GrTextContext; 42 class GrTextureParams; 43 class GrVertexBuffer; 44 class GrVertexBufferAllocPool; 45 class GrStrokeInfo; 46 class GrSoftwarePathRenderer; 47 class SkStrokeRec; 48 49 class SK_API GrContext : public SkRefCnt { 50 public: 51 SK_DECLARE_INST_COUNT(GrContext) 52 53 struct Options { 54 Options() : fDrawPathToCompressedTexture(false) { } 55 56 // EXPERIMENTAL 57 // May be removed in the future, or may become standard depending 58 // on the outcomes of a variety of internal tests. 59 bool fDrawPathToCompressedTexture; 60 }; 61 62 /** 63 * Creates a GrContext for a backend context. 64 */ 65 static GrContext* Create(GrBackend, GrBackendContext, const Options* opts = NULL); 66 67 virtual ~GrContext(); 68 69 /** 70 * The GrContext normally assumes that no outsider is setting state 71 * within the underlying 3D API's context/device/whatever. This call informs 72 * the context that the state was modified and it should resend. Shouldn't 73 * be called frequently for good performance. 74 * The flag bits, state, is dpendent on which backend is used by the 75 * context, either GL or D3D (possible in future). 76 */ 77 void resetContext(uint32_t state = kAll_GrBackendState); 78 79 /** 80 * Callback function to allow classes to cleanup on GrContext destruction. 81 * The 'info' field is filled in with the 'info' passed to addCleanUp. 82 */ 83 typedef void (*PFCleanUpFunc)(const GrContext* context, void* info); 84 85 /** 86 * Add a function to be called from within GrContext's destructor. 87 * This gives classes a chance to free resources held on a per context basis. 88 * The 'info' parameter will be stored and passed to the callback function. 89 */ 90 void addCleanUp(PFCleanUpFunc cleanUp, void* info) { 91 CleanUpData* entry = fCleanUpData.push(); 92 93 entry->fFunc = cleanUp; 94 entry->fInfo = info; 95 } 96 97 /** 98 * Abandons all GPU resources and assumes the underlying backend 3D API 99 * context is not longer usable. Call this if you have lost the associated 100 * GPU context, and thus internal texture, buffer, etc. references/IDs are 101 * now invalid. Should be called even when GrContext is no longer going to 102 * be used for two reasons: 103 * 1) ~GrContext will not try to free the objects in the 3D API. 104 * 2) Any GrGpuResources created by this GrContext that outlive 105 * will be marked as invalid (GrGpuResource::wasDestroyed()) and 106 * when they're destroyed no 3D API calls will be made. 107 * Content drawn since the last GrContext::flush() may be lost. After this 108 * function is called the only valid action on the GrContext or 109 * GrGpuResources it created is to destroy them. 110 */ 111 void abandonContext(); 112 void contextDestroyed() { this->abandonContext(); } // legacy alias 113 114 /////////////////////////////////////////////////////////////////////////// 115 // Resource Cache 116 117 /** 118 * Return the current GPU resource cache limits. 119 * 120 * @param maxResources If non-null, returns maximum number of resources that 121 * can be held in the cache. 122 * @param maxResourceBytes If non-null, returns maximum number of bytes of 123 * video memory that can be held in the cache. 124 */ 125 void getResourceCacheLimits(int* maxResources, size_t* maxResourceBytes) const; 126 SK_ATTR_DEPRECATED("This function has been renamed to getResourceCacheLimits().") 127 void getTextureCacheLimits(int* maxTextures, size_t* maxTextureBytes) const { 128 this->getResourceCacheLimits(maxTextures, maxTextureBytes); 129 } 130 131 /** 132 * Gets the current GPU resource cache usage. 133 * 134 * @param resourceCount If non-null, returns the number of resources that are held in the 135 * cache. 136 * @param maxResourceBytes If non-null, returns the total number of bytes of video memory held 137 * in the cache. 138 */ 139 void getResourceCacheUsage(int* resourceCount, size_t* resourceBytes) const; 140 141 SK_ATTR_DEPRECATED("Use getResourceCacheUsage().") 142 size_t getGpuTextureCacheBytes() const { 143 size_t bytes; 144 this->getResourceCacheUsage(NULL, &bytes); 145 return bytes; 146 } 147 148 SK_ATTR_DEPRECATED("Use getResourceCacheUsage().") 149 int getGpuTextureCacheResourceCount() const { 150 int count; 151 this->getResourceCacheUsage(&count, NULL); 152 return count; 153 } 154 155 /** 156 * Specify the GPU resource cache limits. If the current cache exceeds either 157 * of these, it will be purged (LRU) to keep the cache within these limits. 158 * 159 * @param maxResources The maximum number of resources that can be held in 160 * the cache. 161 * @param maxResourceBytes The maximum number of bytes of video memory 162 * that can be held in the cache. 163 */ 164 void setResourceCacheLimits(int maxResources, size_t maxResourceBytes); 165 SK_ATTR_DEPRECATED("This function has been renamed to setResourceCacheLimits().") 166 void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) { 167 this->setResourceCacheLimits(maxTextures, maxTextureBytes); 168 } 169 170 /** 171 * Frees GPU created by the context. Can be called to reduce GPU memory 172 * pressure. 173 */ 174 void freeGpuResources(); 175 176 /** 177 * This method should be called whenever a GrResource is unreffed or 178 * switched from exclusive to non-exclusive. This 179 * gives the resource cache a chance to discard unneeded resources. 180 * Note: this entry point will be removed once totally ref-driven 181 * cache maintenance is implemented. 182 */ 183 void purgeCache(); 184 185 /** 186 * Purge all the unlocked resources from the cache. 187 * This entry point is mainly meant for timing texture uploads 188 * and is not defined in normal builds of Skia. 189 */ 190 void purgeAllUnlockedResources(); 191 192 /** 193 * Stores a custom resource in the cache, based on the specified key. 194 */ 195 void addResourceToCache(const GrResourceKey&, GrGpuResource*); 196 197 /** 198 * Finds a resource in the cache, based on the specified key. This is intended for use in 199 * conjunction with addResourceToCache(). The return value will be NULL if not found. The 200 * caller must balance with a call to unref(). 201 */ 202 GrGpuResource* findAndRefCachedResource(const GrResourceKey&); 203 204 /** 205 * Creates a new text rendering context that is optimal for the 206 * render target and the context. Caller assumes the ownership 207 * of the returned object. The returned object must be deleted 208 * before the context is destroyed. 209 */ 210 GrTextContext* createTextContext(GrRenderTarget*, 211 const SkDeviceProperties&, 212 bool enableDistanceFieldFonts); 213 214 /////////////////////////////////////////////////////////////////////////// 215 // Textures 216 217 /** 218 * Creates a new entry, based on the specified key and texture and returns it. The caller owns a 219 * ref on the returned texture which must be balanced by a call to unref. 220 * 221 * @param params The texture params used to draw a texture may help determine 222 * the cache entry used. (e.g. different versions may exist 223 * for different wrap modes on GPUs with limited NPOT 224 * texture support). NULL implies clamp wrap modes. 225 * @param desc Description of the texture properties. 226 * @param cacheID Cache-specific properties (e.g., texture gen ID) 227 * @param srcData Pointer to the pixel values. 228 * @param rowBytes The number of bytes between rows of the texture. Zero 229 * implies tightly packed rows. For compressed pixel configs, this 230 * field is ignored. 231 * @param cacheKey (optional) If non-NULL, we'll write the cache key we used to cacheKey. 232 */ 233 GrTexture* createTexture(const GrTextureParams* params, 234 const GrTextureDesc& desc, 235 const GrCacheID& cacheID, 236 const void* srcData, 237 size_t rowBytes, 238 GrResourceKey* cacheKey = NULL); 239 /** 240 * Search for an entry based on key and dimensions. If found, ref it and return it. The return 241 * value will be NULL if not found. The caller must balance with a call to unref. 242 * 243 * @param desc Description of the texture properties. 244 * @param cacheID Cache-specific properties (e.g., texture gen ID) 245 * @param params The texture params used to draw a texture may help determine 246 * the cache entry used. (e.g. different versions may exist 247 * for different wrap modes on GPUs with limited NPOT 248 * texture support). NULL implies clamp wrap modes. 249 */ 250 GrTexture* findAndRefTexture(const GrTextureDesc& desc, 251 const GrCacheID& cacheID, 252 const GrTextureParams* params); 253 /** 254 * Determines whether a texture is in the cache. If the texture is found it 255 * will not be locked or returned. This call does not affect the priority of 256 * the texture for deletion. 257 */ 258 bool isTextureInCache(const GrTextureDesc& desc, 259 const GrCacheID& cacheID, 260 const GrTextureParams* params) const; 261 262 /** 263 * Enum that determines how closely a returned scratch texture must match 264 * a provided GrTextureDesc. 265 */ 266 enum ScratchTexMatch { 267 /** 268 * Finds a texture that exactly matches the descriptor. 269 */ 270 kExact_ScratchTexMatch, 271 /** 272 * Finds a texture that approximately matches the descriptor. Will be 273 * at least as large in width and height as desc specifies. If desc 274 * specifies that texture is a render target then result will be a 275 * render target. If desc specifies a render target and doesn't set the 276 * no stencil flag then result will have a stencil. Format and aa level 277 * will always match. 278 */ 279 kApprox_ScratchTexMatch 280 }; 281 282 /** 283 * Returns a texture matching the desc. It's contents are unknown. Subsequent 284 * requests with the same descriptor are not guaranteed to return the same 285 * texture. The same texture is guaranteed not be returned again until it is 286 * unlocked. Call must be balanced with an unlockTexture() call. The caller 287 * owns a ref on the returned texture and must balance with a call to unref. 288 * 289 * Textures created by createAndLockTexture() hide the complications of 290 * tiling non-power-of-two textures on APIs that don't support this (e.g. 291 * unextended GLES2). Tiling a NPOT texture created by lockScratchTexture on 292 * such an API will create gaps in the tiling pattern. This includes clamp 293 * mode. (This may be addressed in a future update.) 294 */ 295 GrTexture* lockAndRefScratchTexture(const GrTextureDesc&, ScratchTexMatch match); 296 297 /** 298 * When done with an entry, call unlockScratchTexture(entry) on it, which returns 299 * it to the cache, where it may be purged. This does not unref the texture. 300 */ 301 void unlockScratchTexture(GrTexture* texture); 302 303 /** 304 * Creates a texture that is outside the cache. Does not count against 305 * cache's budget. 306 */ 307 GrTexture* createUncachedTexture(const GrTextureDesc& desc, 308 void* srcData, 309 size_t rowBytes); 310 311 /** 312 * Returns true if the specified use of an indexed texture is supported. 313 * Support may depend upon whether the texture params indicate that the 314 * texture will be tiled. Passing NULL for the texture params indicates 315 * clamp mode. 316 */ 317 bool supportsIndex8PixelConfig(const GrTextureParams*, 318 int width, 319 int height) const; 320 321 /** 322 * Return the max width or height of a texture supported by the current GPU. 323 */ 324 int getMaxTextureSize() const; 325 326 /** 327 * Temporarily override the true max texture size. Note: an override 328 * larger then the true max texture size will have no effect. 329 * This entry point is mainly meant for testing texture size dependent 330 * features and is only available if defined outside of Skia (see 331 * bleed GM. 332 */ 333 void setMaxTextureSizeOverride(int maxTextureSizeOverride); 334 335 /////////////////////////////////////////////////////////////////////////// 336 // Render targets 337 338 /** 339 * Sets the render target. 340 * @param target the render target to set. 341 */ 342 void setRenderTarget(GrRenderTarget* target) { 343 fRenderTarget.reset(SkSafeRef(target)); 344 } 345 346 /** 347 * Gets the current render target. 348 * @return the currently bound render target. 349 */ 350 const GrRenderTarget* getRenderTarget() const { return fRenderTarget.get(); } 351 GrRenderTarget* getRenderTarget() { return fRenderTarget.get(); } 352 353 /** 354 * Can the provided configuration act as a color render target? 355 */ 356 bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const; 357 358 /** 359 * Return the max width or height of a render target supported by the 360 * current GPU. 361 */ 362 int getMaxRenderTargetSize() const; 363 364 /** 365 * Returns the max sample count for a render target. It will be 0 if MSAA 366 * is not supported. 367 */ 368 int getMaxSampleCount() const; 369 370 /** 371 * Returns the recommended sample count for a render target when using this 372 * context. 373 * 374 * @param config the configuration of the render target. 375 * @param dpi the display density in dots per inch. 376 * 377 * @return sample count that should be perform well and have good enough 378 * rendering quality for the display. Alternatively returns 0 if 379 * MSAA is not supported or recommended to be used by default. 380 */ 381 int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const; 382 383 /////////////////////////////////////////////////////////////////////////// 384 // Backend Surfaces 385 386 /** 387 * Wraps an existing texture with a GrTexture object. 388 * 389 * OpenGL: if the object is a texture Gr may change its GL texture params 390 * when it is drawn. 391 * 392 * @param desc description of the object to create. 393 * 394 * @return GrTexture object or NULL on failure. 395 */ 396 GrTexture* wrapBackendTexture(const GrBackendTextureDesc& desc); 397 398 /** 399 * Wraps an existing render target with a GrRenderTarget object. It is 400 * similar to wrapBackendTexture but can be used to draw into surfaces 401 * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that 402 * the client will resolve to a texture). 403 * 404 * @param desc description of the object to create. 405 * 406 * @return GrTexture object or NULL on failure. 407 */ 408 GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc); 409 410 /////////////////////////////////////////////////////////////////////////// 411 // Matrix state 412 413 /** 414 * Gets the current transformation matrix. 415 * @return the current matrix. 416 */ 417 const SkMatrix& getMatrix() const { return fViewMatrix; } 418 419 /** 420 * Sets the transformation matrix. 421 * @param m the matrix to set. 422 */ 423 void setMatrix(const SkMatrix& m) { fViewMatrix = m; } 424 425 /** 426 * Sets the current transformation matrix to identity. 427 */ 428 void setIdentityMatrix() { fViewMatrix.reset(); } 429 430 /** 431 * Concats the current matrix. The passed matrix is applied before the 432 * current matrix. 433 * @param m the matrix to concat. 434 */ 435 void concatMatrix(const SkMatrix& m) { fViewMatrix.preConcat(m); } 436 437 438 /////////////////////////////////////////////////////////////////////////// 439 // Clip state 440 /** 441 * Gets the current clip. 442 * @return the current clip. 443 */ 444 const GrClipData* getClip() const { return fClip; } 445 446 /** 447 * Sets the clip. 448 * @param clipData the clip to set. 449 */ 450 void setClip(const GrClipData* clipData) { fClip = clipData; } 451 452 /////////////////////////////////////////////////////////////////////////// 453 // Draws 454 455 /** 456 * Clear the entire or rect of the render target, ignoring any clips. 457 * @param rect the rect to clear or the whole thing if rect is NULL. 458 * @param color the color to clear to. 459 * @param canIgnoreRect allows partial clears to be converted to whole 460 * clears on platforms for which that is cheap 461 * @param target if non-NULL, the render target to clear otherwise clear 462 * the current render target 463 */ 464 void clear(const SkIRect* rect, GrColor color, bool canIgnoreRect, 465 GrRenderTarget* target = NULL); 466 467 /** 468 * Draw everywhere (respecting the clip) with the paint. 469 */ 470 void drawPaint(const GrPaint& paint); 471 472 /** 473 * Draw the rect using a paint. 474 * @param paint describes how to color pixels. 475 * @param strokeInfo the stroke information (width, join, cap), and. 476 * the dash information (intervals, count, phase). 477 * If strokeInfo == NULL, then the rect is filled. 478 * Otherwise, if stroke width == 0, then the stroke 479 * is always a single pixel thick, else the rect is 480 * mitered/beveled stroked based on stroke width. 481 * The rects coords are used to access the paint (through texture matrix) 482 */ 483 void drawRect(const GrPaint& paint, 484 const SkRect&, 485 const GrStrokeInfo* strokeInfo = NULL); 486 487 /** 488 * Maps a rect of local coordinates onto the a rect of destination 489 * coordinates. The localRect is stretched over the dstRect. The dstRect is 490 * transformed by the context's matrix. An additional optional matrix can be 491 * provided to transform the local rect. 492 * 493 * @param paint describes how to color pixels. 494 * @param dstRect the destination rect to draw. 495 * @param localRect rect of local coordinates to be mapped onto dstRect 496 * @param localMatrix Optional matrix to transform localRect. 497 */ 498 void drawRectToRect(const GrPaint& paint, 499 const SkRect& dstRect, 500 const SkRect& localRect, 501 const SkMatrix* localMatrix = NULL); 502 503 /** 504 * Draw a roundrect using a paint. 505 * 506 * @param paint describes how to color pixels. 507 * @param rrect the roundrect to draw 508 * @param strokeInfo the stroke information (width, join, cap) and 509 * the dash information (intervals, count, phase). 510 */ 511 void drawRRect(const GrPaint& paint, const SkRRect& rrect, const GrStrokeInfo& strokeInfo); 512 513 /** 514 * Shortcut for drawing an SkPath consisting of nested rrects using a paint. 515 * Does not support stroking. The result is undefined if outer does not contain 516 * inner. 517 * 518 * @param paint describes how to color pixels. 519 * @param outer the outer roundrect 520 * @param inner the inner roundrect 521 */ 522 void drawDRRect(const GrPaint& paint, const SkRRect& outer, const SkRRect& inner); 523 524 525 /** 526 * Draws a path. 527 * 528 * @param paint describes how to color pixels. 529 * @param path the path to draw 530 * @param strokeInfo the stroke information (width, join, cap) and 531 * the dash information (intervals, count, phase). 532 */ 533 void drawPath(const GrPaint& paint, const SkPath& path, const GrStrokeInfo& strokeInfo); 534 535 /** 536 * Draws vertices with a paint. 537 * 538 * @param paint describes how to color pixels. 539 * @param primitiveType primitives type to draw. 540 * @param vertexCount number of vertices. 541 * @param positions array of vertex positions, required. 542 * @param texCoords optional array of texture coordinates used 543 * to access the paint. 544 * @param colors optional array of per-vertex colors, supercedes 545 * the paint's color field. 546 * @param indices optional array of indices. If NULL vertices 547 * are drawn non-indexed. 548 * @param indexCount if indices is non-null then this is the 549 * number of indices. 550 */ 551 void drawVertices(const GrPaint& paint, 552 GrPrimitiveType primitiveType, 553 int vertexCount, 554 const SkPoint positions[], 555 const SkPoint texs[], 556 const GrColor colors[], 557 const uint16_t indices[], 558 int indexCount); 559 560 /** 561 * Draws an oval. 562 * 563 * @param paint describes how to color pixels. 564 * @param oval the bounding rect of the oval. 565 * @param strokeInfo the stroke information (width, join, cap) and 566 * the dash information (intervals, count, phase). 567 */ 568 void drawOval(const GrPaint& paint, 569 const SkRect& oval, 570 const GrStrokeInfo& strokeInfo); 571 572 /////////////////////////////////////////////////////////////////////////// 573 // Misc. 574 575 /** 576 * Flags that affect flush() behavior. 577 */ 578 enum FlushBits { 579 /** 580 * A client may reach a point where it has partially rendered a frame 581 * through a GrContext that it knows the user will never see. This flag 582 * causes the flush to skip submission of deferred content to the 3D API 583 * during the flush. 584 */ 585 kDiscard_FlushBit = 0x2, 586 }; 587 588 /** 589 * Call to ensure all drawing to the context has been issued to the 590 * underlying 3D API. 591 * @param flagsBitfield flags that control the flushing behavior. See 592 * FlushBits. 593 */ 594 void flush(int flagsBitfield = 0); 595 596 /** 597 * These flags can be used with the read/write pixels functions below. 598 */ 599 enum PixelOpsFlags { 600 /** The GrContext will not be flushed. This means that the read or write may occur before 601 previous draws have executed. */ 602 kDontFlush_PixelOpsFlag = 0x1, 603 /** The src for write or dst read is unpremultiplied. This is only respected if both the 604 config src and dst configs are an RGBA/BGRA 8888 format. */ 605 kUnpremul_PixelOpsFlag = 0x2, 606 }; 607 608 /** 609 * Reads a rectangle of pixels from a render target. 610 * @param target the render target to read from. NULL means the current render target. 611 * @param left left edge of the rectangle to read (inclusive) 612 * @param top top edge of the rectangle to read (inclusive) 613 * @param width width of rectangle to read in pixels. 614 * @param height height of rectangle to read in pixels. 615 * @param config the pixel config of the destination buffer 616 * @param buffer memory to read the rectangle into. 617 * @param rowBytes number of bytes bewtween consecutive rows. Zero means rows are tightly 618 * packed. 619 * @param pixelOpsFlags see PixelOpsFlags enum above. 620 * 621 * @return true if the read succeeded, false if not. The read can fail because of an unsupported 622 * pixel config or because no render target is currently set and NULL was passed for 623 * target. 624 */ 625 bool readRenderTargetPixels(GrRenderTarget* target, 626 int left, int top, int width, int height, 627 GrPixelConfig config, void* buffer, 628 size_t rowBytes = 0, 629 uint32_t pixelOpsFlags = 0); 630 631 /** 632 * Copy the src pixels [buffer, row bytes, pixel config] into a render target at the specified 633 * rectangle. 634 * @param target the render target to write into. NULL means the current render target. 635 * @param left left edge of the rectangle to write (inclusive) 636 * @param top top edge of the rectangle to write (inclusive) 637 * @param width width of rectangle to write in pixels. 638 * @param height height of rectangle to write in pixels. 639 * @param config the pixel config of the source buffer 640 * @param buffer memory to read the rectangle from. 641 * @param rowBytes number of bytes between consecutive rows. Zero means rows are tightly 642 * packed. 643 * @param pixelOpsFlags see PixelOpsFlags enum above. 644 * 645 * @return true if the write succeeded, false if not. The write can fail because of an 646 * unsupported combination of target and pixel configs. 647 */ 648 bool writeRenderTargetPixels(GrRenderTarget* target, 649 int left, int top, int width, int height, 650 GrPixelConfig config, const void* buffer, 651 size_t rowBytes = 0, 652 uint32_t pixelOpsFlags = 0); 653 654 /** 655 * Reads a rectangle of pixels from a texture. 656 * @param texture the texture to read from. 657 * @param left left edge of the rectangle to read (inclusive) 658 * @param top top edge of the rectangle to read (inclusive) 659 * @param width width of rectangle to read in pixels. 660 * @param height height of rectangle to read in pixels. 661 * @param config the pixel config of the destination buffer 662 * @param buffer memory to read the rectangle into. 663 * @param rowBytes number of bytes between consecutive rows. Zero means rows are tightly 664 * packed. 665 * @param pixelOpsFlags see PixelOpsFlags enum above. 666 * 667 * @return true if the read succeeded, false if not. The read can fail because of an unsupported 668 * pixel config. 669 */ 670 bool readTexturePixels(GrTexture* texture, 671 int left, int top, int width, int height, 672 GrPixelConfig config, void* buffer, 673 size_t rowBytes = 0, 674 uint32_t pixelOpsFlags = 0); 675 676 /** 677 * Writes a rectangle of pixels to a texture. 678 * @param texture the render target to read from. 679 * @param left left edge of the rectangle to write (inclusive) 680 * @param top top edge of the rectangle to write (inclusive) 681 * @param width width of rectangle to write in pixels. 682 * @param height height of rectangle to write in pixels. 683 * @param config the pixel config of the source buffer 684 * @param buffer memory to read pixels from 685 * @param rowBytes number of bytes between consecutive rows. Zero 686 * means rows are tightly packed. 687 * @param pixelOpsFlags see PixelOpsFlags enum above. 688 * @return true if the write succeeded, false if not. The write can fail because of an 689 * unsupported combination of texture and pixel configs. 690 */ 691 bool writeTexturePixels(GrTexture* texture, 692 int left, int top, int width, int height, 693 GrPixelConfig config, const void* buffer, 694 size_t rowBytes, 695 uint32_t pixelOpsFlags = 0); 696 697 /** 698 * Copies a rectangle of texels from src to dst. The size of dst is the size of the rectangle 699 * copied and topLeft is the position of the rect in src. The rectangle is clipped to src's 700 * bounds. 701 * @param src the texture to copy from. 702 * @param dst the render target to copy to. 703 * @param topLeft the point in src that will be copied to the top-left of dst. If NULL, 704 * (0, 0) will be used. 705 */ 706 void copyTexture(GrTexture* src, GrRenderTarget* dst, const SkIPoint* topLeft = NULL); 707 708 /** 709 * Resolves a render target that has MSAA. The intermediate MSAA buffer is 710 * down-sampled to the associated GrTexture (accessible via 711 * GrRenderTarget::asTexture()). Any pending draws to the render target will 712 * be executed before the resolve. 713 * 714 * This is only necessary when a client wants to access the object directly 715 * using the backend API directly. GrContext will detect when it must 716 * perform a resolve to a GrTexture used as the source of a draw or before 717 * reading pixels back from a GrTexture or GrRenderTarget. 718 */ 719 void resolveRenderTarget(GrRenderTarget*); 720 721 /** 722 * Provides a perfomance hint that the render target's contents are allowed 723 * to become undefined. 724 */ 725 void discardRenderTarget(GrRenderTarget*); 726 727 #ifdef SK_DEVELOPER 728 void dumpFontCache() const; 729 #endif 730 731 /////////////////////////////////////////////////////////////////////////// 732 // Helpers 733 734 class AutoRenderTarget : public ::SkNoncopyable { 735 public: 736 AutoRenderTarget(GrContext* context, GrRenderTarget* target) { 737 fPrevTarget = context->getRenderTarget(); 738 SkSafeRef(fPrevTarget); 739 context->setRenderTarget(target); 740 fContext = context; 741 } 742 AutoRenderTarget(GrContext* context) { 743 fPrevTarget = context->getRenderTarget(); 744 SkSafeRef(fPrevTarget); 745 fContext = context; 746 } 747 ~AutoRenderTarget() { 748 if (fContext) { 749 fContext->setRenderTarget(fPrevTarget); 750 } 751 SkSafeUnref(fPrevTarget); 752 } 753 private: 754 GrContext* fContext; 755 GrRenderTarget* fPrevTarget; 756 }; 757 758 /** 759 * Save/restore the view-matrix in the context. It can optionally adjust a paint to account 760 * for a coordinate system change. Here is an example of how the paint param can be used: 761 * 762 * A GrPaint is setup with GrProcessors. The stages will have access to the pre-matrix source 763 * geometry positions when the draw is executed. Later on a decision is made to transform the 764 * geometry to device space on the CPU. The effects now need to know that the space in which 765 * the geometry will be specified has changed. 766 * 767 * Note that when restore is called (or in the destructor) the context's matrix will be 768 * restored. However, the paint will not be restored. The caller must make a copy of the 769 * paint if necessary. Hint: use SkTCopyOnFirstWrite if the AutoMatrix is conditionally 770 * initialized. 771 */ 772 class AutoMatrix : public ::SkNoncopyable { 773 public: 774 AutoMatrix() : fContext(NULL) {} 775 776 ~AutoMatrix() { this->restore(); } 777 778 /** 779 * Initializes by pre-concat'ing the context's current matrix with the preConcat param. 780 */ 781 void setPreConcat(GrContext* context, const SkMatrix& preConcat, GrPaint* paint = NULL) { 782 SkASSERT(context); 783 784 this->restore(); 785 786 fContext = context; 787 fMatrix = context->getMatrix(); 788 this->preConcat(preConcat, paint); 789 } 790 791 /** 792 * Sets the context's matrix to identity. Returns false if the inverse matrix is required to 793 * update a paint but the matrix cannot be inverted. 794 */ 795 bool setIdentity(GrContext* context, GrPaint* paint = NULL) { 796 SkASSERT(context); 797 798 this->restore(); 799 800 if (paint) { 801 if (!paint->localCoordChangeInverse(context->getMatrix())) { 802 return false; 803 } 804 } 805 fMatrix = context->getMatrix(); 806 fContext = context; 807 context->setIdentityMatrix(); 808 return true; 809 } 810 811 /** 812 * Replaces the context's matrix with a new matrix. Returns false if the inverse matrix is 813 * required to update a paint but the matrix cannot be inverted. 814 */ 815 bool set(GrContext* context, const SkMatrix& newMatrix, GrPaint* paint = NULL) { 816 if (paint) { 817 if (!this->setIdentity(context, paint)) { 818 return false; 819 } 820 this->preConcat(newMatrix, paint); 821 } else { 822 this->restore(); 823 fContext = context; 824 fMatrix = context->getMatrix(); 825 context->setMatrix(newMatrix); 826 } 827 return true; 828 } 829 830 /** 831 * If this has been initialized then the context's matrix will be further updated by 832 * pre-concat'ing the preConcat param. The matrix that will be restored remains unchanged. 833 * The paint is assumed to be relative to the context's matrix at the time this call is 834 * made, not the matrix at the time AutoMatrix was first initialized. In other words, this 835 * performs an incremental update of the paint. 836 */ 837 void preConcat(const SkMatrix& preConcat, GrPaint* paint = NULL) { 838 if (paint) { 839 paint->localCoordChange(preConcat); 840 } 841 fContext->concatMatrix(preConcat); 842 } 843 844 /** 845 * Returns false if never initialized or the inverse matrix was required to update a paint 846 * but the matrix could not be inverted. 847 */ 848 bool succeeded() const { return SkToBool(fContext); } 849 850 /** 851 * If this has been initialized then the context's original matrix is restored. 852 */ 853 void restore() { 854 if (fContext) { 855 fContext->setMatrix(fMatrix); 856 fContext = NULL; 857 } 858 } 859 860 private: 861 GrContext* fContext; 862 SkMatrix fMatrix; 863 }; 864 865 class AutoClip : public ::SkNoncopyable { 866 public: 867 // This enum exists to require a caller of the constructor to acknowledge that the clip will 868 // initially be wide open. It also could be extended if there are other desirable initial 869 // clip states. 870 enum InitialClip { 871 kWideOpen_InitialClip, 872 }; 873 874 AutoClip(GrContext* context, InitialClip initialState) 875 : fContext(context) { 876 SkASSERT(kWideOpen_InitialClip == initialState); 877 fNewClipData.fClipStack = &fNewClipStack; 878 879 fOldClip = context->getClip(); 880 context->setClip(&fNewClipData); 881 } 882 883 AutoClip(GrContext* context, const SkRect& newClipRect) 884 : fContext(context) 885 , fNewClipStack(newClipRect) { 886 fNewClipData.fClipStack = &fNewClipStack; 887 888 fOldClip = fContext->getClip(); 889 fContext->setClip(&fNewClipData); 890 } 891 892 ~AutoClip() { 893 if (fContext) { 894 fContext->setClip(fOldClip); 895 } 896 } 897 private: 898 GrContext* fContext; 899 const GrClipData* fOldClip; 900 901 SkClipStack fNewClipStack; 902 GrClipData fNewClipData; 903 }; 904 905 class AutoWideOpenIdentityDraw { 906 public: 907 AutoWideOpenIdentityDraw(GrContext* ctx, GrRenderTarget* rt) 908 : fAutoClip(ctx, AutoClip::kWideOpen_InitialClip) 909 , fAutoRT(ctx, rt) { 910 fAutoMatrix.setIdentity(ctx); 911 // should never fail with no paint param. 912 SkASSERT(fAutoMatrix.succeeded()); 913 } 914 915 private: 916 AutoClip fAutoClip; 917 AutoRenderTarget fAutoRT; 918 AutoMatrix fAutoMatrix; 919 }; 920 921 /////////////////////////////////////////////////////////////////////////// 922 // Functions intended for internal use only. 923 GrGpu* getGpu() { return fGpu; } 924 const GrGpu* getGpu() const { return fGpu; } 925 GrFontCache* getFontCache() { return fFontCache; } 926 GrLayerCache* getLayerCache() { return fLayerCache.get(); } 927 GrDrawTarget* getTextTarget(); 928 const GrIndexBuffer* getQuadIndexBuffer() const; 929 GrAARectRenderer* getAARectRenderer() { return fAARectRenderer; } 930 GrResourceCache2* getResourceCache2() { return fResourceCache2; } 931 932 // Called by tests that draw directly to the context via GrDrawTarget 933 void getTestTarget(GrTestTarget*); 934 935 void addGpuTraceMarker(const GrGpuTraceMarker* marker); 936 void removeGpuTraceMarker(const GrGpuTraceMarker* marker); 937 938 /** 939 * Stencil buffers add themselves to the cache using addStencilBuffer. findStencilBuffer is 940 * called to check the cache for a SB that matches an RT's criteria. 941 */ 942 void addStencilBuffer(GrStencilBuffer* sb); 943 GrStencilBuffer* findStencilBuffer(int width, int height, int sampleCnt); 944 945 GrPathRenderer* getPathRenderer( 946 const SkPath& path, 947 const SkStrokeRec& stroke, 948 const GrDrawTarget* target, 949 bool allowSW, 950 GrPathRendererChain::DrawType drawType = GrPathRendererChain::kColor_DrawType, 951 GrPathRendererChain::StencilSupport* stencilSupport = NULL); 952 953 /** 954 * This returns a copy of the the GrContext::Options that was passed to the 955 * constructor of this class. 956 */ 957 const Options& getOptions() const { return fOptions; } 958 959 #if GR_CACHE_STATS 960 void printCacheStats() const; 961 #endif 962 963 class GPUStats { 964 public: 965 #if GR_GPU_STATS 966 GPUStats() { this->reset(); } 967 968 void reset() { fRenderTargetBinds = 0; fShaderCompilations = 0; } 969 970 int renderTargetBinds() const { return fRenderTargetBinds; } 971 void incRenderTargetBinds() { fRenderTargetBinds++; } 972 int shaderCompilations() const { return fShaderCompilations; } 973 void incShaderCompilations() { fShaderCompilations++; } 974 private: 975 int fRenderTargetBinds; 976 int fShaderCompilations; 977 #else 978 void incRenderTargetBinds() {} 979 void incShaderCompilations() {} 980 #endif 981 }; 982 983 #if GR_GPU_STATS 984 const GPUStats* gpuStats() const; 985 #endif 986 987 private: 988 // Used to indicate whether a draw should be performed immediately or queued in fDrawBuffer. 989 enum BufferedDraw { 990 kYes_BufferedDraw, 991 kNo_BufferedDraw, 992 }; 993 BufferedDraw fLastDrawWasBuffered; 994 995 GrGpu* fGpu; 996 SkMatrix fViewMatrix; 997 SkAutoTUnref<GrRenderTarget> fRenderTarget; 998 const GrClipData* fClip; // TODO: make this ref counted 999 GrDrawState* fDrawState; 1000 1001 GrResourceCache* fResourceCache; 1002 GrResourceCache2* fResourceCache2; 1003 GrFontCache* fFontCache; 1004 SkAutoTDelete<GrLayerCache> fLayerCache; 1005 1006 GrPathRendererChain* fPathRendererChain; 1007 GrSoftwarePathRenderer* fSoftwarePathRenderer; 1008 1009 GrVertexBufferAllocPool* fDrawBufferVBAllocPool; 1010 GrIndexBufferAllocPool* fDrawBufferIBAllocPool; 1011 GrInOrderDrawBuffer* fDrawBuffer; 1012 1013 // Set by OverbudgetCB() to request that GrContext flush before exiting a draw. 1014 bool fFlushToReduceCacheSize; 1015 1016 GrAARectRenderer* fAARectRenderer; 1017 GrOvalRenderer* fOvalRenderer; 1018 1019 bool fDidTestPMConversions; 1020 int fPMToUPMConversion; 1021 int fUPMToPMConversion; 1022 1023 struct CleanUpData { 1024 PFCleanUpFunc fFunc; 1025 void* fInfo; 1026 }; 1027 1028 SkTDArray<CleanUpData> fCleanUpData; 1029 1030 int fMaxTextureSizeOverride; 1031 1032 const Options fOptions; 1033 1034 GrContext(const Options&); // init must be called after the constructor. 1035 bool init(GrBackend, GrBackendContext); 1036 1037 void setupDrawBuffer(); 1038 1039 class AutoRestoreEffects; 1040 class AutoCheckFlush; 1041 /// Sets the paint and returns the target to draw into. The paint can be NULL in which case the 1042 /// draw state is left unmodified. 1043 GrDrawTarget* prepareToDraw(const GrPaint*, BufferedDraw, AutoRestoreEffects*, AutoCheckFlush*); 1044 1045 void internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath& path, 1046 const GrStrokeInfo& stroke); 1047 1048 GrTexture* createResizedTexture(const GrTextureDesc& desc, 1049 const GrCacheID& cacheID, 1050 const void* srcData, 1051 size_t rowBytes, 1052 bool filter); 1053 1054 // Needed so GrTexture's returnToCache helper function can call 1055 // addExistingTextureToCache 1056 friend class GrTexture; 1057 friend class GrStencilAndCoverPathRenderer; 1058 friend class GrStencilAndCoverTextContext; 1059 1060 // Add an existing texture to the texture cache. This is intended solely 1061 // for use with textures released from an GrAutoScratchTexture. 1062 void addExistingTextureToCache(GrTexture* texture); 1063 1064 /** 1065 * These functions create premul <-> unpremul effects if it is possible to generate a pair 1066 * of effects that make a readToUPM->writeToPM->readToUPM cycle invariant. Otherwise, they 1067 * return NULL. 1068 */ 1069 const GrFragmentProcessor* createPMToUPMEffect(GrTexture*, bool swapRAndB, const SkMatrix&); 1070 const GrFragmentProcessor* createUPMToPMEffect(GrTexture*, bool swapRAndB, const SkMatrix&); 1071 1072 /** 1073 * This callback allows the resource cache to callback into the GrContext 1074 * when the cache is still overbudget after a purge. 1075 */ 1076 static bool OverbudgetCB(void* data); 1077 1078 typedef SkRefCnt INHERITED; 1079 }; 1080 1081 /** 1082 * Gets and locks a scratch texture from a descriptor using either exact or approximate criteria. 1083 * Unlocks texture in the destructor. 1084 */ 1085 class GrAutoScratchTexture : public ::SkNoncopyable { 1086 public: 1087 GrAutoScratchTexture() 1088 : fContext(NULL) 1089 , fTexture(NULL) { 1090 } 1091 1092 GrAutoScratchTexture(GrContext* context, 1093 const GrTextureDesc& desc, 1094 GrContext::ScratchTexMatch match = GrContext::kApprox_ScratchTexMatch) 1095 : fContext(NULL) 1096 , fTexture(NULL) { 1097 this->set(context, desc, match); 1098 } 1099 1100 ~GrAutoScratchTexture() { 1101 this->reset(); 1102 } 1103 1104 void reset() { 1105 if (fContext && fTexture) { 1106 fContext->unlockScratchTexture(fTexture); 1107 fTexture->unref(); 1108 fTexture = NULL; 1109 } 1110 } 1111 1112 /* 1113 * When detaching a texture we do not unlock it in the texture cache but 1114 * we do set the returnToCache flag. In this way the texture remains 1115 * "locked" in the texture cache until it is freed and recycled in 1116 * GrTexture::internal_dispose. In reality, the texture has been removed 1117 * from the cache (because this is in AutoScratchTexture) and by not 1118 * calling unlockScratchTexture we simply don't re-add it. It will be 1119 * reattached in GrTexture::internal_dispose. 1120 * 1121 * Note that the caller is assumed to accept and manage the ref to the 1122 * returned texture. 1123 */ 1124 GrTexture* detach() { 1125 if (NULL == fTexture) { 1126 return NULL; 1127 } 1128 GrTexture* texture = fTexture; 1129 fTexture = NULL; 1130 1131 // This GrAutoScratchTexture has a ref from lockAndRefScratchTexture, which we give up now. 1132 // The cache also has a ref which we are lending to the caller of detach(). When the caller 1133 // lets go of the ref and the ref count goes to 0 internal_dispose will see this flag is 1134 // set and re-ref the texture, thereby restoring the cache's ref. 1135 SkASSERT(!texture->unique()); 1136 texture->impl()->setFlag((GrTextureFlags) GrTextureImpl::kReturnToCache_FlagBit); 1137 texture->unref(); 1138 SkASSERT(texture->getCacheEntry()); 1139 1140 return texture; 1141 } 1142 1143 GrTexture* set(GrContext* context, 1144 const GrTextureDesc& desc, 1145 GrContext::ScratchTexMatch match = GrContext::kApprox_ScratchTexMatch) { 1146 this->reset(); 1147 1148 fContext = context; 1149 if (fContext) { 1150 fTexture = fContext->lockAndRefScratchTexture(desc, match); 1151 if (NULL == fTexture) { 1152 fContext = NULL; 1153 } 1154 return fTexture; 1155 } else { 1156 return NULL; 1157 } 1158 } 1159 1160 GrTexture* texture() { return fTexture; } 1161 1162 private: 1163 GrContext* fContext; 1164 GrTexture* fTexture; 1165 }; 1166 1167 #endif 1168