From 84d96acdd348ee3b1d4c8f2da0b52b18aa8d701f Mon Sep 17 00:00:00 2001 From: Warwick Date: Fri, 28 Nov 2025 20:17:34 +0000 Subject: [PATCH] Moved shader to arena system --- src/main.c | 9 ++++----- src/shader.c | 21 +++++++++++++++------ src/shader.h | 6 ++++-- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/main.c b/src/main.c index 432f16e..2853dd3 100644 --- a/src/main.c +++ b/src/main.c @@ -68,8 +68,8 @@ int main(int argc, char *argv[]) { .vertex_shader_source_path = "shaders/vert.glsl", .fragment_shader_source_path = "shaders/frag.glsl"}; - wn_shader shader = wn_shader_init(shader_code_location); - if (shader.success == false) { + wn_shader *shader = wn_shader_init(global_arena, shader_code_location); + if (shader->success == false) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize shader"); return EXIT_FAILURE; } @@ -144,7 +144,7 @@ int main(int argc, char *argv[]) { mat4 mvp; camera_calc_mvp(&mvp, &camera); int mvp_uniform_location = - glGetUniformLocation(shader.shaderProgram, "MVP"); + glGetUniformLocation(shader->shaderProgram, "MVP"); glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]); // render @@ -152,7 +152,7 @@ int main(int argc, char *argv[]) { glClear(GL_COLOR_BUFFER_BIT); // draw our first triangle - glUseProgram(shader.shaderProgram); + glUseProgram(shader->shaderProgram); glBindVertexArray( VAO); // seeing as we only have a single VAO there's no need to bind it // every time, but we'll do so to keep things a bit more organized @@ -167,7 +167,6 @@ int main(int argc, char *argv[]) { glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); - wn_shader_deinit(shader); arena_deinit(global_arena); return EXIT_SUCCESS; } diff --git a/src/shader.c b/src/shader.c index 38b42c3..752a0fc 100644 --- a/src/shader.c +++ b/src/shader.c @@ -1,10 +1,14 @@ #include "shader.h" #include "SDL3/SDL_iostream.h" #include "SDL3/SDL_log.h" +#include "arena_allocator.h" #include -wn_shader wn_shader_init(wn_shader_code_location shader_code_location) { - wn_shader shader = {.shaderProgram = 0, .success = false}; +wn_shader *wn_shader_init(Arena *arena, + wn_shader_code_location shader_code_location) { + + wn_shader *shader = arena_alloc(arena, sizeof(wn_shader)); + *shader = (wn_shader){.shaderProgram = 0, .success = false}; const char *vertexShaderSource = SDL_LoadFile(shader_code_location.vertex_shader_source_path, NULL); @@ -60,11 +64,16 @@ wn_shader wn_shader_init(wn_shader_code_location shader_code_location) { glDeleteShader(vertexShader); glDeleteShader(fragmentShader); - shader.shaderProgram = shaderProgram; - shader.success = true; + shader->shaderProgram = shaderProgram; + shader->success = true; + + arena_deinit_task_push(arena, (ArenaDeinitTask){.func_ptr = *wn_shader_deinit, + .func_param = shader, + .next = NULL}); return shader; } -void wn_shader_deinit(wn_shader shader) { - glDeleteProgram(shader.shaderProgram); +void wn_shader_deinit(void *shader) { + wn_shader *cast_shader = (wn_shader *)shader; + glDeleteProgram(cast_shader->shaderProgram); } diff --git a/src/shader.h b/src/shader.h index 648df84..318974c 100644 --- a/src/shader.h +++ b/src/shader.h @@ -1,5 +1,6 @@ #pragma once +#include "arena_allocator.h" #include typedef struct { @@ -13,6 +14,7 @@ struct wn_shader_s { }; typedef struct wn_shader_s wn_shader; -wn_shader wn_shader_init(wn_shader_code_location shader_code_location); +wn_shader *wn_shader_init(Arena *arena, + wn_shader_code_location shader_code_location); -void wn_shader_deinit(wn_shader shader); +void wn_shader_deinit(void* shader);