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