diff --git a/app/src/main/cpp/gl/drawing.c b/app/src/main/cpp/gl/drawing.c index e738e25..44f674a 100644 --- a/app/src/main/cpp/gl/drawing.c +++ b/app/src/main/cpp/gl/drawing.c @@ -89,7 +89,7 @@ void glDrawBuffers(GLsizei n, const GLenum *bufs) { GLenum new_bufs[n]; for (int i = 0; i < n; i++) { - if (bufs[i] >= GL_COLOR_ATTACHMENT0 && bufs <= GL_COLOR_ATTACHMENT0 + getMaxDrawBuffers()) { + if (bufs[i] >= GL_COLOR_ATTACHMENT0 && bufs[i] <= GL_COLOR_ATTACHMENT0 + getMaxDrawBuffers()) { GLenum target_attachment = GL_COLOR_ATTACHMENT0 + i; new_bufs[i] = target_attachment; if (bufs[i] == target_attachment) diff --git a/app/src/main/cpp/gl/framebuffer.c b/app/src/main/cpp/gl/framebuffer.c index 0b8fa44..7a6d037 100644 --- a/app/src/main/cpp/gl/framebuffer.c +++ b/app/src/main/cpp/gl/framebuffer.c @@ -20,6 +20,9 @@ GLint getMaxDrawBuffers() { } void rebind_framebuffer(GLenum old_attachment, GLenum target_attachment) { + if (!bound_framebuffer || !bound_framebuffer->attachment) + return; + struct attachment_t attachment = bound_framebuffer->attachment[old_attachment - GL_COLOR_ATTACHMENT0]; LOAD_GLES(glFramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) @@ -34,8 +37,10 @@ void glBindFramebuffer(GLenum target, GLuint framebuffer) { LOAD_GLES(glBindFramebuffer, void, GLenum target, GLuint framebuffer) gles_glBindFramebuffer(target, framebuffer); - bound_framebuffer = NULL; - bound_framebuffer = malloc(sizeof(struct framebuffer_t)); + if (!bound_framebuffer) + bound_framebuffer = malloc(sizeof(struct framebuffer_t)); + free(bound_framebuffer->attachment); + bound_framebuffer->attachment = malloc(getMaxDrawBuffers() * sizeof(struct attachment_t)); bound_framebuffer->target = target; CHECK_GL_ERROR @@ -46,9 +51,11 @@ void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, LOG_D("glFramebufferTexture2D(0x%x, 0x%x, 0x%x, %d, %d)", target, attachment, textarget, texture, level) - bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].textarget = textarget; - bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].texture = texture; - bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].level = level; + if (bound_framebuffer && bound_framebuffer->attachment) { + bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].textarget = textarget; + bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].texture = texture; + bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].level = level; + } LOAD_GLES(glFramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) gles_glFramebufferTexture2D(target, attachment, textarget, texture, level); diff --git a/app/src/main/cpp/gl/framebuffer.h b/app/src/main/cpp/gl/framebuffer.h index 3960ed1..2b9e61e 100644 --- a/app/src/main/cpp/gl/framebuffer.h +++ b/app/src/main/cpp/gl/framebuffer.h @@ -15,7 +15,7 @@ struct attachment_t { struct framebuffer_t { GLenum target; - struct attachment_t attachment[]; + struct attachment_t* attachment; }; extern struct framebuffer_t* bound_framebuffer;