diff options
Diffstat (limited to 'src/rendering.c')
| -rw-r--r-- | src/rendering.c | 110 |
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) { |
