From 3d5ff931b5b55d54a239b0e9c0839b3c096ffe9e Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 26 Jun 2024 09:05:32 +0300 Subject: [PATCH] Separated GL Buffer stuff --- src/CRE/GL/array_buffer.cpp | 132 ++++++++++++++++++++++++ src/CRE/GL/array_buffer.hpp | 144 +++------------------------ src/CRE/GL/element_array_buffer.cpp | 132 ++++++++++++++++++++++++ src/CRE/GL/element_array_buffer.hpp | 144 +++------------------------ src/CRE/GL/shader_storage_buffer.cpp | 132 ++++++++++++++++++++++++ src/CRE/GL/shader_storage_buffer.hpp | 144 +++------------------------ src/CRE/GL/uniform_buffer.cpp | 132 ++++++++++++++++++++++++ src/CRE/GL/uniform_buffer.hpp | 144 +++------------------------ src/CRE/render_context.hpp | 1 - 9 files changed, 580 insertions(+), 525 deletions(-) create mode 100644 src/CRE/GL/array_buffer.cpp create mode 100644 src/CRE/GL/element_array_buffer.cpp create mode 100644 src/CRE/GL/shader_storage_buffer.cpp create mode 100644 src/CRE/GL/uniform_buffer.cpp diff --git a/src/CRE/GL/array_buffer.cpp b/src/CRE/GL/array_buffer.cpp new file mode 100644 index 00000000..49f6d5cd --- /dev/null +++ b/src/CRE/GL/array_buffer.cpp @@ -0,0 +1,132 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "array_buffer.hpp" +#include "../gl_state.hpp" + +namespace GL { + void ArrayBuffer::Bind(bool force) { + gl_state_bind_array_buffer(buffer, force); + } + + void ArrayBuffer::Create(size_t size) { + if (buffer) + return; + + if (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, true); + if (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); + } + } + + void ArrayBuffer::Create(size_t size, const void* data, bool dynamic) { + if (buffer) + return; + + if (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, true); + if (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); + } + } + + void ArrayBuffer::Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + void* ArrayBuffer::MapMemory() { + if (!buffer) + return 0; + + void* data; + if (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 (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + gl_state_bind_array_buffer(0); + } + return 0; + } + + void* ArrayBuffer::MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_array_buffer(buffer); + data = glMapBufferRange(GL_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + gl_state_bind_array_buffer(0); + } + return 0; + } + + void ArrayBuffer::UnmapMemory() { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ARRAY_BUFFER); + gl_state_bind_array_buffer(0); + } + } + + void ArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (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); + } + } +} diff --git a/src/CRE/GL/array_buffer.hpp b/src/CRE/GL/array_buffer.hpp index fb775b51..55a71fae 100644 --- a/src/CRE/GL/array_buffer.hpp +++ b/src/CRE/GL/array_buffer.hpp @@ -5,8 +5,8 @@ #pragma once +#include "../../KKdLib/default.hpp" #include -#include "../gl_state.hpp" namespace GL { struct ArrayBuffer { @@ -26,148 +26,30 @@ namespace GL { } - 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, true); - 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, true); - 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; - } - } + void Bind(bool force = false); + void Create(size_t size); + void Create(size_t size, const void* data, bool dynamic = false); + void Destroy(); + void* MapMemory(); + void* MapMemory(size_t offset, size_t length); + void UnmapMemory(); + void WriteMemory(size_t offset, size_t size, const void* data); 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) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - gl_state_bind_array_buffer(0); - } - return 0; - } - - inline void* MapMemory(size_t offset, size_t length) { - if (!buffer) - return 0; - - void* data; - if (GL_VERSION_4_5) - data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - else { - gl_state_bind_array_buffer(buffer); - data = glMapBufferRange(GL_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ARRAY_BUFFER); - 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; + WriteMemory(0, sizeof(T), &data); + } - 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); - } + inline operator GLuint() const { + return buffer; } }; } diff --git a/src/CRE/GL/element_array_buffer.cpp b/src/CRE/GL/element_array_buffer.cpp new file mode 100644 index 00000000..0a8345c7 --- /dev/null +++ b/src/CRE/GL/element_array_buffer.cpp @@ -0,0 +1,132 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "element_array_buffer.hpp" +#include "../gl_state.hpp" + +namespace GL { + void ElementArrayBuffer::Bind(bool force) { + gl_state_bind_element_array_buffer(buffer, force); + } + + void ElementArrayBuffer::Create(size_t size) { + if (buffer) + return; + + if (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, true); + if (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); + } + } + + void ElementArrayBuffer::Create(size_t size, const void* data, bool dynamic) { + if (buffer) + return; + + if (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, true); + if (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); + } + } + + void ElementArrayBuffer::Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + void* ElementArrayBuffer::MapMemory() { + if (!buffer) + return 0; + + void* data; + if (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 (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + gl_state_bind_element_array_buffer(0); + } + return 0; + } + + void* ElementArrayBuffer::MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_element_array_buffer(buffer); + data = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + gl_state_bind_element_array_buffer(0); + } + return 0; + } + + void ElementArrayBuffer::UnmapMemory() { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); + gl_state_bind_element_array_buffer(0); + } + } + + void ElementArrayBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (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); + } + } +} diff --git a/src/CRE/GL/element_array_buffer.hpp b/src/CRE/GL/element_array_buffer.hpp index 279e7305..f0baf34e 100644 --- a/src/CRE/GL/element_array_buffer.hpp +++ b/src/CRE/GL/element_array_buffer.hpp @@ -5,8 +5,8 @@ #pragma once +#include "../../KKdLib/default.hpp" #include -#include "../gl_state.hpp" namespace GL { struct ElementArrayBuffer { @@ -22,148 +22,30 @@ namespace GL { } - 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, 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); - } - } - - 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, 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); - } - } - - inline void Destroy() { - if (buffer) { - glDeleteBuffers(1, &buffer); - buffer = 0; - } - } + void Bind(bool force = false); + void Create(size_t size); + void Create(size_t size, const void* data, bool dynamic = false); + void Destroy(); + void* MapMemory(); + void* MapMemory(size_t offset, size_t length); + void UnmapMemory(); + void WriteMemory(size_t offset, size_t size, const void* data); 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) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - gl_state_bind_element_array_buffer(0); - } - return 0; - } - - inline void* MapMemory(size_t offset, size_t length) { - if (!buffer) - return 0; - - void* data; - if (GL_VERSION_4_5) - data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - else { - gl_state_bind_element_array_buffer(buffer); - data = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); - 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; + WriteMemory(0, sizeof(T), &data); + } - 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); - } + inline operator GLuint() const { + return buffer; } }; } diff --git a/src/CRE/GL/shader_storage_buffer.cpp b/src/CRE/GL/shader_storage_buffer.cpp new file mode 100644 index 00000000..b15979da --- /dev/null +++ b/src/CRE/GL/shader_storage_buffer.cpp @@ -0,0 +1,132 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "shader_storage_buffer.hpp" +#include "../gl_state.hpp" + +namespace GL { + void ShaderStorageBuffer::Bind(int32_t index, bool force) { + gl_state_bind_shader_storage_buffer_base(index, buffer, force); + } + + void ShaderStorageBuffer::Create(size_t size) { + if (buffer) + return; + + if (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_shader_storage_buffer(buffer, true); + if (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); + } + } + + void ShaderStorageBuffer::Create(size_t size, const void* data, bool dynamic) { + if (buffer) + return; + + if (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_shader_storage_buffer(buffer, true); + if (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); + } + } + + void ShaderStorageBuffer::Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + void* ShaderStorageBuffer::MapMemory() { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + gl_state_bind_shader_storage_buffer(buffer); + data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + gl_state_bind_shader_storage_buffer(0); + } + return 0; + } + + void* ShaderStorageBuffer::MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_shader_storage_buffer(buffer); + data = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + gl_state_bind_shader_storage_buffer(0); + } + return 0; + } + + void ShaderStorageBuffer::UnmapMemory() { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + gl_state_bind_shader_storage_buffer(0); + } + } + + void ShaderStorageBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + gl_state_bind_shader_storage_buffer(buffer); + glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } +} diff --git a/src/CRE/GL/shader_storage_buffer.hpp b/src/CRE/GL/shader_storage_buffer.hpp index f2ad399d..09766916 100644 --- a/src/CRE/GL/shader_storage_buffer.hpp +++ b/src/CRE/GL/shader_storage_buffer.hpp @@ -5,8 +5,8 @@ #pragma once +#include "../../KKdLib/default.hpp" #include -#include "../gl_state.hpp" namespace GL { struct ShaderStorageBuffer { @@ -22,148 +22,30 @@ 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, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - } - else { - glGenBuffers(1, &buffer); - gl_state_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); - } - } - - 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_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); - } - } - - inline void Destroy() { - if (buffer) { - glDeleteBuffers(1, &buffer); - buffer = 0; - } - } + void Bind(int32_t index, bool force = false); + void Create(size_t size); + void Create(size_t size, const void* data, bool dynamic = false); + void Destroy(); + void* MapMemory(); + void* MapMemory(size_t offset, size_t length); + void UnmapMemory(); + void WriteMemory(size_t offset, size_t size, const void* data); 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_shader_storage_buffer(buffer); - data = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_state_bind_shader_storage_buffer(0); - } - return 0; - } - - inline void* MapMemory(size_t offset, size_t length) { - if (!buffer) - return 0; - - void* data; - if (GL_VERSION_4_5) - data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - else { - gl_state_bind_shader_storage_buffer(buffer); - data = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); - gl_state_bind_shader_storage_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_SHADER_STORAGE_BUFFER); - gl_state_bind_shader_storage_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_shader_storage_buffer(buffer); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - template inline void WriteMemory(T& data) { - if (!buffer) - return; + WriteMemory(0, sizeof(T), &data); + } - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, 0, sizeof(T), &data); - else { - gl_state_bind_shader_storage_buffer(buffer); - glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(T), &data); - } + inline operator GLuint() const { + return buffer; } }; } diff --git a/src/CRE/GL/uniform_buffer.cpp b/src/CRE/GL/uniform_buffer.cpp new file mode 100644 index 00000000..00c631d3 --- /dev/null +++ b/src/CRE/GL/uniform_buffer.cpp @@ -0,0 +1,132 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "uniform_buffer.hpp" +#include "../gl_state.hpp" + +namespace GL { + void UniformBuffer::Bind(int32_t index, bool force) { + gl_state_bind_uniform_buffer_base(index, buffer, force); + } + + void UniformBuffer::Create(size_t size) { + if (buffer) + return; + + if (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_uniform_buffer(buffer, true); + if (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); + } + } + + void UniformBuffer::Create(size_t size, const void* data, bool dynamic) { + if (buffer) + return; + + if (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_uniform_buffer(buffer, true); + if (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); + } + } + + void UniformBuffer::Destroy() { + if (buffer) { + glDeleteBuffers(1, &buffer); + buffer = 0; + } + } + + void* UniformBuffer::MapMemory() { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBuffer(buffer, GL_WRITE_ONLY); + else { + gl_state_bind_uniform_buffer(buffer); + data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + gl_state_bind_uniform_buffer(0); + } + return 0; + } + + void* UniformBuffer::MapMemory(size_t offset, size_t length) { + if (!buffer) + return 0; + + void* data; + if (GL_VERSION_4_5) + data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + else { + gl_state_bind_uniform_buffer(buffer); + data = glMapBufferRange(GL_UNIFORM_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); + } + + if (data) + return data; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + gl_state_bind_uniform_buffer(0); + } + return 0; + } + + void UniformBuffer::UnmapMemory() { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glUnmapNamedBuffer(buffer); + else { + glUnmapBuffer(GL_UNIFORM_BUFFER); + gl_state_bind_uniform_buffer(0); + } + } + + void UniformBuffer::WriteMemory(size_t offset, size_t size, const void* data) { + if (!buffer) + return; + + if (GL_VERSION_4_5) + glNamedBufferSubData(buffer, (GLsizeiptr)offset, (GLsizeiptr)size, data); + else { + gl_state_bind_uniform_buffer(buffer); + glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); + } + } +}; diff --git a/src/CRE/GL/uniform_buffer.hpp b/src/CRE/GL/uniform_buffer.hpp index c3794e38..94b2ea14 100644 --- a/src/CRE/GL/uniform_buffer.hpp +++ b/src/CRE/GL/uniform_buffer.hpp @@ -5,8 +5,8 @@ #pragma once +#include "../../KKdLib/default.hpp" #include -#include "../gl_state.hpp" namespace GL { struct UniformBuffer { @@ -22,148 +22,30 @@ 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, (GLsizeiptr)size, 0, GL_DYNAMIC_STORAGE_BIT | GL_MAP_WRITE_BIT); - } - else { - glGenBuffers(1, &buffer); - gl_state_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); - } - } - - 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_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); - } - } - - inline void Destroy() { - if (buffer) { - glDeleteBuffers(1, &buffer); - buffer = 0; - } - } + void Bind(int32_t index, bool force = false); + void Create(size_t size); + void Create(size_t size, const void* data, bool dynamic = false); + void Destroy(); + void* MapMemory(); + void* MapMemory(size_t offset, size_t length); + void UnmapMemory(); + void WriteMemory(size_t offset, size_t size, const void* data); 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_uniform_buffer(buffer); - data = glMapBuffer(GL_UNIFORM_BUFFER, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GLAD_GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_state_bind_uniform_buffer(0); - } - return 0; - } - - inline void* MapMemory(size_t offset, size_t length) { - if (!buffer) - return 0; - - void* data; - if (GL_VERSION_4_5) - data = glMapNamedBufferRange(buffer, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - else { - gl_state_bind_uniform_buffer(buffer); - data = glMapBufferRange(GL_UNIFORM_BUFFER, (GLintptr)offset, (GLsizeiptr)length, GL_WRITE_ONLY); - } - - if (data) - return data; - - if (GL_VERSION_4_5) - glUnmapNamedBuffer(buffer); - else { - glUnmapBuffer(GL_UNIFORM_BUFFER); - gl_state_bind_uniform_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_UNIFORM_BUFFER); - gl_state_bind_uniform_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_uniform_buffer(buffer); - glBufferSubData(GL_UNIFORM_BUFFER, (GLsizeiptr)offset, (GLsizeiptr)size, data); - } - } - template inline void WriteMemory(T& data) { - if (!buffer) - return; + WriteMemory(0, sizeof(T), &data); + } - if (GLAD_GL_VERSION_4_5) - glNamedBufferSubData(buffer, 0, sizeof(T), &data); - else { - gl_state_bind_uniform_buffer(buffer); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(T), &data); - } + inline operator GLuint() const { + return buffer; } }; } diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index bb77add1..d16fec24 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -9,7 +9,6 @@ #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"