mcst-linux-kernel/patches-2024.06.26/gl4es-1.1.4/0196-Fixed-issue-when-mixin...

239 lines
13 KiB
Diff

From dfd54c5b939966d0c1885df6f3097446f68f4083 Mon Sep 17 00:00:00 2001
From: ptitSeb <sebastien.chev@gmail.com>
Date: Fri, 18 Mar 2022 10:50:24 +0100
Subject: [PATCH 196/233] Fixed issue when mixing VAO and glBegin/glEnd (should
help #373, maybe #358, probably other too)
---
src/gl/fpe.c | 21 ++++++++-------------
src/gl/gl4es.c | 1 +
src/gl/list.c | 6 +++---
src/gl/listdraw.c | 19 +++++++++++++++++++
4 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/src/gl/fpe.c b/src/gl/fpe.c
index bf5f1e9f..e3a578e2 100644
--- a/src/gl/fpe.c
+++ b/src/gl/fpe.c
@@ -682,8 +682,6 @@ void APIENTRY_GL4ES fpe_glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, G
void APIENTRY_GL4ES fpe_glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
DBG(printf("fpe_glSecondaryColorPointer(%d, %s, %d, %p)\n", size, PrintEnum(type), stride, pointer);)
- if(pointer==glstate->vao->vertexattrib[ATT_SECONDARY].pointer)
- return;
glstate->vao->vertexattrib[ATT_SECONDARY].size = size;
glstate->vao->vertexattrib[ATT_SECONDARY].type = type;
glstate->vao->vertexattrib[ATT_SECONDARY].stride = stride;
@@ -692,12 +690,12 @@ void APIENTRY_GL4ES fpe_glSecondaryColorPointer(GLint size, GLenum type, GLsizei
glstate->vao->vertexattrib[ATT_SECONDARY].normalized = (type==GL_FLOAT)?GL_FALSE:GL_TRUE;
glstate->vao->vertexattrib[ATT_SECONDARY].real_buffer = 0;
glstate->vao->vertexattrib[ATT_SECONDARY].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_SECONDARY].buffer = glstate->vao->vertex;
+
}
void APIENTRY_GL4ES fpe_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
- DBG(printf("fpe_glVertexPointer(%d, %s, %d, %p)\n", size, PrintEnum(type), stride, pointer);)
- if(pointer==glstate->vao->vertexattrib[ATT_VERTEX].pointer)
- return;
+ DBG(printf("fpe_glVertexPointer(%d, %s, %d, %p), vertex_buffer=%p\n", size, PrintEnum(type), stride, pointer, glstate->vao->vertex);)
glstate->vao->vertexattrib[ATT_VERTEX].size = size;
glstate->vao->vertexattrib[ATT_VERTEX].type = type;
glstate->vao->vertexattrib[ATT_VERTEX].stride = stride;
@@ -706,12 +704,11 @@ void APIENTRY_GL4ES fpe_glVertexPointer(GLint size, GLenum type, GLsizei stride,
glstate->vao->vertexattrib[ATT_VERTEX].normalized = GL_FALSE;
glstate->vao->vertexattrib[ATT_VERTEX].real_buffer = 0;
glstate->vao->vertexattrib[ATT_VERTEX].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_VERTEX].buffer = glstate->vao->vertex;
}
void APIENTRY_GL4ES fpe_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
DBG(printf("fpe_glColorPointer(%d, %s, %d, %p)\n", size, PrintEnum(type), stride, pointer);)
- if(pointer==glstate->vao->vertexattrib[ATT_COLOR].pointer)
- return;
glstate->vao->vertexattrib[ATT_COLOR].size = size;
glstate->vao->vertexattrib[ATT_COLOR].type = type;
glstate->vao->vertexattrib[ATT_COLOR].stride = stride;
@@ -720,12 +717,11 @@ void APIENTRY_GL4ES fpe_glColorPointer(GLint size, GLenum type, GLsizei stride,
glstate->vao->vertexattrib[ATT_COLOR].normalized = (type==GL_FLOAT)?GL_FALSE:GL_TRUE;
glstate->vao->vertexattrib[ATT_COLOR].real_buffer = 0;
glstate->vao->vertexattrib[ATT_COLOR].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_COLOR].buffer = glstate->vao->vertex;
}
void APIENTRY_GL4ES fpe_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer) {
DBG(printf("fpe_glNormalPointer(%s, %d, %p)\n", PrintEnum(type), stride, pointer);)
- if(pointer==glstate->vao->vertexattrib[ATT_NORMAL].pointer)
- return;
glstate->vao->vertexattrib[ATT_NORMAL].size = 3;
glstate->vao->vertexattrib[ATT_NORMAL].type = type;
glstate->vao->vertexattrib[ATT_NORMAL].stride = stride;
@@ -734,6 +730,7 @@ void APIENTRY_GL4ES fpe_glNormalPointer(GLenum type, GLsizei stride, const GLvoi
glstate->vao->vertexattrib[ATT_NORMAL].normalized = (type==GL_FLOAT)?GL_FALSE:GL_TRUE;
glstate->vao->vertexattrib[ATT_NORMAL].real_buffer = 0;
glstate->vao->vertexattrib[ATT_NORMAL].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_NORMAL].buffer = glstate->vao->vertex;
}
void APIENTRY_GL4ES fpe_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
@@ -742,8 +739,6 @@ void APIENTRY_GL4ES fpe_glTexCoordPointer(GLint size, GLenum type, GLsizei strid
void APIENTRY_GL4ES fpe_glTexCoordPointerTMU(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer, int TMU) {
DBG(printf("fpe_glTexCoordPointer(%d, %s, %d, %p) on tmu=%d\n", size, PrintEnum(type), stride, pointer, TMU);)
- if(pointer==glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].pointer)
- return;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].size = size;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].type = type;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].stride = stride;
@@ -752,12 +747,11 @@ void APIENTRY_GL4ES fpe_glTexCoordPointerTMU(GLint size, GLenum type, GLsizei st
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].normalized = GL_FALSE;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].real_buffer = 0;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+TMU].buffer = glstate->vao->vertex;
}
void APIENTRY_GL4ES fpe_glFogCoordPointer(GLenum type, GLsizei stride, const GLvoid *pointer) {
DBG(printf("fpe_glFogPointer(%s, %d, %p)\n", PrintEnum(type), stride, pointer);)
- if(pointer==glstate->vao->vertexattrib[ATT_FOGCOORD].pointer)
- return;
glstate->vao->vertexattrib[ATT_FOGCOORD].size = 1;
glstate->vao->vertexattrib[ATT_FOGCOORD].type = type;
glstate->vao->vertexattrib[ATT_FOGCOORD].stride = stride;
@@ -766,6 +760,7 @@ void APIENTRY_GL4ES fpe_glFogCoordPointer(GLenum type, GLsizei stride, const GLv
glstate->vao->vertexattrib[ATT_FOGCOORD].normalized = (type==GL_FLOAT)?GL_FALSE:GL_TRUE;
glstate->vao->vertexattrib[ATT_FOGCOORD].real_buffer = 0;
glstate->vao->vertexattrib[ATT_FOGCOORD].real_pointer = 0;
+ glstate->vao->vertexattrib[ATT_FOGCOORD].buffer = glstate->vao->vertex;
}
void APIENTRY_GL4ES fpe_glEnable(GLenum cap) {
diff --git a/src/gl/gl4es.c b/src/gl/gl4es.c
index 98f0bc5c..8809fbfb 100644
--- a/src/gl/gl4es.c
+++ b/src/gl/gl4es.c
@@ -249,6 +249,7 @@ void APIENTRY_GL4ES gl4es_glBegin(GLenum mode) {
// small optim... continue a render command if possible
glstate->list.active = NewDrawStage(glstate->list.active, mode);
glstate->list.pending = 0;
+ glstate->list.active->use_vbo_array = 2;
noerrorShimNoPurge(); // TODO, check Enum validity
}
AliasExport(void,glBegin,,(GLenum mode));
diff --git a/src/gl/list.c b/src/gl/list.c
index 93c4311b..64f9d857 100644
--- a/src/gl/list.c
+++ b/src/gl/list.c
@@ -837,9 +837,9 @@ void adjust_renderlist(renderlist_t *list) {
if (list->set_texture && (list->tmu == a))
bound = gl4es_getTexture(list->target_texture, list->texture);
// GL_ARB_texture_rectangle
- if ((list->tex[a]) && (itarget == ENABLED_TEXTURE_RECTANGLE) && (bound)) {
- tex_coord_rect_arb(list->tex[a], list->tex_stride[a]>>2, list->len, bound->width, bound->height);
- }
+ if ((list->tex[a]) && (itarget == ENABLED_TEXTURE_RECTANGLE) && (bound)) {
+ tex_coord_rect_arb(list->tex[a], list->tex_stride[a]>>2, list->len, bound->width, bound->height);
+ }
}
}
diff --git a/src/gl/listdraw.c b/src/gl/listdraw.c
index 66104eee..383e61d6 100644
--- a/src/gl/listdraw.c
+++ b/src/gl/listdraw.c
@@ -149,45 +149,58 @@ int list2VBO(renderlist_t* list)
typedef struct save_vbo_s {
GLuint real_buffer;
const GLvoid* real_pointer;
+ glbuffer_t* buffer;
} save_vbo_t;
void listActiveVBO(renderlist_t* list, save_vbo_t* saved) {
if(list->vert) {
saved[ATT_VERTEX].real_buffer = glstate->vao->vertexattrib[ATT_VERTEX].real_buffer;
saved[ATT_VERTEX].real_pointer = glstate->vao->vertexattrib[ATT_VERTEX].real_pointer;
+ saved[ATT_VERTEX].buffer = glstate->vao->vertexattrib[ATT_VERTEX].buffer;
glstate->vao->vertexattrib[ATT_VERTEX].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_VERTEX].real_pointer = list->vbo_vert;
+ glstate->vao->vertexattrib[ATT_VERTEX].buffer = NULL;
}
if(list->color) {
saved[ATT_COLOR].real_buffer = glstate->vao->vertexattrib[ATT_COLOR].real_buffer;
saved[ATT_COLOR].real_pointer = glstate->vao->vertexattrib[ATT_COLOR].real_pointer;
+ saved[ATT_COLOR].buffer = glstate->vao->vertexattrib[ATT_COLOR].buffer;
glstate->vao->vertexattrib[ATT_COLOR].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_COLOR].real_pointer = list->vbo_color;
+ glstate->vao->vertexattrib[ATT_COLOR].buffer = NULL;
}
if(list->secondary) {
saved[ATT_SECONDARY].real_buffer = glstate->vao->vertexattrib[ATT_SECONDARY].real_buffer;
saved[ATT_SECONDARY].real_pointer = glstate->vao->vertexattrib[ATT_SECONDARY].real_pointer;
+ saved[ATT_SECONDARY].buffer = glstate->vao->vertexattrib[ATT_SECONDARY].buffer;
glstate->vao->vertexattrib[ATT_SECONDARY].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_SECONDARY].real_pointer = list->vbo_secondary;
+ glstate->vao->vertexattrib[ATT_SECONDARY].buffer = NULL;
}
if(list->fogcoord) {
saved[ATT_FOGCOORD].real_buffer = glstate->vao->vertexattrib[ATT_FOGCOORD].real_buffer;
saved[ATT_FOGCOORD].real_pointer = glstate->vao->vertexattrib[ATT_FOGCOORD].real_pointer;
+ saved[ATT_FOGCOORD].buffer = glstate->vao->vertexattrib[ATT_FOGCOORD].buffer;
glstate->vao->vertexattrib[ATT_FOGCOORD].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_FOGCOORD].real_pointer = list->vbo_fogcoord;
+ glstate->vao->vertexattrib[ATT_FOGCOORD].buffer = NULL;
}
if(list->normal) {
saved[ATT_NORMAL].real_buffer = glstate->vao->vertexattrib[ATT_NORMAL].real_buffer;
saved[ATT_NORMAL].real_pointer = glstate->vao->vertexattrib[ATT_NORMAL].real_pointer;
+ saved[ATT_NORMAL].buffer = glstate->vao->vertexattrib[ATT_NORMAL].buffer;
glstate->vao->vertexattrib[ATT_NORMAL].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_NORMAL].real_pointer = list->vbo_normal;
+ glstate->vao->vertexattrib[ATT_NORMAL].buffer = NULL;
}
for (int a=0; a<list->maxtex; ++a) {
if(list->tex[a]) {
saved[ATT_MULTITEXCOORD0+a].real_buffer = glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_buffer;
saved[ATT_MULTITEXCOORD0+a].real_pointer = glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_pointer;
+ saved[ATT_MULTITEXCOORD0+a].buffer = glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].buffer;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_buffer = list->vbo_array;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_pointer = list->vbo_tex[a];
+ glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].buffer = NULL;
}
}
}
@@ -195,27 +208,33 @@ void listInactiveVBO(renderlist_t* list, save_vbo_t* saved) {
if(list->vert) {
glstate->vao->vertexattrib[ATT_VERTEX].real_buffer = saved[ATT_VERTEX].real_buffer;
glstate->vao->vertexattrib[ATT_VERTEX].real_pointer = saved[ATT_VERTEX].real_pointer;
+ glstate->vao->vertexattrib[ATT_VERTEX].buffer = saved[ATT_VERTEX].buffer;
}
if(list->color) {
glstate->vao->vertexattrib[ATT_COLOR].real_buffer = saved[ATT_COLOR].real_buffer;
glstate->vao->vertexattrib[ATT_COLOR].real_pointer = saved[ATT_COLOR].real_pointer;
+ glstate->vao->vertexattrib[ATT_COLOR].buffer = saved[ATT_COLOR].buffer;
}
if(list->secondary) {
glstate->vao->vertexattrib[ATT_SECONDARY].real_buffer = saved[ATT_SECONDARY].real_buffer;
glstate->vao->vertexattrib[ATT_SECONDARY].real_pointer = saved[ATT_SECONDARY].real_pointer;
+ glstate->vao->vertexattrib[ATT_SECONDARY].buffer = saved[ATT_SECONDARY].buffer;
}
if(list->fogcoord) {
glstate->vao->vertexattrib[ATT_FOGCOORD].real_buffer = saved[ATT_FOGCOORD].real_buffer;
glstate->vao->vertexattrib[ATT_FOGCOORD].real_pointer = saved[ATT_FOGCOORD].real_pointer;
+ glstate->vao->vertexattrib[ATT_FOGCOORD].buffer = saved[ATT_FOGCOORD].buffer;
}
if(list->normal) {
glstate->vao->vertexattrib[ATT_NORMAL].real_buffer = saved[ATT_NORMAL].real_buffer;
glstate->vao->vertexattrib[ATT_NORMAL].real_pointer = saved[ATT_NORMAL].real_pointer;
+ glstate->vao->vertexattrib[ATT_NORMAL].buffer = saved[ATT_NORMAL].buffer;
}
for (int a=0; a<list->maxtex; ++a) {
if(list->tex[a]) {
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_buffer = saved[ATT_MULTITEXCOORD0+a].real_buffer;
glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].real_pointer = saved[ATT_MULTITEXCOORD0+a].real_pointer;
+ glstate->vao->vertexattrib[ATT_MULTITEXCOORD0+a].buffer = saved[ATT_MULTITEXCOORD0+a].buffer;
}
}
}
--
2.11.0