Browse Source

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.
shared-context
Olli Wang 10 years ago
parent
commit
2cee1c0f93
1 changed files with 12 additions and 2 deletions
  1. +12
    -2
      src/nanovg_gl_utils.h

+ 12
- 2
src/nanovg_gl_utils.h View File

@@ -35,7 +35,7 @@ void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb);


#ifdef NANOVG_GL_IMPLEMENTATION #ifdef NANOVG_GL_IMPLEMENTATION


#if defined(NANOVG_GL3)
#if defined(NANOVG_GL3) || defined(NANOVG_GLES2) || defined(NANOVG_GLES3)
// FBO is core in OpenGL 3>. // FBO is core in OpenGL 3>.
# define NANOVG_FBO_VALID 1 # define NANOVG_FBO_VALID 1
#elif defined(NANOVG_GL2) #elif defined(NANOVG_GL2)
@@ -46,14 +46,21 @@ void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb);
# endif # endif
#endif #endif


static GLint defaultFBO = -1;

NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags) NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags)
{ {
#ifdef NANOVG_FBO_VALID #ifdef NANOVG_FBO_VALID
GLint defaultFBO;
GLint defaultRBO;
NVGLUframebuffer* fb = NULL; NVGLUframebuffer* fb = NULL;
fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer)); fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer));
if (fb == NULL) goto error; if (fb == NULL) goto error;
memset(fb, 0, sizeof(NVGLUframebuffer)); 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->image = nvgCreateImageRGBA(ctx, w, h, imageFlags | NVG_IMAGE_FLIPY | NVG_IMAGE_PREMULTIPLIED, NULL);
fb->texture = nvglImageHandle(ctx, fb->image); 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; if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) goto error;


glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO);
glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO);
return fb; return fb;
error: error:
nvgluDeleteFramebuffer(ctx, fb); nvgluDeleteFramebuffer(ctx, fb);
@@ -88,7 +97,8 @@ error:
void nvgluBindFramebuffer(NVGLUframebuffer* fb) void nvgluBindFramebuffer(NVGLUframebuffer* fb)
{ {
#ifdef NANOVG_FBO_VALID #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 #else
NVG_NOTUSED(fb); NVG_NOTUSED(fb);
#endif #endif


Loading…
Cancel
Save