From 5b43e3d5bea00c6703af844151db30066dabccf3 Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Tue, 12 Aug 2025 23:51:04 -0400 Subject: [PATCH] OpenGL buffers --- .../apis/opengl/loader/opengl_device_loader.c | 12 ++++--- .../apis/opengl/src/buffer/opengl_buffer.c | 33 +++++++++++++++++++ .../apis/opengl/src/buffer/opengl_buffer.h | 15 +++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 projects/apis/opengl/src/buffer/opengl_buffer.c create mode 100644 projects/apis/opengl/src/buffer/opengl_buffer.h diff --git a/projects/apis/opengl/loader/opengl_device_loader.c b/projects/apis/opengl/loader/opengl_device_loader.c index 2040df5..b05b767 100644 --- a/projects/apis/opengl/loader/opengl_device_loader.c +++ b/projects/apis/opengl/loader/opengl_device_loader.c @@ -5,6 +5,7 @@ #include "renderpass/opengl_render_pass_descriptor.h" #include "uniforms/pool/opengl_uniform_pool.h" #include "commands/pool/opengl_command_pool.h" +#include "buffer/opengl_buffer.h" gnDeviceFunctions loadOpenGLDeviceFunctions() { return (gnDeviceFunctions){ @@ -27,11 +28,12 @@ gnDeviceFunctions loadOpenGLDeviceFunctions() { ._gnCreateCommandPool = openglCreateCommandPool, ._gnDestroyCommandPool = openglDestroyCommandPool, - ._gnCreateBuffer = NULL, - ._gnBufferData = NULL, - ._gnBufferSubData = NULL, - ._gnMapBuffer = NULL, - ._gnDestroyBuffer = NULL, + ._gnCreateBuffer = openglCreateBuffer, + ._gnBufferData = openglBufferData, + ._gnBufferSubData = openglBufferSubData, + ._gnMapBuffer = openglMapBuffer, + ._gnUnmapBuffer = openglUnmapBuffer, + ._gnDestroyBuffer = openglDestroyBuffer, ._gnCreateUniformPool = openglCreateUniformPool, ._gnUniformPoolAllocateUniforms = openglAllocateUniforms, diff --git a/projects/apis/opengl/src/buffer/opengl_buffer.c b/projects/apis/opengl/src/buffer/opengl_buffer.c new file mode 100644 index 0000000..0f99108 --- /dev/null +++ b/projects/apis/opengl/src/buffer/opengl_buffer.c @@ -0,0 +1,33 @@ +#include "opengl_buffer.h" + +GLenum gnBufferTypeToGLEnum(gnBufferType type) { + switch (type) { + case GN_VERTEX_BUFFER: return GL_ARRAY_BUFFER; + case GN_INDEX_BUFFER: return GL_ELEMENT_ARRAY_BUFFER; + case GN_UNIFORM_BUFFER: return GL_UNIFORM_BUFFER; + case GN_STORAGE_BUFFER: return GL_SHADER_STORAGE_BUFFER; + } +} + +gnReturnCode openglCreateBuffer(gnBufferHandle buffer, gnDevice device, gnBufferInfo info) { + buffer->buffer = malloc(sizeof(gnPlatformBuffer)); + glCreateBuffers(1, &buffer->buffer->id); + buffer->buffer->type = gnBufferTypeToGLEnum(info.type); + buffer->buffer->usage = (info.usage == GN_DYNAMIC_DRAW) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; + return GN_SUCCESS; +} +void openglBufferData(gnBufferHandle buffer, size_t dataSize, void* data) { + glNamedBufferData(buffer->buffer->id, dataSize, data, buffer->buffer->usage); +} +void openglBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, gnBufferMemory data) { + glNamedBufferSubData(buffer->buffer->id, offset, dataSize, data); +} +void* openglMapBuffer(gnBufferHandle buffer) { + return glMapNamedBuffer(buffer->buffer->id, GL_READ_WRITE); +} +void openglUnmapBuffer(gnBufferHandle buffer) { + glUnmapNamedBuffer(buffer->buffer->id); +} +void openglDestroyBuffer(gnBufferHandle buffer) { + glDeleteBuffers(1, &buffer->buffer->id); +} diff --git a/projects/apis/opengl/src/buffer/opengl_buffer.h b/projects/apis/opengl/src/buffer/opengl_buffer.h new file mode 100644 index 0000000..878864f --- /dev/null +++ b/projects/apis/opengl/src/buffer/opengl_buffer.h @@ -0,0 +1,15 @@ +#pragma once +#include "core/src/buffers/gryphn_buffer.h" +#include "glad/glad.h" + +typedef struct gnPlatformBuffer_t { + GLuint id; + GLenum type, usage; +} gnPlatformBuffer; + +gnReturnCode openglCreateBuffer(gnBufferHandle buffer, gnDevice device, gnBufferInfo info); +void openglBufferData(gnBufferHandle buffer, size_t dataSize, void* data); +void openglBufferSubData(gnBufferHandle buffer, size_t offset, size_t dataSize, gnBufferMemory data); +void* openglMapBuffer(gnBufferHandle buffer); +void openglUnmapBuffer(gnBufferHandle buffer); +void openglDestroyBuffer(gnBufferHandle buffer);