mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-22 10:42:11 -04:00
[Fix] (buffer): fix vao-ibo relationship on renaming
This commit is contained in:
parent
f8a2d74a2d
commit
a73661f6b8
@ -20,6 +20,8 @@ unordered_map<GLuint, GLuint> g_gen_arrays;
|
|||||||
|
|
||||||
unordered_map<GLenum, GLuint> g_bound_buffers;
|
unordered_map<GLenum, GLuint> g_bound_buffers;
|
||||||
GLuint bound_array = 0;
|
GLuint bound_array = 0;
|
||||||
|
// fake array - fake ibo
|
||||||
|
unordered_map<GLuint, GLuint> g_element_array_buffer_per_vao;
|
||||||
|
|
||||||
unordered_map<GLuint, BufferMapping> g_active_mappings;
|
unordered_map<GLuint, BufferMapping> g_active_mappings;
|
||||||
|
|
||||||
@ -51,6 +53,18 @@ GLuint find_real_buffer(GLuint key) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLuint get_ibo_by_vao(GLuint vao) {
|
||||||
|
return g_element_array_buffer_per_vao[vao];
|
||||||
|
}
|
||||||
|
|
||||||
|
GLuint find_bound_array() {
|
||||||
|
return bound_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_vao_ibo_binding(GLuint vao, GLuint ibo) {
|
||||||
|
g_element_array_buffer_per_vao[vao] = ibo;
|
||||||
|
}
|
||||||
|
|
||||||
GLuint find_bound_buffer(GLenum key) {
|
GLuint find_bound_buffer(GLenum key) {
|
||||||
GLenum target = 0;
|
GLenum target = 0;
|
||||||
switch (key) {
|
switch (key) {
|
||||||
@ -94,6 +108,10 @@ GLuint find_bound_buffer(GLenum key) {
|
|||||||
target = 0;
|
target = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (target == GL_ELEMENT_ARRAY_BUFFER) {
|
||||||
|
return get_ibo_by_vao(find_bound_array());
|
||||||
|
}
|
||||||
|
|
||||||
auto it = g_bound_buffers.find(target);
|
auto it = g_bound_buffers.find(target);
|
||||||
if (it != g_bound_buffers.end())
|
if (it != g_bound_buffers.end())
|
||||||
return it->second;
|
return it->second;
|
||||||
@ -119,6 +137,7 @@ void modify_array(GLuint key, GLuint value) {
|
|||||||
void remove_array(GLuint key) {
|
void remove_array(GLuint key) {
|
||||||
if (g_gen_arrays.find(key) != g_gen_arrays.end())
|
if (g_gen_arrays.find(key) != g_gen_arrays.end())
|
||||||
g_gen_arrays.erase(key);
|
g_gen_arrays.erase(key);
|
||||||
|
g_element_array_buffer_per_vao.erase(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint find_real_array(GLuint key) {
|
GLuint find_real_array(GLuint key) {
|
||||||
@ -129,10 +148,6 @@ GLuint find_real_array(GLuint key) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint find_bound_array() {
|
|
||||||
return bound_array;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLenum get_binding_query(GLenum target) {
|
static GLenum get_binding_query(GLenum target) {
|
||||||
switch(target) {
|
switch(target) {
|
||||||
case GL_ARRAY_BUFFER: return GL_ARRAY_BUFFER_BINDING;
|
case GL_ARRAY_BUFFER: return GL_ARRAY_BUFFER_BINDING;
|
||||||
@ -174,6 +189,11 @@ void glBindBuffer(GLenum target, GLuint buffer) {
|
|||||||
LOG()
|
LOG()
|
||||||
LOG_D("glBindBuffer, target = %s, buffer = %d", glEnumToString(target), buffer)
|
LOG_D("glBindBuffer, target = %s, buffer = %d", glEnumToString(target), buffer)
|
||||||
g_bound_buffers[target] = buffer;
|
g_bound_buffers[target] = buffer;
|
||||||
|
// save ibo binding to vao
|
||||||
|
if (target == GL_ELEMENT_ARRAY_BUFFER) {
|
||||||
|
update_vao_ibo_binding(find_bound_array(), buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (!has_buffer(buffer) || buffer == 0) {
|
if (!has_buffer(buffer) || buffer == 0) {
|
||||||
GLES.glBindBuffer(target, buffer);
|
GLES.glBindBuffer(target, buffer);
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
@ -194,6 +214,11 @@ void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offs
|
|||||||
LOG()
|
LOG()
|
||||||
LOG_D("glBindBufferRange, target = %s, index = %d, buffer = %d, offset = %p, size = %zi", glEnumToString(target), index, buffer, (void*) offset, size)
|
LOG_D("glBindBufferRange, target = %s, index = %d, buffer = %d, offset = %p, size = %zi", glEnumToString(target), index, buffer, (void*) offset, size)
|
||||||
g_bound_buffers[target] = buffer;
|
g_bound_buffers[target] = buffer;
|
||||||
|
// save ibo binding to vao
|
||||||
|
if (target == GL_ELEMENT_ARRAY_BUFFER) {
|
||||||
|
update_vao_ibo_binding(find_bound_array(), buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (!has_buffer(buffer) || buffer == 0) {
|
if (!has_buffer(buffer) || buffer == 0) {
|
||||||
GLES.glBindBufferRange(target, index, buffer, offset, size);
|
GLES.glBindBufferRange(target, index, buffer, offset, size);
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
@ -213,6 +238,11 @@ void glBindBufferBase(GLenum target, GLuint index, GLuint buffer) {
|
|||||||
LOG()
|
LOG()
|
||||||
LOG_D("glBindBufferBase, target = %s, index = %d, buffer = %d", glEnumToString(target), index, buffer)
|
LOG_D("glBindBufferBase, target = %s, index = %d, buffer = %d", glEnumToString(target), index, buffer)
|
||||||
g_bound_buffers[target] = buffer;
|
g_bound_buffers[target] = buffer;
|
||||||
|
// save ibo binding to vao
|
||||||
|
if (target == GL_ELEMENT_ARRAY_BUFFER) {
|
||||||
|
update_vao_ibo_binding(find_bound_array(), buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (!has_buffer(buffer) || buffer == 0) {
|
if (!has_buffer(buffer) || buffer == 0) {
|
||||||
GLES.glBindBufferBase(target, index, buffer);
|
GLES.glBindBufferBase(target, index, buffer);
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
@ -434,12 +464,17 @@ void glBindVertexArray(GLuint array) {
|
|||||||
LOG()
|
LOG()
|
||||||
LOG_D("glBindVertexArray(%d)", array)
|
LOG_D("glBindVertexArray(%d)", array)
|
||||||
bound_array = array;
|
bound_array = array;
|
||||||
|
|
||||||
|
// update bound ibo
|
||||||
|
g_bound_buffers[GL_ELEMENT_ARRAY_BUFFER] = get_ibo_by_vao(array);
|
||||||
|
|
||||||
if (!has_array(array) || array == 0) {
|
if (!has_array(array) || array == 0) {
|
||||||
LOG_D("Does not have va=%d found!", array)
|
LOG_D("Does not have va=%d found!", array)
|
||||||
GLES.glBindVertexArray(array);
|
GLES.glBindVertexArray(array);
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GLuint real_array = find_real_array(array);
|
GLuint real_array = find_real_array(array);
|
||||||
if (!real_array) {
|
if (!real_array) {
|
||||||
LOG_D("va=%d not initialized, initializing...", array)
|
LOG_D("va=%d not initialized, initializing...", array)
|
||||||
|
@ -62,6 +62,7 @@ void glGetIntegerv(GLenum pname, GLint *params) {
|
|||||||
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
|
case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
|
||||||
case GL_UNIFORM_BUFFER_BINDING:
|
case GL_UNIFORM_BUFFER_BINDING:
|
||||||
(*params) = (int) find_bound_buffer(pname);
|
(*params) = (int) find_bound_buffer(pname);
|
||||||
|
LOG_D(" -> %d",*params)
|
||||||
break;
|
break;
|
||||||
case GL_VERTEX_ARRAY_BINDING:
|
case GL_VERTEX_ARRAY_BINDING:
|
||||||
(*params) = (int) find_bound_array();
|
(*params) = (int) find_bound_array();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user