Separated GL Buffer stuff

This commit is contained in:
korenkonder
2024-06-26 09:05:32 +03:00
parent 09b3f0dc94
commit 3d5ff931b5
9 changed files with 580 additions and 525 deletions
+132
View File
@@ -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);
}
}
}