#ifndef VG_SHADER_H
#define VG_SHADER_H
+#include "vg/vg.h"
+#include "vg/vg_platform.h"
+
#define STB_INCLUDE_IMPLEMENTATION
#define STB_INCLUDE_LINE_GLSL
+#define STB_MALLOC vg_alloc
+#define STB_FREE vg_free
+#define STB_REALLOC vg_realloc
#include "stb/stb_include.h"
const char *vg_shader_gl_ver = "#version 330 core\n";
+static
struct vg_shader
{
GLuint id;
int compiled;
}
** vg_shaders_active = NULL;
+static u32 vg_shader_count,
+ vg_shader_cap;
static GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
{
vg_error( "Could not find shader source files (%s)\n",
shader->vs.orig_file );
- free( avs );
- free( afs );
+ vg_free( avs );
+ vg_free( afs );
return 0;
}
if( !static_src )
{
- free( avs );
- free( afs );
+ vg_free( avs );
+ vg_free( afs );
}
if( !vert || !frag )
return 1;
}
-static void vg_shaders_free(void)
+static void vg_free_shader( struct vg_shader *shader )
+{
+ if( shader->compiled )
+ {
+ glDeleteProgram( shader->id );
+ shader->compiled = 0;
+ }
+}
+
+static void vg_shaders_free(void *nothing)
{
- for( int i = 0; i < arrlen( vg_shaders_active ); i ++ )
+ for( int i=0; i<vg_shader_count; i ++ )
{
struct vg_shader *shader = vg_shaders_active[i];
glDeleteProgram( shader->id );
}
- arrfree( vg_shaders_active );
+ vg_free( vg_shaders_active );
}
-static int vg_shaders_recompile(int argc, const char *argv[])
+static int vg_shaders_recompile(void)
{
vg_info( "Compiling shaders\n" );
- for( int i = 0; i < arrlen( vg_shaders_active ); i ++ )
+
+ for( int i=0; i<vg_shader_count; i ++ )
{
struct vg_shader *shader = vg_shaders_active[i];
- vg_shader_compile( shader );
+
+ if( !vg_shader_compile( shader ) )
+ return 0;
}
- return 0;
+ return 1;
}
static void vg_shader_register( struct vg_shader *shader )
{
shader->compiled = 0;
shader->id = 0; /* TODO: make this an error shader */
- arrpush( vg_shaders_active, shader );
+ vg_shaders_active = buffer_reserve( vg_shaders_active, vg_shader_count,
+ &vg_shader_cap, 1,
+ sizeof( struct vg_shader * ) );
+
+ vg_shaders_active[ vg_shader_count ++ ] = shader;
}
#endif /* VG_SHADER_H */