Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: src/gpu/GrContext.cpp

Issue 481443002: Add GrResourceCache2. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix leaks Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "GrContext.h" 10 #include "GrContext.h"
11 11
12 #include "effects/GrConfigConversionEffect.h" 12 #include "effects/GrConfigConversionEffect.h"
13 #include "effects/GrDashingEffect.h" 13 #include "effects/GrDashingEffect.h"
14 #include "effects/GrSingleTextureEffect.h" 14 #include "effects/GrSingleTextureEffect.h"
15 15
16 #include "GrAARectRenderer.h" 16 #include "GrAARectRenderer.h"
17 #include "GrBufferAllocPool.h" 17 #include "GrBufferAllocPool.h"
18 #include "GrGpu.h" 18 #include "GrGpu.h"
19 #include "GrDistanceFieldTextContext.h" 19 #include "GrDistanceFieldTextContext.h"
20 #include "GrDrawTargetCaps.h" 20 #include "GrDrawTargetCaps.h"
21 #include "GrIndexBuffer.h" 21 #include "GrIndexBuffer.h"
22 #include "GrInOrderDrawBuffer.h" 22 #include "GrInOrderDrawBuffer.h"
23 #include "GrLayerCache.h" 23 #include "GrLayerCache.h"
24 #include "GrOvalRenderer.h" 24 #include "GrOvalRenderer.h"
25 #include "GrPathRenderer.h" 25 #include "GrPathRenderer.h"
26 #include "GrPathUtils.h" 26 #include "GrPathUtils.h"
27 #include "GrResourceCache.h" 27 #include "GrResourceCache.h"
28 #include "GrResourceCache2.h"
28 #include "GrSoftwarePathRenderer.h" 29 #include "GrSoftwarePathRenderer.h"
29 #include "GrStencilBuffer.h" 30 #include "GrStencilBuffer.h"
30 #include "GrStencilAndCoverTextContext.h" 31 #include "GrStencilAndCoverTextContext.h"
31 #include "GrStrokeInfo.h" 32 #include "GrStrokeInfo.h"
32 #include "GrTextStrike.h" 33 #include "GrTextStrike.h"
33 #include "GrTraceMarker.h" 34 #include "GrTraceMarker.h"
34 #include "GrTracing.h" 35 #include "GrTracing.h"
35 #include "SkDashPathPriv.h" 36 #include "SkDashPathPriv.h"
36 #include "SkGr.h" 37 #include "SkGr.h"
37 #include "SkRTConf.h" 38 #include "SkRTConf.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 102 }
102 } 103 }
103 104
104 GrContext::GrContext(const Options& opts) : fOptions(opts) { 105 GrContext::GrContext(const Options& opts) : fOptions(opts) {
105 fDrawState = NULL; 106 fDrawState = NULL;
106 fGpu = NULL; 107 fGpu = NULL;
107 fClip = NULL; 108 fClip = NULL;
108 fPathRendererChain = NULL; 109 fPathRendererChain = NULL;
109 fSoftwarePathRenderer = NULL; 110 fSoftwarePathRenderer = NULL;
110 fResourceCache = NULL; 111 fResourceCache = NULL;
112 fResourceCache2 = NULL;
111 fFontCache = NULL; 113 fFontCache = NULL;
112 fDrawBuffer = NULL; 114 fDrawBuffer = NULL;
113 fDrawBufferVBAllocPool = NULL; 115 fDrawBufferVBAllocPool = NULL;
114 fDrawBufferIBAllocPool = NULL; 116 fDrawBufferIBAllocPool = NULL;
115 fFlushToReduceCacheSize = false; 117 fFlushToReduceCacheSize = false;
116 fAARectRenderer = NULL; 118 fAARectRenderer = NULL;
117 fOvalRenderer = NULL; 119 fOvalRenderer = NULL;
118 fViewMatrix.reset(); 120 fViewMatrix.reset();
119 fMaxTextureSizeOverride = 1 << 20; 121 fMaxTextureSizeOverride = 1 << 20;
120 } 122 }
121 123
122 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { 124 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) {
123 SkASSERT(NULL == fGpu); 125 SkASSERT(NULL == fGpu);
124 126
125 fGpu = GrGpu::Create(backend, backendContext, this); 127 fGpu = GrGpu::Create(backend, backendContext, this);
126 if (NULL == fGpu) { 128 if (NULL == fGpu) {
127 return false; 129 return false;
128 } 130 }
129 131
130 fDrawState = SkNEW(GrDrawState); 132 fDrawState = SkNEW(GrDrawState);
131 fGpu->setDrawState(fDrawState); 133 fGpu->setDrawState(fDrawState);
132 134
133 fResourceCache = SkNEW_ARGS(GrResourceCache, (MAX_RESOURCE_CACHE_COUNT, 135 fResourceCache = SkNEW_ARGS(GrResourceCache, (MAX_RESOURCE_CACHE_COUNT,
134 MAX_RESOURCE_CACHE_BYTES)); 136 MAX_RESOURCE_CACHE_BYTES));
135 fResourceCache->setOverbudgetCallback(OverbudgetCB, this); 137 fResourceCache->setOverbudgetCallback(OverbudgetCB, this);
138 fResourceCache2 = SkNEW(GrResourceCache2);
136 139
137 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu)); 140 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu));
138 141
139 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this))); 142 fLayerCache.reset(SkNEW_ARGS(GrLayerCache, (this)));
140 143
141 fLastDrawWasBuffered = kNo_BufferedDraw; 144 fLastDrawWasBuffered = kNo_BufferedDraw;
142 145
143 fAARectRenderer = SkNEW(GrAARectRenderer); 146 fAARectRenderer = SkNEW(GrAARectRenderer);
144 fOvalRenderer = SkNEW(GrOvalRenderer); 147 fOvalRenderer = SkNEW(GrOvalRenderer);
145 148
146 fDidTestPMConversions = false; 149 fDidTestPMConversions = false;
147 150
148 this->setupDrawBuffer(); 151 this->setupDrawBuffer();
149 152
150 return true; 153 return true;
151 } 154 }
152 155
153 GrContext::~GrContext() { 156 GrContext::~GrContext() {
154 if (NULL == fGpu) { 157 if (NULL == fGpu) {
155 return; 158 return;
156 } 159 }
157 160
158 this->flush(); 161 this->flush();
159 162
160 for (int i = 0; i < fCleanUpData.count(); ++i) { 163 for (int i = 0; i < fCleanUpData.count(); ++i) {
161 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo); 164 (*fCleanUpData[i].fFunc)(this, fCleanUpData[i].fInfo);
162 } 165 }
163 166
164 // Since the gpu can hold scratch textures, give it a chance to let go 167 delete fResourceCache2;
165 // of them before freeing the texture cache 168 fResourceCache2 = NULL;
166 fGpu->purgeResources();
167
168 delete fResourceCache; 169 delete fResourceCache;
169 fResourceCache = NULL; 170 fResourceCache = NULL;
170 delete fFontCache; 171 delete fFontCache;
171 delete fDrawBuffer; 172 delete fDrawBuffer;
172 delete fDrawBufferVBAllocPool; 173 delete fDrawBufferVBAllocPool;
173 delete fDrawBufferIBAllocPool; 174 delete fDrawBufferIBAllocPool;
174 175
175 fAARectRenderer->unref(); 176 fAARectRenderer->unref();
176 fOvalRenderer->unref(); 177 fOvalRenderer->unref();
177 178
178 fGpu->unref(); 179 fGpu->unref();
179 SkSafeUnref(fPathRendererChain); 180 SkSafeUnref(fPathRendererChain);
180 SkSafeUnref(fSoftwarePathRenderer); 181 SkSafeUnref(fSoftwarePathRenderer);
181 fDrawState->unref(); 182 fDrawState->unref();
182 } 183 }
183 184
184 void GrContext::abandonContext() { 185 void GrContext::abandonContext() {
185 // abandon first to so destructors 186 // abandon first to so destructors
186 // don't try to free the resources in the API. 187 // don't try to free the resources in the API.
187 fGpu->abandonResources(); 188 fResourceCache2->abandonAll();
189
190 fGpu->contextAbandonded();
188 191
189 // a path renderer may be holding onto resources that 192 // a path renderer may be holding onto resources that
190 // are now unusable 193 // are now unusable
191 SkSafeSetNull(fPathRendererChain); 194 SkSafeSetNull(fPathRendererChain);
192 SkSafeSetNull(fSoftwarePathRenderer); 195 SkSafeSetNull(fSoftwarePathRenderer);
193 196
194 delete fDrawBuffer; 197 delete fDrawBuffer;
195 fDrawBuffer = NULL; 198 fDrawBuffer = NULL;
196 199
197 delete fDrawBufferVBAllocPool; 200 delete fDrawBufferVBAllocPool;
198 fDrawBufferVBAllocPool = NULL; 201 fDrawBufferVBAllocPool = NULL;
199 202
200 delete fDrawBufferIBAllocPool; 203 delete fDrawBufferIBAllocPool;
201 fDrawBufferIBAllocPool = NULL; 204 fDrawBufferIBAllocPool = NULL;
202 205
203 fAARectRenderer->reset(); 206 fAARectRenderer->reset();
204 fOvalRenderer->reset(); 207 fOvalRenderer->reset();
205 208
206 fResourceCache->purgeAllUnlocked(); 209 fResourceCache->purgeAllUnlocked();
207 210
208 fFontCache->freeAll(); 211 fFontCache->freeAll();
209 fLayerCache->freeAll(); 212 fLayerCache->freeAll();
210 fGpu->markContextDirty();
211 } 213 }
212 214
213 void GrContext::resetContext(uint32_t state) { 215 void GrContext::resetContext(uint32_t state) {
214 fGpu->markContextDirty(state); 216 fGpu->markContextDirty(state);
215 } 217 }
216 218
217 void GrContext::freeGpuResources() { 219 void GrContext::freeGpuResources() {
218 this->flush(); 220 this->flush();
219 221
220 fGpu->purgeResources(); 222 fGpu->purgeResources();
223 if (NULL != fDrawBuffer) {
224 fDrawBuffer->purgeResources();
225 }
221 226
222 fAARectRenderer->reset(); 227 fAARectRenderer->reset();
223 fOvalRenderer->reset(); 228 fOvalRenderer->reset();
224 229
225 fResourceCache->purgeAllUnlocked(); 230 fResourceCache->purgeAllUnlocked();
226 fFontCache->freeAll(); 231 fFontCache->freeAll();
227 fLayerCache->freeAll(); 232 fLayerCache->freeAll();
228 // a path renderer may be holding onto resources 233 // a path renderer may be holding onto resources
229 SkSafeSetNull(fPathRendererChain); 234 SkSafeSetNull(fPathRendererChain);
230 SkSafeSetNull(fSoftwarePathRenderer); 235 SkSafeSetNull(fSoftwarePathRenderer);
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 this->purgeCache(); 538 this->purgeCache();
534 } else { 539 } else {
535 // When we aren't reusing textures we know this scratch texture 540 // When we aren't reusing textures we know this scratch texture
536 // will never be reused and would be just wasting time in the cache 541 // will never be reused and would be just wasting time in the cache
537 fResourceCache->makeNonExclusive(texture->getCacheEntry()); 542 fResourceCache->makeNonExclusive(texture->getCacheEntry());
538 fResourceCache->deleteResource(texture->getCacheEntry()); 543 fResourceCache->deleteResource(texture->getCacheEntry());
539 } 544 }
540 } 545 }
541 546
542 void GrContext::unlockScratchTexture(GrTexture* texture) { 547 void GrContext::unlockScratchTexture(GrTexture* texture) {
548 if (texture->wasDestroyed()) {
549 if (texture->getCacheEntry()->key().isScratch()) {
550 // This texture was detached from the cache but the cache still had a ref to it but
551 // not a pointer to it.
552 texture->unref();
553 }
554 return;
555 }
556
543 ASSERT_OWNED_RESOURCE(texture); 557 ASSERT_OWNED_RESOURCE(texture);
544 SkASSERT(NULL != texture->getCacheEntry()); 558 SkASSERT(NULL != texture->getCacheEntry());
545 559
546 // If this is a scratch texture we detached it from the cache 560 // If this is a scratch texture we detached it from the cache
547 // while it was locked (to avoid two callers simultaneously getting 561 // while it was locked (to avoid two callers simultaneously getting
548 // the same texture). 562 // the same texture).
549 if (texture->getCacheEntry()->key().isScratch()) { 563 if (texture->getCacheEntry()->key().isScratch()) {
550 if (fGpu->caps()->reuseScratchTextures() || NULL != texture->asRenderTar get()) { 564 if (fGpu->caps()->reuseScratchTextures() || NULL != texture->asRenderTar get()) {
551 fResourceCache->makeNonExclusive(texture->getCacheEntry()); 565 fResourceCache->makeNonExclusive(texture->getCacheEntry());
552 this->purgeCache(); 566 this->purgeCache();
(...skipping 1378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 fDrawBuffer->removeGpuTraceMarker(marker); 1945 fDrawBuffer->removeGpuTraceMarker(marker);
1932 } 1946 }
1933 } 1947 }
1934 1948
1935 /////////////////////////////////////////////////////////////////////////////// 1949 ///////////////////////////////////////////////////////////////////////////////
1936 #if GR_CACHE_STATS 1950 #if GR_CACHE_STATS
1937 void GrContext::printCacheStats() const { 1951 void GrContext::printCacheStats() const {
1938 fResourceCache->printStats(); 1952 fResourceCache->printStats();
1939 } 1953 }
1940 #endif 1954 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrClipMaskManager.cpp ('k') | src/gpu/GrGpu.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698