Clone of mesa.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

arbgpuprog.c 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /**
  2. * Just compile ARB vert/frag program from named file(s).
  3. */
  4. #include <assert.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <GL/glut.h>
  10. static GLuint FragProg;
  11. static GLuint VertProg;
  12. static GLint Win;
  13. static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB_func;
  14. static PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB_func;
  15. static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB_func;
  16. static PFNGLGENPROGRAMSARBPROC glGenProgramsARB_func;
  17. static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB_func;
  18. static PFNGLBINDPROGRAMARBPROC glBindProgramARB_func;
  19. static PFNGLISPROGRAMARBPROC glIsProgramARB_func;
  20. static PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB_func;
  21. static void Redisplay( void )
  22. {
  23. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  24. glutSwapBuffers();
  25. exit(0);
  26. }
  27. static void Reshape( int width, int height )
  28. {
  29. glViewport( 0, 0, width, height );
  30. glMatrixMode( GL_PROJECTION );
  31. glLoadIdentity();
  32. glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
  33. glMatrixMode( GL_MODELVIEW );
  34. glLoadIdentity();
  35. glTranslatef( 0.0, 0.0, -15.0 );
  36. }
  37. static void Key( unsigned char key, int x, int y )
  38. {
  39. (void) x;
  40. (void) y;
  41. switch (key) {
  42. case 27:
  43. glDeleteProgramsARB_func(1, &VertProg);
  44. glDeleteProgramsARB_func(1, &FragProg);
  45. glutDestroyWindow(Win);
  46. exit(0);
  47. break;
  48. }
  49. glutPostRedisplay();
  50. }
  51. /* A helper for finding errors in program strings */
  52. static int FindLine( const char *program, int position )
  53. {
  54. int i, line = 1;
  55. for (i = 0; i < position; i++) {
  56. if (program[i] == '\n')
  57. line++;
  58. }
  59. return line;
  60. }
  61. static void Init( const char *vertProgFile,
  62. const char *fragProgFile )
  63. {
  64. GLint errorPos;
  65. char buf[10*1000];
  66. if (!glutExtensionSupported("GL_ARB_vertex_program")) {
  67. printf("Sorry, this demo requires GL_ARB_vertex_program\n");
  68. exit(1);
  69. }
  70. if (!glutExtensionSupported("GL_ARB_fragment_program")) {
  71. printf("Sorry, this demo requires GL_ARB_fragment_program\n");
  72. exit(1);
  73. }
  74. printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
  75. /*
  76. * Get extension function pointers.
  77. */
  78. glProgramLocalParameter4fvARB_func = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
  79. assert(glProgramLocalParameter4fvARB_func);
  80. glProgramLocalParameter4dARB_func = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
  81. assert(glProgramLocalParameter4dARB_func);
  82. glGetProgramLocalParameterdvARB_func = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
  83. assert(glGetProgramLocalParameterdvARB_func);
  84. glGenProgramsARB_func = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
  85. assert(glGenProgramsARB_func);
  86. glProgramStringARB_func = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
  87. assert(glProgramStringARB_func);
  88. glBindProgramARB_func = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
  89. assert(glBindProgramARB_func);
  90. glIsProgramARB_func = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
  91. assert(glIsProgramARB_func);
  92. glDeleteProgramsARB_func = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
  93. assert(glDeleteProgramsARB_func);
  94. /*
  95. * Vertex program
  96. */
  97. if (vertProgFile) {
  98. FILE *f;
  99. int len;
  100. glGenProgramsARB_func(1, &VertProg);
  101. assert(VertProg > 0);
  102. glBindProgramARB_func(GL_VERTEX_PROGRAM_ARB, VertProg);
  103. f = fopen(vertProgFile, "r");
  104. if (!f) {
  105. printf("Unable to open %s\n", fragProgFile);
  106. exit(1);
  107. }
  108. len = fread(buf, 1, 10*1000,f);
  109. fclose(f);
  110. glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB,
  111. GL_PROGRAM_FORMAT_ASCII_ARB,
  112. len,
  113. (const GLubyte *) buf);
  114. glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
  115. if (glGetError() != GL_NO_ERROR || errorPos != -1) {
  116. int l = FindLine(buf, errorPos);
  117. printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
  118. (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
  119. exit(0);
  120. }
  121. else {
  122. glEnable(GL_VERTEX_PROGRAM_ARB);
  123. printf("Vertex Program OK\n");
  124. }
  125. }
  126. /*
  127. * Fragment program
  128. */
  129. if (fragProgFile) {
  130. FILE *f;
  131. int len;
  132. glGenProgramsARB_func(1, &FragProg);
  133. assert(FragProg > 0);
  134. glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, FragProg);
  135. f = fopen(fragProgFile, "r");
  136. if (!f) {
  137. printf("Unable to open %s\n", fragProgFile);
  138. exit(1);
  139. }
  140. len = fread(buf, 1, 10*1000,f);
  141. fclose(f);
  142. glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB,
  143. GL_PROGRAM_FORMAT_ASCII_ARB,
  144. len,
  145. (const GLubyte *) buf);
  146. glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
  147. if (glGetError() != GL_NO_ERROR || errorPos != -1) {
  148. int l = FindLine(buf, errorPos);
  149. printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
  150. (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
  151. exit(0);
  152. }
  153. else {
  154. glEnable(GL_FRAGMENT_PROGRAM_ARB);
  155. printf("Fragment Program OK\n");
  156. }
  157. }
  158. }
  159. int main( int argc, char *argv[] )
  160. {
  161. const char *vertProgFile = NULL, *fragProgFile = NULL;
  162. int i;
  163. glutInit( &argc, argv );
  164. glutInitWindowPosition( 0, 0 );
  165. glutInitWindowSize( 200, 200 );
  166. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  167. Win = glutCreateWindow(argv[0]);
  168. glutReshapeFunc( Reshape );
  169. glutKeyboardFunc( Key );
  170. glutDisplayFunc( Redisplay );
  171. if (argc == 1) {
  172. printf("arbgpuprog:\n");
  173. printf(" Compile GL_ARB_vertex/fragment_programs, report any errors.\n");
  174. printf("Usage:\n");
  175. printf(" arbgpuprog [--vp vertprogfile] [--fp fragprogfile]\n");
  176. exit(1);
  177. }
  178. for (i = 1; i < argc; i++) {
  179. if (strcmp(argv[i], "--vp") == 0) {
  180. vertProgFile = argv[i+1];
  181. i++;
  182. }
  183. else if (strcmp(argv[i], "--fp") == 0) {
  184. fragProgFile = argv[i+1];
  185. i++;
  186. }
  187. }
  188. Init(vertProgFile, fragProgFile);
  189. glutMainLoop();
  190. return 0;
  191. }