239 lines
13 KiB
Diff
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
|
|
|