X-Git-Url: https://harrygodden.com/git/?p=vg.git;a=blobdiff_plain;f=vg_shader.h;h=50e8bd0e291589a17d32b17fe1c11f0038e9234e;hp=516d1a84c67587c7e44d56fe2853c870de252138;hb=HEAD;hpb=4c48fe01a5d1983be89b7dce6f08e6b708cfbb05 diff --git a/vg_shader.h b/vg_shader.h index 516d1a8..5e2ad35 100644 --- a/vg_shader.h +++ b/vg_shader.h @@ -1,25 +1,8 @@ -/* 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"; +#pragma once typedef struct vg_shader vg_shader; -struct +struct vg_shaders { struct vg_shader { @@ -32,188 +15,14 @@ struct *static_src; } vs, fs; - - void (*link)(void); int compiled; } - * shaders[32]; + * shaders[48]; u32 count; } -static vg_shaders; - -VG_STATIC GLuint vg_shader_subshader( const char *src, GLint gliShaderType ) -{ - GLint shader = glCreateShader( gliShaderType ); - - if( shader == GL_NONE ) - { - vg_error( "Could not 'glCreateShader()'\n" ); - return 0; - } - - glShaderSource( shader, 2, (const char*[2]){ vg_shader_gl_ver, src }, NULL ); - glCompileShader( shader ); - - GLint status; - glGetShaderiv( shader, GL_COMPILE_STATUS, &status ); - - if( status != GL_TRUE ) - { - GLchar info[1024]; - GLsizei len; - - glGetShaderInfoLog( shader, sizeof(info), &len, info ); - vg_error( "Error info:\n%s\n", info ); - return 0; - } - - return shader; -} - -VG_STATIC int vg_shader_compile( struct vg_shader *shader ) -{ - vg_info( "Compile shader '%s'\n", shader->name ); - - GLuint program, vert, frag; - const char *svs, *sfs; - char *avs, *afs; - - int static_src = 1; - - /* If we are compiling this again, we obviously need to try to take the src - * from the disk instead. - * - * Only do this if we have filenames set on the shader, so engine shaders - * dont have to do it (text.. etc). - */ - if( shader->compiled ) - { - if( shader->vs.orig_file && shader->fs.orig_file ) - static_src = 0; - else return 1; - } - - if( static_src ) - { - svs = shader->vs.static_src; - sfs = shader->fs.static_src; - } - 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 ); - - strcpy( path, shader->fs.orig_file ); - afs = stb_include_file( path, "", "../../shaders", error ); - - if( !avs || !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; - - program = glCreateProgram(); - - glAttachShader( program, vert ); - glAttachShader( program, frag ); - glLinkProgram( program ); - - glDeleteShader( vert ); - glDeleteShader( frag ); - - /* Check for link errors */ - char infoLog[ 512 ]; - int success_link = 1; - - glGetProgramiv( program, GL_LINK_STATUS, &success_link ); - if( !success_link ) - { - glGetProgramInfoLog( program, 512, NULL, infoLog ); - vg_error( "Link failed: %s\n", infoLog ); - glDeleteProgram( program ); - return 0; - } - - if( shader->compiled ) - glDeleteProgram( shader->id ); - - shader->id = program; - shader->compiled = 1; - if( shader->link ) - shader->link(); - return 1; -} - -VG_STATIC void vg_free_shader( struct vg_shader *shader ) -{ - if( shader->compiled ) - { - glDeleteProgram( shader->id ); - shader->compiled = 0; - } -} - -VG_STATIC void vg_shaders_compile(void) -{ - vg_info( "Compiling shaders\n" ); - - for( int i=0; icompiled = 0; - shader->id = 0; /* TODO: make this an error shader */ - vg_shaders.shaders[ vg_shaders.count ++ ] = shader; -} +extern vg_shaders; -#endif /* VG_SHADER_H */ +void vg_shaders_compile(void); +int vg_shaders_live_recompile(int argc, const char *argv[]); +void vg_shader_register( struct vg_shader *shader ); +int vg_shader_compile( struct vg_shader *shader );