Use scratch keys for stencil buffers.
BUG=skia:2889
Committed: https://skia.googlesource.com/skia/+/91175f19664a62851da4ca4e0984a7c7c45b258f
Review URL: https://codereview.chromium.org/747043004
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 9e1f754..bb40839 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -9,6 +9,7 @@
#include "GrGpuGL.h"
#include "GrGLStencilBuffer.h"
#include "GrGLTextureRenderTarget.h"
+#include "GrGpuResourceCacheAccess.h"
#include "GrOptDrawState.h"
#include "GrSurfacePriv.h"
#include "GrTemplates.h"
@@ -1121,8 +1122,7 @@
}
}
-bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt,
- int width, int height) {
+bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width, int height) {
// All internally created RTs are also textures. We don't create
// SBs for a client's standalone RT (that is a RT that isn't also a texture).
@@ -1171,15 +1171,16 @@
SkAutoTUnref<GrStencilBuffer> sb(SkNEW_ARGS(GrGLStencilBuffer,
(this, kIsWrapped, sbID, width, height,
samples, format)));
- // If we fail we have to create a new render buffer ID since we gave this one to the
- // GrGLStencilBuffer object.
- sbID = 0;
if (this->attachStencilBufferToRenderTarget(sb, rt)) {
fLastSuccessfulStencilFmtIdx = sIdx;
- sb->transferToCache();
rt->setStencilBuffer(sb);
return true;
}
+ // Remove the scratch key from this resource so we don't grab it from the cache ever
+ // again.
+ sb->cacheAccess().removeScratchKey();
+ // Set this to 0 since we handed the valid ID off to the failed stencil buffer resource.
+ sbID = 0;
}
}
GL_CALL(DeleteRenderbuffers(1, &sbID));