-/* TODO: TUrn off in release */
+/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */
+
+#ifndef VG_SHADER_H
+#define VG_SHADER_H
+
+#include "vg/vg.h"
+#include "vg/vg_platform.h"
+
+#if 0
#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"
+#endif
const char *vg_shader_gl_ver = "#version 330 core\n";
-struct vg_shader
-{
- GLuint id;
- const char *name;
+typedef struct vg_shader vg_shader;
- struct vg_subshader
+struct
+{
+ struct vg_shader
{
- const char *orig_file,
- *static_src;
- }
- vs, fs;
+ GLuint id;
+ const char *name;
- void (*link)(void);
- int compiled;
+ struct vg_subshader
+ {
+ const char *orig_file,
+ *static_src;
+ }
+ vs, fs;
+
+ void (*link)(void);
+ int compiled;
+ }
+ * shaders[32];
+ u32 count;
}
-** vg_shaders_active = NULL;
+static vg_shaders;
-static GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
+VG_STATIC GLuint vg_shader_subshader( const char *src, GLint gliShaderType )
{
GLint shader = glCreateShader( gliShaderType );
return shader;
}
-static int vg_shader_compile( struct vg_shader *shader )
+VG_STATIC int vg_shader_compile( struct vg_shader *shader )
{
vg_info( "Compile shader '%s'\n", shader->name );
}
else
{
+ vg_fatal_exit_loop( "Unimplemented" );
+
+#if 0
char error[260];
char path[260];
strcpy( path, shader->vs.orig_file );
- avs = stb_include_file( path, "", "../shaders", error );
+ avs = stb_include_file( path, "", "../../shaders", error );
strcpy( path, shader->fs.orig_file );
- afs = stb_include_file( path, "", "../shaders", error );
+ afs = stb_include_file( path, "", "../../shaders", error );
if( !avs || !afs )
{
- free( avs );
- free( afs );
+ vg_error( "Could not find shader source files (%s)\n",
+ shader->vs.orig_file );
+
+ vg_free( avs );
+ vg_free( afs );
return 0;
}
svs = avs;
sfs = afs;
+#endif
}
vert = vg_shader_subshader( svs, GL_VERTEX_SHADER );
frag = vg_shader_subshader( sfs, GL_FRAGMENT_SHADER );
+#if 0
if( !static_src )
{
free( avs );
free( afs );
}
+#endif
if( !vert || !frag )
return 0;
return 1;
}
-static void vg_shaders_free(void)
+VG_STATIC void vg_free_shader( struct vg_shader *shader )
{
- for( int i = 0; i < arrlen( vg_shaders_active ); i ++ )
- {
- struct vg_shader *shader = vg_shaders_active[i];
-
- if( shader->compiled )
- glDeleteProgram( shader->id );
- }
-
- arrfree( vg_shaders_active );
+ if( shader->compiled )
+ {
+ glDeleteProgram( shader->id );
+ shader->compiled = 0;
+ }
}
-static int vg_shaders_recompile(int argc, const char *argv[])
+VG_STATIC void vg_shaders_compile(void)
{
vg_info( "Compiling shaders\n" );
- for( int i = 0; i < arrlen( vg_shaders_active ); i ++ )
+
+ for( int i=0; i<vg_shaders.count; i ++ )
{
- struct vg_shader *shader = vg_shaders_active[i];
- vg_shader_compile( shader );
+ vg_shader *shader = vg_shaders.shaders[i];
+
+ if( !vg_shader_compile( shader ) )
+ vg_fatal_exit_loop( "Failed to compile shader" );
}
+}
+
+VG_STATIC int vg_shaders_live_recompile(int argc, const char *argv[])
+{
+ vg_info( "Recompiling shaders\n" );
+ for( int i=0; i<vg_shaders.count; i ++ )
+ {
+ struct vg_shader *shader = vg_shaders.shaders[i];
+ vg_shader_compile( shader );
+ }
return 0;
}
-static void vg_shader_register( struct vg_shader *shader )
+VG_STATIC void vg_shader_register( struct vg_shader *shader )
{
+ if( vg_shaders.count == vg_list_size(vg_shaders.shaders) )
+ vg_fatal_exit_loop( "Too many shaders" );
+
shader->compiled = 0;
shader->id = 0; /* TODO: make this an error shader */
- arrpush( vg_shaders_active, shader );
+ vg_shaders.shaders[ vg_shaders.count ++ ] = shader;
}
+
+#endif /* VG_SHADER_H */