From 916df68f067cc4ebf9c31f43d515c7c2d8464dfe Mon Sep 17 00:00:00 2001 From: Gregory Wells Date: Mon, 18 Aug 2025 21:13:40 -0400 Subject: [PATCH] OpenGL framebuffer API --- .../apis/opengl/loader/opengl_device_loader.c | 5 +-- .../src/framebuffer/opengl_framebuffer.c | 35 +++++++++++++++++++ .../src/framebuffer/opengl_framebuffer.h | 11 ++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 projects/apis/opengl/src/framebuffer/opengl_framebuffer.c create mode 100644 projects/apis/opengl/src/framebuffer/opengl_framebuffer.h diff --git a/projects/apis/opengl/loader/opengl_device_loader.c b/projects/apis/opengl/loader/opengl_device_loader.c index d3edbce..8828c8a 100644 --- a/projects/apis/opengl/loader/opengl_device_loader.c +++ b/projects/apis/opengl/loader/opengl_device_loader.c @@ -8,6 +8,7 @@ #include "commands/pool/opengl_command_pool.h" #include "buffer/opengl_buffer.h" #include "textures/opengl_texture.h" +#include "framebuffer/opengl_framebuffer.h" gnDeviceFunctions loadOpenGLDeviceFunctions() { return (gnDeviceFunctions){ @@ -24,8 +25,8 @@ gnDeviceFunctions loadOpenGLDeviceFunctions() { ._gnCreateGraphicsPipeline = NULL, ._gnDestroyGraphicsPipeline = NULL, - ._gnCreateFramebuffer = NULL, - ._gnDestroyFramebuffer = NULL, + ._gnCreateFramebuffer = openglCreateFramebuffer, + ._gnDestroyFramebuffer = openglDestroyFramebuffer, ._gnCreateCommandPool = openglCreateCommandPool, ._gnDestroyCommandPool = openglDestroyCommandPool, diff --git a/projects/apis/opengl/src/framebuffer/opengl_framebuffer.c b/projects/apis/opengl/src/framebuffer/opengl_framebuffer.c new file mode 100644 index 0000000..feac3b7 --- /dev/null +++ b/projects/apis/opengl/src/framebuffer/opengl_framebuffer.c @@ -0,0 +1,35 @@ +#include "opengl_framebuffer.h" +#include "stdlib.h" +#include "renderpass/opengl_render_pass_descriptor.h" +#include "textures/opengl_texture.h" +#include "stdio.h" +#include "core/src/output_device/gryphn_output_device.h" +#include "core/src/instance/gryphn_instance.h" + +gnReturnCode openglCreateFramebuffer(gnFramebuffer framebuffer, gnDevice device, gnFramebufferInfo info) { + framebuffer->framebuffer = malloc(sizeof(struct gnPlatformFramebuffer_t)); + framebuffer->framebuffer->framebufferCount = info.renderPassDescriptor->renderPassDescriptor->subpassCount; + framebuffer->framebuffer->framebuffers = malloc(sizeof(GLuint) * info.renderPassDescriptor->renderPassDescriptor->subpassCount); + for (int i = 0; i < info.renderPassDescriptor->renderPassDescriptor->subpassCount; i++) { + glCreateFramebuffers(1, &framebuffer->framebuffer->framebuffers[i]); + for (int c = 0; c < info.renderPassDescriptor->renderPassDescriptor->subpasses[i].colorAttachmentCount; c++) + glNamedFramebufferTexture(framebuffer->framebuffer->framebuffers[i], GL_COLOR_ATTACHMENT0 + c, info.attachments[info.renderPassDescriptor->renderPassDescriptor->subpasses[i].colorAttachments[c].attachmentIndex]->texture->id, 0); + if (info.renderPassDescriptor->renderPassDescriptor->subpasses[i].depthAttachment.index >= 0) + glNamedFramebufferTexture(framebuffer->framebuffer->framebuffers[i], GL_DEPTH_STENCIL_ATTACHMENT, info.attachments[info.renderPassDescriptor->renderPassDescriptor->subpasses[i].depthAttachment.index]->texture->id, 0); + if (glCheckNamedFramebufferStatus(framebuffer->framebuffer->framebuffers[i], GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + char string[500]; + snprintf(string, 500, "Failed to create OpenGL framebuffer: 0x%x\n", glCheckNamedFramebufferStatus(framebuffer->framebuffer->framebuffers[i], GL_FRAMEBUFFER)); + gnDebuggerSetErrorMessage(framebuffer->device->instance->debugger, (gnMessageData){ + .message = gnCreateString(string) + }); + return GN_FAILED_CREATE_OBJECT; + } + + } + return GN_SUCCESS; +} +void openglDestroyFramebuffer(gnFramebuffer framebuffer) { + for (int i = 0; i < framebuffer->framebuffer->framebufferCount; i++) + glDeleteFramebuffers(1, &framebuffer->framebuffer->framebuffers[i]); + free(framebuffer->framebuffer); +} diff --git a/projects/apis/opengl/src/framebuffer/opengl_framebuffer.h b/projects/apis/opengl/src/framebuffer/opengl_framebuffer.h new file mode 100644 index 0000000..5f8f4dc --- /dev/null +++ b/projects/apis/opengl/src/framebuffer/opengl_framebuffer.h @@ -0,0 +1,11 @@ +#pragma once +#include "glad/glad.h" +#include "core/src/framebuffer/gryphn_framebuffer.h" + +typedef struct gnPlatformFramebuffer_t { + uint32_t framebufferCount; + GLuint* framebuffers; +} gnPlatformFramebuffer_t; + +gnReturnCode openglCreateFramebuffer(gnFramebuffer framebuffer, gnDevice device, gnFramebufferInfo info); +void openglDestroyFramebuffer(gnFramebuffer framebuffer);