From bd57f345ed9dbed1d81683e48199626de2ea9044 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Fri, 27 Jun 2025 10:18:39 -0700 Subject: Restructure project --- src/util/shader.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 src/util/shader.c (limited to 'src/util/shader.c') diff --git a/src/util/shader.c b/src/util/shader.c new file mode 100644 index 0000000..f5c22cc --- /dev/null +++ b/src/util/shader.c @@ -0,0 +1,136 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static ShaderProgram* make_shader_program( + GfxCore* gfxcore, const char* vert_source, const char* frag_source, + const ShaderCompilerDefine* defines, size_t num_defines) { + assert(gfxcore); + assert(vert_source); + assert(frag_source); + + Shader* vert = 0; + Shader* frag = 0; + + ShaderDesc vertex_shader_desc = { + .code = vert_source, .type = VertexShader, .num_defines = num_defines}; + ShaderDesc fragment_shader_desc = { + .code = frag_source, .type = FragmentShader, .num_defines = num_defines}; + if (num_defines > 0) { + memcpy( + vertex_shader_desc.defines, defines, + num_defines * sizeof(ShaderCompilerDefine)); + memcpy( + fragment_shader_desc.defines, defines, + num_defines * sizeof(ShaderCompilerDefine)); + } + vert = gfx_make_shader(gfxcore, &vertex_shader_desc); + if (!vert) { + goto cleanup; + } + frag = gfx_make_shader(gfxcore, &fragment_shader_desc); + if (!frag) { + goto cleanup; + } + + ShaderProgramDesc shader_program_desc = { + .vertex_shader = vert, .fragment_shader = frag}; + ShaderProgram* prog = gfx_make_shader_program(gfxcore, &shader_program_desc); + if (!prog) { + goto cleanup; + } + return prog; + +cleanup: + if (vert) { + gfx_destroy_shader(gfxcore, &vert); + } + if (frag) { + gfx_destroy_shader(gfxcore, &frag); + } + return 0; +} + +ShaderProgram* gfx_make_brdf_integration_map_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, quad_vert, brdf_integration_map_frag, 0, 0); +} + +ShaderProgram* gfx_make_cook_torrance_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, cook_torrance_vert, cook_torrance_frag, 0, 0); +} + +ShaderProgram* gfx_make_cook_torrance_shader_perm( + GfxCore* gfxcore, const ShaderCompilerDefine* defines, size_t num_defines) { + return make_shader_program( + gfxcore, cook_torrance_vert, cook_torrance_frag, defines, num_defines); +} + +ShaderProgram* gfx_make_immediate_mode_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, immediate_mode_vert, immediate_mode_frag, 0, 0); +} + +ShaderProgram* gfx_make_irradiance_map_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, cubemap_filtering_vert, irradiance_map_frag, 0, 0); +} + +ShaderProgram* gfx_make_prefiltered_environment_map_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, cubemap_filtering_vert, prefiltered_environment_map_frag, 0, 0); +} + +ShaderProgram* gfx_make_debug3d_shader(GfxCore* gfxcore) { + return make_shader_program(gfxcore, debug3d_vert, debug3d_frag, 0, 0); +} + +ShaderProgram* gfx_make_skyquad_shader(GfxCore* gfxcore) { + return make_shader_program(gfxcore, skyquad_vert, skyquad_frag, 0, 0); +} + +ShaderProgram* gfx_make_view_normal_mapped_normals_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, view_normal_mapped_normals_vert, view_normal_mapped_normals_frag, + 0, 0); +} + +ShaderProgram* gfx_make_view_normals_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, view_normals_vert, view_normals_frag, 0, 0); +} + +ShaderProgram* gfx_make_view_tangents_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, view_tangents_vert, view_tangents_frag, 0, 0); +} + +ShaderProgram* gfx_make_view_texture_shader(GfxCore* gfxcore) { + return make_shader_program( + gfxcore, view_texture_vert, view_texture_frag, 0, 0); +} -- cgit v1.2.3