Checker can use "normal" shaders now

Passing '/' as an argument before the shader type will use separable
shaders.
This commit is contained in:
Emmanuel BENOîT 2015-03-11 08:56:20 +01:00
parent 60d4dc7652
commit cf1a1619fe

View file

@ -11,8 +11,10 @@ static int vAttributes[] = {
}; };
static int cAttributes[] = { static int cAttributes[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB , 4 , GLX_CONTEXT_MAJOR_VERSION_ARB , 3 ,
GLX_CONTEXT_MINOR_VERSION_ARB , 1 , GLX_CONTEXT_MINOR_VERSION_ARB , 0 ,
GLX_CONTEXT_FLAGS_ARB ,
GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB ,
GLX_CONTEXT_PROFILE_MASK_ARB , GLX_CONTEXT_PROFILE_MASK_ARB ,
GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB , GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB ,
0 0
@ -39,9 +41,16 @@ static int errmsg( char const* msg )
static Display * xDisplay; static Display * xDisplay;
static GLXContext glxContext; static GLXContext glxContext;
static GLXPbuffer pBuffer; static GLXPbuffer pBuffer;
static PFNGLCREATESHADERPROC glCreateShader;
static PFNGLCREATESHADERPROGRAMVPROC glCreateShaderProgramv; static PFNGLCREATESHADERPROGRAMVPROC glCreateShaderProgramv;
static PFNGLSHADERSOURCEPROC glShaderSource;
static PFNGLCOMPILESHADERPROC glCompileShader;
static PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; static PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
static PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
static PFNGLGETSHADERIVPROC glGetShaderiv;
static PFNGLDELETEPROGRAMPROC glDeleteProgram; static PFNGLDELETEPROGRAMPROC glDeleteProgram;
static PFNGLDELETESHADERPROC glDeleteShader;
static int initContext( ) static int initContext( )
@ -82,11 +91,18 @@ static int initContext( )
return errmsg( "Could not activate context" ); return errmsg( "Could not activate context" );
} }
glCreateShader = gglp( PFNGLCREATESHADERPROC , "CreateShader" );
glCreateShaderProgramv = gglp( PFNGLCREATESHADERPROGRAMVPROC , glCreateShaderProgramv = gglp( PFNGLCREATESHADERPROGRAMVPROC ,
"CreateShaderProgramv" ); "CreateShaderProgramv" );
glShaderSource = gglp( PFNGLSHADERSOURCEPROC , "ShaderSource" );
glCompileShader = gglp( PFNGLCOMPILESHADERPROC , "CompileShader" );
glGetProgramInfoLog = gglp( PFNGLGETPROGRAMINFOLOGPROC , glGetProgramInfoLog = gglp( PFNGLGETPROGRAMINFOLOGPROC ,
"GetProgramInfoLog" ); "GetProgramInfoLog" );
glGetShaderInfoLog = gglp( PFNGLGETSHADERINFOLOGPROC ,
"GetShaderInfoLog" );
glGetShaderiv = gglp( PFNGLGETSHADERIVPROC , "GetShaderiv" );
glDeleteProgram = gglp( PFNGLDELETEPROGRAMPROC , "DeleteProgram" ); glDeleteProgram = gglp( PFNGLDELETEPROGRAMPROC , "DeleteProgram" );
glDeleteShader = gglp( PFNGLDELETESHADERPROC , "DeleteShader" );
return 1; return 1;
} }
@ -153,7 +169,7 @@ static char * loadFile( char const* name )
} }
void loadShader( GLenum type , char const* file ) static void loadShaderSeparable( GLenum type , char const* file )
{ {
GLuint program; GLuint program;
char * source = loadFile( file ); char * source = loadFile( file );
@ -167,6 +183,7 @@ void loadShader( GLenum type , char const* file )
char infoLog[ 128 * 1024 ]; char infoLog[ 128 * 1024 ];
int sz , i , j; int sz , i , j;
glGetProgramInfoLog( program , sizeof( infoLog ) , &sz , infoLog ); glGetProgramInfoLog( program , sizeof( infoLog ) , &sz , infoLog );
glDeleteProgram( program );
i = 0; i = 0;
while ( i < sz ) { while ( i < sz ) {
@ -180,8 +197,43 @@ void loadShader( GLenum type , char const* file )
fprintf( stderr , "%s: %s\n" , file , &infoLog[ i ] ); fprintf( stderr , "%s: %s\n" , file , &infoLog[ i ] );
i = j + 1; i = j + 1;
} }
}
glDeleteProgram( program );
static void loadShader( GLenum type , char const* file )
{
GLenum shader;
shader = glCreateShader( type );
char * source = loadFile( file );
if ( source == NULL ) {
return;
}
glShaderSource( shader , 1 , (GLchar const**) &source , NULL );
free( source );
glCompileShader( shader );
GLint status;
glGetShaderiv( shader , GL_COMPILE_STATUS , &status );
char infoLog[ 128 * 1024 ];
int sz , i , j;
glGetShaderInfoLog( shader , sizeof( infoLog ) , &sz , infoLog );
glDeleteShader( shader );
i = 0;
while ( i < sz ) {
j = i;
while ( j < sz && infoLog[ j ] != '\n' ) {
j ++;
}
if ( j < sz ) {
infoLog[ j ] = 0;
}
fprintf( stderr , "%s: %s\n" , file , &infoLog[ i ] );
i = j + 1;
}
} }
@ -194,19 +246,29 @@ int main( int argc , char ** argv )
if ( argc > 1 ) { if ( argc > 1 ) {
if ( argc < 3 ) { if ( argc < 3 ) {
fprintf( stderr , fprintf( stderr ,
"Syntax: %s [v|f|g|tc|te|c] file...\n" , "Syntax: %s [/] v|f|g|tc|te|c file...\n" ,
argv[ 0 ] ); argv[ 0 ] );
return 1; return 1;
} }
GLenum type = getShaderType( argv[ 1 ] ); int argPos = 1 , separable = 0;
if ( argc > 3 && !strcmp( "/" , argv[ 1 ] ) ) {
separable = 1;
argPos ++;
}
GLenum type = getShaderType( argv[ argPos ] );
if ( type == 0 ) { if ( type == 0 ) {
return 1; return 1;
} }
int i; int i;
for ( i = 2 ; i < argc ; i ++ ) { for ( i = argPos + 1 ; i < argc ; i ++ ) {
loadShader( type , argv[ i ] ); if ( separable ) {
loadShaderSeparable( type , argv[ i ] );
} else {
loadShader( type , argv[ i ] );
}
} }
} }