fix potential bugs

This commit is contained in:
Tungstend 2025-02-06 02:34:46 +08:00
parent 3fdd673aae
commit 571a7b74cb
3 changed files with 14 additions and 7 deletions

View File

@ -89,7 +89,7 @@ void glDrawBuffers(GLsizei n, const GLenum *bufs) {
GLenum new_bufs[n]; GLenum new_bufs[n];
for (int i = 0; i < n; i++) { 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; GLenum target_attachment = GL_COLOR_ATTACHMENT0 + i;
new_bufs[i] = target_attachment; new_bufs[i] = target_attachment;
if (bufs[i] == target_attachment) if (bufs[i] == target_attachment)

View File

@ -20,6 +20,9 @@ GLint getMaxDrawBuffers() {
} }
void rebind_framebuffer(GLenum old_attachment, GLenum target_attachment) { 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]; 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) 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) LOAD_GLES(glBindFramebuffer, void, GLenum target, GLuint framebuffer)
gles_glBindFramebuffer(target, framebuffer); gles_glBindFramebuffer(target, framebuffer);
bound_framebuffer = NULL; if (!bound_framebuffer)
bound_framebuffer = malloc(sizeof(struct framebuffer_t)); bound_framebuffer = malloc(sizeof(struct framebuffer_t));
free(bound_framebuffer->attachment);
bound_framebuffer->attachment = malloc(getMaxDrawBuffers() * sizeof(struct attachment_t));
bound_framebuffer->target = target; bound_framebuffer->target = target;
CHECK_GL_ERROR 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) LOG_D("glFramebufferTexture2D(0x%x, 0x%x, 0x%x, %d, %d)", target, attachment, textarget, texture, level)
if (bound_framebuffer && bound_framebuffer->attachment) {
bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].textarget = textarget; 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].texture = texture;
bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].level = level; bound_framebuffer->attachment[attachment - GL_COLOR_ATTACHMENT0].level = level;
}
LOAD_GLES(glFramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) LOAD_GLES(glFramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
gles_glFramebufferTexture2D(target, attachment, textarget, texture, level); gles_glFramebufferTexture2D(target, attachment, textarget, texture, level);

View File

@ -15,7 +15,7 @@ struct attachment_t {
struct framebuffer_t { struct framebuffer_t {
GLenum target; GLenum target;
struct attachment_t attachment[]; struct attachment_t* attachment;
}; };
extern struct framebuffer_t* bound_framebuffer; extern struct framebuffer_t* bound_framebuffer;