Files
korenkonder_AFTMods/src/DivaGL/GL/array_buffer.cpp
T

109 lines
3.0 KiB
C++

/*
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::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);
}
}
}