Index: src/gpu/GrContext.cpp |
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp |
index 357f58e6e323240234a8f226fd0e65b3ea2a76c3..3f4d2fa95913a066f2eb8719cf375e97780af159 100644 |
--- a/src/gpu/GrContext.cpp |
+++ b/src/gpu/GrContext.cpp |
@@ -66,6 +66,7 @@ |
fResourceCache = nullptr; |
fResourceProvider = nullptr; |
fBatchFontCache = nullptr; |
+ fFlushToReduceCacheSize = false; |
} |
bool GrContext::init(GrBackend backend, GrBackendContext backendContext, |
@@ -86,6 +87,7 @@ |
fCaps = SkRef(fGpu->caps()); |
fResourceCache = new GrResourceCache(fCaps); |
+ fResourceCache->setOverBudgetCallback(OverBudgetCB, this); |
fResourceProvider = new GrResourceProvider(fGpu, fResourceCache, &fSingleOwner); |
fDidTestPMConversions = false; |
@@ -95,8 +97,7 @@ |
dtOptions.fDrawBatchBounds = options.fDrawBatchBounds; |
dtOptions.fMaxBatchLookback = options.fMaxBatchLookback; |
dtOptions.fMaxBatchLookahead = options.fMaxBatchLookahead; |
- fDrawingManager.reset(new GrDrawingManager(this, dtOptions, options.fImmediateMode, |
- &fSingleOwner)); |
+ fDrawingManager.reset(new GrDrawingManager(this, dtOptions, &fSingleOwner)); |
// GrBatchFontCache will eventually replace GrFontCache |
fBatchFontCache = new GrBatchFontCache(this); |
@@ -202,21 +203,41 @@ |
//////////////////////////////////////////////////////////////////////////////// |
+void GrContext::OverBudgetCB(void* data) { |
+ SkASSERT(data); |
+ |
+ GrContext* context = reinterpret_cast<GrContext*>(data); |
+ |
+ // Flush the GrBufferedDrawTarget to possibly free up some textures |
+ context->fFlushToReduceCacheSize = true; |
+} |
+ |
void GrContext::TextBlobCacheOverBudgetCB(void* data) { |
SkASSERT(data); |
- // TextBlobs are drawn at the SkGpuDevice level, therefore they cannot rely on GrDrawContext |
- // to perform a necessary flush. The solution is to move drawText calls to below the GrContext |
- // level, but this is not trivial because they call drawPath on SkGpuDevice. |
+ |
+ // Unlike the GrResourceCache, TextBlobs are drawn at the SkGpuDevice level, therefore they |
+ // cannot use fFlushTorReduceCacheSize because it uses AutoCheckFlush. The solution is to move |
+ // drawText calls to below the GrContext level, but this is not trivial because they call |
+ // drawPath on SkGpuDevice |
GrContext* context = reinterpret_cast<GrContext*>(data); |
context->flush(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-void GrContext::flush() { |
+void GrContext::flush(int flagsBitfield) { |
ASSERT_SINGLE_OWNER |
RETURN_IF_ABANDONED |
- fDrawingManager->flush(); |
+ bool flushed = false; |
+ if (kDiscard_FlushBit & flagsBitfield) { |
+ fDrawingManager->reset(); |
+ } else { |
+ flushed = fDrawingManager->flush(); |
+ } |
+ if (flushed) { |
+ fResourceCache->notifyFlushOccurred(); |
+ } |
+ fFlushToReduceCacheSize = false; |
} |
bool sw_convert_to_premul(GrPixelConfig srcConfig, int width, int height, size_t inRowBytes, |