From 7b1866e63dc6dbce7280fa346ae11966c75d945e Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 1 Dec 2023 16:27:26 +0300 Subject: [PATCH] Added wrappers for VBO and EBO --- src/CRE/GL/array_buffer.hpp | 141 +++++++++++++++++++++ src/CRE/GL/element_array_buffer.hpp | 141 +++++++++++++++++++++ src/CRE/GL/shader_storage_buffer.hpp | 29 +++-- src/CRE/GL/uniform_buffer.hpp | 29 +++-- src/CRE/Glitter/glitter.hpp | 6 +- src/CRE/Glitter/render_group.cpp | 64 ++-------- src/CRE/Glitter/render_scene.cpp | 181 +++++---------------------- src/CRE/post_process.cpp | 41 ++---- src/CRE/post_process.hpp | 3 +- src/CRE/render_context.cpp | 70 +++-------- src/CRE/render_context.hpp | 6 +- src/CRE/sprite.cpp | 93 ++++---------- src/CRE/task_effect.cpp | 167 ++++++------------------ src/ReDIVA/render.cpp | 19 +-- 14 files changed, 464 insertions(+), 526 deletions(-) create mode 100644 src/CRE/GL/array_buffer.hpp create mode 100644 src/CRE/GL/element_array_buffer.hpp diff --git a/src/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp new file mode 100644 index 00000000..6cc72f42 --- /dev/null +++ b/src/CRE/GL/array_buffer.hpp @@ -0,0 +1,141 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once +#include +#include "../gl_state.hpp" + +namespace GL { + struct ArrayBuffer { + private: + GLuint buffer; + + public: + inline ArrayBuffer() : buffer() { + + } + + inline ~ArrayBuffer() { + + } + + inline void Bind(bool force = false) { + gl_state_bind_array_buffer(buffer, force); + } + + inline void Create(size_t size) { + if (buffer) + return; + + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + } + else { + glGenBuffers(1, &buffer); + gl_state_bind_array_buffer(buffer); + if (GLAD_GL_VERSION_4_4) + glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, + 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + else + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + } + + } + + inline void Create(size_t size, const void* data, bool dynamic = false) { + if (buffer) + return; + + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); + } + else { + glGenBuffers(1, &buffer); + gl_state_bind_array_buffer(buffer); + if (GLAD_GL_VERSION_4_4) + glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); + else + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + } + } + + inline void Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + inline bool IsNull() { + return !buffer; + } + + inline void* MapMemory() { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + gl_state_bind_array_buffer(buffer); + data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (!GLAD_GL_VERSION_4_5) + gl_state_bind_array_buffer(0); + return 0; + } + + inline bool NotNull() { + return !!buffer; + } + + inline void UnmapMemory() { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + gl_state_bind_array_buffer(0); + } + } + + inline void WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + gl_state_bind_array_buffer(buffer); + glBufferSubData(GL_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + template + inline void WriteMemory(T& data) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, 0, sizeof(T), &data); + else { + gl_state_bind_array_buffer(buffer); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(T), &data); + } + } + }; +} diff --git a/src/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp new file mode 100644 index 00000000..9751b8d3 --- /dev/null +++ b/src/CRE/GL/element_array_buffer.hpp @@ -0,0 +1,141 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once +#include +#include "../gl_state.hpp" + +namespace GL { + struct ElementArrayBuffer { + private: + GLuint buffer; + + public: + inline ElementArrayBuffer() : buffer() { + + } + + inline ~ElementArrayBuffer() { + + } + + inline void Bind(bool force = false) { + gl_state_bind_element_array_buffer(buffer, force); + } + + inline void Create(size_t size) { + if (buffer) + return; + + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + } + else { + glGenBuffers(1, &buffer); + gl_state_bind_element_array_buffer(buffer); + if (GLAD_GL_VERSION_4_4) + glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, + 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + else + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + } + + } + + inline void Create(size_t size, const void* data, bool dynamic = false) { + if (buffer) + return; + + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); + } + else { + glGenBuffers(1, &buffer); + gl_state_bind_element_array_buffer(buffer); + if (GLAD_GL_VERSION_4_4) + glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); + else + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + } + } + + inline void Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + inline bool IsNull() { + return !buffer; + } + + inline void* MapMemory() { + if (!buffer) + return 0; + + void* data; + if (GLAD_GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + gl_state_bind_element_array_buffer(buffer); + data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (!GLAD_GL_VERSION_4_5) + gl_state_bind_element_array_buffer(0); + return 0; + } + + inline bool NotNull() { + return !!buffer; + } + + inline void UnmapMemory() { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + gl_state_bind_element_array_buffer(0); + } + } + + inline void WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + gl_state_bind_element_array_buffer(buffer); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } + + template + inline void WriteMemory(T& data) { + if (!buffer) + return; + + if (GLAD_GL_VERSION_4_5) + glNamedBufferSubData(buffer, 0, sizeof(T), &data); + else { + gl_state_bind_element_array_buffer(buffer); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(T), &data); + } + } + }; +} diff --git a/src/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index 17d2dda3..a22482b4 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/GL/shader_storage_buffer.hpp @@ -21,13 +21,17 @@ namespace GL { } + inline void Bind(int32_t index, bool force = false) { + gl_state_bind_shader_storage_buffer_base(index, buffer, force); + } + inline void Create(size_t size) { if (buffer) return; if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); } else { glGenBuffers(1, &buffer); @@ -41,28 +45,27 @@ namespace GL { } - inline void Create(size_t size, const void* data) { + inline void Create(size_t size, const void* data, bool dynamic = false) { if (buffer) return; if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, data, 0); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); } else { glGenBuffers(1, &buffer); gl_state_bind_shader_storage_buffer(buffer); if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, 0); + glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); else - glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, GL_STATIC_DRAW); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); } } - inline void Bind(int32_t index) { - gl_state_bind_shader_storage_buffer_base(index, buffer); - } - inline void Destroy() { if (buffer) { glDeleteBuffers(1, &buffer); @@ -70,6 +73,10 @@ namespace GL { } } + inline bool IsNull() { + return !buffer; + } + inline void* MapMemory() { if (!buffer) return 0; @@ -90,6 +97,10 @@ namespace GL { return 0; } + inline bool NotNull() { + return !!buffer; + } + inline void UnmapMemory() { if (!buffer) return; diff --git a/src/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index e3a0f79d..e196dcd7 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/GL/uniform_buffer.hpp @@ -21,13 +21,17 @@ namespace GL { } + inline void Bind(int32_t index, bool force = false) { + gl_state_bind_uniform_buffer_base(index, buffer, force); + } + inline void Create(size_t size) { if (buffer) return; if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); } else { glGenBuffers(1, &buffer); @@ -41,28 +45,27 @@ namespace GL { } - inline void Create(size_t size, const void* data) { + inline void Create(size_t size, const void* data, bool dynamic = false) { if (buffer) return; if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, data, 0); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); } else { glGenBuffers(1, &buffer); gl_state_bind_uniform_buffer(buffer); if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, 0); + glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0); else - glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, GL_STATIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, + dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); } } - inline void Bind(int32_t index) { - gl_state_bind_uniform_buffer_base(index, buffer); - } - inline void Destroy() { if (buffer) { glDeleteBuffers(1, &buffer); @@ -70,6 +73,10 @@ namespace GL { } } + inline bool IsNull() { + return !buffer; + } + inline void* MapMemory() { if (!buffer) return 0; @@ -90,6 +97,10 @@ namespace GL { return 0; } + inline bool NotNull() { + return !!buffer; + } + inline void UnmapMemory() { if (!buffer) return; diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index ff21be91..7decf0f9 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -16,6 +16,8 @@ #include "../../KKdLib/mat.hpp" #include "../../KKdLib/txp.hpp" #include "../../KKdLib/vec.hpp" +#include "../GL/array_buffer.hpp" +#include "../GL/element_array_buffer.hpp" #include "../GL/uniform_buffer.hpp" #include "../color.hpp" #include "../file_handler.hpp" @@ -759,8 +761,8 @@ namespace Glitter { DispType disp_type; FogType fog_type; GLuint vao; - GLuint vbo; - GLuint ebo; + GL::ArrayBuffer vbo; + GL::ElementArrayBuffer ebo; float_t emission; prj::vector_pair draw_list; diff --git a/src/CRE/Glitter/render_group.cpp b/src/CRE/Glitter/render_group.cpp index 043f1708..9bc7fc50 100644 --- a/src/CRE/Glitter/render_group.cpp +++ b/src/CRE/Glitter/render_group.cpp @@ -82,17 +82,10 @@ namespace Glitter { glGenVertexArrays(1, &vao); gl_state_bind_vertex_array(vao, true); - glGenBuffers(1, &vbo); - gl_state_bind_array_buffer(vbo, true); - static const GLsizei buffer_size = sizeof(Buffer); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_DRAW); + vbo.Create(buffer_size * max_count); + vbo.Bind(); if (is_quad) { size_t count = max_count / 4 * 5; @@ -105,14 +98,8 @@ namespace Glitter { ebo_data[i + 4] = (uint16_t)0xFFFFFFFF; } - glGenBuffers(1, &ebo); - gl_state_bind_element_array_buffer(ebo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, 0); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, GL_STATIC_DRAW); + ebo.Create(sizeof(uint16_t) * count, ebo_data); + ebo.Bind(); free_def(ebo_data); } @@ -267,15 +254,8 @@ namespace Glitter { particle = 0; } - if (ebo) { - glDeleteBuffers(1, &ebo); - ebo = 0; - } - - if (vbo) { - glDeleteBuffers(1, &vbo); - vbo = 0; - } + ebo.Destroy(); + vbo.Destroy(); if (vao) { glDeleteVertexArrays(1, &vao); @@ -426,17 +406,10 @@ namespace Glitter { glGenVertexArrays(1, &vao); gl_state_bind_vertex_array(vao, true); - glGenBuffers(1, &vbo); - gl_state_bind_array_buffer(vbo, true); - static const GLsizei buffer_size = sizeof(Buffer); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * max_count), 0, GL_DYNAMIC_DRAW); + vbo.Create(buffer_size * max_count); + vbo.Bind(); if (is_quad) { size_t count = max_count / 4 * 5; @@ -449,14 +422,8 @@ namespace Glitter { ebo_data[i + 4] = (uint16_t)0xFFFFFFFF; } - glGenBuffers(1, &ebo); - gl_state_bind_element_array_buffer(ebo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, 0); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * count), ebo_data, GL_STATIC_DRAW); + ebo.Create(sizeof(uint16_t) * count, ebo_data); + ebo.Bind(); free_def(ebo_data); } @@ -630,15 +597,8 @@ namespace Glitter { particle = 0; } - if (ebo) { - glDeleteBuffers(1, &ebo); - ebo = 0; - } - - if (vbo) { - glDeleteBuffers(1, &vbo); - vbo = 0; - } + ebo.Destroy(); + vbo.Destroy(); if (vao) { glDeleteVertexArrays(1, &vao); diff --git a/src/CRE/Glitter/render_scene.cpp b/src/CRE/Glitter/render_scene.cpp index e1b37af5..d2fe09be 100644 --- a/src/CRE/Glitter/render_scene.cpp +++ b/src/CRE/Glitter/render_scene.cpp @@ -232,7 +232,7 @@ namespace Glitter { } void F2RenderScene::CalcDispLine(F2RenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; size_t count = 0; @@ -267,19 +267,9 @@ namespace Glitter { else rend_group->mat_draw = mat4_identity; - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } elem = rend_group->elements; size_t disp = 0; @@ -322,16 +312,11 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void F2RenderScene::CalcDispLocus(GPM, F2RenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; size_t count = 0; @@ -385,19 +370,9 @@ namespace Glitter { mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec); - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } elem = rend_group->elements; vec2 split_uv = rend_group->split_uv; @@ -481,16 +456,11 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void F2RenderScene::CalcDispQuad(GPM, F2RenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; mat4 model_mat; @@ -589,19 +559,9 @@ namespace Glitter { vec3 scale; mat4_get_scale(model_mat, &scale); - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } bool use_scale = rend_group->flags & PARTICLE_SCALE ? true : false; RenderElement* elem = rend_group->elements; @@ -683,12 +643,7 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void F2RenderScene::CalcDispQuadNormal(GPM, @@ -753,19 +708,9 @@ namespace Glitter { mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec); mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec); - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } RenderElement* elem = rend_group->elements; vec2 split_uv = rend_group->split_uv; @@ -919,12 +864,7 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void F2RenderScene::Ctrl(GLT, float_t delta_frame) { @@ -1256,7 +1196,7 @@ namespace Glitter { } void XRenderScene::CalcDispLine(XRenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; size_t count = 0; @@ -1290,19 +1230,9 @@ namespace Glitter { else rend_group->mat_draw = mat4_identity; - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } elem = rend_group->elements; size_t disp = 0; @@ -1344,17 +1274,11 @@ namespace Glitter { } } rend_group->disp = disp; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void XRenderScene::CalcDispLocus(GPM, XRenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; size_t count = 0; @@ -1406,19 +1330,9 @@ namespace Glitter { mat3_transform_vector(&GPM_VAL->cam.inv_view_mat3, &x_vec, &x_vec); - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } elem = rend_group->elements; vec2 split_uv = rend_group->split_uv; @@ -1502,12 +1416,7 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void XRenderScene::CalcDispMesh(GPM, XRenderGroup* rend_group) { @@ -1701,7 +1610,7 @@ namespace Glitter { } void XRenderScene::CalcDispQuad(GPM, XRenderGroup* rend_group) { - if (!rend_group->elements || !rend_group->vbo || rend_group->ctrl < 1) + if (!rend_group->elements || rend_group->vbo.IsNull() || rend_group->ctrl < 1) return; mat4 model_mat; @@ -1796,19 +1705,9 @@ namespace Glitter { y_vec_base.y *= scale.y; } - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } RenderElement* elem = rend_group->elements; vec2 split_uv = rend_group->split_uv; @@ -1888,12 +1787,7 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } void XRenderScene::CalcDispQuadNormal(XRenderGroup* rend_group, mat4* model_mat, mat4* dir_mat) { @@ -1955,19 +1849,9 @@ namespace Glitter { mat4_transform_vector(&inv_model_mat, &x_vec, &x_vec); mat4_transform_vector(&inv_model_mat, &y_vec, &y_vec); - Buffer* buf; - if (GLAD_GL_VERSION_4_5) - buf = (Buffer*)glMapNamedBuffer(rend_group->vbo, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(rend_group->vbo); - buf = (Buffer*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - } - - if (!buf) { - if (!GLAD_GL_VERSION_4_5) - gl_state_bind_array_buffer(0); + Buffer* buf = (Buffer*)rend_group->vbo.MapMemory(); + if (!buf) return; - } RenderElement* elem = rend_group->elements; vec2 split_uv = rend_group->split_uv; @@ -2115,12 +1999,7 @@ namespace Glitter { } rend_group->disp = disp; - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(rend_group->vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + rend_group->vbo.UnmapMemory(); } bool XRenderScene::CanDisp(DispType disp_type, bool a3) { diff --git a/src/CRE/post_process.cpp b/src/CRE/post_process.cpp index d05d86c3..3d2c8d46 100644 --- a/src/CRE/post_process.cpp +++ b/src/CRE/post_process.cpp @@ -83,13 +83,8 @@ screen_x_offset(), screen_y_offset(), screen_width(), screen_height(), mag_filte glGenVertexArrays(1, &lens_ghost_vao); gl_state_bind_vertex_array(lens_ghost_vao); - glGenBuffers(1, &lens_ghost_vbo); - gl_state_bind_array_buffer(lens_ghost_vbo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t) * 5 * (6 * 16), - 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, sizeof(float_t) * 5 * (6 * 16), 0, GL_DYNAMIC_DRAW); + lens_ghost_vbo.Create(sizeof(float_t) * 5 * (6 * 16)); + lens_ghost_vbo.Bind(); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float_t) * 5, (void*)0); @@ -166,10 +161,7 @@ post_process::~post_process() { lens_ghost_vao = 0; } - if (lens_ghost_vbo) { - glDeleteBuffers(1, &lens_ghost_vbo); - lens_ghost_vbo = 0; - } + lens_ghost_vbo.Destroy(); if (lens_shaft_query[0]) { glDeleteQueries(3, lens_shaft_query); @@ -618,23 +610,9 @@ void post_process::draw_lens_ghost(RenderTexture* rt) { const float_t angle_sin = sinf(angle); const float_t angle_cos = cosf(angle); - float_t* data; - if (GLAD_GL_VERSION_4_5) { - data = (float_t*)glMapNamedBuffer(lens_ghost_vbo, GL_WRITE_ONLY); - if (!data) { - glUnmapNamedBuffer(lens_ghost_vbo); - return; - } - } - else { - gl_state_bind_array_buffer(lens_ghost_vbo); - data = (float_t*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - if (!data) { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - return; - } - } + float_t* data = (float_t*)lens_ghost_vbo.MapMemory(); + if (!data) + return; const float_t lens_ghost = tone_map->lens_ghost; const int32_t lens_ghost_count = this->lens_ghost_count; @@ -650,12 +628,7 @@ void post_process::draw_lens_ghost(RenderTexture* rt) { make_ghost_quad((uint8_t)(i & 0x03), opacity, &mat, data); } - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(lens_ghost_vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + lens_ghost_vbo.UnmapMemory(); rt->Bind(); rt->SetViewport(); diff --git a/src/CRE/post_process.hpp b/src/CRE/post_process.hpp index 5e3e54ac..49d715a0 100644 --- a/src/CRE/post_process.hpp +++ b/src/CRE/post_process.hpp @@ -7,6 +7,7 @@ #include "../KKdLib/default.hpp" #include "../KKdLib/vec.hpp" +#include "GL/array_buffer.hpp" #include "GL/uniform_buffer.hpp" #include "post_process/blur.hpp" #include "post_process/dof.hpp" @@ -78,7 +79,7 @@ struct post_process { GLuint samplers[3]; GLuint query_vao; GLuint lens_ghost_vao; - GLuint lens_ghost_vbo; + GL::ArrayBuffer lens_ghost_vbo; RenderTexture mlaa_buffer; RenderTexture temp_buffer; GLuint mlaa_area_texture; diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index c93a6812..ea2edbaa 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -479,15 +479,8 @@ namespace mdl { for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) { glDeleteVertexArrays(1, &i.vertex_array); - if (i.vertex_buffer) { - glDeleteBuffers(1, &i.vertex_buffer); - i.vertex_buffer = 0; - } - - if (i.index_buffer) { - glDeleteBuffers(1, &i.index_buffer); - i.index_buffer = 0; - } + i.vertex_buffer.Destroy(); + i.index_buffer.Destroy(); } etc_vertex_array_cache.clear(); @@ -1799,7 +1792,7 @@ namespace mdl { DispManager::etc_vertex_array* etc_vertex_array = 0; for (DispManager::etc_vertex_array& i : etc_vertex_array_cache) { - if (i.alive_time <= 0 || i.type != type || !i.vertex_buffer) + if (i.alive_time <= 0 || i.type != type || i.vertex_buffer.IsNull()) continue; if (type == mdl::ETC_OBJ_TEAPOT @@ -1996,57 +1989,34 @@ namespace mdl { if (etc_vertex_array->max_vtx < vtx_data.size()) { etc_vertex_array->max_vtx = vtx_data.size(); - if (etc_vertex_array->vertex_buffer) { - glDeleteBuffers(1, &etc_vertex_array->vertex_buffer); - etc_vertex_array->vertex_buffer = 0; - } + etc_vertex_array->vertex_buffer.Destroy(); } if (etc_vertex_array->max_idx < vtx_indices.size()) { etc_vertex_array->max_idx = vtx_indices.size(); - if (etc_vertex_array->index_buffer) { - glDeleteBuffers(1, &etc_vertex_array->index_buffer); - etc_vertex_array->index_buffer = 0; - } + etc_vertex_array->index_buffer.Destroy(); } GLsizei size_vertex = sizeof(vec3) * 2; gl_state_bind_vertex_array(etc_vertex_array->vertex_array); - if (!etc_vertex_array->vertex_buffer) { - glGenBuffers(1, &etc_vertex_array->vertex_buffer); - gl_state_bind_array_buffer(etc_vertex_array->vertex_buffer); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t) - * vtx_data.size(), vtx_data.data(), GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, sizeof(float_t) - * vtx_data.size(), vtx_data.data(), GL_DYNAMIC_DRAW); - } - else { - gl_state_bind_array_buffer(etc_vertex_array->vertex_buffer); - glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float_t) - * vtx_data.size(), vtx_data.data()); - } + if (etc_vertex_array->vertex_buffer.IsNull()) + etc_vertex_array->vertex_buffer.Create(sizeof(float_t) * vtx_data.size()); - if (indexed) - if (!etc_vertex_array->index_buffer) { - glGenBuffers(1, &etc_vertex_array->index_buffer); - gl_state_bind_element_array_buffer(etc_vertex_array->index_buffer); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) - * vtx_indices.size(), vtx_indices.data(), GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) - * vtx_indices.size(), vtx_indices.data(), GL_DYNAMIC_DRAW); - } - else { - gl_state_bind_element_array_buffer(etc_vertex_array->index_buffer); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint32_t) - * vtx_indices.size(), vtx_indices.data()); - } + etc_vertex_array->vertex_buffer.Bind(); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float_t) + * vtx_data.size(), vtx_data.data()); + + if (indexed) { + if (etc_vertex_array->index_buffer.IsNull()) + etc_vertex_array->index_buffer.Create(sizeof(uint32_t) * vtx_indices.size()); + + etc_vertex_array->index_buffer.Bind(); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint32_t) + * vtx_indices.size(), vtx_indices.data()); + } glEnableVertexAttribArray(POSITION_INDEX); glVertexAttribPointer(POSITION_INDEX, @@ -3840,8 +3810,8 @@ render_context::~render_context() { contour_params_ubo.Destroy(); contour_coef_ubo.Destroy(); - glDeleteVertexArrays(1, &box_vao); glDeleteBuffers(1, &box_vbo); + glDeleteVertexArrays(1, &box_vao); if (camera) { delete camera; diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index 923cac52..415dbf3b 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -8,6 +8,8 @@ #include "../KKdLib/default.hpp" #include "../KKdLib/time.hpp" #include "../KKdLib/vec.hpp" +#include "GL/array_buffer.hpp" +#include "GL/element_array_buffer.hpp" #include "GL/uniform_buffer.hpp" #include "light_param/face.hpp" #include "light_param/fog.hpp" @@ -521,8 +523,8 @@ namespace mdl { }; struct etc_vertex_array { - GLuint vertex_buffer; - GLuint index_buffer; + GL::ArrayBuffer vertex_buffer; + GL::ElementArrayBuffer index_buffer; int32_t alive_time; GLuint vertex_array; EtcObj::Data data; diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index 521e36a5..e245dba1 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -7,6 +7,8 @@ #include "../KKdLib/prj/shared_ptr.hpp" #include "../KKdLib/prj/stack_allocator.hpp" #include "../KKdLib/txp.hpp" +#include "GL/array_buffer.hpp" +#include "GL/element_array_buffer.hpp" #include "data.hpp" #include "file_handler.hpp" #include "shader_ft.hpp" @@ -122,9 +124,9 @@ namespace spr { std::vector vertex_buffer; std::vector index_buffer; GLuint vao; - GLuint vbo; + GL::ArrayBuffer vbo; size_t vbo_vertex_count; - GLuint ebo; + GL::ElementArrayBuffer ebo; size_t ebo_index_count; RenderData(); @@ -590,23 +592,16 @@ void sprite_manager_free() { } namespace spr { - SpriteManager::RenderData::RenderData() { + SpriteManager::RenderData::RenderData() : vao() { glGenVertexArrays(1, &vao); gl_state_bind_vertex_array(vao, true); - glGenBuffers(1, &vbo); - gl_state_bind_array_buffer(vbo, true); - vbo_vertex_count = 4096; static const GLsizei buffer_size = sizeof(sprite_draw_vertex); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_DRAW); + vbo.Create(buffer_size * vbo_vertex_count); + vbo.Bind(); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, buffer_size, @@ -621,17 +616,10 @@ namespace spr { glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, buffer_size, (void*)offsetof(sprite_draw_vertex, uv[1])); - glGenBuffers(1, &ebo); - gl_state_bind_element_array_buffer(ebo, true); - ebo_index_count = 4096; - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_DRAW); + ebo.Create(sizeof(uint32_t) * ebo_index_count); + ebo.Bind(); gl_state_bind_array_buffer(0); gl_state_bind_vertex_array(0); @@ -639,15 +627,8 @@ namespace spr { } SpriteManager::RenderData::~RenderData() { - if (ebo) { - glDeleteBuffers(1, &ebo); - ebo = 0; - } - - if (vbo) { - glDeleteBuffers(1, &vbo); - vbo = 0; - } + ebo.Destroy(); + vbo.Destroy(); if (vao) { glDeleteVertexArrays(1, &vao); @@ -668,18 +649,13 @@ namespace spr { while (vbo_vertex_count < vertex_buffer.size()) vbo_vertex_count *= 2; - glDeleteBuffers(1, &vbo); - glGenBuffers(1, &vbo); + vbo.Destroy(); gl_state_bind_vertex_array(vao, true); - gl_state_bind_array_buffer(vbo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * vbo_vertex_count), 0, GL_DYNAMIC_DRAW); + vbo.Create(buffer_size * vbo_vertex_count); + vbo.Bind(); + glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size * vertex_buffer.size()), vertex_buffer.data()); @@ -699,51 +675,28 @@ namespace spr { gl_state_bind_array_buffer(0); gl_state_bind_vertex_array(0); } - else { - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(vbo, 0, (GLsizeiptr)(buffer_size - * vertex_buffer.size()), vertex_buffer.data()); - else { - gl_state_bind_array_buffer(vbo); - glBufferSubData(GL_ARRAY_BUFFER, 0, (GLsizeiptr)(buffer_size - * vertex_buffer.size()), vertex_buffer.data()); - gl_state_bind_array_buffer(0); - } - } + else + vbo.WriteMemory(0, buffer_size * vertex_buffer.size(), vertex_buffer.data()); if (ebo_index_count < index_buffer.size()) { while (ebo_index_count < index_buffer.size()) ebo_index_count *= 2; - glDeleteBuffers(1, &ebo); - glGenBuffers(1, &ebo); + ebo.Destroy(); gl_state_bind_vertex_array(vao, true); - gl_state_bind_element_array_buffer(ebo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_STORAGE_BIT); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_index_count), 0, GL_DYNAMIC_DRAW); + ebo.Create(sizeof(uint32_t) * ebo_index_count); + ebo.Bind(); + glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t) * index_buffer.size()), index_buffer.data()); gl_state_bind_vertex_array(0); gl_state_bind_element_array_buffer(0); } - else { - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(ebo, 0, (GLsizeiptr)(sizeof(uint32_t) - * index_buffer.size()), index_buffer.data()); - else { - gl_state_bind_array_buffer(ebo); - glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, (GLsizeiptr)(sizeof(uint32_t) - * index_buffer.size()), index_buffer.data()); - gl_state_bind_array_buffer(0); - } - } + else + ebo.WriteMemory(0, sizeof(uint32_t) * index_buffer.size(), index_buffer.data()); } SpriteManager::SpriteManager() : aspect(), index(), set_counter() { diff --git a/src/CRE/task_effect.cpp b/src/CRE/task_effect.cpp index bca86055..6dd90676 100644 --- a/src/CRE/task_effect.cpp +++ b/src/CRE/task_effect.cpp @@ -6,6 +6,7 @@ #include "task_effect.hpp" #include "../KKdLib/prj/algorithm.hpp" #include "../KKdLib/hash.hpp" +#include "GL/element_array_buffer.hpp" #include "auth_3d.hpp" #include "data.hpp" #include "gl_state.hpp" @@ -154,8 +155,8 @@ struct star_catalog_batch_shader_data { }; struct star_catalog_milky_way { - GLuint vbo; - GLuint ebo; + GL::ArrayBuffer vbo; + GL::ElementArrayBuffer ebo; GLuint vao; GLuint sampler; uint16_t restart_index; @@ -352,8 +353,8 @@ static int32_t leaf_particle_num_ptcls; static uint32_t leaf_particle_tex_id; static leaf_particle_data* leaf_ptcl_data; static GLuint leaf_ptcl_vao; -static GLuint leaf_ptcl_vbo; -static GLuint leaf_ptcl_ebo; +static GL::ArrayBuffer leaf_ptcl_vbo; +static GL::ElementArrayBuffer leaf_ptcl_ebo; static GL::UniformBuffer leaf_particle_scene_ubo; static const size_t leaf_ptcl_count = 0x800; @@ -371,7 +372,7 @@ static int32_t particle_count; static vec3 particle_wind; static particle_rot_data* ptcl_data; static GLuint ptcl_vao; -static GLuint ptcl_vbo; +static GL::ElementArrayBuffer ptcl_vbo; static GL::UniformBuffer particle_scene_ubo; static const size_t ptcl_count = 0x400; @@ -2848,31 +2849,13 @@ void particle_draw() { if (!ptcl_data) return; - particle_vertex_data* vtx_data; - if (GLAD_GL_VERSION_4_5) { - vtx_data = (particle_vertex_data*)glMapNamedBuffer(ptcl_vbo, GL_WRITE_ONLY); - if (!vtx_data) { - glUnmapNamedBuffer(ptcl_vbo); - return; - } - } - else { - gl_state_bind_array_buffer(ptcl_vbo); - vtx_data = (particle_vertex_data*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - if (!vtx_data) { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - return; - } - } + particle_vertex_data* vtx_data = (particle_vertex_data*)ptcl_vbo.MapMemory(); + if (!vtx_data) + return; int32_t count = particle_disp(vtx_data, ptcl_data, ptcl_count); - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(ptcl_vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + + ptcl_vbo.UnmapMemory(); if (!count) return; @@ -3324,8 +3307,8 @@ particle_data::particle_data() : size(), alpha(), life_time() { } -star_catalog_milky_way::star_catalog_milky_way() : vbo(), ebo(), vao(), sampler(), -restart_index(), idx_count(), longitude_degs_10(), latitude_degs_10(), longitude_offset_degs_10(), +star_catalog_milky_way::star_catalog_milky_way() : vao(), sampler(), restart_index(), +idx_count(), longitude_degs_10(), latitude_degs_10(), longitude_offset_degs_10(), latitude_offset_degs_10(), latitude(), longitude(), uv_rec_scale_u(), uv_rec_scale_v() { reset(); } @@ -3347,12 +3330,6 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal gl_state_bind_array_buffer(0); gl_state_bind_element_array_buffer(0); - if (!vao) - glGenVertexArrays(1, &vao); - - if (!vbo) - glGenBuffers(1, &vbo); - const float_t rec_longitude_degs_10 = 1.0f / (float_t)longitude_degs_10; const float_t rec_latitude_degs_10 = 1.0f / (float_t)latitude_degs_10; @@ -3385,13 +3362,11 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal vtx_data[vtx].texcoord.x = 1.0f; vtx_data[vtx].texcoord.y = (latitude_offset_degs_10 - (1.0f / uv_rec_scale_v) * 90.0f) * rec_latitude_degs_10; - gl_state_bind_array_buffer(vbo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(star_catalog_vertex) * vtx_count), vtx_data, 0); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(star_catalog_vertex) * vtx_count), vtx_data, GL_STATIC_DRAW); + if (!vao) + glGenVertexArrays(1, &vao); + + vbo.Create(sizeof(star_catalog_vertex) * vtx_count, vtx_data); + vbo.Bind(); free_def(vtx_data); static const GLsizei buffer_size = sizeof(star_catalog_vertex); @@ -3435,16 +3410,8 @@ void star_catalog_milky_way::create_buffers(int32_t subdivs, float_t uv_rec_scal ebo_data[idx + 3] = restart_index; } - if (!ebo) - glGenBuffers(1, &ebo); - - gl_state_bind_element_array_buffer(ebo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * ebo_count), ebo_data, 0); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint16_t) * ebo_count), ebo_data, GL_STATIC_DRAW); + ebo.Create(sizeof(uint16_t) * ebo_count, ebo_data); + ebo.Bind(); free_def(ebo_data); if (!sampler) @@ -3470,15 +3437,8 @@ void star_catalog_milky_way::delete_buffers() { sampler = 0; } - if (vbo) { - glDeleteBuffers(1, &vbo); - vbo = 0; - } - - if (ebo) { - glDeleteBuffers(1, &ebo); - ebo = 0; - } + vbo.Destroy(); + ebo.Destroy(); if (vao) { glDeleteVertexArrays(1, &vao); @@ -4178,20 +4138,10 @@ static void leaf_particle_init(bool change_stage) { if (!leaf_ptcl_vao) glGenVertexArrays(1, &leaf_ptcl_vao); - if (!leaf_ptcl_vbo) - glGenBuffers(1, &leaf_ptcl_vbo); - static const GLsizei buffer_size = sizeof(leaf_particle_vertex_data); - gl_state_bind_array_buffer(leaf_ptcl_vbo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * leaf_ptcl_vtx_count), - 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * leaf_ptcl_vtx_count), - 0, GL_DYNAMIC_DRAW); + leaf_ptcl_vbo.Create(buffer_size * leaf_ptcl_vtx_count); + leaf_ptcl_vbo.Bind(); gl_state_bind_vertex_array(leaf_ptcl_vao); glEnableVertexAttribArray(0); @@ -4215,16 +4165,8 @@ static void leaf_particle_init(bool change_stage) { ebo_data[i + 5] = (uint32_t)(j + 3); } - if (!leaf_ptcl_ebo) - glGenBuffers(1, &leaf_ptcl_ebo); - - gl_state_bind_element_array_buffer(leaf_ptcl_ebo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_count), ebo_data, 0); - else - glBufferData(GL_ELEMENT_ARRAY_BUFFER, - (GLsizeiptr)(sizeof(uint32_t) * ebo_count), ebo_data, GL_STATIC_DRAW); + leaf_ptcl_ebo.Create(sizeof(uint32_t) * ebo_count, ebo_data); + leaf_ptcl_ebo.Bind(); free_def(ebo_data); gl_state_bind_vertex_array(0); @@ -4319,23 +4261,9 @@ static int32_t leaf_particle_disp() { normal[2] = sub_1406427A0(vec3(-0.2f, -0.2f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; normal[3] = sub_1406427A0(vec3( 0.4f, -0.4f, 1.0f), vec3(0.0f, 1.0f, 0.0f)).first; - leaf_particle_vertex_data* vtx_data; - if (GLAD_GL_VERSION_4_5) { - vtx_data = (leaf_particle_vertex_data*)glMapNamedBuffer(leaf_ptcl_vbo, GL_WRITE_ONLY); - if (!vtx_data) { - glUnmapNamedBuffer(leaf_ptcl_vbo); - return 0; - } - } - else { - gl_state_bind_array_buffer(leaf_ptcl_vbo); - vtx_data = (leaf_particle_vertex_data*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); - if (!vtx_data) { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - return 0; - } - } + leaf_particle_vertex_data* vtx_data = (leaf_particle_vertex_data*)leaf_ptcl_vbo.MapMemory(); + if (!vtx_data) + return 0; int32_t vtx_count = 0; leaf_particle_data* data = leaf_ptcl_data; @@ -4411,12 +4339,7 @@ static int32_t leaf_particle_disp() { } } - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(leaf_ptcl_vbo); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } + leaf_ptcl_vbo.UnmapMemory(); return vtx_count; } @@ -4431,15 +4354,8 @@ static void leaf_particle_free() { leaf_ptcl_vao = 0; } - if (leaf_ptcl_vbo) { - glDeleteBuffers(1, &leaf_ptcl_vbo); - leaf_ptcl_vbo = 0; - } - - if (leaf_ptcl_ebo) { - glDeleteBuffers(1, &leaf_ptcl_ebo); - leaf_ptcl_ebo = 0; - } + leaf_ptcl_vbo.Destroy(); + leaf_ptcl_ebo.Destroy(); leaf_particle_scene_ubo.Destroy(); } @@ -4466,20 +4382,10 @@ static void particle_init(vec3* offset) { if (!ptcl_vao) glGenVertexArrays(1, &ptcl_vao); - if (!ptcl_vbo) - glGenBuffers(1, &ptcl_vbo); - static const GLsizei buffer_size = sizeof(particle_vertex_data); - gl_state_bind_array_buffer(ptcl_vbo, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * ptcl_vtx_count), - 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_ARRAY_BUFFER, - (GLsizeiptr)(buffer_size * ptcl_vtx_count), - 0, GL_DYNAMIC_DRAW); + ptcl_vbo.Create(buffer_size * ptcl_vtx_count); + ptcl_vbo.Bind(); gl_state_bind_vertex_array(ptcl_vao); glEnableVertexAttribArray(0); @@ -4694,10 +4600,7 @@ static void particle_free() { ptcl_vao = 0; } - if (ptcl_vbo) { - glDeleteBuffers(1, &ptcl_vbo); - ptcl_vbo = 0; - } + ptcl_vbo.Destroy(); particle_scene_ubo.Destroy(); } diff --git a/src/ReDIVA/render.cpp b/src/ReDIVA/render.cpp index d58a8557..32a8c8e0 100644 --- a/src/ReDIVA/render.cpp +++ b/src/ReDIVA/render.cpp @@ -101,7 +101,7 @@ struct common_data_struct { struct render_data { GLuint grid_vao; - GLuint grid_vbo; + GL::ArrayBuffer grid_vbo; render_data(); ~render_data(); @@ -355,7 +355,7 @@ void draw_pass_3d_grid(render_context* rctx) { float_t rob_frame = 0.0f; -render_data::render_data() : grid_vao(), grid_vbo() { +render_data::render_data() : grid_vao() { } @@ -433,14 +433,8 @@ void render_data::load_common_data() { glGenVertexArrays(1, &grid_vao); gl_state_bind_vertex_array(grid_vao); - glGenBuffers(1, &grid_vbo); - gl_state_bind_array_buffer(grid_vbo); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_ARRAY_BUFFER, sizeof(float_t) * 3 - * grid_vertex_count, grid_verts, 0); - else - glBufferData(GL_ARRAY_BUFFER, sizeof(float_t) * 3 - * grid_vertex_count, grid_verts, GL_STATIC_DRAW); + grid_vbo.Create(sizeof(float_t) * 3 * grid_vertex_count, grid_verts); + grid_vbo.Bind(); glVertexAttrib4f(0, 0.0f, 0.0f, 0.0f, 1.0f); glVertexAttribI1i(1, 2); @@ -459,10 +453,7 @@ void render_data::load_common_data() { } void render_data::unload_common_data() { - if (grid_vbo) { - glDeleteBuffers(1, &grid_vbo); - grid_vbo = 0; - } + grid_vbo.Destroy(); if (grid_vao) { glDeleteVertexArrays(1, &grid_vao);