aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl
diff options
context:
space:
mode:
authorGravatar bsalomon <bsalomon@google.com>2015-03-11 15:49:54 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-11 15:49:55 -0700
commit084340bb9bbb538baf02a11ac36e29f0d9cdc493 (patch)
tree52fb9ac6a18db328fb6ff2f7d08f29bfd8ef9bd0 /src/gpu/gl
parent79738cc7bf12d212bef4ff80591d1bf6f383663d (diff)
Add terrible workaround to fix stencil clear crash on S3.
Diffstat (limited to 'src/gpu/gl')
-rw-r--r--src/gpu/gl/GrGLGpu.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index b7901400fb..51fc42b995 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1210,8 +1210,27 @@ bool GrGLGpu::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width,
}
GL_CALL(ClearStencil(0));
+ // At least some versions of the SGX 54x driver can't handle clearing a stencil
+ // buffer without a color buffer and will crash.
+ GrGLuint tempRB = 0;
+ if (kPowerVR54x_GrGLRenderer == this->ctxInfo().renderer()) {
+ GL_CALL(GenRenderbuffers(1, &tempRB));
+ GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, tempRB));
+ GL_CALL(RenderbufferStorage(GR_GL_RENDERBUFFER, GR_GL_RGBA8, width, height));
+ GL_CALL(FramebufferRenderbuffer(fboTarget,
+ GR_GL_COLOR_ATTACHMENT0,
+ GR_GL_RENDERBUFFER, tempRB));
+ }
+
GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT));
+ if (tempRB) {
+ GL_CALL(FramebufferRenderbuffer(fboTarget,
+ GR_GL_COLOR_ATTACHMENT0,
+ GR_GL_RENDERBUFFER, 0));
+ GL_CALL(DeleteRenderbuffers(1, &tempRB));
+ }
+
// Unbind the SB from the FBO so that we don't keep it alive.
GL_CALL(FramebufferRenderbuffer(fboTarget,
GR_GL_STENCIL_ATTACHMENT,