diff options
author | 3gg <3gg@shellblade.net> | 2025-06-27 10:18:39 -0700 |
---|---|---|
committer | 3gg <3gg@shellblade.net> | 2025-06-27 10:18:39 -0700 |
commit | bd57f345ed9dbed1d81683e48199626de2ea9044 (patch) | |
tree | 4221f2f2a7ad2244d2e93052bd68187ec91b8ea9 /src/util/shader.c | |
parent | 9a82ce0083437a4f9f58108b2c23b957d2249ad8 (diff) |
Diffstat (limited to 'src/util/shader.c')
-rw-r--r-- | src/util/shader.c | 136 |
1 files changed, 136 insertions, 0 deletions
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 @@ | |||
1 | #include <gfx/util/shader.h> | ||
2 | |||
3 | #include <gfx/core.h> | ||
4 | #include <shaders/brdf_integration_map.frag.h> | ||
5 | #include <shaders/cook_torrance.frag.h> | ||
6 | #include <shaders/cook_torrance.vert.h> | ||
7 | #include <shaders/cubemap_filtering.vert.h> | ||
8 | #include <shaders/debug3d.frag.h> | ||
9 | #include <shaders/debug3d.vert.h> | ||
10 | #include <shaders/immediate_mode.frag.h> | ||
11 | #include <shaders/immediate_mode.vert.h> | ||
12 | #include <shaders/irradiance_map.frag.h> | ||
13 | #include <shaders/prefiltered_environment_map.frag.h> | ||
14 | #include <shaders/quad.vert.h> | ||
15 | #include <shaders/skyquad.frag.h> | ||
16 | #include <shaders/skyquad.vert.h> | ||
17 | #include <shaders/view_normal_mapped_normals.frag.h> | ||
18 | #include <shaders/view_normal_mapped_normals.vert.h> | ||
19 | #include <shaders/view_normals.frag.h> | ||
20 | #include <shaders/view_normals.vert.h> | ||
21 | #include <shaders/view_tangents.frag.h> | ||
22 | #include <shaders/view_tangents.vert.h> | ||
23 | #include <shaders/view_texture.frag.h> | ||
24 | #include <shaders/view_texture.vert.h> | ||
25 | |||
26 | #include <assert.h> | ||
27 | #include <string.h> | ||
28 | |||
29 | static ShaderProgram* make_shader_program( | ||
30 | GfxCore* gfxcore, const char* vert_source, const char* frag_source, | ||
31 | const ShaderCompilerDefine* defines, size_t num_defines) { | ||
32 | assert(gfxcore); | ||
33 | assert(vert_source); | ||
34 | assert(frag_source); | ||
35 | |||
36 | Shader* vert = 0; | ||
37 | Shader* frag = 0; | ||
38 | |||
39 | ShaderDesc vertex_shader_desc = { | ||
40 | .code = vert_source, .type = VertexShader, .num_defines = num_defines}; | ||
41 | ShaderDesc fragment_shader_desc = { | ||
42 | .code = frag_source, .type = FragmentShader, .num_defines = num_defines}; | ||
43 | if (num_defines > 0) { | ||
44 | memcpy( | ||
45 | vertex_shader_desc.defines, defines, | ||
46 | num_defines * sizeof(ShaderCompilerDefine)); | ||
47 | memcpy( | ||
48 | fragment_shader_desc.defines, defines, | ||
49 | num_defines * sizeof(ShaderCompilerDefine)); | ||
50 | } | ||
51 | vert = gfx_make_shader(gfxcore, &vertex_shader_desc); | ||
52 | if (!vert) { | ||
53 | goto cleanup; | ||
54 | } | ||
55 | frag = gfx_make_shader(gfxcore, &fragment_shader_desc); | ||
56 | if (!frag) { | ||
57 | goto cleanup; | ||
58 | } | ||
59 | |||
60 | ShaderProgramDesc shader_program_desc = { | ||
61 | .vertex_shader = vert, .fragment_shader = frag}; | ||
62 | ShaderProgram* prog = gfx_make_shader_program(gfxcore, &shader_program_desc); | ||
63 | if (!prog) { | ||
64 | goto cleanup; | ||
65 | } | ||
66 | return prog; | ||
67 | |||
68 | cleanup: | ||
69 | if (vert) { | ||
70 | gfx_destroy_shader(gfxcore, &vert); | ||
71 | } | ||
72 | if (frag) { | ||
73 | gfx_destroy_shader(gfxcore, &frag); | ||
74 | } | ||
75 | return 0; | ||
76 | } | ||
77 | |||
78 | ShaderProgram* gfx_make_brdf_integration_map_shader(GfxCore* gfxcore) { | ||
79 | return make_shader_program( | ||
80 | gfxcore, quad_vert, brdf_integration_map_frag, 0, 0); | ||
81 | } | ||
82 | |||
83 | ShaderProgram* gfx_make_cook_torrance_shader(GfxCore* gfxcore) { | ||
84 | return make_shader_program( | ||
85 | gfxcore, cook_torrance_vert, cook_torrance_frag, 0, 0); | ||
86 | } | ||
87 | |||
88 | ShaderProgram* gfx_make_cook_torrance_shader_perm( | ||
89 | GfxCore* gfxcore, const ShaderCompilerDefine* defines, size_t num_defines) { | ||
90 | return make_shader_program( | ||
91 | gfxcore, cook_torrance_vert, cook_torrance_frag, defines, num_defines); | ||
92 | } | ||
93 | |||
94 | ShaderProgram* gfx_make_immediate_mode_shader(GfxCore* gfxcore) { | ||
95 | return make_shader_program( | ||
96 | gfxcore, immediate_mode_vert, immediate_mode_frag, 0, 0); | ||
97 | } | ||
98 | |||
99 | ShaderProgram* gfx_make_irradiance_map_shader(GfxCore* gfxcore) { | ||
100 | return make_shader_program( | ||
101 | gfxcore, cubemap_filtering_vert, irradiance_map_frag, 0, 0); | ||
102 | } | ||
103 | |||
104 | ShaderProgram* gfx_make_prefiltered_environment_map_shader(GfxCore* gfxcore) { | ||
105 | return make_shader_program( | ||
106 | gfxcore, cubemap_filtering_vert, prefiltered_environment_map_frag, 0, 0); | ||
107 | } | ||
108 | |||
109 | ShaderProgram* gfx_make_debug3d_shader(GfxCore* gfxcore) { | ||
110 | return make_shader_program(gfxcore, debug3d_vert, debug3d_frag, 0, 0); | ||
111 | } | ||
112 | |||
113 | ShaderProgram* gfx_make_skyquad_shader(GfxCore* gfxcore) { | ||
114 | return make_shader_program(gfxcore, skyquad_vert, skyquad_frag, 0, 0); | ||
115 | } | ||
116 | |||
117 | ShaderProgram* gfx_make_view_normal_mapped_normals_shader(GfxCore* gfxcore) { | ||
118 | return make_shader_program( | ||
119 | gfxcore, view_normal_mapped_normals_vert, view_normal_mapped_normals_frag, | ||
120 | 0, 0); | ||
121 | } | ||
122 | |||
123 | ShaderProgram* gfx_make_view_normals_shader(GfxCore* gfxcore) { | ||
124 | return make_shader_program( | ||
125 | gfxcore, view_normals_vert, view_normals_frag, 0, 0); | ||
126 | } | ||
127 | |||
128 | ShaderProgram* gfx_make_view_tangents_shader(GfxCore* gfxcore) { | ||
129 | return make_shader_program( | ||
130 | gfxcore, view_tangents_vert, view_tangents_frag, 0, 0); | ||
131 | } | ||
132 | |||
133 | ShaderProgram* gfx_make_view_texture_shader(GfxCore* gfxcore) { | ||
134 | return make_shader_program( | ||
135 | gfxcore, view_texture_vert, view_texture_frag, 0, 0); | ||
136 | } | ||