From 050f36cbb2c1767b542ed48f405a9df0208eeeca Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 17 Jun 2025 15:55:58 +0300 Subject: [PATCH] Sprite Draw: Fixed buffer update --- src/DivaGL/GL/array_buffer.cpp | 23 ++++++++++++++++++++ src/DivaGL/GL/array_buffer.hpp | 2 ++ src/DivaGL/GL/element_array_buffer.cpp | 23 ++++++++++++++++++++ src/DivaGL/GL/element_array_buffer.hpp | 2 ++ src/DivaGL/GL/shader_storage_buffer.cpp | 23 ++++++++++++++++++++ src/DivaGL/GL/shader_storage_buffer.hpp | 2 ++ src/DivaGL/GL/uniform_buffer.cpp | 23 ++++++++++++++++++++ src/DivaGL/GL/uniform_buffer.hpp | 2 ++ src/DivaGL/sprite.cpp | 29 +++++-------------------- 9 files changed, 106 insertions(+), 23 deletions(-) diff --git a/src/DivaGL/GL/array_buffer.cpp b/src/DivaGL/GL/array_buffer.cpp index 5951264..a0f653b 100644 --- a/src/DivaGL/GL/array_buffer.cpp +++ b/src/DivaGL/GL/array_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (DIVA_GL_VERSION_4_5) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_array_buffer(buffer); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_STREAM_DRAW); + } + } + + void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { + if (DIVA_GL_VERSION_4_5) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_array_buffer(buffer); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW); + } + } + void ArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; diff --git a/src/DivaGL/GL/array_buffer.hpp b/src/DivaGL/GL/array_buffer.hpp index 1ef4f48..5f1031b 100644 --- a/src/DivaGL/GL/array_buffer.hpp +++ b/src/DivaGL/GL/array_buffer.hpp @@ -34,6 +34,8 @@ namespace GL { void Destroy(); void* MapMemory(gl_state_struct& gl_st); void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void Recreate(gl_state_struct& gl_st, size_t size); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void UnmapMemory(gl_state_struct& gl_st); void UnmapMemory(p_gl_rend_state& p_gl_rend_st); void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); diff --git a/src/DivaGL/GL/element_array_buffer.cpp b/src/DivaGL/GL/element_array_buffer.cpp index ef31604..33fc7cc 100644 --- a/src/DivaGL/GL/element_array_buffer.cpp +++ b/src/DivaGL/GL/element_array_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_element_array_buffer(buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_STREAM_DRAW); + } + } + + void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_element_array_buffer(buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW); + } + } + void ElementArrayBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; diff --git a/src/DivaGL/GL/element_array_buffer.hpp b/src/DivaGL/GL/element_array_buffer.hpp index 2b422c0..8af770e 100644 --- a/src/DivaGL/GL/element_array_buffer.hpp +++ b/src/DivaGL/GL/element_array_buffer.hpp @@ -34,6 +34,8 @@ namespace GL { void Destroy(); void* MapMemory(gl_state_struct& gl_st); void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void Recreate(gl_state_struct& gl_st, size_t size); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void UnmapMemory(gl_state_struct& gl_st); void UnmapMemory(p_gl_rend_state& p_gl_rend_st); void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); diff --git a/src/DivaGL/GL/shader_storage_buffer.cpp b/src/DivaGL/GL/shader_storage_buffer.cpp index 0c95caf..4a283e8 100644 --- a/src/DivaGL/GL/shader_storage_buffer.cpp +++ b/src/DivaGL/GL/shader_storage_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_shader_storage_buffer(buffer); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_STREAM_DRAW); + } + } + + void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_shader_storage_buffer(buffer); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW); + } + } + void ShaderStorageBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; diff --git a/src/DivaGL/GL/shader_storage_buffer.hpp b/src/DivaGL/GL/shader_storage_buffer.hpp index a02e23b..161920e 100644 --- a/src/DivaGL/GL/shader_storage_buffer.hpp +++ b/src/DivaGL/GL/shader_storage_buffer.hpp @@ -34,6 +34,8 @@ namespace GL { void Destroy(); void* MapMemory(gl_state_struct& gl_st); void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void Recreate(gl_state_struct& gl_st, size_t size); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void UnmapMemory(gl_state_struct& gl_st); void UnmapMemory(p_gl_rend_state& p_gl_rend_st); void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); diff --git a/src/DivaGL/GL/uniform_buffer.cpp b/src/DivaGL/GL/uniform_buffer.cpp index 2b1b956..f8dfdcf 100644 --- a/src/DivaGL/GL/uniform_buffer.cpp +++ b/src/DivaGL/GL/uniform_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_uniform_buffer(buffer); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_STREAM_DRAW); + } + } + + void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { + if (DIVA_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_uniform_buffer(buffer); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_STREAM_DRAW : GL_STATIC_DRAW); + } + } + void UniformBuffer::UnmapMemory(gl_state_struct& gl_st) { if (!buffer) return; diff --git a/src/DivaGL/GL/uniform_buffer.hpp b/src/DivaGL/GL/uniform_buffer.hpp index adf10c9..9d2129f 100644 --- a/src/DivaGL/GL/uniform_buffer.hpp +++ b/src/DivaGL/GL/uniform_buffer.hpp @@ -34,6 +34,8 @@ namespace GL { void Destroy(); void* MapMemory(gl_state_struct& gl_st); void* MapMemory(p_gl_rend_state& p_gl_rend_st); + void Recreate(gl_state_struct& gl_st, size_t size); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); void UnmapMemory(gl_state_struct& gl_st); void UnmapMemory(p_gl_rend_state& p_gl_rend_st); void WriteMemory(gl_state_struct& gl_st, size_t offset, size_t size, const void* data); diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index f05ef2e..400b3e3 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -261,20 +261,10 @@ namespace spr { static const GLsizei buffer_size_uv2 = sizeof(sprite_vertex_data_uv2); if (vbo_vertex_count < vertex_buffer.size() / sizeof(sprite_vertex_data_uv2)) { - while (vbo_vertex_count < vertex_buffer.size()) + while (vbo_vertex_count < vertex_buffer.size() / sizeof(sprite_vertex_data_uv2)) vbo_vertex_count *= 2; - if (DIVA_GL_VERSION_4_4) { - vbo.Destroy(); - vbo.Create(gl_state, buffer_size_uv2 * vbo_vertex_count); - gl_state.bind_array_buffer(vbo, true); - } - else { - gl_state.bind_array_buffer(vbo, true); - - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)vbo_vertex_count, 0, GL_DYNAMIC_DRAW); - } + vbo.Recreate(gl_state, buffer_size_uv2 * vbo_vertex_count); gl_state.bind_vertex_array(vao[0]); gl_state.bind_array_buffer(vbo, true); @@ -322,17 +312,7 @@ namespace spr { while (ebo_index_count < index_buffer.size()) ebo_index_count *= 2; - if (DIVA_GL_VERSION_4_4) { - ebo.Destroy(); - ebo.Create(gl_state, sizeof(uint32_t) * ebo_index_count); - gl_state.bind_element_array_buffer(ebo, true); - } - else { - gl_state.bind_element_array_buffer(ebo, true); - - glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)(sizeof(uint32_t) - * ebo_index_count), 0, GL_DYNAMIC_DRAW); - } + ebo.Recreate(gl_state, sizeof(uint32_t) * ebo_index_count); gl_state.bind_vertex_array(vao[0]); gl_state.bind_element_array_buffer(ebo, true); @@ -346,6 +326,9 @@ namespace spr { } ebo.WriteMemory(gl_state, 0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); + + gl_state.bind_array_buffer(0); + gl_state.bind_element_array_buffer(0); } void SpriteManager::Draw(render_data_context& rend_data_ctx,