2186c9dace606b9e3e8b3e54dc4b1d9e9b3f39bc
1 /* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
7 #include "vg/vg_platform.h"
9 #define STB_INCLUDE_IMPLEMENTATION
10 #define STB_INCLUDE_LINE_GLSL
11 #define STB_MALLOC vg_alloc
12 #define STB_FREE vg_free
13 #define STB_REALLOC vg_realloc
14 #include "stb/stb_include.h"
16 const char *vg_shader_gl_ver
= "#version 330 core\n";
26 const char *orig_file
,
34 ** vg_shaders_active
= NULL
;
35 static u32 vg_shader_count
,
38 static GLuint
vg_shader_subshader( const char *src
, GLint gliShaderType
)
40 GLint shader
= glCreateShader( gliShaderType
);
42 if( shader
== GL_NONE
)
44 vg_error( "Could not 'glCreateShader()'\n" );
48 glShaderSource( shader
, 2, (const char*[2]){ vg_shader_gl_ver
, src
}, NULL
);
49 glCompileShader( shader
);
52 glGetShaderiv( shader
, GL_COMPILE_STATUS
, &status
);
54 if( status
!= GL_TRUE
)
59 glGetShaderInfoLog( shader
, sizeof(info
), &len
, info
);
60 vg_error( "Error info:\n%s\n", info
);
67 static int vg_shader_compile( struct vg_shader
*shader
)
69 vg_info( "Compile shader '%s'\n", shader
->name
);
71 GLuint program
, vert
, frag
;
72 const char *svs
, *sfs
;
77 /* If we are compiling this again, we obviously need to try to take the src
78 * from the disk instead.
80 * Only do this if we have filenames set on the shader, so engine shaders
81 * dont have to do it (text.. etc).
83 if( shader
->compiled
)
85 if( shader
->vs
.orig_file
&& shader
->fs
.orig_file
)
92 svs
= shader
->vs
.static_src
;
93 sfs
= shader
->fs
.static_src
;
99 strcpy( path
, shader
->vs
.orig_file
);
100 avs
= stb_include_file( path
, "", "../../shaders", error
);
102 strcpy( path
, shader
->fs
.orig_file
);
103 afs
= stb_include_file( path
, "", "../../shaders", error
);
107 vg_error( "Could not find shader source files (%s)\n",
108 shader
->vs
.orig_file
);
119 vert
= vg_shader_subshader( svs
, GL_VERTEX_SHADER
);
120 frag
= vg_shader_subshader( sfs
, GL_FRAGMENT_SHADER
);
131 program
= glCreateProgram();
133 glAttachShader( program
, vert
);
134 glAttachShader( program
, frag
);
135 glLinkProgram( program
);
137 glDeleteShader( vert
);
138 glDeleteShader( frag
);
140 /* Check for link errors */
142 int success_link
= 1;
144 glGetProgramiv( program
, GL_LINK_STATUS
, &success_link
);
147 glGetProgramInfoLog( program
, 512, NULL
, infoLog
);
148 vg_error( "Link failed: %s\n", infoLog
);
149 glDeleteProgram( program
);
153 if( shader
->compiled
)
154 glDeleteProgram( shader
->id
);
156 shader
->id
= program
;
157 shader
->compiled
= 1;
163 static void vg_free_shader( struct vg_shader
*shader
)
165 if( shader
->compiled
)
167 glDeleteProgram( shader
->id
);
168 shader
->compiled
= 0;
172 static void vg_shaders_free(void *nothing
)
174 for( int i
=0; i
<vg_shader_count
; i
++ )
176 struct vg_shader
*shader
= vg_shaders_active
[i
];
178 if( shader
->compiled
)
179 glDeleteProgram( shader
->id
);
182 vg_free( vg_shaders_active
);
185 static int vg_shaders_recompile(void)
187 vg_info( "Compiling shaders\n" );
189 for( int i
=0; i
<vg_shader_count
; i
++ )
191 struct vg_shader
*shader
= vg_shaders_active
[i
];
193 if( !vg_shader_compile( shader
) )
200 static void vg_shader_register( struct vg_shader
*shader
)
202 shader
->compiled
= 0;
203 shader
->id
= 0; /* TODO: make this an error shader */
204 vg_shaders_active
= buffer_reserve( vg_shaders_active
, vg_shader_count
,
206 sizeof( struct vg_shader
* ) );
208 vg_shaders_active
[ vg_shader_count
++ ] = shader
;
211 #endif /* VG_SHADER_H */