Index: src/gpu/GrResourceCache2.cpp |
diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp |
index e0ba26ae83516c54d4e87937bef28607f760b64d..85e66a7642ad45ea373eded4ef9c878fcb4ea181 100644 |
--- a/src/gpu/GrResourceCache2.cpp |
+++ b/src/gpu/GrResourceCache2.cpp |
@@ -8,7 +8,8 @@ |
#include "GrResourceCache2.h" |
-#include "GrGpuResource.h" |
+#include "GrGpuResource.h" |
+#include "SkRefCnt.h" |
GrResourceCache2::~GrResourceCache2() { |
this->releaseAll(); |
@@ -55,3 +56,32 @@ void GrResourceCache2::releaseAll() { |
SkASSERT(!fScratchMap.count()); |
SkASSERT(!fCount); |
} |
+ |
+class GrResourceCache2::AvailableForScratchUse { |
+public: |
+ AvailableForScratchUse(bool calledDuringFlush) : fFlushing(calledDuringFlush) { } |
+ |
+ bool operator()(const GrGpuResource* resource) const { |
+ if (fFlushing) { |
+ // If this request is coming during draw buffer flush then no refs are allowed |
+ // either by drawing code or for pending io operations. |
+ // This will be removed when flush no longer creates resources. |
+ return resource->reffedOnlyByCache() && !resource->internalHasPendingIO() && |
+ GrGpuResource::kYes_IsScratch == resource->fIsScratch; |
+ } else { |
+ // Because duties are currently shared between GrResourceCache and GrResourceCache2, the |
+ // current interpretation of this rule is that only GrResourceCache has a ref but that |
+ // it has been marked as a scratch resource. |
+ return resource->reffedOnlyByCache() && |
+ GrGpuResource::kYes_IsScratch == resource->fIsScratch; |
+ } |
+ } |
+private: |
+ bool fFlushing; |
+}; |
+ |
+GrGpuResource* GrResourceCache2::findAndRefScratchResource(const GrResourceKey& scratchKey, |
+ bool calledDuringFlush) { |
+ SkASSERT(scratchKey.isScratch()); |
+ return SkSafeRef(fScratchMap.find(scratchKey, AvailableForScratchUse(calledDuringFlush))); |
+} |