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.

arbvptest1.c 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* Test glGenProgramsARB(), glIsProgramARB(), glLoadProgramARB() */
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #define GL_GLEXT_PROTOTYPES
  8. #include <GL/glut.h>
  9. static void Display( void )
  10. {
  11. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  12. glPushMatrix();
  13. glBegin(GL_POLYGON);
  14. glVertexAttrib2fARB(0, -1, -1);
  15. glVertexAttrib2fARB(0, 1, -1);
  16. glVertexAttrib2fARB(0, 0, 1);
  17. glEnd();
  18. glPopMatrix();
  19. glutSwapBuffers();
  20. }
  21. static void Reshape( int width, int height )
  22. {
  23. glViewport( 0, 0, width, height );
  24. glMatrixMode( GL_PROJECTION );
  25. glLoadIdentity();
  26. glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
  27. glMatrixMode( GL_MODELVIEW );
  28. glLoadIdentity();
  29. glTranslatef( 0.0, 0.0, -15.0 );
  30. }
  31. static void Key( unsigned char key, int x, int y )
  32. {
  33. (void) x;
  34. (void) y;
  35. switch (key) {
  36. case 27:
  37. exit(0);
  38. break;
  39. }
  40. glutPostRedisplay();
  41. }
  42. static void load_program(const char *prog, GLuint prognum)
  43. {
  44. int a;
  45. GLint errorpos, errno;
  46. glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum);
  47. glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
  48. strlen(prog), (const GLubyte *) prog);
  49. assert(glIsProgramARB(prognum));
  50. errno = glGetError();
  51. printf("glGetError = %d\n", errno);
  52. if (errno != GL_NO_ERROR)
  53. {
  54. glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos);
  55. printf("errorpos: %d\n", errorpos);
  56. printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB));
  57. for (a=-10; a<10; a++)
  58. {
  59. if ((errorpos+a < 0) || (errorpos+a >= strlen(prog))) continue;
  60. printf("%c", prog[errorpos+a]);
  61. }
  62. printf("\n");
  63. exit(1);
  64. }
  65. }
  66. static void Init( void )
  67. {
  68. GLuint prognum[4];
  69. static const char *prog1 =
  70. "!!ARBvp1.0\n"
  71. "TEMP R0;\n"
  72. "MUL result.color.primary.xyz, R0, program.local[35]; \n"
  73. "END\n";
  74. static const char *prog2 =
  75. "!!ARBvp1.0\n"
  76. "#\n"
  77. "# c[0-3] = modelview projection (composite) matrix\n"
  78. "# c[32] = normalized light direction in object-space\n"
  79. "# c[35] = yellow diffuse material, (1.0, 1.0, 0.0, 1.0)\n"
  80. "# c[64].x = 0.0\n"
  81. "# c[64].z = 0.125, a scaling factor\n"
  82. "TEMP R0, R1;\n"
  83. "#\n"
  84. "# outputs diffuse illumination for color and perturbed position\n"
  85. "#\n"
  86. "DP3 R0, program.local[32], vertex.normal; # light direction DOT normal\n"
  87. "MUL result.color.primary.xyz, R0, program.local[35]; \n"
  88. "MAX R0, program.local[64].x, R0; \n"
  89. "MUL R0, R0, vertex.normal; \n"
  90. "MUL R0, R0, program.local[64].z; \n"
  91. "ADD R1, vertex.position, -R0; # perturb object space position\n"
  92. "DP4 result.position.x, state.matrix.mvp.row[3], R1; \n"
  93. "DP4 result.position.y, state.matrix.mvp.row[1], R1; \n"
  94. "DP4 result.position.z, state.matrix.mvp.row[2], R1; \n"
  95. "DP4 result.position.w, state.matrix.mvp.row[3], R1; \n"
  96. "END\n";
  97. static const char *prog3 =
  98. "!!ARBvp1.0\n"
  99. "TEMP R0, R1, R2, R3;\n"
  100. "DP4 result.position.x, state.matrix.mvp.row[0], vertex.position;\n"
  101. "DP4 result.position.y, state.matrix.mvp.row[1], vertex.position;\n"
  102. "DP4 result.position.z, state.matrix.mvp.row[2], vertex.position;\n"
  103. "DP4 result.position.w, state.matrix.mvp.row[3], vertex.position;\n"
  104. "DP3 R0.x, state.matrix.modelview.inverse.row[0], vertex.normal;\n"
  105. "DP3 R0.y, state.matrix.modelview.inverse.row[1], vertex.normal;\n"
  106. "DP3 R0.z, state.matrix.modelview.inverse.row[2], vertex.normal;\n"
  107. "DP3 R1.x, program.env[32], R0; # R1.x = Lpos DOT n'\n"
  108. "DP3 R1.y, program.env[33], R0; # R1.y = hHat DOT n'\n"
  109. "MOV R1.w, program.local[38].x; # R1.w = specular power\n"
  110. "LIT R2, R1; # Compute lighting values\n"
  111. "MAD R3, program.env[35].x, R2.y, program.env[35].y; # diffuse + emissive\n"
  112. "MAD result.color.primary.xyz, program.env[36], R2.z, R3; # + specular\n"
  113. "END\n";
  114. static const char *prog4 =
  115. "!!ARBvp1.0\n"
  116. "TEMP R2, R3;\n"
  117. "PARAM foo = {0., 0., 0., 1.};\n"
  118. "PARAM blah[] = { program.local[0..8] };\n"
  119. "ADDRESS A0;\n"
  120. "ARL A0.x, foo.x;\n"
  121. "DP4 R2, R3, blah[A0.x].x;\n"
  122. "DP4 R2, R3, blah[A0.x + 5];\n"
  123. "DP4 result.position, R3, blah[A0.x - 4];\n"
  124. "END\n";
  125. glGenProgramsARB(4, prognum);
  126. load_program(prog1, prognum[0]);
  127. load_program(prog2, prognum[1]);
  128. load_program(prog3, prognum[2]);
  129. load_program(prog4, prognum[3]);
  130. }
  131. int main( int argc, char *argv[] )
  132. {
  133. glutInit( &argc, argv );
  134. glutInitWindowPosition( 0, 0 );
  135. glutInitWindowSize( 250, 250 );
  136. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  137. glutCreateWindow(argv[0]);
  138. glutReshapeFunc( Reshape );
  139. glutKeyboardFunc( Key );
  140. glutDisplayFunc( Display );
  141. Init();
  142. glutMainLoop();
  143. return 0;
  144. }