Moved shader to arena system

This commit is contained in:
Warwick 2025-11-28 20:17:34 +00:00
parent 8fe8fbb493
commit 84d96acdd3
3 changed files with 23 additions and 13 deletions

View file

@ -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;
}

View file

@ -1,10 +1,14 @@
#include "shader.h"
#include "SDL3/SDL_iostream.h"
#include "SDL3/SDL_log.h"
#include "arena_allocator.h"
#include <GLES2/gl2.h>
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);
}

View file

@ -1,5 +1,6 @@
#pragma once
#include "arena_allocator.h"
#include <stdbool.h>
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);