OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef GrContext_DEFINED | 8 #ifndef GrContext_DEFINED |
9 #define GrContext_DEFINED | 9 #define GrContext_DEFINED |
10 | 10 |
11 #include "GrClip.h" | 11 #include "GrClip.h" |
12 #include "GrColor.h" | 12 #include "GrColor.h" |
13 #include "GrPaint.h" | 13 #include "GrPaint.h" |
14 #include "GrPathRendererChain.h" | 14 #include "GrPathRendererChain.h" |
15 #include "GrRenderTarget.h" | 15 #include "GrRenderTarget.h" |
16 #include "GrTexture.h" | 16 #include "GrTextureProvider.h" |
17 #include "SkMatrix.h" | 17 #include "SkMatrix.h" |
18 #include "SkPathEffect.h" | 18 #include "SkPathEffect.h" |
19 #include "SkTypes.h" | 19 #include "SkTypes.h" |
20 | 20 |
21 class GrAARectRenderer; | 21 class GrAARectRenderer; |
22 class GrBatchFontCache; | 22 class GrBatchFontCache; |
23 class GrDrawTarget; | 23 class GrDrawTarget; |
24 class GrFragmentProcessor; | 24 class GrFragmentProcessor; |
25 class GrGpu; | 25 class GrGpu; |
26 class GrGpuTraceMarker; | 26 class GrGpuTraceMarker; |
27 class GrIndexBuffer; | 27 class GrIndexBuffer; |
28 class GrIndexBufferAllocPool; | 28 class GrIndexBufferAllocPool; |
29 class GrLayerCache; | 29 class GrLayerCache; |
30 class GrOvalRenderer; | 30 class GrOvalRenderer; |
31 class GrPath; | 31 class GrPath; |
32 class GrPathRenderer; | 32 class GrPathRenderer; |
33 class GrPipelineBuilder; | 33 class GrPipelineBuilder; |
34 class GrResourceEntry; | 34 class GrResourceEntry; |
35 class GrResourceCache; | 35 class GrResourceCache; |
| 36 class GrResourceProvider; |
36 class GrTestTarget; | 37 class GrTestTarget; |
37 class GrTextBlobCache; | 38 class GrTextBlobCache; |
38 class GrTextContext; | 39 class GrTextContext; |
39 class GrTextureParams; | 40 class GrTextureParams; |
40 class GrVertexBuffer; | 41 class GrVertexBuffer; |
41 class GrVertexBufferAllocPool; | 42 class GrVertexBufferAllocPool; |
42 class GrStrokeInfo; | 43 class GrStrokeInfo; |
43 class GrSoftwarePathRenderer; | 44 class GrSoftwarePathRenderer; |
44 class SkGpuDevice; | 45 class SkGpuDevice; |
45 | 46 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 * be used for two reasons: | 105 * be used for two reasons: |
105 * 1) ~GrContext will not try to free the objects in the 3D API. | 106 * 1) ~GrContext will not try to free the objects in the 3D API. |
106 * 2) Any GrGpuResources created by this GrContext that outlive | 107 * 2) Any GrGpuResources created by this GrContext that outlive |
107 * will be marked as invalid (GrGpuResource::wasDestroyed()) and | 108 * will be marked as invalid (GrGpuResource::wasDestroyed()) and |
108 * when they're destroyed no 3D API calls will be made. | 109 * when they're destroyed no 3D API calls will be made. |
109 * Content drawn since the last GrContext::flush() may be lost. After this | 110 * Content drawn since the last GrContext::flush() may be lost. After this |
110 * function is called the only valid action on the GrContext or | 111 * function is called the only valid action on the GrContext or |
111 * GrGpuResources it created is to destroy them. | 112 * GrGpuResources it created is to destroy them. |
112 */ | 113 */ |
113 void abandonContext(); | 114 void abandonContext(); |
114 void contextDestroyed() { this->abandonContext(); } // legacy alias | |
115 | 115 |
116 /////////////////////////////////////////////////////////////////////////// | 116 /////////////////////////////////////////////////////////////////////////// |
117 // Resource Cache | 117 // Resource Cache |
118 | 118 |
119 /** | 119 /** |
120 * Return the current GPU resource cache limits. | 120 * Return the current GPU resource cache limits. |
121 * | 121 * |
122 * @param maxResources If non-null, returns maximum number of resources tha
t | 122 * @param maxResources If non-null, returns maximum number of resources tha
t |
123 * can be held in the cache. | 123 * can be held in the cache. |
124 * @param maxResourceBytes If non-null, returns maximum number of bytes of | 124 * @param maxResourceBytes If non-null, returns maximum number of bytes of |
(...skipping 15 matching lines...) Expand all Loading... |
140 * Specify the GPU resource cache limits. If the current cache exceeds eith
er | 140 * Specify the GPU resource cache limits. If the current cache exceeds eith
er |
141 * of these, it will be purged (LRU) to keep the cache within these limits. | 141 * of these, it will be purged (LRU) to keep the cache within these limits. |
142 * | 142 * |
143 * @param maxResources The maximum number of resources that can be held in | 143 * @param maxResources The maximum number of resources that can be held in |
144 * the cache. | 144 * the cache. |
145 * @param maxResourceBytes The maximum number of bytes of video memory | 145 * @param maxResourceBytes The maximum number of bytes of video memory |
146 * that can be held in the cache. | 146 * that can be held in the cache. |
147 */ | 147 */ |
148 void setResourceCacheLimits(int maxResources, size_t maxResourceBytes); | 148 void setResourceCacheLimits(int maxResources, size_t maxResourceBytes); |
149 | 149 |
| 150 GrTextureProvider* textureProvider() { return fTextureProvider; } |
| 151 const GrTextureProvider* textureProvider() const { return fTextureProvider;
} |
| 152 |
150 /** | 153 /** |
151 * Frees GPU created by the context. Can be called to reduce GPU memory | 154 * Frees GPU created by the context. Can be called to reduce GPU memory |
152 * pressure. | 155 * pressure. |
153 */ | 156 */ |
154 void freeGpuResources(); | 157 void freeGpuResources(); |
155 | 158 |
156 /** | 159 /** |
157 * This method should be called whenever a GrResource is unreffed or | |
158 * switched from exclusive to non-exclusive. This | |
159 * gives the resource cache a chance to discard unneeded resources. | |
160 * Note: this entry point will be removed once totally ref-driven | |
161 * cache maintenance is implemented. | |
162 */ | |
163 void purgeCache(); | |
164 | |
165 /** | |
166 * Purge all the unlocked resources from the cache. | 160 * Purge all the unlocked resources from the cache. |
167 * This entry point is mainly meant for timing texture uploads | 161 * This entry point is mainly meant for timing texture uploads |
168 * and is not defined in normal builds of Skia. | 162 * and is not defined in normal builds of Skia. |
169 */ | 163 */ |
170 void purgeAllUnlockedResources(); | 164 void purgeAllUnlockedResources(); |
171 | 165 |
172 /** | 166 ////////////////////////////////////////////////////////////////////////// |
173 * Sets a unique key on the resource. Upon key collision this resource takes
the place of the | 167 /// Texture and Render Target Queries |
174 * previous resource that had the key. | |
175 */ | |
176 void addResourceToCache(const GrUniqueKey&, GrGpuResource*); | |
177 | |
178 /** | |
179 * Finds a resource in the cache, based on the specified key. This is intend
ed for use in | |
180 * conjunction with addResourceToCache(). The return value will be NULL if n
ot found. The | |
181 * caller must balance with a call to unref(). | |
182 */ | |
183 GrGpuResource* findAndRefCachedResource(const GrUniqueKey&); | |
184 | |
185 /** Helper for casting resource to a texture. Caller must be sure that the r
esource cached | |
186 with the key is either NULL or a texture and not another resource type.
*/ | |
187 GrTexture* findAndRefCachedTexture(const GrUniqueKey& key) { | |
188 GrGpuResource* resource = this->findAndRefCachedResource(key); | |
189 if (resource) { | |
190 GrTexture* texture = static_cast<GrSurface*>(resource)->asTexture(); | |
191 SkASSERT(texture); | |
192 return texture; | |
193 } | |
194 return NULL; | |
195 } | |
196 | |
197 /** | |
198 * Determines whether a resource is in the cache. If the resource is found i
t | |
199 * will not be locked or returned. This call does not affect the priority of | |
200 * the resource for deletion. | |
201 */ | |
202 bool isResourceInCache(const GrUniqueKey& key) const; | |
203 | |
204 /////////////////////////////////////////////////////////////////////////// | |
205 // Textures | |
206 | |
207 /** | |
208 * Creates a new texture in the resource cache and returns it. The caller ow
ns a | |
209 * ref on the returned texture which must be balanced by a call to unref. | |
210 * | |
211 * @param desc Description of the texture properties. | |
212 * @param budgeted Does the texture count against the resource cache budget
? | |
213 * @param srcData Pointer to the pixel values (optional). | |
214 * @param rowBytes The number of bytes between rows of the texture. Zero | |
215 * implies tightly packed rows. For compressed pixel config
s, this | |
216 * field is ignored. | |
217 */ | |
218 GrTexture* createTexture(const GrSurfaceDesc& desc, bool budgeted, const voi
d* srcData, | |
219 size_t rowBytes); | |
220 | |
221 GrTexture* createTexture(const GrSurfaceDesc& desc, bool budgeted) { | |
222 return this->createTexture(desc, budgeted, NULL, 0); | |
223 } | |
224 | |
225 /** | |
226 * DEPRECATED: use createTexture(). | |
227 */ | |
228 GrTexture* createUncachedTexture(const GrSurfaceDesc& desc, void* srcData, s
ize_t rowBytes) { | |
229 return this->createTexture(desc, false, srcData, rowBytes); | |
230 } | |
231 | |
232 /** | |
233 * Enum that determines how closely a returned scratch texture must match | |
234 * a provided GrSurfaceDesc. TODO: Remove this. createTexture() should be us
ed | |
235 * for exact match and refScratchTexture() should be replaced with createApp
roxTexture(). | |
236 */ | |
237 enum ScratchTexMatch { | |
238 /** | |
239 * Finds a texture that exactly matches the descriptor. | |
240 */ | |
241 kExact_ScratchTexMatch, | |
242 /** | |
243 * Finds a texture that approximately matches the descriptor. Will be | |
244 * at least as large in width and height as desc specifies. If desc | |
245 * specifies that texture is a render target then result will be a | |
246 * render target. If desc specifies a render target and doesn't set the | |
247 * no stencil flag then result will have a stencil. Format and aa level | |
248 * will always match. | |
249 */ | |
250 kApprox_ScratchTexMatch | |
251 }; | |
252 | |
253 /** | |
254 * Returns a texture matching the desc. It's contents are unknown. The calle
r | |
255 * owns a ref on the returned texture and must balance with a call to unref. | |
256 * It is guaranteed that the same texture will not be returned in subsequent | |
257 * calls until all refs to the texture are dropped. | |
258 * | |
259 * Textures created by createTexture() hide the complications of | |
260 * tiling non-power-of-two textures on APIs that don't support this (e.g. | |
261 * unextended GLES2). NPOT scratch textures are not tilable on such APIs. | |
262 * | |
263 * internalFlag is a temporary workaround until changes in the internal | |
264 * architecture are complete. Use the default value. | |
265 * | |
266 * TODO: Once internal flag can be removed, this should be replaced with | |
267 * createApproxTexture() and exact textures should be created with | |
268 * createTexture(). | |
269 */ | |
270 GrTexture* refScratchTexture(const GrSurfaceDesc&, ScratchTexMatch match, | |
271 bool internalFlag = false); | |
272 | 168 |
273 /** | 169 /** |
274 * Can the provided configuration act as a texture? | 170 * Can the provided configuration act as a texture? |
275 */ | 171 */ |
276 bool isConfigTexturable(GrPixelConfig) const; | 172 bool isConfigTexturable(GrPixelConfig) const; |
277 | 173 |
278 /** | 174 /** |
279 * Can non-power-of-two textures be used with tile modes other than clamp? | 175 * Can non-power-of-two textures be used with tile modes other than clamp? |
280 */ | 176 */ |
281 bool npotTextureTileSupport() const; | 177 bool npotTextureTileSupport() const; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 * @param config the configuration of the render target. | 214 * @param config the configuration of the render target. |
319 * @param dpi the display density in dots per inch. | 215 * @param dpi the display density in dots per inch. |
320 * | 216 * |
321 * @return sample count that should be perform well and have good enough | 217 * @return sample count that should be perform well and have good enough |
322 * rendering quality for the display. Alternatively returns 0 if | 218 * rendering quality for the display. Alternatively returns 0 if |
323 * MSAA is not supported or recommended to be used by default. | 219 * MSAA is not supported or recommended to be used by default. |
324 */ | 220 */ |
325 int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const; | 221 int getRecommendedSampleCount(GrPixelConfig config, SkScalar dpi) const; |
326 | 222 |
327 /////////////////////////////////////////////////////////////////////////// | 223 /////////////////////////////////////////////////////////////////////////// |
328 // Backend Surfaces | |
329 | |
330 /** | |
331 * Wraps an existing texture with a GrTexture object. | |
332 * | |
333 * OpenGL: if the object is a texture Gr may change its GL texture params | |
334 * when it is drawn. | |
335 * | |
336 * @param desc description of the object to create. | |
337 * | |
338 * @return GrTexture object or NULL on failure. | |
339 */ | |
340 GrTexture* wrapBackendTexture(const GrBackendTextureDesc& desc); | |
341 | |
342 /** | |
343 * Wraps an existing render target with a GrRenderTarget object. It is | |
344 * similar to wrapBackendTexture but can be used to draw into surfaces | |
345 * that are not also textures (e.g. FBO 0 in OpenGL, or an MSAA buffer that | |
346 * the client will resolve to a texture). | |
347 * | |
348 * @param desc description of the object to create. | |
349 * | |
350 * @return GrTexture object or NULL on failure. | |
351 */ | |
352 GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc& de
sc); | |
353 | |
354 /////////////////////////////////////////////////////////////////////////// | |
355 // Draws | 224 // Draws |
356 | 225 |
357 /** | 226 /** |
358 * Clear the entire or rect of the render target, ignoring any clips. | 227 * Clear the entire or rect of the render target, ignoring any clips. |
359 * @param rect the rect to clear or the whole thing if rect is NULL. | 228 * @param rect the rect to clear or the whole thing if rect is NULL. |
360 * @param color the color to clear to. | 229 * @param color the color to clear to. |
361 * @param canIgnoreRect allows partial clears to be converted to whole | 230 * @param canIgnoreRect allows partial clears to be converted to whole |
362 * clears on platforms for which that is cheap | 231 * clears on platforms for which that is cheap |
363 * @param target The render target to clear. | 232 * @param target The render target to clear. |
364 */ | 233 */ |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 */ | 508 */ |
640 void prepareSurfaceForExternalRead(GrSurface*); | 509 void prepareSurfaceForExternalRead(GrSurface*); |
641 | 510 |
642 /** | 511 /** |
643 * Provides a perfomance hint that the render target's contents are allowed | 512 * Provides a perfomance hint that the render target's contents are allowed |
644 * to become undefined. | 513 * to become undefined. |
645 */ | 514 */ |
646 void discardRenderTarget(GrRenderTarget*); | 515 void discardRenderTarget(GrRenderTarget*); |
647 | 516 |
648 /////////////////////////////////////////////////////////////////////////// | 517 /////////////////////////////////////////////////////////////////////////// |
| 518 // Legacy functions, to be removed once Chromium stops using them. |
| 519 |
| 520 enum ScratchTexMatch { |
| 521 kExact_ScratchTexMatch = GrTextureProvider::kExact_ScratchTexMatch, |
| 522 kApprox_ScratchTexMatch = GrTextureProvider::kApprox_ScratchTexMatch |
| 523 }; |
| 524 |
| 525 GrTexture* refScratchTexture(const GrSurfaceDesc& desc, ScratchTexMatch matc
h) { |
| 526 return this->textureProvider()->refScratchTexture( |
| 527 desc, (GrTextureProvider::ScratchTexMatch) match); |
| 528 } |
| 529 |
| 530 GrTexture* wrapBackendTexture(const GrBackendTextureDesc& desc) { |
| 531 return this->textureProvider()->wrapBackendTexture(desc); |
| 532 } |
| 533 |
| 534 /////////////////////////////////////////////////////////////////////////// |
649 // Functions intended for internal use only. | 535 // Functions intended for internal use only. |
650 GrGpu* getGpu() { return fGpu; } | 536 GrGpu* getGpu() { return fGpu; } |
651 const GrGpu* getGpu() const { return fGpu; } | 537 const GrGpu* getGpu() const { return fGpu; } |
652 GrBatchFontCache* getBatchFontCache() { return fBatchFontCache; } | 538 GrBatchFontCache* getBatchFontCache() { return fBatchFontCache; } |
653 GrLayerCache* getLayerCache() { return fLayerCache.get(); } | 539 GrLayerCache* getLayerCache() { return fLayerCache.get(); } |
654 GrTextBlobCache* getTextBlobCache() { return fTextBlobCache; } | 540 GrTextBlobCache* getTextBlobCache() { return fTextBlobCache; } |
655 GrDrawTarget* getTextTarget(); | 541 GrDrawTarget* getTextTarget(); |
656 const GrIndexBuffer* getQuadIndexBuffer() const; | 542 const GrIndexBuffer* getQuadIndexBuffer() const; |
657 GrAARectRenderer* getAARectRenderer() { return fAARectRenderer; } | 543 GrAARectRenderer* getAARectRenderer() { return fAARectRenderer; } |
| 544 GrResourceProvider* resourceProvider() { return fResourceProvider; } |
| 545 const GrResourceProvider* resourceProvider() const { return fResourceProvide
r; } |
658 GrResourceCache* getResourceCache() { return fResourceCache; } | 546 GrResourceCache* getResourceCache() { return fResourceCache; } |
659 | 547 |
660 // Called by tests that draw directly to the context via GrDrawTarget | 548 // Called by tests that draw directly to the context via GrDrawTarget |
661 void getTestTarget(GrTestTarget*); | 549 void getTestTarget(GrTestTarget*); |
662 | 550 |
663 void addGpuTraceMarker(const GrGpuTraceMarker* marker); | 551 void addGpuTraceMarker(const GrGpuTraceMarker* marker); |
664 void removeGpuTraceMarker(const GrGpuTraceMarker* marker); | 552 void removeGpuTraceMarker(const GrGpuTraceMarker* marker); |
665 | 553 |
666 GrPathRenderer* getPathRenderer( | 554 GrPathRenderer* getPathRenderer( |
667 const GrDrawTarget* target, | 555 const GrDrawTarget* target, |
(...skipping 14 matching lines...) Expand all Loading... |
682 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */ | 570 /** Prints cache stats to the string if GR_CACHE_STATS == 1. */ |
683 void dumpCacheStats(SkString*) const; | 571 void dumpCacheStats(SkString*) const; |
684 void printCacheStats() const; | 572 void printCacheStats() const; |
685 | 573 |
686 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */ | 574 /** Prints GPU stats to the string if GR_GPU_STATS == 1. */ |
687 void dumpGpuStats(SkString*) const; | 575 void dumpGpuStats(SkString*) const; |
688 void printGpuStats() const; | 576 void printGpuStats() const; |
689 | 577 |
690 private: | 578 private: |
691 GrGpu* fGpu; | 579 GrGpu* fGpu; |
| 580 GrResourceCache* fResourceCache; |
| 581 // this union exists because the inheritance of GrTextureProvider->GrResourc
eProvider |
| 582 // is in a private header. |
| 583 union { |
| 584 GrResourceProvider* fResourceProvider; |
| 585 GrTextureProvider* fTextureProvider; |
| 586 }; |
692 | 587 |
693 GrResourceCache* fResourceCache; | |
694 GrBatchFontCache* fBatchFontCache; | 588 GrBatchFontCache* fBatchFontCache; |
695 SkAutoTDelete<GrLayerCache> fLayerCache; | 589 SkAutoTDelete<GrLayerCache> fLayerCache; |
696 SkAutoTDelete<GrTextBlobCache> fTextBlobCache; | 590 SkAutoTDelete<GrTextBlobCache> fTextBlobCache; |
697 | 591 |
698 GrPathRendererChain* fPathRendererChain; | 592 GrPathRendererChain* fPathRendererChain; |
699 GrSoftwarePathRenderer* fSoftwarePathRenderer; | 593 GrSoftwarePathRenderer* fSoftwarePathRenderer; |
700 | 594 |
701 GrVertexBufferAllocPool* fDrawBufferVBAllocPool; | 595 GrVertexBufferAllocPool* fDrawBufferVBAllocPool; |
702 GrIndexBufferAllocPool* fDrawBufferIBAllocPool; | 596 GrIndexBufferAllocPool* fDrawBufferIBAllocPool; |
703 GrDrawTarget* fDrawBuffer; | 597 GrDrawTarget* fDrawBuffer; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 GrDrawTarget* prepareToDraw(); | 635 GrDrawTarget* prepareToDraw(); |
742 | 636 |
743 void internalDrawPath(GrDrawTarget*, | 637 void internalDrawPath(GrDrawTarget*, |
744 GrPipelineBuilder*, | 638 GrPipelineBuilder*, |
745 const SkMatrix& viewMatrix, | 639 const SkMatrix& viewMatrix, |
746 GrColor, | 640 GrColor, |
747 bool useAA, | 641 bool useAA, |
748 const SkPath&, | 642 const SkPath&, |
749 const GrStrokeInfo&); | 643 const GrStrokeInfo&); |
750 | 644 |
751 GrTexture* internalRefScratchTexture(const GrSurfaceDesc&, uint32_t flags); | |
752 | |
753 /** | 645 /** |
754 * Creates a new text rendering context that is optimal for the | 646 * Creates a new text rendering context that is optimal for the |
755 * render target and the context. Caller assumes the ownership | 647 * render target and the context. Caller assumes the ownership |
756 * of the returned object. The returned object must be deleted | 648 * of the returned object. The returned object must be deleted |
757 * before the context is destroyed. | 649 * before the context is destroyed. |
758 * TODO we can possibly bury this behind context, but we need to be able to
use the | 650 * TODO we can possibly bury this behind context, but we need to be able to
use the |
759 * drawText_asPaths logic on SkGpuDevice | 651 * drawText_asPaths logic on SkGpuDevice |
760 */ | 652 */ |
761 GrTextContext* createTextContext(GrRenderTarget*, | 653 GrTextContext* createTextContext(GrRenderTarget*, |
762 SkGpuDevice*, | 654 SkGpuDevice*, |
(...skipping 21 matching lines...) Expand all Loading... |
784 */ | 676 */ |
785 static void TextBlobCacheOverBudgetCB(void* data); | 677 static void TextBlobCacheOverBudgetCB(void* data); |
786 | 678 |
787 // TODO see note on createTextContext | 679 // TODO see note on createTextContext |
788 friend class SkGpuDevice; | 680 friend class SkGpuDevice; |
789 | 681 |
790 typedef SkRefCnt INHERITED; | 682 typedef SkRefCnt INHERITED; |
791 }; | 683 }; |
792 | 684 |
793 #endif | 685 #endif |
OLD | NEW |