109 lines
3.0 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|