Index: src/gpu/gl/GrGpuGL.cpp |
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp |
index 877c21fc7e29e7ff28ad3ef2c8493feec44b5a9b..89f26efe22b619d72c16dcedf94ea94b99e5766b 100644 |
--- a/src/gpu/gl/GrGpuGL.cpp |
+++ b/src/gpu/gl/GrGpuGL.cpp |
@@ -1131,21 +1131,22 @@ bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt, |
SkASSERT(height >= rt->height()); |
int samples = rt->numSamples(); |
- GrGLuint sbID; |
- GL_CALL(GenRenderbuffers(1, &sbID)); |
- if (!sbID) { |
- return false; |
- } |
+ GrGLuint sbID = 0; |
int stencilFmtCnt = this->glCaps().stencilFormats().count(); |
for (int i = 0; i < stencilFmtCnt; ++i) { |
+ if (!sbID) { |
+ GL_CALL(GenRenderbuffers(1, &sbID)); |
+ } |
+ if (!sbID) { |
+ return false; |
+ } |
GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, sbID)); |
// we start with the last stencil format that succeeded in hopes |
// that we won't go through this loop more than once after the |
// first (painful) stencil creation. |
int sIdx = (i + fLastSuccessfulStencilFmtIdx) % stencilFmtCnt; |
- const GrGLCaps::StencilFormat& sFmt = |
- this->glCaps().stencilFormats()[sIdx]; |
+ const GrGLCaps::StencilFormat& sFmt = this->glCaps().stencilFormats()[sIdx]; |
CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
// we do this "if" so that we don't call the multisample |
// version on a GL that doesn't have an MSAA extension. |
@@ -1156,12 +1157,10 @@ bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt, |
sFmt.fInternalFormat, |
width, height); |
} else { |
- GL_ALLOC_CALL(this->glInterface(), |
- RenderbufferStorage(GR_GL_RENDERBUFFER, |
- sFmt.fInternalFormat, |
- width, height)); |
- created = |
- (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glInterface())); |
+ GL_ALLOC_CALL(this->glInterface(), RenderbufferStorage(GR_GL_RENDERBUFFER, |
+ sFmt.fInternalFormat, |
+ width, height)); |
+ created = (GR_GL_NO_ERROR == check_alloc_error(rt->desc(), this->glInterface())); |
} |
if (created) { |
// After sized formats we attempt an unsized format and take |
@@ -1172,13 +1171,15 @@ bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt, |
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; |
- } |
- sb->abandon(); // otherwise we lose sbID |
+ } |
} |
} |
GL_CALL(DeleteRenderbuffers(1, &sbID)); |