From 675c5c4303f75581405b510537e2fccd69bd416f Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Tue, 6 Dec 2011 19:54:37 +0000 Subject: [PATCH] Fix SkGLContext FBO setup for ES2 Review URL: http://codereview.appspot.com/5452058/ git-svn-id: http://skia.googlecode.com/svn/trunk@2812 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/gpu/SkGLContext.cpp | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/gpu/SkGLContext.cpp b/src/gpu/SkGLContext.cpp index c50ee6e..f6b7db8 100644 --- a/src/gpu/SkGLContext.cpp +++ b/src/gpu/SkGLContext.cpp @@ -24,28 +24,45 @@ bool SkGLContext::init(int width, int height) { fGL = this->createGLContext(); if (fGL) { + // clear any existing GL erorrs + GrGLenum error; + do { + error = SK_GL(*this, GetError()); + } while (GR_GL_NO_ERROR != error); GrGLuint cbID; GrGLuint dsID; SK_GL(*this, GenFramebuffers(1, &fFBO)); SK_GL(*this, BindFramebuffer(GR_GL_FRAMEBUFFER, fFBO)); SK_GL(*this, GenRenderbuffers(1, &cbID)); SK_GL(*this, BindRenderbuffer(GR_GL_RENDERBUFFER, cbID)); - SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, - GR_GL_RGBA, - width, height)); + if (fGL->supportsES2()) { + SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, + GR_GL_RGBA8, + width, height)); + } else { + SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, + GR_GL_RGBA, + width, height)); + } SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, GR_GL_COLOR_ATTACHMENT0, GR_GL_RENDERBUFFER, cbID)); SK_GL(*this, GenRenderbuffers(1, &dsID)); SK_GL(*this, BindRenderbuffer(GR_GL_RENDERBUFFER, dsID)); - SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, - GR_GL_DEPTH_STENCIL, - width, height)); - SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, - GR_GL_DEPTH_ATTACHMENT, - GR_GL_RENDERBUFFER, - dsID)); + if (fGL->supportsES2()) { + SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, + GR_GL_STENCIL_INDEX8, + width, height)); + } else { + SK_GL(*this, RenderbufferStorage(GR_GL_RENDERBUFFER, + GR_GL_DEPTH_STENCIL, + width, height)); + SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, + GR_GL_DEPTH_ATTACHMENT, + GR_GL_RENDERBUFFER, + dsID)); + } SK_GL(*this, FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, GR_GL_STENCIL_ATTACHMENT, GR_GL_RENDERBUFFER, @@ -53,10 +70,13 @@ bool SkGLContext::init(int width, int height) { SK_GL(*this, Viewport(0, 0, width, height)); SK_GL(*this, ClearStencil(0)); SK_GL(*this, Clear(GR_GL_STENCIL_BUFFER_BIT)); - + + error = SK_GL(*this, GetError()); GrGLenum status = SK_GL(*this, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); - if (GR_GL_FRAMEBUFFER_COMPLETE != status) { + + if (GR_GL_FRAMEBUFFER_COMPLETE != status || + GR_GL_NO_ERROR != error) { fFBO = 0; fGL->unref(); fGL = NULL; -- 2.7.4