tests: added arbgpuprog, for compile-testing ARB vertex/fragment programs
This commit is contained in:
parent
509d9eb686
commit
5379f35a15
|
@ -17,6 +17,7 @@ SOURCES = \
|
|||
arbfptest1.c \
|
||||
arbfptexture.c \
|
||||
arbfptrig.c \
|
||||
arbgpuprog.c \
|
||||
arbnpot.c \
|
||||
arbnpot-mipmap.c \
|
||||
arbvptest1.c \
|
||||
|
|
|
@ -0,0 +1,230 @@
|
|||
/**
|
||||
* Just compile ARB vert/frag program from named file(s).
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <GL/glut.h>
|
||||
|
||||
|
||||
static GLuint FragProg;
|
||||
static GLuint VertProg;
|
||||
static GLint Win;
|
||||
|
||||
static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB_func;
|
||||
static PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB_func;
|
||||
static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB_func;
|
||||
static PFNGLGENPROGRAMSARBPROC glGenProgramsARB_func;
|
||||
static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB_func;
|
||||
static PFNGLBINDPROGRAMARBPROC glBindProgramARB_func;
|
||||
static PFNGLISPROGRAMARBPROC glIsProgramARB_func;
|
||||
static PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB_func;
|
||||
|
||||
|
||||
static void Redisplay( void )
|
||||
{
|
||||
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
|
||||
glutSwapBuffers();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
glTranslatef( 0.0, 0.0, -15.0 );
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
glDeleteProgramsARB_func(1, &VertProg);
|
||||
glDeleteProgramsARB_func(1, &FragProg);
|
||||
glutDestroyWindow(Win);
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
/* A helper for finding errors in program strings */
|
||||
static int FindLine( const char *program, int position )
|
||||
{
|
||||
int i, line = 1;
|
||||
for (i = 0; i < position; i++) {
|
||||
if (program[i] == '\n')
|
||||
line++;
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
|
||||
static void Init( const char *vertProgFile,
|
||||
const char *fragProgFile )
|
||||
{
|
||||
GLint errorPos;
|
||||
char buf[10*1000];
|
||||
|
||||
if (!glutExtensionSupported("GL_ARB_vertex_program")) {
|
||||
printf("Sorry, this demo requires GL_ARB_vertex_program\n");
|
||||
exit(1);
|
||||
}
|
||||
if (!glutExtensionSupported("GL_ARB_fragment_program")) {
|
||||
printf("Sorry, this demo requires GL_ARB_fragment_program\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
|
||||
/*
|
||||
* Get extension function pointers.
|
||||
*/
|
||||
glProgramLocalParameter4fvARB_func = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
|
||||
assert(glProgramLocalParameter4fvARB_func);
|
||||
|
||||
glProgramLocalParameter4dARB_func = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
|
||||
assert(glProgramLocalParameter4dARB_func);
|
||||
|
||||
glGetProgramLocalParameterdvARB_func = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
|
||||
assert(glGetProgramLocalParameterdvARB_func);
|
||||
|
||||
glGenProgramsARB_func = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
|
||||
assert(glGenProgramsARB_func);
|
||||
|
||||
glProgramStringARB_func = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
|
||||
assert(glProgramStringARB_func);
|
||||
|
||||
glBindProgramARB_func = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
|
||||
assert(glBindProgramARB_func);
|
||||
|
||||
glIsProgramARB_func = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
|
||||
assert(glIsProgramARB_func);
|
||||
|
||||
glDeleteProgramsARB_func = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
|
||||
assert(glDeleteProgramsARB_func);
|
||||
|
||||
/*
|
||||
* Vertex program
|
||||
*/
|
||||
if (vertProgFile) {
|
||||
FILE *f;
|
||||
int len;
|
||||
|
||||
glGenProgramsARB_func(1, &VertProg);
|
||||
assert(VertProg > 0);
|
||||
glBindProgramARB_func(GL_VERTEX_PROGRAM_ARB, VertProg);
|
||||
|
||||
f = fopen(vertProgFile, "r");
|
||||
if (!f) {
|
||||
printf("Unable to open %s\n", fragProgFile);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
len = fread(buf, 1, 10*1000,f);
|
||||
glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB,
|
||||
GL_PROGRAM_FORMAT_ASCII_ARB,
|
||||
len,
|
||||
(const GLubyte *) buf);
|
||||
|
||||
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
|
||||
if (glGetError() != GL_NO_ERROR || errorPos != -1) {
|
||||
int l = FindLine(buf, errorPos);
|
||||
printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
|
||||
(char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
|
||||
exit(0);
|
||||
}
|
||||
else {
|
||||
glEnable(GL_VERTEX_PROGRAM_ARB);
|
||||
printf("Vertex Program OK\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fragment program
|
||||
*/
|
||||
if (fragProgFile) {
|
||||
FILE *f;
|
||||
int len;
|
||||
|
||||
glGenProgramsARB_func(1, &FragProg);
|
||||
assert(FragProg > 0);
|
||||
glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, FragProg);
|
||||
|
||||
f = fopen(fragProgFile, "r");
|
||||
if (!f) {
|
||||
printf("Unable to open %s\n", fragProgFile);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
len = fread(buf, 1, 10*1000,f);
|
||||
glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB,
|
||||
GL_PROGRAM_FORMAT_ASCII_ARB,
|
||||
len,
|
||||
(const GLubyte *) buf);
|
||||
|
||||
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
|
||||
if (glGetError() != GL_NO_ERROR || errorPos != -1) {
|
||||
int l = FindLine(buf, errorPos);
|
||||
printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
|
||||
(char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
|
||||
exit(0);
|
||||
}
|
||||
else {
|
||||
glEnable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
printf("Fragment Program OK\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
const char *vertProgFile = NULL, *fragProgFile = NULL;
|
||||
int i;
|
||||
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( 200, 200 );
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
|
||||
Win = glutCreateWindow(argv[0]);
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Redisplay );
|
||||
|
||||
if (argc == 1) {
|
||||
printf("arbgpuprog:\n");
|
||||
printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
|
||||
printf("Usage:\n");
|
||||
printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "--vp") == 0) {
|
||||
vertProgFile = argv[i+1];
|
||||
i++;
|
||||
}
|
||||
else if (strcmp(argv[i], "--fp") == 0) {
|
||||
fragProgFile = argv[i+1];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
Init(vertProgFile, fragProgFile);
|
||||
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue