From 942f3ea5a5332c2ecb3a2abd7cc7ed2780f3b73c Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 17 Jun 2025 15:55:56 +0300 Subject: [PATCH] Sprite Draw: Fixed buffer update --- src/CRE/GL/array_buffer.cpp | 23 ++++++++++++++++++++++ src/CRE/GL/array_buffer.hpp | 2 ++ src/CRE/GL/element_array_buffer.cpp | 23 ++++++++++++++++++++++ src/CRE/GL/element_array_buffer.hpp | 2 ++ src/CRE/GL/shader_storage_buffer.cpp | 23 ++++++++++++++++++++++ src/CRE/GL/shader_storage_buffer.hpp | 2 ++ src/CRE/GL/uniform_buffer.cpp | 23 ++++++++++++++++++++++ src/CRE/GL/uniform_buffer.hpp | 2 ++ src/CRE/sprite.cpp | 29 ++++++---------------------- 9 files changed, 106 insertions(+), 23 deletions(-) diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp index d43527bd..a8f2814d 100644 --- a/src/CRE/GL/array_buffer.cpp +++ b/src/CRE/GL/array_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (GLAD_GL_VERSION_4_5) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_array_buffer(buffer, true); + 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 (GLAD_GL_VERSION_4_5) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_array_buffer(buffer, true); + 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/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp index a3aa6dd0..8b53a9e0 100644 --- a/src/CRE/GL/array_buffer.hpp +++ b/src/CRE/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/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp index 843aa3df..14dced66 100644 --- a/src/CRE/GL/element_array_buffer.cpp +++ b/src/CRE/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 (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_element_array_buffer(buffer, true); + 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 (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_element_array_buffer(buffer, true); + 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/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp index dd76ad17..4624c4db 100644 --- a/src/CRE/GL/element_array_buffer.hpp +++ b/src/CRE/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/CRE/GL/shader_storage_buffer.cpp b/src/CRE/GL/shader_storage_buffer.cpp index baeffb7a..9e0f211a 100644 --- a/src/CRE/GL/shader_storage_buffer.cpp +++ b/src/CRE/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 (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_shader_storage_buffer(buffer, true); + 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 (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_shader_storage_buffer(buffer, true); + 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/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index 46f9685e..7fae59b3 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/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/CRE/GL/uniform_buffer.cpp b/src/CRE/GL/uniform_buffer.cpp index 40ea8dc3..4e836678 100644 --- a/src/CRE/GL/uniform_buffer.cpp +++ b/src/CRE/GL/uniform_buffer.cpp @@ -103,6 +103,29 @@ namespace GL { return 0; } + void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size) { + if (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size); + } + else { + gl_st.bind_uniform_buffer(buffer, true); + 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 (GLAD_GL_VERSION_4_4) { + Destroy(); + Create(gl_st, size, data, dynamic); + } + else { + gl_st.bind_uniform_buffer(buffer, true); + 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/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index 75c00624..6c8a2b6a 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/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/CRE/sprite.cpp b/src/CRE/sprite.cpp index 8c408d15..352730a6 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -727,20 +727,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 (GLAD_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); @@ -788,17 +778,7 @@ namespace spr { while (ebo_index_count < index_buffer.size()) ebo_index_count *= 2; - if (GLAD_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); @@ -812,6 +792,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); } SpriteManager::SpriteManager() : aspect(), index(), set_counter() {