495 lines
22 KiB
Diff
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
|
||
|
|