| Index: src/gpu/GrResourceCache2.cpp
|
| diff --git a/src/gpu/GrResourceCache2.cpp b/src/gpu/GrResourceCache2.cpp
|
| index 5144c59eef44f38ca5da81bb90caba0d7817caa1..6bc23a3096a5101027f4dfa2aae1c1a4ea6c8a1c 100644
|
| --- a/src/gpu/GrResourceCache2.cpp
|
| +++ b/src/gpu/GrResourceCache2.cpp
|
| @@ -59,29 +59,33 @@ void GrResourceCache2::releaseAll() {
|
|
|
| class GrResourceCache2::AvailableForScratchUse {
|
| public:
|
| - AvailableForScratchUse(bool calledDuringFlush) : fFlushing(calledDuringFlush) { }
|
| + AvailableForScratchUse(bool rejectPendingIO) : fRejectPendingIO(rejectPendingIO) { }
|
|
|
| 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() &&
|
| - resource->isScratch();
|
| - } 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() && resource->isScratch();
|
| + if (!resource->reffedOnlyByCache() || !resource->isScratch()) {
|
| + return false;
|
| }
|
| +
|
| + return !fRejectPendingIO || !resource->internalHasPendingIO();
|
| }
|
|
|
| private:
|
| - bool fFlushing;
|
| + bool fRejectPendingIO;
|
| };
|
|
|
| GrGpuResource* GrResourceCache2::findAndRefScratchResource(const GrResourceKey& scratchKey,
|
| - bool calledDuringFlush) {
|
| + uint32_t flags) {
|
| SkASSERT(scratchKey.isScratch());
|
| - return SkSafeRef(fScratchMap.find(scratchKey, AvailableForScratchUse(calledDuringFlush)));
|
| +
|
| + if (flags & (kPreferNoPendingIO_ScratchFlag | kRequireNoPendingIO_ScratchFlag)) {
|
| + GrGpuResource* resource = fScratchMap.find(scratchKey, AvailableForScratchUse(true));
|
| + if (resource) {
|
| + return SkRef(resource);
|
| + } else if (flags & kRequireNoPendingIO_ScratchFlag) {
|
| + return NULL;
|
| + }
|
| + // TODO: fail here when kPrefer is specified, we didn't find a resource without pending io,
|
| + // but there is still space in our budget for the resource.
|
| + }
|
| + return SkSafeRef(fScratchMap.find(scratchKey, AvailableForScratchUse(false)));
|
| }
|
|
|