1 2 /* 3 * Copyright 2010 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef GrContext_DEFINED 11 #define GrContext_DEFINED 12 13 #include "GrClip.h" 14 #include "GrPaint.h" 15 // not strictly needed but requires WK change in LayerTextureUpdaterCanvas to 16 // remove. 17 #include "GrRenderTarget.h" 18 19 class GrDrawTarget; 20 class GrFontCache; 21 class GrGpu; 22 struct GrGpuStats; 23 class GrIndexBuffer; 24 class GrIndexBufferAllocPool; 25 class GrInOrderDrawBuffer; 26 class GrPathRenderer; 27 class GrPathRendererChain; 28 class GrResourceEntry; 29 class GrResourceCache; 30 class GrStencilBuffer; 31 class GrVertexBuffer; 32 class GrVertexBufferAllocPool; 33 34 class GR_API GrContext : public GrRefCnt { 35 public: 36 /** 37 * Creates a GrContext from within a 3D context. 38 */ 39 static GrContext* Create(GrEngine engine, 40 GrPlatform3DContext context3D); 41 42 virtual ~GrContext(); 43 44 /** 45 * The GrContext normally assumes that no outsider is setting state 46 * within the underlying 3D API's context/device/whatever. This call informs 47 * the context that the state was modified and it should resend. Shouldn't 48 * be called frequently for good performance. 49 */ 50 void resetContext(); 51 52 /** 53 * Abandons all gpu resources, assumes 3D API state is unknown. Call this 54 * if you have lost the associated GPU context, and thus internal texture, 55 * buffer, etc. references/IDs are now invalid. Should be called even when 56 * GrContext is no longer going to be used for two reasons: 57 * 1) ~GrContext will not try to free the objects in the 3D API. 58 * 2) If you've created GrResources that outlive the GrContext they will 59 * be marked as invalid (GrResource::isValid()) and won't attempt to 60 * free their underlying resource in the 3D API. 61 * Content drawn since the last GrContext::flush() may be lost. 62 */ 63 void contextLost(); 64 65 /** 66 * Similar to contextLost, but makes no attempt to reset state. 67 * Use this method when GrContext destruction is pending, but 68 * the graphics context is destroyed first. 69 */ 70 void contextDestroyed(); 71 72 /** 73 * Frees gpu created by the context. Can be called to reduce GPU memory 74 * pressure. 75 */ 76 void freeGpuResources(); 77 78 /** 79 * Returns the number of bytes of GPU memory hosted by the texture cache. 80 */ 81 size_t getGpuTextureCacheBytes() const; 82 83 /////////////////////////////////////////////////////////////////////////// 84 // Textures 85 86 /** 87 * Token that refers to an entry in the texture cache. Returned by 88 * functions that lock textures. Passed to unlockTexture. 89 */ 90 class SK_API TextureCacheEntry { 91 public: TextureCacheEntry()92 TextureCacheEntry() : fEntry(NULL) {} TextureCacheEntry(const TextureCacheEntry & e)93 TextureCacheEntry(const TextureCacheEntry& e) : fEntry(e.fEntry) {} 94 TextureCacheEntry& operator= (const TextureCacheEntry& e) { 95 fEntry = e.fEntry; 96 return *this; 97 } 98 GrTexture* texture() const; reset()99 void reset() { fEntry = NULL; } 100 private: TextureCacheEntry(GrResourceEntry * entry)101 explicit TextureCacheEntry(GrResourceEntry* entry) { fEntry = entry; } set(GrResourceEntry * entry)102 void set(GrResourceEntry* entry) { fEntry = entry; } cacheEntry()103 GrResourceEntry* cacheEntry() { return fEntry; } 104 GrResourceEntry* fEntry; 105 friend class GrContext; 106 }; 107 108 /** 109 * Key generated by client. Should be a unique key on the texture data. 110 * Does not need to consider that width and height of the texture. Two 111 * textures with the same TextureKey but different bounds will not collide. 112 */ 113 typedef uint64_t TextureKey; 114 115 /** 116 * Create a new entry, based on the specified key and texture, and return 117 * its "locked" entry. Must call be balanced with an unlockTexture() call. 118 * 119 * @param key A client-generated key that identifies the contents 120 * of the texture. Respecified to findAndLockTexture 121 * for subsequent uses of the texture. 122 * @param sampler The sampler state used to draw a texture may be used 123 * to determine how to store the pixel data in the texture 124 * cache. (e.g. different versions may exist for different 125 * wrap modes on GPUs with limited or no NPOT texture 126 * support). Only the wrap and filter fields are used. NULL 127 * implies clamp wrap modes and nearest filtering. 128 * @param desc Description of the texture properties. 129 * @param srcData Pointer to the pixel values. 130 * @param rowBytes The number of bytes between rows of the texture. Zero 131 * implies tightly packed rows. 132 */ 133 TextureCacheEntry createAndLockTexture(TextureKey key, 134 const GrSamplerState* sampler, 135 const GrTextureDesc& desc, 136 void* srcData, size_t rowBytes); 137 138 /** 139 * Search for an entry based on key and dimensions. If found, "lock" it and 140 * return it. The entry's texture() function will return NULL if not found. 141 * Must be balanced with an unlockTexture() call. 142 * 143 * @param key A client-generated key that identifies the contents 144 * of the texture. 145 * @param width The width of the texture in pixels as specifed in 146 * the GrTextureDesc originally passed to 147 * createAndLockTexture 148 * @param width The height of the texture in pixels as specifed in 149 * the GrTextureDesc originally passed to 150 * createAndLockTexture 151 * @param sampler The sampler state used to draw a texture may be used 152 * to determine the cache entry used. (e.g. different 153 * versions may exist for different wrap modes on GPUs with 154 * limited or no NPOT texture support). Only the wrap and 155 * filter fields are used. NULL implies clamp wrap modes 156 * and nearest filtering. 157 */ 158 TextureCacheEntry findAndLockTexture(TextureKey key, 159 int width, 160 int height, 161 const GrSamplerState* sampler); 162 /** 163 * Determines whether a texture is in the cache. If the texture is found it 164 * will not be locked or returned. This call does not affect the priority of 165 * the texture for deletion. 166 */ 167 bool isTextureInCache(TextureKey key, 168 int width, 169 int height, 170 const GrSamplerState*) const; 171 172 /** 173 * Enum that determines how closely a returned scratch texture must match 174 * a provided GrTextureDesc. 175 */ 176 enum ScratchTexMatch { 177 /** 178 * Finds a texture that exactly matches the descriptor. 179 */ 180 kExact_ScratchTexMatch, 181 /** 182 * Finds a texture that approximately matches the descriptor. Will be 183 * at least as large in width and height as desc specifies. If desc 184 * specifies that texture is a render target then result will be a 185 * render target. If desc specifies a render target and doesn't set the 186 * no stencil flag then result will have a stencil. Format and aa level 187 * will always match. 188 */ 189 kApprox_ScratchTexMatch 190 }; 191 192 /** 193 * Returns a texture matching the desc. It's contents are unknown. Subsequent 194 * requests with the same descriptor are not guaranteed to return the same 195 * texture. The same texture is guaranteed not be returned again until it is 196 * unlocked. Must call be balanced with an unlockTexture() call. 197 * 198 * Textures created by createAndLockTexture() hide the complications of 199 * tiling non-power-of-two textures on APIs that don't support this (e.g. 200 * unextended GLES2). Tiling a npot texture created by lockScratchTexture on 201 * such an API will create gaps in the tiling pattern. This includes clamp 202 * mode. (This may be addressed in a future update.) 203 */ 204 TextureCacheEntry lockScratchTexture(const GrTextureDesc& desc, ScratchTexMatch match); 205 206 /** 207 * When done with an entry, call unlockTexture(entry) on it, which returns 208 * it to the cache, where it may be purged. 209 */ 210 void unlockTexture(TextureCacheEntry entry); 211 212 /** 213 * Creates a texture that is outside the cache. Does not count against 214 * cache's budget. 215 */ 216 GrTexture* createUncachedTexture(const GrTextureDesc&, 217 void* srcData, 218 size_t rowBytes); 219 220 /** 221 * Returns true if the specified use of an indexed texture is supported. 222 */ 223 bool supportsIndex8PixelConfig(const GrSamplerState*, 224 int width, 225 int height) const; 226 227 /** 228 * Return the current texture cache limits. 229 * 230 * @param maxTextures If non-null, returns maximum number of textures that 231 * can be held in the cache. 232 * @param maxTextureBytes If non-null, returns maximum number of bytes of 233 * texture memory that can be held in the cache. 234 */ 235 void getTextureCacheLimits(int* maxTextures, size_t* maxTextureBytes) const; 236 237 /** 238 * Specify the texture cache limits. If the current cache exceeds either 239 * of these, it will be purged (LRU) to keep the cache within these limits. 240 * 241 * @param maxTextures The maximum number of textures that can be held in 242 * the cache. 243 * @param maxTextureBytes The maximum number of bytes of texture memory 244 * that can be held in the cache. 245 */ 246 void setTextureCacheLimits(int maxTextures, size_t maxTextureBytes); 247 248 /** 249 * Return the max width or height of a texture supported by the current gpu 250 */ 251 int getMaxTextureSize() const; 252 253 /** 254 * Return the max width or height of a render target supported by the 255 * current gpu 256 */ 257 int getMaxRenderTargetSize() const; 258 259 /////////////////////////////////////////////////////////////////////////// 260 // Render targets 261 262 /** 263 * Sets the render target. 264 * @param target the render target to set. (should not be NULL.) 265 */ 266 void setRenderTarget(GrRenderTarget* target); 267 268 /** 269 * Gets the current render target. 270 * @return the currently bound render target. Should never be NULL. 271 */ 272 const GrRenderTarget* getRenderTarget() const; 273 GrRenderTarget* getRenderTarget(); 274 275 /////////////////////////////////////////////////////////////////////////// 276 // Platform Surfaces 277 278 /** 279 * Wraps an existing texture with a GrTexture object. 280 * 281 * OpenGL: if the object is a texture Gr may change its GL texture params 282 * when it is drawn. 283 * 284 * @param desc description of the object to create. 285 * 286 * @return GrTexture object or NULL on failure. 287 */ 288 GrTexture* createPlatformTexture(const GrPlatformTextureDesc& desc); 289 290 /** 291 * Wraps an existing render target with a GrRenderTarget object. It is 292 * similar to createPlatformTexture but can be used to draw into surfaces 293 * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that 294 * the client will resolve to a texture). 295 * 296 * @param desc description of the object to create. 297 * 298 * @return GrTexture object or NULL on failure. 299 */ 300 GrRenderTarget* createPlatformRenderTarget( 301 const GrPlatformRenderTargetDesc& desc); 302 303 /////////////////////////////////////////////////////////////////////////// 304 // Matrix state 305 306 /** 307 * Gets the current transformation matrix. 308 * @return the current matrix. 309 */ 310 const GrMatrix& getMatrix() const; 311 312 /** 313 * Sets the transformation matrix. 314 * @param m the matrix to set. 315 */ 316 void setMatrix(const GrMatrix& m); 317 318 /** 319 * Concats the current matrix. The passed matrix is applied before the 320 * current matrix. 321 * @param m the matrix to concat. 322 */ 323 void concatMatrix(const GrMatrix& m) const; 324 325 326 /////////////////////////////////////////////////////////////////////////// 327 // Clip state 328 /** 329 * Gets the current clip. 330 * @return the current clip. 331 */ 332 const GrClip& getClip() const; 333 334 /** 335 * Sets the clip. 336 * @param clip the clip to set. 337 */ 338 void setClip(const GrClip& clip); 339 340 /** 341 * Convenience method for setting the clip to a rect. 342 * @param rect the rect to set as the new clip. 343 */ 344 void setClip(const GrIRect& rect); 345 346 /////////////////////////////////////////////////////////////////////////// 347 // Draws 348 349 /** 350 * Clear the entire or rect of the render target, ignoring any clips. 351 * @param rect the rect to clear or the whole thing if rect is NULL. 352 * @param color the color to clear to. 353 */ 354 void clear(const GrIRect* rect, GrColor color); 355 356 /** 357 * Draw everywhere (respecting the clip) with the paint. 358 */ 359 void drawPaint(const GrPaint& paint); 360 361 /** 362 * Draw the rect using a paint. 363 * @param paint describes how to color pixels. 364 * @param strokeWidth If strokeWidth < 0, then the rect is filled, else 365 * the rect is mitered stroked based on strokeWidth. If 366 * strokeWidth == 0, then the stroke is always a single 367 * pixel thick. 368 * @param matrix Optional matrix applied to the rect. Applied before 369 * context's matrix or the paint's matrix. 370 * The rects coords are used to access the paint (through texture matrix) 371 */ 372 void drawRect(const GrPaint& paint, 373 const GrRect&, 374 GrScalar strokeWidth = -1, 375 const GrMatrix* matrix = NULL); 376 377 /** 378 * Maps a rect of paint coordinates onto the a rect of destination 379 * coordinates. Each rect can optionally be transformed. The srcRect 380 * is stretched over the dstRect. The dstRect is transformed by the 381 * context's matrix and the srcRect is transformed by the paint's matrix. 382 * Additional optional matrices can be provided by parameters. 383 * 384 * @param paint describes how to color pixels. 385 * @param dstRect the destination rect to draw. 386 * @param srcRect rect of paint coordinates to be mapped onto dstRect 387 * @param dstMatrix Optional matrix to transform dstRect. Applied before 388 * context's matrix. 389 * @param srcMatrix Optional matrix to transform srcRect Applied before 390 * paint's matrix. 391 */ 392 void drawRectToRect(const GrPaint& paint, 393 const GrRect& dstRect, 394 const GrRect& srcRect, 395 const GrMatrix* dstMatrix = NULL, 396 const GrMatrix* srcMatrix = NULL); 397 398 /** 399 * Draws a path. 400 * 401 * @param paint describes how to color pixels. 402 * @param path the path to draw 403 * @param fill the path filling rule to use. 404 * @param translate optional additional translation applied to the 405 * path. 406 */ 407 void drawPath(const GrPaint& paint, const GrPath& path, GrPathFill fill, 408 const GrPoint* translate = NULL); 409 410 /** 411 * Draws vertices with a paint. 412 * 413 * @param paint describes how to color pixels. 414 * @param primitiveType primitives type to draw. 415 * @param vertexCount number of vertices. 416 * @param positions array of vertex positions, required. 417 * @param texCoords optional array of texture coordinates used 418 * to access the paint. 419 * @param colors optional array of per-vertex colors, supercedes 420 * the paint's color field. 421 * @param indices optional array of indices. If NULL vertices 422 * are drawn non-indexed. 423 * @param indexCount if indices is non-null then this is the 424 * number of indices. 425 */ 426 void drawVertices(const GrPaint& paint, 427 GrPrimitiveType primitiveType, 428 int vertexCount, 429 const GrPoint positions[], 430 const GrPoint texs[], 431 const GrColor colors[], 432 const uint16_t indices[], 433 int indexCount); 434 435 /////////////////////////////////////////////////////////////////////////// 436 // Misc. 437 438 /** 439 * Flags that affect flush() behavior. 440 */ 441 enum FlushBits { 442 /** 443 * A client may want Gr to bind a GrRenderTarget in the 3D API so that 444 * it can be rendered to directly. However, Gr lazily sets state. Simply 445 * calling setRenderTarget() followed by flush() without flags may not 446 * bind the render target. This flag forces the context to bind the last 447 * set render target in the 3D API. 448 */ 449 kForceCurrentRenderTarget_FlushBit = 0x1, 450 /** 451 * A client may reach a point where it has partially rendered a frame 452 * through a GrContext that it knows the user will never see. This flag 453 * causes the flush to skip submission of deferred content to the 3D API 454 * during the flush. 455 */ 456 kDiscard_FlushBit = 0x2, 457 }; 458 459 /** 460 * Call to ensure all drawing to the context has been issued to the 461 * underlying 3D API. 462 * @param flagsBitfield flags that control the flushing behavior. See 463 * FlushBits. 464 */ 465 void flush(int flagsBitfield = 0); 466 467 /** 468 * Reads a rectangle of pixels from a render target. 469 * @param target the render target to read from. NULL means the 470 * current render target. 471 * @param left left edge of the rectangle to read (inclusive) 472 * @param top top edge of the rectangle to read (inclusive) 473 * @param width width of rectangle to read in pixels. 474 * @param height height of rectangle to read in pixels. 475 * @param config the pixel config of the destination buffer 476 * @param buffer memory to read the rectangle into. 477 * @param rowBytes number of bytes bewtween consecutive rows. Zero 478 * means rows are tightly packed. 479 * 480 * @return true if the read succeeded, false if not. The read can fail 481 * because of an unsupported pixel config or because no render 482 * target is currently set. 483 */ readRenderTargetPixels(GrRenderTarget * target,int left,int top,int width,int height,GrPixelConfig config,void * buffer,size_t rowBytes)484 bool readRenderTargetPixels(GrRenderTarget* target, 485 int left, int top, int width, int height, 486 GrPixelConfig config, void* buffer, 487 size_t rowBytes) { 488 return this->internalReadRenderTargetPixels(target, left, top, 489 width, height, 490 config, buffer, 491 rowBytes, 0); 492 } 493 494 /** 495 * Copy the src pixels [buffer, rowbytes, pixelconfig] into a render target 496 * at the specified rectangle. 497 * @param target the render target to write into. NULL means the 498 * current render target. 499 * @param left left edge of the rectangle to write (inclusive) 500 * @param top top edge of the rectangle to write (inclusive) 501 * @param width width of rectangle to write in pixels. 502 * @param height height of rectangle to write in pixels. 503 * @param config the pixel config of the source buffer 504 * @param buffer memory to read the rectangle from. 505 * @param rowBytes number of bytes bewtween consecutive rows. Zero 506 * means rows are tightly packed. 507 */ writeRenderTargetPixels(GrRenderTarget * target,int left,int top,int width,int height,GrPixelConfig config,const void * buffer,size_t rowBytes)508 void writeRenderTargetPixels(GrRenderTarget* target, 509 int left, int top, int width, int height, 510 GrPixelConfig config, const void* buffer, 511 size_t rowBytes) { 512 this->internalWriteRenderTargetPixels(target, left, top, width, height, 513 config, buffer, rowBytes, 0); 514 } 515 516 /** 517 * Reads a rectangle of pixels from a texture. 518 * @param texture the texture to read from. 519 * @param left left edge of the rectangle to read (inclusive) 520 * @param top top edge of the rectangle to read (inclusive) 521 * @param width width of rectangle to read in pixels. 522 * @param height height of rectangle to read in pixels. 523 * @param config the pixel config of the destination buffer 524 * @param buffer memory to read the rectangle into. 525 * @param rowBytes number of bytes bewtween consecutive rows. Zero 526 * means rows are tightly packed. 527 * 528 * @return true if the read succeeded, false if not. The read can fail 529 * because of an unsupported pixel config. 530 */ readTexturePixels(GrTexture * texture,int left,int top,int width,int height,GrPixelConfig config,void * buffer,size_t rowBytes)531 bool readTexturePixels(GrTexture* texture, 532 int left, int top, int width, int height, 533 GrPixelConfig config, void* buffer, 534 size_t rowBytes) { 535 return this->internalReadTexturePixels(texture, left, top, 536 width, height, 537 config, buffer, rowBytes, 0); 538 } 539 540 /** 541 * Writes a rectangle of pixels to a texture. 542 * @param texture the render target to read from. 543 * @param left left edge of the rectangle to write (inclusive) 544 * @param top top edge of the rectangle to write (inclusive) 545 * @param width width of rectangle to write in pixels. 546 * @param height height of rectangle to write in pixels. 547 * @param config the pixel config of the source buffer 548 * @param buffer memory to read pixels from 549 * @param rowBytes number of bytes bewtween consecutive rows. Zero 550 * means rows are tightly packed. 551 */ writeTexturePixels(GrTexture * texture,int left,int top,int width,int height,GrPixelConfig config,const void * buffer,size_t rowBytes)552 void writeTexturePixels(GrTexture* texture, 553 int left, int top, int width, int height, 554 GrPixelConfig config, const void* buffer, 555 size_t rowBytes) { 556 this->internalWriteTexturePixels(texture, left, top, width, height, 557 config, buffer, rowBytes, 0); 558 } 559 /** 560 * Copies all texels from one texture to another. 561 * @param src the texture to copy from. 562 * @param dst the render target to copy to. 563 */ 564 void copyTexture(GrTexture* src, GrRenderTarget* dst); 565 566 /** 567 * Resolves a render target that has MSAA. The intermediate MSAA buffer is 568 * downsampled to the associated GrTexture (accessible via 569 * GrRenderTarget::asTexture()). Any pending draws to the render target will 570 * be executed before the resolve. 571 * 572 * This is only necessary when a client wants to access the object directly 573 * using the underlying graphics API. GrContext will detect when it must 574 * perform a resolve to a GrTexture used as the source of a draw or before 575 * reading pixels back from a GrTexture or GrRenderTarget. 576 */ 577 void resolveRenderTarget(GrRenderTarget* target); 578 579 /** 580 * Applies a 1D convolution kernel in the given direction to a rectangle of 581 * pixels from a given texture. 582 * @param texture the texture to read from 583 * @param rect the destination rectangle 584 * @param kernel the convolution kernel (kernelWidth elements) 585 * @param kernelWidth the width of the convolution kernel 586 * @param direction the direction in which to apply the kernel 587 */ 588 void convolve(GrTexture* texture, 589 const SkRect& rect, 590 const float* kernel, 591 int kernelWidth, 592 GrSamplerState::FilterDirection direction); 593 /** 594 * Applies a 1D morphology in the given direction to a rectangle of 595 * pixels from a given texture. 596 * @param texture the texture to read from 597 * @param rect the destination rectangle 598 * @param radius the radius of the morphological operator 599 * @param filter the filter kernel (must be kDilate or kErode) 600 * @param direction the direction in which to apply the morphology 601 */ 602 void applyMorphology(GrTexture* texture, 603 const SkRect& rect, 604 int radius, 605 GrSamplerState::Filter filter, 606 GrSamplerState::FilterDirection direction); 607 /////////////////////////////////////////////////////////////////////////// 608 // Helpers 609 610 class AutoRenderTarget : ::GrNoncopyable { 611 public: AutoRenderTarget(GrContext * context,GrRenderTarget * target)612 AutoRenderTarget(GrContext* context, GrRenderTarget* target) { 613 fContext = NULL; 614 fPrevTarget = context->getRenderTarget(); 615 if (fPrevTarget != target) { 616 context->setRenderTarget(target); 617 fContext = context; 618 } 619 } ~AutoRenderTarget()620 ~AutoRenderTarget() { 621 if (fContext) { 622 fContext->setRenderTarget(fPrevTarget); 623 } 624 } 625 private: 626 GrContext* fContext; 627 GrRenderTarget* fPrevTarget; 628 }; 629 630 631 /////////////////////////////////////////////////////////////////////////// 632 // Functions intended for internal use only. getGpu()633 GrGpu* getGpu() { return fGpu; } getGpu()634 const GrGpu* getGpu() const { return fGpu; } getFontCache()635 GrFontCache* getFontCache() { return fFontCache; } 636 GrDrawTarget* getTextTarget(const GrPaint& paint); 637 void flushText(); 638 const GrIndexBuffer* getQuadIndexBuffer() const; 639 void resetStats(); 640 const GrGpuStats& getStats() const; 641 void printStats() const; 642 /** 643 * Stencil buffers add themselves to the cache using 644 * addAndLockStencilBuffer. When a SB's RT-attachment count 645 * reaches zero the SB unlocks itself using unlockStencilBuffer and is 646 * eligible for purging. findStencilBuffer is called to check the cache for 647 * a SB that matching an RT's criteria. If a match is found that has been 648 * unlocked (its attachment count has reached 0) then it will be relocked. 649 */ 650 GrResourceEntry* addAndLockStencilBuffer(GrStencilBuffer* sb); 651 void unlockStencilBuffer(GrResourceEntry* sbEntry); 652 GrStencilBuffer* findStencilBuffer(int width, int height, int sampleCnt); 653 654 private: 655 // used to keep track of when we need to flush the draw buffer 656 enum DrawCategory { 657 kBuffered_DrawCategory, // last draw was inserted in draw buffer 658 kUnbuffered_DrawCategory, // last draw was not inserted in the draw buffer 659 kText_DrawCategory // text context was last to draw 660 }; 661 DrawCategory fLastDrawCategory; 662 663 GrGpu* fGpu; 664 GrResourceCache* fTextureCache; 665 GrFontCache* fFontCache; 666 667 GrPathRendererChain* fPathRendererChain; 668 669 GrVertexBufferAllocPool* fDrawBufferVBAllocPool; 670 GrIndexBufferAllocPool* fDrawBufferIBAllocPool; 671 GrInOrderDrawBuffer* fDrawBuffer; 672 673 GrIndexBuffer* fAAFillRectIndexBuffer; 674 GrIndexBuffer* fAAStrokeRectIndexBuffer; 675 676 GrContext(GrGpu* gpu); 677 678 void fillAARect(GrDrawTarget* target, 679 const GrRect& devRect, 680 bool useVertexCoverage); 681 682 void strokeAARect(GrDrawTarget* target, 683 const GrRect& devRect, 684 const GrVec& devStrokeSize, 685 bool useVertexCoverage); 686 687 inline int aaFillRectIndexCount() const; 688 GrIndexBuffer* aaFillRectIndexBuffer(); 689 690 inline int aaStrokeRectIndexCount() const; 691 GrIndexBuffer* aaStrokeRectIndexBuffer(); 692 693 void setupDrawBuffer(); 694 695 void flushDrawBuffer(); 696 697 void setPaint(const GrPaint& paint, GrDrawTarget* target); 698 699 GrDrawTarget* prepareToDraw(const GrPaint& paint, DrawCategory drawType); 700 701 GrPathRenderer* getPathRenderer(const GrPath& path, 702 GrPathFill fill, 703 const GrDrawTarget* target, 704 bool antiAlias); 705 706 /** 707 * Flags to the internal read/write pixels funcs 708 */ 709 enum PixelOpsFlags { 710 kDontFlush_PixelOpsFlag = 0x1, 711 }; 712 713 bool internalReadRenderTargetPixels(GrRenderTarget* target, 714 int left, int top, 715 int width, int height, 716 GrPixelConfig config, void* buffer, 717 size_t rowBytes, uint32_t flags); 718 719 void internalWriteRenderTargetPixels(GrRenderTarget* target, 720 int left, int top, 721 int width, int height, 722 GrPixelConfig, const void* buffer, 723 size_t rowBytes, uint32_t flags); 724 725 bool internalReadTexturePixels(GrTexture* texture, 726 int left, int top, 727 int width, int height, 728 GrPixelConfig config, void* buffer, 729 size_t rowBytes, uint32_t flags); 730 731 void internalWriteTexturePixels(GrTexture* texture, 732 int left, int top, 733 int width, int height, 734 GrPixelConfig config, const void* buffer, 735 size_t rowBytes, uint32_t flags); 736 // needed for access to internalWriteTexturePixels. TODO: make GrContext 737 // be a facade for an internal class. Then functions that are public on the 738 // internal class would have only be callable in src/gpu. The facade would 739 // only have to functions necessary for clients. 740 friend class GrAtlas; 741 742 // computes vertex layout bits based on the paint. If paint expresses 743 // a texture for a stage, the stage coords will be bound to postitions 744 // unless hasTexCoords[s]==true in which case stage s's input coords 745 // are bound to tex coord index s. hasTexCoords == NULL is a shortcut 746 // for an array where all the values are false. 747 static int PaintStageVertexLayoutBits( 748 const GrPaint& paint, 749 const bool hasTexCoords[GrPaint::kTotalStages]); 750 751 }; 752 753 /** 754 * Save/restore the view-matrix in the context. 755 */ 756 class GrAutoMatrix : GrNoncopyable { 757 public: GrAutoMatrix()758 GrAutoMatrix() : fContext(NULL) {} GrAutoMatrix(GrContext * ctx)759 GrAutoMatrix(GrContext* ctx) : fContext(ctx) { 760 fMatrix = ctx->getMatrix(); 761 } GrAutoMatrix(GrContext * ctx,const GrMatrix & matrix)762 GrAutoMatrix(GrContext* ctx, const GrMatrix& matrix) : fContext(ctx) { 763 fMatrix = ctx->getMatrix(); 764 ctx->setMatrix(matrix); 765 } set(GrContext * ctx)766 void set(GrContext* ctx) { 767 if (NULL != fContext) { 768 fContext->setMatrix(fMatrix); 769 } 770 fMatrix = ctx->getMatrix(); 771 fContext = ctx; 772 } set(GrContext * ctx,const GrMatrix & matrix)773 void set(GrContext* ctx, const GrMatrix& matrix) { 774 if (NULL != fContext) { 775 fContext->setMatrix(fMatrix); 776 } 777 fMatrix = ctx->getMatrix(); 778 ctx->setMatrix(matrix); 779 fContext = ctx; 780 } ~GrAutoMatrix()781 ~GrAutoMatrix() { 782 if (NULL != fContext) { 783 fContext->setMatrix(fMatrix); 784 } 785 } 786 787 private: 788 GrContext* fContext; 789 GrMatrix fMatrix; 790 }; 791 792 /** 793 * Gets and locks a scratch texture from a descriptor using 794 * either exact or approximate criteria. Unlocks texture in 795 * the destructor. 796 */ 797 class GrAutoScratchTexture : ::GrNoncopyable { 798 public: GrAutoScratchTexture()799 GrAutoScratchTexture() 800 : fContext(NULL) { 801 } 802 803 GrAutoScratchTexture(GrContext* context, 804 const GrTextureDesc& desc, 805 GrContext::ScratchTexMatch match = 806 GrContext::kApprox_ScratchTexMatch) fContext(NULL)807 : fContext(NULL) { 808 this->set(context, desc, match); 809 } 810 ~GrAutoScratchTexture()811 ~GrAutoScratchTexture() { 812 if (NULL != fContext) { 813 fContext->unlockTexture(fEntry); 814 } 815 } 816 817 GrTexture* set(GrContext* context, 818 const GrTextureDesc& desc, 819 GrContext::ScratchTexMatch match = 820 GrContext::kApprox_ScratchTexMatch) { 821 if (NULL != fContext) { 822 fContext->unlockTexture(fEntry); 823 } 824 fContext = context; 825 if (NULL != fContext) { 826 fEntry = fContext->lockScratchTexture(desc, match); 827 GrTexture* ret = fEntry.texture(); 828 if (NULL == ret) { 829 fContext = NULL; 830 } 831 return ret; 832 } else { 833 return NULL; 834 } 835 } 836 texture()837 GrTexture* texture() { return fEntry.texture(); } 838 private: 839 GrContext* fContext; 840 GrContext::TextureCacheEntry fEntry; 841 }; 842 843 #endif 844