summaryrefslogtreecommitdiff
path: root/src/rendering.c
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-12-03 21:21:54 +0000
committeronelin <oscar@nelin.dk>2025-12-18 21:14:18 +0000
commiteb06c9d49fddd6ffd5725bf8a33c2eab8cfd94c7 (patch)
tree3889668b09aecf35473ccfb18409f3072f1beb5f /src/rendering.c
parent841c0da02c6d042578f45ed46f443852f8aa3148 (diff)
Add support for depth & stencil buffers
Diffstat (limited to 'src/rendering.c')
-rw-r--r--src/rendering.c110
1 files changed, 89 insertions, 21 deletions
diff --git a/src/rendering.c b/src/rendering.c
index 88b1b9c..3faf91c 100644
--- a/src/rendering.c
+++ b/src/rendering.c
@@ -719,28 +719,35 @@ void r_destroy_framebuffers(void* restrict ctx, u32* restrict framebuffer_array,
gl->DeleteFramebuffers(num_targets, framebuffer_array);
}
+static u32 gl_texture_format(u32 texture_format) {
+ switch (texture_format) {
+ case BUFFERPARAMETER_FMT_RGBA8: return GL_RGBA8;
+ case BUFFERPARAMETER_FMT_SRGB8: return GL_SRGB;
+ case BUFFERPARAMETER_FMT_SRGBA8: return GL_SRGB8_ALPHA8;
+
+ case BUFFERPARAMETER_FMT_DEPTH24_STENCIL8: return GL_DEPTH24_STENCIL8;
+ case BUFFERPARAMETER_FMT_DEPTH16: return GL_DEPTH_COMPONENT16;
+ case BUFFERPARAMETER_FMT_DEPTH24: return GL_DEPTH_COMPONENT24;
+ case BUFFERPARAMETER_FMT_DEPTH32: return GL_DEPTH_COMPONENT32;
+ case BUFFERPARAMETER_FMT_DEPTH32F: return GL_DEPTH_COMPONENT32F;
+ case BUFFERPARAMETER_FMT_STENCIL8: return GL_STENCIL_INDEX8;
+
+ default:
+ ERROR("Failed to convert format to GL internal format!");
+ exit(EXIT_FAILURE);
+ }
+}
+
void r_create_textures(void* restrict ctx, u32* restrict texture_array,
u32* restrict texture_parameters,
ivec3* restrict texture_size, usize num_targets) {
const GladGLContext* gl = (GladGLContext*)ctx;
u32 texture_dim = BUFFERPARAMETER_TEXTURE_GET_DIMENSION(texture_parameters[0]);
- u32 texture_format = BUFFERPARAMETER_TEXTURE_GET_FORMAT(texture_parameters[0]);
- u32 gl_texture_format;
u32 err;
for (usize i = 1; i < num_targets; i++) {
ASSERT(texture_dim == BUFFERPARAMETER_TEXTURE_GET_DIMENSION(texture_parameters[i]));
- ASSERT(texture_format == BUFFERPARAMETER_TEXTURE_GET_FORMAT(texture_parameters[i]));
- }
-
- switch (texture_format) {
- case BUFFERPARAMETER_TEXTURE_FMT_RGBA8: gl_texture_format = GL_RGBA8; break;
- case BUFFERPARAMETER_TEXTURE_FMT_SRGB8: gl_texture_format = GL_SRGB; break;
- case BUFFERPARAMETER_TEXTURE_FMT_SRGBA8: gl_texture_format = GL_SRGB8_ALPHA8; break;
- default:
- ERROR("Failed to convert format to GL internal format!");
- exit(EXIT_FAILURE);
}
// Convert the texturetype to GL texturetype
@@ -749,7 +756,7 @@ void r_create_textures(void* restrict ctx, u32* restrict texture_array,
gl->CreateTextures(GL_TEXTURE_1D, num_targets, texture_array);
ASSERT(!gl->GetError());
for (usize i = 0; i < num_targets; i++) {
- gl->TextureStorage1D(texture_array[i], 1, gl_texture_format, (*texture_size)[0]);
+ gl->TextureStorage1D(texture_array[i], 1, gl_texture_format(BUFFERPARAMETER_TEXTURE_GET_FORMAT(texture_parameters[i])), (*texture_size)[0]);
}
break;
@@ -757,7 +764,7 @@ void r_create_textures(void* restrict ctx, u32* restrict texture_array,
gl->CreateTextures(GL_TEXTURE_2D, num_targets, texture_array);
ASSERT(!gl->GetError());
for (usize i = 0; i < num_targets; i++) {
- gl->TextureStorage2D(texture_array[i], 1, gl_texture_format, (*texture_size)[0], (*texture_size)[1]);
+ gl->TextureStorage2D(texture_array[i], 1, gl_texture_format(BUFFERPARAMETER_TEXTURE_GET_FORMAT(texture_parameters[i])), (*texture_size)[0], (*texture_size)[1]);
}
break;
@@ -765,7 +772,7 @@ void r_create_textures(void* restrict ctx, u32* restrict texture_array,
gl->CreateTextures(GL_TEXTURE_3D, num_targets, texture_array);
ASSERT(!gl->GetError());
for (usize i = 0; i < num_targets; i++) {
- gl->TextureStorage3D(texture_array[i], 1, gl_texture_format, (*texture_size)[0], (*texture_size)[1], (*texture_size)[2]);
+ gl->TextureStorage3D(texture_array[i], 1, gl_texture_format(BUFFERPARAMETER_TEXTURE_GET_FORMAT(texture_parameters[i])), (*texture_size)[0], (*texture_size)[1], (*texture_size)[2]);
}
break;
@@ -814,18 +821,79 @@ void r_destroy_textures(void *restrict ctx, u32* textures, usize num_textures) {
gl->DeleteTextures(num_textures, textures);
}
+// I know there's a "size too many", but it is included for easier
+// interopability with r_create_textures
+void r_create_renderbuffers(void *restrict ctx, u32* restrict buffer_array, u32* restrict buffer_types, ivec3* restrict buffer_sizes, usize num_buffers) {
+ GladGLContext *restrict gl = (GladGLContext*)ctx;
+
+ gl->CreateRenderbuffers(num_buffers, buffer_array);
+ for (usize i = 0; i < num_buffers; i++) {
+ gl->NamedRenderbufferStorage(
+ buffer_array[i],
+ gl_texture_format(BUFFERPARAMETER_RENDERBUFFER_GET_FORMAT(buffer_types[i])),
+ buffer_sizes[i][0],
+ buffer_sizes[i][1]
+ );
+ }
+
+}
+
+void r_destroy_renderbuffers(void *restrict ctx, u32* buffers, usize num_buffers) {
+ ((GladGLContext *restrict)ctx)->DeleteRenderbuffers(num_buffers, buffers);
+}
+
+static u32 gl_renderbuffer_type(u32 buffer_param) {
+ switch (BUFFERPARAMETER_RENDERBUFFER_GET_TYPE(buffer_param)) {
+ case BUFFERPARAMETER_RENDERBUFFER_DEPTH:
+ return GL_DEPTH_ATTACHMENT;
+ case BUFFERPARAMETER_RENDERBUFFER_STENCIL:
+ return GL_STENCIL_ATTACHMENT;
+ case (BUFFERPARAMETER_RENDERBUFFER_DEPTH | BUFFERPARAMETER_RENDERBUFFER_STENCIL):
+ return GL_DEPTH_STENCIL_ATTACHMENT;
+ default:
+ UNIMPLEMENTED;
+ }
+ return -1;
+}
+
void r_attach_buffers(void *restrict ctx, u32 fbo, u32* buffers, u32* buffer_parameters, i32 num_buffers) {
const GladGLContext *restrict gl = (GladGLContext*)ctx;
+ DEBUG("Attaching to FBO %d\n", fbo);
+
u32 err;
for (i32 i = 0; i < num_buffers; i++) {
- BufferType t = BUFFERPARAMETER_GET_TYPE(buffer_parameters[i]);
-
- if (t != BufferType_texture) UNIMPLEMENTED;
-
- // TODO: FINISH ME
- gl->NamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0 + i, buffers[i], 0);
+ switch (BUFFERPARAMETER_GET_TYPE(buffer_parameters[i])) {
+ case BufferType_frame:
+ UNIMPLEMENTED;
+ case BufferType_texture:
+ switch (BUFFERPARAMETER_TEXTURE_GET_FORMAT(buffer_parameters[i])) {
+ case BUFFERPARAMETER_FMT_DEPTH24_STENCIL8:
+ gl->NamedFramebufferTexture(fbo, GL_DEPTH_STENCIL_ATTACHMENT, buffers[i], 0);
+ break;
+ case BUFFERPARAMETER_FMT_DEPTH16:
+ case BUFFERPARAMETER_FMT_DEPTH24:
+ case BUFFERPARAMETER_FMT_DEPTH32:
+ case BUFFERPARAMETER_FMT_DEPTH32F:
+ gl->NamedFramebufferTexture(fbo, GL_DEPTH_ATTACHMENT, buffers[i], 0);
+ break;
+ case BUFFERPARAMETER_FMT_STENCIL8:
+ gl->NamedFramebufferTexture(fbo, GL_STENCIL_ATTACHMENT, buffers[i], 0);
+ break;
+ default:
+ gl->NamedFramebufferTexture(fbo, GL_COLOR_ATTACHMENT0 + i, buffers[i], 0);
+ break;
+ }
+ break;
+ case BufferType_render:
+ gl->NamedFramebufferRenderbuffer(fbo, gl_renderbuffer_type(buffer_parameters[i]), GL_RENDERBUFFER, buffers[i]);
+ break;
+ case BufferType_buffer:
+ UNIMPLEMENTED;
+ default:
+ UNIMPLEMENTED;
+ }
err = gl->GetError();
if (err) {