aboutsummaryrefslogtreecommitdiff
path: root/src/util/shader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/shader.c')
-rw-r--r--src/util/shader.c136
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
29static 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
68cleanup:
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
78ShaderProgram* 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
83ShaderProgram* gfx_make_cook_torrance_shader(GfxCore* gfxcore) {
84 return make_shader_program(
85 gfxcore, cook_torrance_vert, cook_torrance_frag, 0, 0);
86}
87
88ShaderProgram* 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
94ShaderProgram* gfx_make_immediate_mode_shader(GfxCore* gfxcore) {
95 return make_shader_program(
96 gfxcore, immediate_mode_vert, immediate_mode_frag, 0, 0);
97}
98
99ShaderProgram* gfx_make_irradiance_map_shader(GfxCore* gfxcore) {
100 return make_shader_program(
101 gfxcore, cubemap_filtering_vert, irradiance_map_frag, 0, 0);
102}
103
104ShaderProgram* 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
109ShaderProgram* gfx_make_debug3d_shader(GfxCore* gfxcore) {
110 return make_shader_program(gfxcore, debug3d_vert, debug3d_frag, 0, 0);
111}
112
113ShaderProgram* gfx_make_skyquad_shader(GfxCore* gfxcore) {
114 return make_shader_program(gfxcore, skyquad_vert, skyquad_frag, 0, 0);
115}
116
117ShaderProgram* 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
123ShaderProgram* gfx_make_view_normals_shader(GfxCore* gfxcore) {
124 return make_shader_program(
125 gfxcore, view_normals_vert, view_normals_frag, 0, 0);
126}
127
128ShaderProgram* gfx_make_view_tangents_shader(GfxCore* gfxcore) {
129 return make_shader_program(
130 gfxcore, view_tangents_vert, view_tangents_frag, 0, 0);
131}
132
133ShaderProgram* gfx_make_view_texture_shader(GfxCore* gfxcore) {
134 return make_shader_program(
135 gfxcore, view_texture_vert, view_texture_frag, 0, 0);
136}