mcst-linux-kernel/patches-2024.06.26/gl4es-1.1.4/0083-GLES2-Try-to-optimize-...

495 lines
22 KiB
Diff

From 0b173f318dd8a0a4232300cb5264487fb7d17415 Mon Sep 17 00:00:00 2001
From: ptitSeb <sebastien.chev@gmail.com>
Date: Wed, 28 Oct 2020 21:59:19 +0100
Subject: [PATCH 083/233] [GLES2] Try to optimize real VBO handling
---
src/gl/buffers.c | 87 ++++++++++++++++++++++++++++++++++++++++---------------
src/gl/buffers.h | 10 +++++++
src/gl/fpe.c | 34 ++++++++++------------
src/gl/gl4es.c | 16 ++++------
src/gl/glstate.h | 2 ++
src/gl/listdraw.c | 17 +++++------
src/gl/state.h | 7 +++++
7 files changed, 112 insertions(+), 61 deletions(-)
diff --git a/src/gl/buffers.c b/src/gl/buffers.c
index b5ca14f1..f1508daa 100755
--- a/src/gl/buffers.c
+++ b/src/gl/buffers.c
@@ -197,9 +197,8 @@ void gl4es_glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLe
}
LOAD_GLES(glBufferData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(target, buff->real_buffer);
+ bindBuffer(target, buff->real_buffer);
gles_glBufferData(target, size, data, usage);
- gles_glBindBuffer(target, 0);
DBG(printf(" => real VBO %d\n", buff->real_buffer);)
}
@@ -248,9 +247,8 @@ void gl4es_glNamedBufferData(GLuint buffer, GLsizeiptr size, const GLvoid * data
}
LOAD_GLES(glBufferData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferData(buff->type, size, data, usage);
- gles_glBindBuffer(buff->type, 0);
}
buff->size = size;
@@ -286,10 +284,8 @@ void gl4es_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, cons
if((target==GL_ARRAY_BUFFER || target==GL_ELEMENT_ARRAY_BUFFER) && buff->real_buffer) {
LOAD_GLES(glBufferSubData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(target, buff->real_buffer);
+ bindBuffer(target, buff->real_buffer);
gles_glBufferSubData(target, offset, size, data);
- gles_glBindBuffer(target, 0);
-
}
memcpy(buff->data + offset, data, size);
@@ -311,9 +307,8 @@ void gl4es_glNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size,
if((buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && buff->real_buffer) {
LOAD_GLES(glBufferSubData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, offset, size, data);
- gles_glBindBuffer(buff->type, 0);
}
memcpy(buff->data + offset, data, size);
noerrorShim();
@@ -498,16 +493,13 @@ GLboolean gl4es_glUnmapBuffer(GLenum target) {
if(buff->real_buffer && (buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && buff->mapped && !buff->ranged && (buff->access==GL_WRITE_ONLY || buff->access==GL_READ_WRITE)) {
LOAD_GLES(glBufferSubData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, 0, buff->size, buff->data);
- gles_glBindBuffer(buff->type, 0);
}
if(buff->real_buffer && (buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && buff->mapped && buff->ranged && (buff->access&GL_MAP_WRITE_BIT_EXT) && !(buff->access&GL_MAP_FLUSH_EXPLICIT_BIT_EXT)) {
LOAD_GLES(glBufferSubData);
- LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, buff->offset, buff->length, (void*)((uintptr_t)buff->data+buff->offset));
- gles_glBindBuffer(buff->type, 0);
}
if (buff->mapped) {
buff->mapped = 0;
@@ -528,16 +520,14 @@ GLboolean gl4es_glUnmapNamedBuffer(GLuint buffer) {
if(buff->real_buffer && (buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && buff->mapped && (buff->access==GL_WRITE_ONLY || buff->access==GL_READ_WRITE)) {
LOAD_GLES(glBufferSubData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, 0, buff->size, buff->data);
- gles_glBindBuffer(buff->type, 0);
}
if(buff->real_buffer && (buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && buff->mapped && buff->ranged && (buff->access&GL_MAP_WRITE_BIT_EXT) && !(buff->access&GL_MAP_FLUSH_EXPLICIT_BIT_EXT)) {
LOAD_GLES(glBufferSubData);
LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, buff->offset, buff->length, (void*)((uintptr_t)buff->data+buff->offset));
- gles_glBindBuffer(buff->type, 0);
}
if (buff->mapped) {
buff->mapped = 0;
@@ -657,10 +647,8 @@ void gl4es_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr l
if(buff->real_buffer && (buff->type==GL_ARRAY_BUFFER || buff->type==GL_ELEMENT_ARRAY_BUFFER) && (buff->access&GL_MAP_WRITE_BIT_EXT)) {
LOAD_GLES(glBufferSubData);
- LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(buff->type, buff->real_buffer);
+ bindBuffer(buff->type, buff->real_buffer);
gles_glBufferSubData(buff->type, buff->offset+offset, length, (void*)((uintptr_t)buff->data+buff->offset+offset));
- gles_glBindBuffer(buff->type, 0);
}
}
@@ -682,14 +670,65 @@ void gl4es_glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr r
memcpy(writebuff->data+writeOffset, readbuff->data+readOffset, size);
if(writebuff->real_buffer && (writebuff->type==GL_ARRAY_BUFFER || writebuff->type==GL_ELEMENT_ARRAY_BUFFER) && writebuff->mapped && (writebuff->access==GL_WRITE_ONLY || writebuff->access==GL_READ_WRITE)) {
LOAD_GLES(glBufferSubData);
- LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(writebuff->type, writebuff->real_buffer);
+ bindBuffer(writebuff->type, writebuff->real_buffer);
gles_glBufferSubData(writebuff->type, writeOffset, size, writebuff->data+writeOffset);
- gles_glBindBuffer(writebuff->type, 0);
}
noerrorShim();
}
+void bindBuffer(GLenum target, GLuint buffer)
+{
+ LOAD_GLES(glBindBuffer);
+ if(target==GL_ARRAY_BUFFER) {
+ if(glstate->bind_buffer.array == buffer)
+ return;
+ glstate->bind_buffer.array = buffer;
+ gles_glBindBuffer(target, buffer);
+
+ } else if (target==GL_ELEMENT_ARRAY_BUFFER) {
+ glstate->bind_buffer.want_index = buffer;
+ if(glstate->bind_buffer.index == buffer)
+ return;
+ glstate->bind_buffer.index = buffer;
+ gles_glBindBuffer(target, buffer);
+ } else {
+ LOGE("Warning, unhandled Buffer type %s in bindBuffer\n", PrintEnum(target));
+ return;
+ }
+ glstate->bind_buffer.used = (glstate->bind_buffer.index && glstate->bind_buffer.array)?1:0;
+}
+
+void wantBufferIndex(GLuint buffer)
+{
+ glstate->bind_buffer.want_index = buffer;
+}
+
+void realize_bufferIndex()
+{
+ LOAD_GLES(glBindBuffer);
+ if(glstate->bind_buffer.index != glstate->bind_buffer.want_index) {
+ glstate->bind_buffer.index = glstate->bind_buffer.want_index;
+ gles_glBindBuffer(GL_ARRAY_BUFFER, glstate->bind_buffer.index);
+ glstate->bind_buffer.used = (glstate->bind_buffer.index && glstate->bind_buffer.array)?1:0;
+ }
+}
+
+void unboundBuffers()
+{
+ if(!glstate->bind_buffer.used)
+ return;
+ LOAD_GLES(glBindBuffer);
+ if(glstate->bind_buffer.array) {
+ glstate->bind_buffer.array = 0;
+ gles_glBindBuffer(GL_ARRAY_BUFFER, 0);
+ }
+ if(glstate->bind_buffer.index) {
+ glstate->bind_buffer.index = 0;
+ gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+ glstate->bind_buffer.used = 0;
+}
+
//Direct wrapper
void glGenBuffers(GLsizei n, GLuint * buffers) AliasExport("gl4es_glGenBuffers");
diff --git a/src/gl/buffers.h b/src/gl/buffers.h
index b8b304c8..4393f343 100755
--- a/src/gl/buffers.h
+++ b/src/gl/buffers.h
@@ -67,6 +67,16 @@ GLboolean glUnmapBufferARB(GLenum target);
void glGetBufferSubDataARB(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid * data);
void glGetBufferPointervARB(GLenum target, GLenum pname, GLvoid ** params);
+// internal actual BindBuffer with cache
+void bindBuffer(GLenum target, GLuint buffer);
+// unbound all buffer
+void unboundBuffers();
+// update wanted Index Buffer
+void wantBufferIndex(GLuint buffer);
+// Bind the wanted index buffer if needed
+void realize_bufferIndex();
+
+
// Pointer..... ****** => map them in vertexattrib (even with GLES1.1). So no more pointer_state_t, use vertexattrib_t
// and map .enabled to .vaarray
diff --git a/src/gl/fpe.c b/src/gl/fpe.c
index f5011763..30f6176b 100755
--- a/src/gl/fpe.c
+++ b/src/gl/fpe.c
@@ -796,19 +796,20 @@ void fpe_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
void fpe_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) {
DBG(printf("fpe_glDrawElements(%s, %d, %s, %p), program=%d, instanceID=%u\n", PrintEnum(mode), count, PrintEnum(type), indices, glstate->glsl->program, glstate->instanceID);)
- LOAD_GLES2(glBindBuffer);
scratch_t scratch = {0};
realize_glenv(mode==GL_POINTS, 0, count, type, indices, &scratch);
LOAD_GLES(glDrawElements);
int use_vbo = 0;
if(glstate->vao->elements && glstate->vao->elements->real_buffer && indices>=glstate->vao->elements->data && indices<=(glstate->vao->elements->data+glstate->vao->elements->size)) {
use_vbo = 1;
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->vao->elements->real_buffer);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->vao->elements->real_buffer);
indices = (GLvoid*)((uintptr_t)indices - (uintptr_t)(glstate->vao->elements->data));
}
+ realize_bufferIndex();
gles_glDrawElements(mode, count, type, indices);
+ if(use_vbo)
+ wantBufferIndex(0);
free_scratch(&scratch);
- if(use_vbo) gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void fpe_glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
DBG(printf("fpe_glDrawArraysInstanced(%s, %d, %d, %d), program=%d\n", PrintEnum(mode), first, count, primcount, glstate->glsl->program);)
@@ -862,7 +863,6 @@ void fpe_glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei
}
void fpe_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount) {
DBG(printf("fpe_glDrawElementsInstanced(%s, %d, %s, %p, %d), program=%d\n", PrintEnum(mode), count, PrintEnum(type), indices, primcount, glstate->glsl->program);)
- LOAD_GLES2(glBindBuffer);
LOAD_GLES(glDrawElements);
LOAD_GLES2(glVertexAttrib4fv);
scratch_t scratch = {0};
@@ -873,10 +873,13 @@ void fpe_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const
GLfloat tmp[4] = {0.0f, 0.0f, 0.0f, 1.0f};
if(glstate->vao->elements && glstate->vao->elements->real_buffer && indices>=glstate->vao->elements->data && indices<=(glstate->vao->elements->data+glstate->vao->elements->size)) {
use_vbo = 1;
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->vao->elements->real_buffer);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->vao->elements->real_buffer);
inds = (void*)((uintptr_t)indices - (uintptr_t)(glstate->vao->elements->data));
- } else
+ } else {
inds = (void*)indices;
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+ //realize_bufferIndex(); // not usefull here
for (GLint id=0; id<primcount; ++id) {
GoUniformiv(glprogram, glprogram->builtin_instanceID, 1, 1, &id);
for(int i=0; i<hardext.maxvattrib; i++)
@@ -917,8 +920,9 @@ void fpe_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const
}
gles_glDrawElements(mode, count, type, inds);
}
+ if(use_vbo)
+ wantBufferIndex(0);
free_scratch(&scratch);
- if(use_vbo) gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
@@ -1025,7 +1029,6 @@ void realize_glenv(int ispoint, int first, int count, GLenum type, const void* i
LOAD_GLES2(glDisableVertexAttribArray);
LOAD_GLES2(glVertexAttribPointer);
LOAD_GLES2(glVertexAttrib4fv);
- LOAD_GLES2(glBindBuffer);
LOAD_GLES2(glUseProgram);
// update texture state for fpe only
if(glstate->fpe_bound_changed && !glstate->glsl->program) {
@@ -1403,7 +1406,6 @@ void realize_glenv(int ispoint, int first, int count, GLenum type, const void* i
#undef GO
}
// set VertexAttrib if needed
- GLuint old_buffer = 0;
for(int i=0; i<hardext.maxvattrib; i++)
if(glprogram->va_size[i]) // only check used VA...
{
@@ -1426,7 +1428,8 @@ void realize_glenv(int ispoint, int first, int count, GLenum type, const void* i
void * ptr = (void*)((uintptr_t)w->pointer + ((w->buffer)?(uintptr_t)w->buffer->data:0));
if(dirty || v->size!=w->size || v->type!=w->type || v->normalized!=w->normalized
|| v->stride!=w->stride || v->buffer!=w->buffer || (w->real_buffer==0 && v->pointer!=ptr)
- || v->real_buffer!=w->real_buffer || (w->real_buffer!=0 && v->real_pointer != w->real_pointer)) {
+ || v->real_buffer!=w->real_buffer || (w->real_buffer!=0 && v->real_pointer != w->real_pointer)
+ || w->real_buffer!=glstate->bind_buffer.array) {
if((w->size==GL_BGRA || w->type==GL_DOUBLE) && scratch->size<8) {
// need to adjust, so first need the min/max (a shame as I already must have that somewhere)
int imin, imax;
@@ -1466,11 +1469,9 @@ void realize_glenv(int ispoint, int first, int count, GLenum type, const void* i
v->pointer = (v->real_buffer)?v->real_pointer:ptr;
v->buffer = w->buffer; // buffer is unused here
}
- if(old_buffer != v->real_buffer) {
- DBG(printf("Switching to Buffer %d\n", v->real_buffer);)
- gles_glBindBuffer(GL_ARRAY_BUFFER, v->real_buffer);
- old_buffer = v->real_buffer;
- }
+ DBG(printf("using Buffer %d\n", v->real_buffer);)
+ bindBuffer(GL_ARRAY_BUFFER, v->real_buffer);
+
gles_glVertexAttribPointer(i, v->size, v->type, v->normalized, v->stride, v->pointer);
DBG(printf("glVertexAttribPointer(%d, %d, %s, %d, %d, %p)\n", i, v->size, PrintEnum(v->type), v->normalized, v->stride, (GLvoid*)((uintptr_t)v->pointer+((v->buffer)?(uintptr_t)v->buffer->data:0)));)
}
@@ -1520,9 +1521,6 @@ void realize_glenv(int ispoint, int first, int count, GLenum type, const void* i
gles_glDisableVertexAttribArray(i);
}
}
- if(old_buffer)
- gles_glBindBuffer(GL_ARRAY_BUFFER, 0);
-
}
void realize_blitenv(int alpha) {
diff --git a/src/gl/gl4es.c b/src/gl/gl4es.c
index 084a1a71..662ce818 100755
--- a/src/gl/gl4es.c
+++ b/src/gl/gl4es.c
@@ -701,7 +701,7 @@ void ToBuffer(int first, int count) {
if(!glstate->scratch_vertex)
gles_glGenBuffers(1, &glstate->scratch_vertex);
glstate->scratch_vertex_size = stride*count;
- gles_glBindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
+ bindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
gles_glBufferData(GL_ARRAY_BUFFER, stride*count, (void*)(master+first*stride), GL_STREAM_DRAW);
#else
LOAD_GLES(glBufferSubData);
@@ -1162,7 +1162,6 @@ void gl4es_scratch(int alloc) {
void gl4es_scratch_vertex(int alloc) {
LOAD_GLES(glBufferData);
- LOAD_GLES(glBindBuffer);
LOAD_GLES(glGenBuffers);
if(!glstate->scratch_vertex) {
glGenBuffers(1, &glstate->scratch_vertex);
@@ -1174,26 +1173,24 @@ void gl4es_scratch_vertex(int alloc) {
glGenBuffers(1, &glstate->scratch_vertex);
gles_glDeleteBuffers(1, &old_buffer);
#endif
- gles_glBindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
+ bindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
gles_glBufferData(GL_ARRAY_BUFFER, alloc, NULL, GL_STREAM_DRAW);
glstate->scratch_vertex_size = alloc;
} else
- gles_glBindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
+ bindBuffer(GL_ARRAY_BUFFER, glstate->scratch_vertex);
}
void gl4es_use_scratch_vertex(int use) {
- LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(GL_ARRAY_BUFFER, use?glstate->scratch_vertex:0);
+ bindBuffer(GL_ARRAY_BUFFER, use?glstate->scratch_vertex:0);
}
void gl4es_scratch_indices(int alloc) {
LOAD_GLES(glBufferData);
- LOAD_GLES(glBindBuffer);
LOAD_GLES(glGenBuffers);
if(!glstate->scratch_indices) {
glGenBuffers(1, &glstate->scratch_indices);
}
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->scratch_indices);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, glstate->scratch_indices);
if(glstate->scratch_indices_size < alloc) {
gles_glBufferData(GL_ELEMENT_ARRAY_BUFFER, alloc, NULL, GL_DYNAMIC_DRAW);
glstate->scratch_indices_size = alloc;
@@ -1201,8 +1198,7 @@ void gl4es_scratch_indices(int alloc) {
}
void gl4es_use_scratch_indices(int use) {
- LOAD_GLES(glBindBuffer);
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, use?glstate->scratch_indices:0);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, use?glstate->scratch_indices:0);
}
#if defined(AMIGAOS4) || (defined(NOX11) && defined(NOEGL))
diff --git a/src/gl/glstate.h b/src/gl/glstate.h
index f059c168..67a0c3b3 100755
--- a/src/gl/glstate.h
+++ b/src/gl/glstate.h
@@ -125,6 +125,8 @@ typedef struct glstate_s {
samplers_t samplers;
// Queries
queries_t queries;
+ // Binded buffer (if used)
+ bind_buffers_t bind_buffer;
} glstate_t;
diff --git a/src/gl/listdraw.c b/src/gl/listdraw.c
index 0d60c040..7cb5ed62 100755
--- a/src/gl/listdraw.c
+++ b/src/gl/listdraw.c
@@ -23,7 +23,6 @@ typedef struct array2vbo_s {
int list2VBO(renderlist_t* list)
{
LOAD_GLES2(glGenBuffers);
- LOAD_GLES2(glBindBuffer);
LOAD_GLES2(glBufferData);
LOAD_GLES2(glBufferSubData);
array2vbo_t work[ATT_MAX] = {0};
@@ -109,14 +108,13 @@ int list2VBO(renderlist_t* list)
return 1;
// Create the VBO and fill the data
gles_glGenBuffers(1, &list->vbo_array);
- gles_glBindBuffer(GL_ARRAY_BUFFER, list->vbo_array);
+ bindBuffer(GL_ARRAY_BUFFER, list->vbo_array);
gles_glBufferData(GL_ARRAY_BUFFER, vbo_base, NULL, GL_STATIC_DRAW);
for(int i=0; i<imax; ++i) {
array2vbo_t *r = work+sorted[i];
if(r->vbo_base==r->vbo_basebase)
gles_glBufferSubData(GL_ARRAY_BUFFER, r->vbo_basebase, r->real_size, (void*)r->real_base);
}
- gles_glBindBuffer(GL_ARRAY_BUFFER, 0);
// work -> list
imax = 0;
if(list->vert) {
@@ -356,7 +354,6 @@ void draw_renderlist(renderlist_t *list) {
LOAD_GLES_FPE(glTexCoordPointer);
LOAD_GLES_FPE(glEnable);
LOAD_GLES_FPE(glDisable);
- LOAD_GLES2(glBindBuffer);
gl4es_glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
int old_tex;
@@ -731,6 +728,7 @@ void draw_renderlist(renderlist_t *list) {
int k = fill_lineIndices(list->mode_inits?list->mode_inits:&tmp, list->mode_inits?list->mode_init_len:1, list->mode, indices, list->ind_lines);
list->ind_line = k;
}
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gles_glDrawElements(mode, list->ind_line, GL_UNSIGNED_SHORT, list->ind_lines);
use_vbo_indices = 1;
} else {
@@ -740,14 +738,15 @@ void draw_renderlist(renderlist_t *list) {
LOAD_GLES2(glGenBuffers);
LOAD_GLES2(glBufferData);
gles_glGenBuffers(1, &list->vbo_indices);
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, list->vbo_indices);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, list->vbo_indices);
gles_glBufferData(GL_ELEMENT_ARRAY_BUFFER, list->ilen*sizeof(GL_UNSIGNED_SHORT), indices, GL_STATIC_DRAW);
use_vbo_indices = 2;
vbo_indices = 1;
} else if(use_vbo_indices==2) {
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, list->vbo_indices);
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, list->vbo_indices);
vbo_indices = 1;
- }
+ } else
+ realize_bufferIndex();
if(list->instanceCount==1)
gles_glDrawElements(mode, list->ilen, GL_UNSIGNED_SHORT, vbo_indices?NULL:indices);
else {
@@ -755,8 +754,7 @@ void draw_renderlist(renderlist_t *list) {
gles_glDrawElements(mode, list->ilen, GL_UNSIGNED_SHORT, vbo_indices?NULL:indices);
glstate->instanceID = 0;
}
- if(vbo_indices)
- gles_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ wantBufferIndex(0);
}
}
} else {
@@ -777,6 +775,7 @@ void draw_renderlist(renderlist_t *list) {
int k = fill_lineIndices(list->mode_inits?list->mode_inits:&tmp, list->mode_inits?list->mode_init_len:1, list->mode, NULL, list->ind_lines);
list->ind_line = k;
}
+ bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
gles_glDrawElements(mode, list->ind_line, GL_UNSIGNED_SHORT, list->ind_lines);
} else {
if(list->instanceCount==1)
diff --git a/src/gl/state.h b/src/gl/state.h
index e4996210..bed9362d 100755
--- a/src/gl/state.h
+++ b/src/gl/state.h
@@ -367,5 +367,12 @@ typedef struct {
unsigned long long start;
} queries_t;
+typedef struct {
+ GLuint array;
+ GLuint index;
+ GLuint want_index;
+ int used;
+} bind_buffers_t;
+
#endif // _GL4ES_STATE_H_
--
2.11.0