now thats a lot of damage!
[vg.git] / src / vg / vg_shader.h
index 06f455d59e663c52614595e2f547430d7b8fae95..516d1a84c67587c7e44d56fe2853c870de252138 100644 (file)
@@ -6,36 +6,42 @@
 #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_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";
 
-static
-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;
+
+      struct vg_subshader
+      {
+         const char *orig_file,
+                    *static_src;
+      }
+      vs, fs;
 
-   void (*link)(void);
-   int compiled;
+      void (*link)(void);
+      int compiled;
+   }
+   * shaders[32];
+   u32 count;
 }
-** vg_shaders_active = NULL;
-static u32 vg_shader_count,
-           vg_shader_cap;
+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 );
 
@@ -64,7 +70,7 @@ static GLuint vg_shader_subshader( const char *src, GLint 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 );
        
@@ -94,6 +100,9 @@ static int vg_shader_compile( struct vg_shader *shader )
    }
    else
    {
+      vg_fatal_exit_loop( "Unimplemented" );
+
+#if 0
       char error[260];
       char path[260];
       strcpy( path, shader->vs.orig_file );
@@ -114,16 +123,19 @@ static int vg_shader_compile( struct vg_shader *shader )
 
       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 )
    {
-      vg_free( avs );
-      vg_free( afs );
+      free( avs );
+      free( afs );
    }
+#endif
 
        if( !vert || !frag )
                return 0;
@@ -160,7 +172,7 @@ static int vg_shader_compile( struct vg_shader *shader )
        return 1;
 }
 
-static void vg_free_shader( struct vg_shader *shader )
+VG_STATIC void vg_free_shader( struct vg_shader *shader )
 {
    if( shader->compiled )
    {
@@ -169,55 +181,39 @@ static void vg_free_shader( struct vg_shader *shader )
    }
 }
 
-static void vg_shaders_free(void *nothing)
-{
-       for( int i=0; i<vg_shader_count; i ++ )
-       {
-               struct vg_shader *shader = vg_shaders_active[i];
-               
-               if( shader->compiled )
-                       glDeleteProgram( shader->id );
-       }
-       
-       vg_free( vg_shaders_active );
-}
-
-static int vg_shaders_recompile(void)
+VG_STATIC void vg_shaders_compile(void)
 {
        vg_info( "Compiling shaders\n" );
 
-       for( int i=0; i<vg_shader_count; i ++ )
+       for( int i=0; i<vg_shaders.count; i ++ )
        {
-               struct vg_shader *shader = vg_shaders_active[i];
+               vg_shader *shader = vg_shaders.shaders[i];
 
                if( !vg_shader_compile( shader ) )
-         return 0;
+         vg_fatal_exit_loop( "Failed to compile shader" );
        }
-
-   return 1;
 }
 
-static int vg_shaders_live_recompile(int argc, const char *argv[])
+VG_STATIC int vg_shaders_live_recompile(int argc, const char *argv[])
 {
    vg_info( "Recompiling shaders\n" );
-   for( int i=0; i<vg_shader_count; i ++ )
+   for( int i=0; i<vg_shaders.count; i ++ )
    {
-      struct vg_shader *shader = vg_shaders_active[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 */
-   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;
+   vg_shaders.shaders[ vg_shaders.count ++ ] = shader;
 }
 
 #endif /* VG_SHADER_H */