tests: added arbgpuprog, for compile-testing ARB vertex/fragment programs
authorBrian Paul <brianp@vmware.com>
Thu, 11 Jun 2009 18:10:00 +0000 (12:10 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 12 Jun 2009 14:16:18 +0000 (08:16 -0600)
progs/tests/Makefile
progs/tests/arbgpuprog.c [new file with mode: 0644]

index 5069817be3e307bf6f67ff497274998cc6057a94..f3f1aea9442a56a48871c3068b1032707c7efc03 100644 (file)
@@ -17,6 +17,7 @@ SOURCES = \
        arbfptest1.c \
        arbfptexture.c \
        arbfptrig.c \
+       arbgpuprog.c \
        arbnpot.c \
        arbnpot-mipmap.c \
        arbvptest1.c \
diff --git a/progs/tests/arbgpuprog.c b/progs/tests/arbgpuprog.c
new file mode 100644 (file)
index 0000000..23aa899
--- /dev/null
@@ -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;
+}