diff --git a/backends/gpu/opengl/includes/kore3/opengl/buffer_structs.h b/backends/gpu/opengl/includes/kore3/opengl/buffer_structs.h index 671f9cecf..da39a1cf1 100644 --- a/backends/gpu/opengl/includes/kore3/opengl/buffer_structs.h +++ b/backends/gpu/opengl/includes/kore3/opengl/buffer_structs.h @@ -10,7 +10,8 @@ extern "C" { struct kore_gpu_device; typedef struct kore_opengl_buffer { - int nothing; + uint32_t buffer; + uint32_t buffer_type; } kore_opengl_buffer; #ifdef __cplusplus diff --git a/backends/gpu/opengl/sources/buffer.c b/backends/gpu/opengl/sources/buffer.c index de2ef354c..f609f2409 100644 --- a/backends/gpu/opengl/sources/buffer.c +++ b/backends/gpu/opengl/sources/buffer.c @@ -4,14 +4,19 @@ void kore_opengl_buffer_set_name(kore_gpu_buffer *buffer, const char *name) {} -void kore_opengl_buffer_destroy(kore_gpu_buffer *buffer) {} +void kore_opengl_buffer_destroy(kore_gpu_buffer *buffer) { + glDeleteBuffers(1, &buffer->opengl.buffer); +} void *kore_opengl_buffer_try_to_lock_all(kore_gpu_buffer *buffer) { - return NULL; + return kore_opengl_buffer_lock_all(buffer); } void *kore_opengl_buffer_lock_all(kore_gpu_buffer *buffer) { - return NULL; + glBindBuffer(buffer->opengl.buffer_type, buffer->opengl.buffer); + void *data = glMapBuffer(buffer->opengl.buffer_type, GL_WRITE_ONLY); + glBindBuffer(buffer->opengl.buffer_type, buffer->opengl.buffer); + return data; } void *kore_opengl_buffer_try_to_lock(kore_gpu_buffer *buffer, uint64_t offset, uint64_t size) { @@ -19,7 +24,14 @@ void *kore_opengl_buffer_try_to_lock(kore_gpu_buffer *buffer, uint64_t offset, u } void *kore_opengl_buffer_lock(kore_gpu_buffer *buffer, uint64_t offset, uint64_t size) { - return NULL; + glBindBuffer(buffer->opengl.buffer_type, buffer->opengl.buffer); + void *data = glMapBufferRange(buffer->opengl.buffer_type, offset, size, GL_WRITE_ONLY); + glBindBuffer(buffer->opengl.buffer_type, 0); + return data; } -void kore_opengl_buffer_unlock(kore_gpu_buffer *buffer) {} +void kore_opengl_buffer_unlock(kore_gpu_buffer *buffer) { + glBindBuffer(buffer->opengl.buffer_type, buffer->opengl.buffer); + glUnmapBuffer(buffer->opengl.buffer_type); + glBindBuffer(buffer->opengl.buffer_type, 0); +} diff --git a/backends/gpu/opengl/sources/device.c b/backends/gpu/opengl/sources/device.c index 25b7df0ff..6f8cdab6f 100644 --- a/backends/gpu/opengl/sources/device.c +++ b/backends/gpu/opengl/sources/device.c @@ -88,7 +88,23 @@ void kore_opengl_device_destroy(kore_gpu_device *device) {} void kore_opengl_device_set_name(kore_gpu_device *device, const char *name) {} -void kore_opengl_device_create_buffer(kore_gpu_device *device, const kore_gpu_buffer_parameters *parameters, kore_gpu_buffer *buffer) {} +void kore_opengl_device_create_buffer(kore_gpu_device *device, const kore_gpu_buffer_parameters *parameters, kore_gpu_buffer *buffer) { + glGenBuffers(1, &buffer->opengl.buffer); + if ((parameters->usage_flags & KORE_GPU_BUFFER_USAGE_VERTEX) != 0) { + buffer->opengl.buffer_type = GL_ARRAY_BUFFER; + } + else if ((parameters->usage_flags & KORE_GPU_BUFFER_USAGE_INDEX) != 0) { + buffer->opengl.buffer_type = GL_ELEMENT_ARRAY_BUFFER; + } + else { + assert(false); + } + + glBindBuffer(buffer->opengl.buffer_type, buffer->opengl.buffer); + kore_opengl_check_errors(); + glBufferData(buffer->opengl.buffer_type, parameters->size, NULL, GL_DYNAMIC_DRAW); + glBindBuffer(buffer->opengl.buffer_type, 0); +} void kore_opengl_device_create_command_list(kore_gpu_device *device, kore_gpu_command_list_type type, kore_gpu_command_list *list) {}