From 5fabbbbcd4d66f936375e6302c7cc8fd938e1728 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 14 Nov 2025 01:13:36 +0300 Subject: [PATCH] GL: Reworked Buffer (re)creation --- src/CRE/GL/array_buffer.cpp | 96 ++++++++++++++++++---------- src/CRE/GL/array_buffer.hpp | 9 +-- src/CRE/GL/buffer.hpp | 33 ++++++++++ src/CRE/GL/element_array_buffer.cpp | 92 +++++++++++++++++--------- src/CRE/GL/element_array_buffer.hpp | 9 +-- src/CRE/GL/shader_storage_buffer.cpp | 92 +++++++++++++++++--------- src/CRE/GL/shader_storage_buffer.hpp | 9 +-- src/CRE/GL/uniform_buffer.cpp | 92 +++++++++++++++++--------- src/CRE/GL/uniform_buffer.hpp | 9 +-- src/CRE/effect.cpp | 16 ++--- src/CRE/object.cpp | 23 +++---- src/CRE/object.hpp | 5 +- src/CRE/rob/ex_block.cpp | 4 +- src/CRE/rob/rob.cpp | 2 +- 14 files changed, 325 insertions(+), 166 deletions(-) create mode 100644 src/CRE/GL/buffer.hpp diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp index b6fd3a3d..8aa57ebb 100644 --- a/src/CRE/GL/array_buffer.cpp +++ b/src/CRE/GL/array_buffer.cpp @@ -8,43 +8,66 @@ #include "../gl_state.hpp" namespace GL { - void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size) { - if (buffer) + void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage, false)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_array_buffer(buffer, true); + glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, flags); + } + return; + } + } + if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); - gl_st.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); + gl_st.bind_array_buffer(buffer, true); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } } - void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (buffer) + void ArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC + ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_array_buffer(buffer, true); + glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, flags); + } + 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); + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); - gl_st.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); + gl_st.bind_array_buffer(buffer, true); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } } @@ -103,32 +126,39 @@ namespace GL { return 0; } - void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) { - if (GLAD_GL_VERSION_4_4) { + void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size); + Create(gl_st, size, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, usage); - gl_st.bind_array_buffer(buffer, true); - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + else { + gl_st.bind_array_buffer(buffer); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + } } } - void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (GLAD_GL_VERSION_4_4) { + void ArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size, data, dynamic); + Create(gl_st, size, data, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, data, usage); - gl_st.bind_array_buffer(buffer, true); - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + else { + gl_st.bind_array_buffer(buffer); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + } } } diff --git a/src/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp index 8b53a9e0..afe50fd6 100644 --- a/src/CRE/GL/array_buffer.hpp +++ b/src/CRE/GL/array_buffer.hpp @@ -7,6 +7,7 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +#include "buffer.hpp" struct gl_state_struct; struct p_gl_rend_state; @@ -29,13 +30,13 @@ namespace GL { } - void Create(gl_state_struct& gl_st, size_t size); - void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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/buffer.hpp b/src/CRE/GL/buffer.hpp new file mode 100644 index 00000000..70302e8b --- /dev/null +++ b/src/CRE/GL/buffer.hpp @@ -0,0 +1,33 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../../KKdLib/default.hpp" +#include "../gl.hpp" + +namespace GL { + enum BufferUsage { + BUFFER_USAGE_STREAM = 0, + BUFFER_USAGE_STATIC, + BUFFER_USAGE_DYNAMIC, + }; + + inline GLenum BufferUsageToGLenum(const BufferUsage usage) { + if (usage == BUFFER_USAGE_STREAM) + return GL_STREAM_DRAW; + else if (usage == BUFFER_USAGE_STATIC) + return GL_STATIC_DRAW; + else if (usage == BUFFER_USAGE_DYNAMIC) + return GL_DYNAMIC_DRAW; + else + return GL_NONE; + } + + inline bool BufferUsageCheck(const BufferUsage usage, bool with_static = true) { + return usage == BUFFER_USAGE_STREAM || with_static && usage == BUFFER_USAGE_STATIC + || usage == BUFFER_USAGE_DYNAMIC; + } +} diff --git a/src/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp index e5c2a107..88a69975 100644 --- a/src/CRE/GL/element_array_buffer.cpp +++ b/src/CRE/GL/element_array_buffer.cpp @@ -8,43 +8,66 @@ #include "../gl_state.hpp" namespace GL { - void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size) { - if (buffer) + void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage, false)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_element_array_buffer(buffer, true); + glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, flags); + } + return; + } + } + if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_element_array_buffer(buffer, true); - 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); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } } - void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (buffer) + void ElementArrayBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC + ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_element_array_buffer(buffer, true); + glBufferStorage(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, flags); + } + 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); + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_element_array_buffer(buffer, true); - 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); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } } @@ -103,32 +126,39 @@ namespace GL { return 0; } - void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size) { - if (GLAD_GL_VERSION_4_4) { + void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size); + Create(gl_st, size, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, usage); - gl_st.bind_element_array_buffer(buffer, true); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + else { + gl_st.bind_element_array_buffer(buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + } } } - void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (GLAD_GL_VERSION_4_4) { + void ElementArrayBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size, data, dynamic); + Create(gl_st, size, data, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, data, usage); - gl_st.bind_element_array_buffer(buffer, true); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + else { + gl_st.bind_element_array_buffer(buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + } } } diff --git a/src/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp index 4624c4db..8f585468 100644 --- a/src/CRE/GL/element_array_buffer.hpp +++ b/src/CRE/GL/element_array_buffer.hpp @@ -7,6 +7,7 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +#include "buffer.hpp" struct gl_state_struct; struct p_gl_rend_state; @@ -29,13 +30,13 @@ namespace GL { } - void Create(gl_state_struct& gl_st, size_t size); - void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 d2c3891a..5ad016f8 100644 --- a/src/CRE/GL/shader_storage_buffer.cpp +++ b/src/CRE/GL/shader_storage_buffer.cpp @@ -8,43 +8,66 @@ #include "../gl_state.hpp" namespace GL { - void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size) { - if (buffer) + void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage, false)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_shader_storage_buffer(buffer, true); + glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, flags); + } + return; + } + } + if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_shader_storage_buffer(buffer, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, - 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } } - void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (buffer) + void ShaderStorageBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC + ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_shader_storage_buffer(buffer, true); + glBufferStorage(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, flags); + } + 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); + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_shader_storage_buffer(buffer, true); - if (GLAD_GL_VERSION_4_4) - 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, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } } @@ -103,32 +126,39 @@ namespace GL { return 0; } - void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size) { - if (GLAD_GL_VERSION_4_4) { + void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size); + Create(gl_st, size, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, usage); - gl_st.bind_shader_storage_buffer(buffer, true); - glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + else { + gl_st.bind_shader_storage_buffer(buffer); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + } } } - void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (GLAD_GL_VERSION_4_4) { + void ShaderStorageBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size, data, dynamic); + Create(gl_st, size, data, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, data, usage); - gl_st.bind_shader_storage_buffer(buffer, true); - glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + else { + gl_st.bind_shader_storage_buffer(buffer); + glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + } } } diff --git a/src/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index 7fae59b3..2180f627 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/GL/shader_storage_buffer.hpp @@ -7,6 +7,7 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +#include "buffer.hpp" struct gl_state_struct; struct p_gl_rend_state; @@ -29,13 +30,13 @@ namespace GL { } - void Create(gl_state_struct& gl_st, size_t size); - void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 57222a60..9567c7f2 100644 --- a/src/CRE/GL/uniform_buffer.cpp +++ b/src/CRE/GL/uniform_buffer.cpp @@ -8,43 +8,66 @@ #include "../gl_state.hpp" namespace GL { - void UniformBuffer::Create(gl_state_struct& gl_st, size_t size) { - if (buffer) + void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage, false)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_uniform_buffer(buffer, true); + glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, flags); + } + return; + } + } + if (GLAD_GL_VERSION_4_5) { glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_uniform_buffer(buffer, true); - if (GLAD_GL_VERSION_4_4) - glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, - 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - else - glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); } } - void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (buffer) + void UniformBuffer::Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (buffer || !BufferUsageCheck(usage)) return; + if (usage != BUFFER_USAGE_STREAM) { + if (GLAD_GL_VERSION_4_4) { + GLbitfield flags = usage == BUFFER_USAGE_DYNAMIC + ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; + if (GLAD_GL_VERSION_4_5) { + glCreateBuffers(1, &buffer); + glNamedBufferStorage(buffer, (GLsizeiptr)size, data, flags); + } + else { + glGenBuffers(1, &buffer); + gl_st.bind_uniform_buffer(buffer, true); + glBufferStorage(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, flags); + } + 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); + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } else { glGenBuffers(1, &buffer); gl_st.bind_uniform_buffer(buffer, true); - if (GLAD_GL_VERSION_4_4) - 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, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); } } @@ -103,32 +126,39 @@ namespace GL { return 0; } - void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size) { - if (GLAD_GL_VERSION_4_4) { + void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size); + Create(gl_st, size, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, usage); - gl_st.bind_uniform_buffer(buffer, true); - glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, GL_DYNAMIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, 0, BufferUsageToGLenum(usage)); + else { + gl_st.bind_uniform_buffer(buffer); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, 0, usage); + } } } - void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic) { - if (GLAD_GL_VERSION_4_4) { + void UniformBuffer::Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage) { + if (GLAD_GL_VERSION_4_4 && usage != BUFFER_USAGE_STREAM) { Destroy(); - Create(gl_st, size, data, dynamic); + Create(gl_st, size, data, usage); } else { if (!buffer) - Create(gl_st, size); + Create(gl_st, size, data, usage); - gl_st.bind_uniform_buffer(buffer, true); - glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + if (GLAD_GL_VERSION_4_5) + glNamedBufferData(buffer, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + else { + gl_st.bind_uniform_buffer(buffer); + glBufferData(GL_UNIFORM_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); + } } } diff --git a/src/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index 6c8a2b6a..7a54c93c 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/GL/uniform_buffer.hpp @@ -7,6 +7,7 @@ #include "../../KKdLib/default.hpp" #include "../gl.hpp" +#include "buffer.hpp" struct gl_state_struct; struct p_gl_rend_state; @@ -29,13 +30,13 @@ namespace GL { } - void Create(gl_state_struct& gl_st, size_t size); - void Create(gl_state_struct& gl_st, size_t size, const void* data, bool dynamic = false); + void Create(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Create(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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 Recreate(gl_state_struct& gl_st, size_t size, BufferUsage usage = BUFFER_USAGE_STREAM); + void Recreate(gl_state_struct& gl_st, size_t size, const void* data, BufferUsage usage = BUFFER_USAGE_STATIC); 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/effect.cpp b/src/CRE/effect.cpp index d4849939..b1f96bc0 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -43,9 +43,9 @@ struct EffectStorage { } void Create(gl_state_struct& gl_st, size_t size, size_t count, - const EffectStorageAttrib* attribs); + const EffectStorageAttrib* attribs, GL::BufferUsage usage = GL::BUFFER_USAGE_STREAM); void Create(gl_state_struct& gl_st, size_t size, size_t count, - const EffectStorageAttrib* attribs, const void* data, bool dynamic = false); + const EffectStorageAttrib* attribs, const void* data, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC); void Destroy(); inline void Bind(p_gl_rend_state& p_gl_rend_st, int32_t index) { @@ -1767,9 +1767,9 @@ bool effect_manager_unload() { } void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count, - const EffectStorageAttrib* attribs) { + const EffectStorageAttrib* attribs, GL::BufferUsage usage) { if (GLAD_GL_VERSION_4_3) { - ssbo.Create(gl_st, size * count); + ssbo.Create(gl_st, size * count, usage); return; } else if (vao || !attribs) @@ -1778,7 +1778,7 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count, glGenVertexArrays(1, &vao); gl_st.bind_vertex_array(vao, true); - vbo.Create(gl_st, size * count); + vbo.Create(gl_st, size * count, usage); gl_st.bind_array_buffer(vbo, true); const EffectStorageAttrib* attrib = attribs; @@ -1795,9 +1795,9 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count, } void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count, - const EffectStorageAttrib* attribs, const void* data, bool dynamic) { + const EffectStorageAttrib* attribs, const void* data, GL::BufferUsage usage) { if (GLAD_GL_VERSION_4_3) { - ssbo.Create(gl_st, size * count, data, dynamic); + ssbo.Create(gl_st, size * count, data, usage); return; } else if (vao || !attribs) @@ -1806,7 +1806,7 @@ void EffectStorage::Create(gl_state_struct& gl_st, size_t size, size_t count, glGenVertexArrays(1, &vao); gl_st.bind_vertex_array(vao, true); - vbo.Create(gl_st, size * count, data, true); + vbo.Create(gl_st, size * count, data, usage); gl_st.bind_array_buffer(vbo, true); const EffectStorageAttrib* attrib = attribs; diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index fbf30170..44b47068 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -29,7 +29,7 @@ struct BufObjMgr { }; static GLuint create_index_buffer(size_t size, const void* data); -static GLuint create_vertex_buffer(size_t size, const void* data, bool dynamic = false); +static GLuint create_vertex_buffer(size_t size, const void* data, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC); static void free_index_buffer(GLuint buffer); static void free_vertex_buffer(GLuint buffer); @@ -171,7 +171,7 @@ GLsizeiptr obj_mesh_vertex_buffer::get_size() { return 0; } -bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, bool dynamic) { +bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, GL::BufferUsage usage) { if (!mesh.num_vertex || !mesh.vertex_array) return false; @@ -194,12 +194,12 @@ bool obj_mesh_vertex_buffer::load(obj_mesh& mesh, bool dynamic) { mesh.size_vertex = size_vertex; bool ret = load_data((size_t)size_vertex * mesh.num_vertex, - vertex, mesh.attrib.m.double_buffer ? 2 : 1, dynamic); + vertex, mesh.attrib.m.double_buffer ? 2 : 1, usage); free_def(vertex); return ret; } -bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t count, bool dynamic) { +bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t count, GL::BufferUsage usage) { if (!size || count > 3) return false; @@ -210,7 +210,7 @@ bool obj_mesh_vertex_buffer::load_data(size_t size, const void* data, int32_t co #endif for (int32_t i = 0; i < count; i++) { - buffers[i] = create_vertex_buffer(size, data, dynamic); + buffers[i] = create_vertex_buffer(size, data, usage); if (!buffers[i]) { unload(); return false; @@ -2433,16 +2433,17 @@ static GLuint create_index_buffer(size_t size, const void* data) { return buffer; } -static GLuint create_vertex_buffer(size_t size, const void* data, bool dynamic) { +static GLuint create_vertex_buffer(size_t size, const void* data, GL::BufferUsage usage) { GLuint buffer = 0; 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); + if (GLAD_GL_VERSION_4_4 && usage != GL::BUFFER_USAGE_STREAM) { + GLbitfield flags = usage == GL::BUFFER_USAGE_DYNAMIC + ? GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT : 0; + glBufferStorage(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, flags); + } else - glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, - dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, data, BufferUsageToGLenum(usage)); gl_state.bind_array_buffer(0); if (glGetError()) { diff --git a/src/CRE/object.hpp b/src/CRE/object.hpp index a34e35af..fb03e727 100644 --- a/src/CRE/object.hpp +++ b/src/CRE/object.hpp @@ -13,6 +13,7 @@ #include "../KKdLib/obj.hpp" #include "../KKdLib/txp.hpp" #include "../KKdLib/vec.hpp" +#include "GL/buffer.hpp" #include "file_handler.hpp" #include "static_var.hpp" #include "texture.hpp" @@ -46,8 +47,8 @@ struct obj_mesh_vertex_buffer { GLuint get_buffer(); size_t get_offset(); GLsizeiptr get_size(); - bool load(obj_mesh& mesh, bool dynamic = false); - bool load_data(size_t size, const void* data, int32_t count, bool dynamic); + bool load(obj_mesh& mesh, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC); + bool load_data(size_t size, const void* data, int32_t count, GL::BufferUsage usage = GL::BUFFER_USAGE_STATIC); void unload(); static void* fill_data(void* data, obj_mesh& mesh); diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index c7560f9e..381137d5 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -1626,14 +1626,14 @@ void RobCloth::InitData(size_t root_count, size_t nodes_count, obj_skin_block_cl } this->index_buffer[0] = index_buffer[mesh_name_index]; - if (!vertex_buffer[0].load(mesh[0], true)) + if (!vertex_buffer[0].load(mesh[0], GL::BUFFER_USAGE_STREAM)) return; this->index_buffer[1] = {}; if (cls_data->backface_mesh_name && backface_mesh_name_index != -1) this->index_buffer[1] = index_buffer[backface_mesh_name_index]; - if (cls_data->backface_mesh_name && !vertex_buffer[1].load(mesh[1], true)) + if (cls_data->backface_mesh_name && !vertex_buffer[1].load(mesh[1], GL::BUFFER_USAGE_STREAM)) return; flags = (((flags ^ (0x04 * loop)) & 0x04) ^ flags) | 0x03; diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 90687a14..d561aabb 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -18838,7 +18838,7 @@ void rob_chara_age_age_object::load(object_info obj_info, int32_t count) { vtx_data->texcoord = vertex_array[k].texcoord0; } - obj_vert_buf.load_data(vertex_data_size, vertex_data, 2, true); + obj_vert_buf.load_data(vertex_data_size, vertex_data, 2, GL::BUFFER_USAGE_STREAM); this->num_index = num_index + 1; int32_t num_idx_data = (int32_t)(count * (num_index + 1));