Checker can use "normal" shaders now
Passing '/' as an argument before the shader type will use separable shaders.
This commit is contained in:
parent
60d4dc7652
commit
cf1a1619fe
1 changed files with 71 additions and 9 deletions
76
check_glsl.c
76
check_glsl.c
|
@ -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,21 +246,31 @@ 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 ++ ) {
|
||||||
|
if ( separable ) {
|
||||||
|
loadShaderSeparable( type , argv[ i ] );
|
||||||
|
} else {
|
||||||
loadShader( type , argv[ i ] );
|
loadShader( type , argv[ i ] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
killContext( );
|
killContext( );
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Reference in a new issue