235 lines
6.4 KiB
C
235 lines
6.4 KiB
C
/**
|
|
* 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);
|
|
fclose(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);
|
|
fclose(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;
|
|
}
|