From 2cee1c0f93afe7e237d6df507c07c07b68bd7ab3 Mon Sep 17 00:00:00 2001 From: Olli Wang Date: Fri, 5 Sep 2014 00:10:03 +0800 Subject: [PATCH] Add FBO support for GLES To support FBO for iOS, the current framebuffer and renderbuffer must be restored after calling nvgluCreateFramebuffer(). The framebuffer should also be restored when calling nvgluBindFramebuffer(NULL) as well. --- src/nanovg_gl_utils.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/nanovg_gl_utils.h b/src/nanovg_gl_utils.h index 33376bd..8784210 100644 --- a/src/nanovg_gl_utils.h +++ b/src/nanovg_gl_utils.h @@ -35,7 +35,7 @@ void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb); #ifdef NANOVG_GL_IMPLEMENTATION -#if defined(NANOVG_GL3) +#if defined(NANOVG_GL3) || defined(NANOVG_GLES2) || defined(NANOVG_GLES3) // FBO is core in OpenGL 3>. # define NANOVG_FBO_VALID 1 #elif defined(NANOVG_GL2) @@ -46,14 +46,21 @@ void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb); # endif #endif +static GLint defaultFBO = -1; + NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags) { #ifdef NANOVG_FBO_VALID + GLint defaultFBO; + GLint defaultRBO; NVGLUframebuffer* fb = NULL; fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer)); if (fb == NULL) goto error; memset(fb, 0, sizeof(NVGLUframebuffer)); + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + glGetIntegerv(GL_RENDERBUFFER_BINDING, &defaultRBO); + fb->image = nvgCreateImageRGBA(ctx, w, h, imageFlags | NVG_IMAGE_FLIPY | NVG_IMAGE_PREMULTIPLIED, NULL); fb->texture = nvglImageHandle(ctx, fb->image); @@ -72,6 +79,8 @@ NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imag if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) goto error; + glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); + glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO); return fb; error: nvgluDeleteFramebuffer(ctx, fb); @@ -88,7 +97,8 @@ error: void nvgluBindFramebuffer(NVGLUframebuffer* fb) { #ifdef NANOVG_FBO_VALID - glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : 0); + if (defaultFBO == -1) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : defaultFBO); #else NVG_NOTUSED(fb); #endif