[Fix] (buffer): fix vao-ibo relationship on renaming

This commit is contained in:
Swung0x48 2025-04-13 22:48:20 +08:00
parent f8a2d74a2d
commit a73661f6b8
2 changed files with 40 additions and 4 deletions

View File

@ -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)

View File

@ -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();