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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /* Test GL_NV_fragment_program */
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <GL/glew.h>
  8. #include <GL/glut.h>
  9. static void Display( void )
  10. {
  11. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  12. glPushMatrix();
  13. glColor4f(0, 0.5, 0, 1);
  14. glColor4f(0, 1, 0, 1);
  15. glBegin(GL_POLYGON);
  16. glVertex2f(-1, -1);
  17. glVertex2f( 1, -1);
  18. glVertex2f( 0, 1);
  19. glEnd();
  20. glPopMatrix();
  21. glutSwapBuffers();
  22. }
  23. static void Reshape( int width, int height )
  24. {
  25. glViewport( 0, 0, width, height );
  26. glMatrixMode( GL_PROJECTION );
  27. glLoadIdentity();
  28. glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
  29. glMatrixMode( GL_MODELVIEW );
  30. glLoadIdentity();
  31. glTranslatef( 0.0, 0.0, -15.0 );
  32. }
  33. static void Key( unsigned char key, int x, int y )
  34. {
  35. (void) x;
  36. (void) y;
  37. switch (key) {
  38. case 27:
  39. exit(0);
  40. break;
  41. }
  42. glutPostRedisplay();
  43. }
  44. static void Init( void )
  45. {
  46. #if 0
  47. static const char *prog0 =
  48. "!!FP1.0\n"
  49. "MUL o[COLR], R0, f[WPOS]; \n"
  50. "ADD o[COLH], H3, f[TEX0]; \n"
  51. "ADD_SAT o[COLH], H3, f[TEX0]; \n"
  52. "ADDX o[COLH], H3, f[TEX0]; \n"
  53. "ADDHC o[COLH], H3, f[TEX0]; \n"
  54. "ADDXC o[COLH], H3, f[TEX0]; \n"
  55. "ADDXC_SAT o[COLH], H30, f[TEX0]; \n"
  56. "MUL o[COLR].xy, R0.wzyx, f[WPOS]; \n"
  57. "MUL o[COLR], H0, f[WPOS]; \n"
  58. "MUL o[COLR], -H0, f[WPOS]; \n"
  59. "MOV RC, H1; \n"
  60. "MOV HC, H2; \n"
  61. "END \n"
  62. ;
  63. #endif
  64. /* masked updates, defines, declarations */
  65. static const char *prog1 =
  66. "!!FP1.0\n"
  67. "DEFINE foo = {1, 2, 3, 4}; \n"
  68. "DEFINE foo2 = 5; \n"
  69. "DECLARE foo3 = {5, 6, 7, 8}; \n"
  70. "DECLARE bar = 3; \n"
  71. "DECLARE bar2; \n"
  72. "DECLARE bar3 = bar; \n"
  73. "#DECLARE bar4 = { a, b, c, d }; \n"
  74. "MOV o[COLR].xy, R0; \n"
  75. "MOV o[COLR] (NE), R0; \n"
  76. "MOV o[COLR] (NE.wzyx), R0; \n"
  77. "MOV o[COLR].xy (NE.wzyx), R0; \n"
  78. "MOV RC.x (EQ), R1.x; \n"
  79. "KIL NE; \n"
  80. "KIL EQ.xyxy; \n"
  81. "END \n"
  82. ;
  83. /* texture instructions */
  84. static const char *prog2 =
  85. "!!FP1.0\n"
  86. "TEX R0, f[TEX0], TEX0, 2D; \n"
  87. "TEX R1, f[TEX1], TEX1, CUBE; \n"
  88. "TEX R2, f[TEX2], TEX2, 3D; \n"
  89. "TXP R3, f[TEX3], TEX3, RECT; \n"
  90. "TXD R3, R2, R1, f[TEX3], TEX3, RECT; \n"
  91. "MUL o[COLR], R0, f[COL0]; \n"
  92. "END \n"
  93. ;
  94. /* test negation, absolute value */
  95. static const char *prog3 =
  96. "!!FP1.0\n"
  97. "MOV R0, -R1; \n"
  98. "MOV R0, +R1; \n"
  99. "MOV R0, |-R1|; \n"
  100. "MOV R0, |+R1|; \n"
  101. "MOV R0, -|R1|; \n"
  102. "MOV R0, +|R1|; \n"
  103. "MOV R0, -|-R1|; \n"
  104. "MOV R0, -|+R1|; \n"
  105. "MOV o[COLR], R0; \n"
  106. "END \n"
  107. ;
  108. /* literal constant sources */
  109. static const char *prog4 =
  110. "!!FP1.0\n"
  111. "DEFINE Pi = 3.14159; \n"
  112. "MOV R0, {1, -2, +3, 4}; \n"
  113. "MOV R0, 5; \n"
  114. "MOV R0, -5; \n"
  115. "MOV R0, +5; \n"
  116. "MOV R0, Pi; \n"
  117. "MOV o[COLR], R0; \n"
  118. "END \n"
  119. ;
  120. /* change the fragment color in a simple way */
  121. static const char *prog10 =
  122. "!!FP1.0\n"
  123. "DEFINE blue = {0, 0, 1, 0};\n"
  124. "DECLARE color; \n"
  125. "MOV R0, f[COL0]; \n"
  126. "#ADD o[COLR], R0, f[COL0]; \n"
  127. "#ADD o[COLR], blue, f[COL0]; \n"
  128. "#ADD o[COLR], {1, 0, 0, 0}, f[COL0]; \n"
  129. "ADD o[COLR], color, f[COL0]; \n"
  130. "END \n"
  131. ;
  132. GLuint progs[20];
  133. if (!glutExtensionSupported ("GL_NV_fragment_program")) {
  134. printf("Sorry, this program requires GL_NV_fragment_program\n");
  135. exit(1);
  136. }
  137. glGenProgramsNV(20, progs);
  138. assert(progs[0]);
  139. assert(progs[1]);
  140. assert(progs[0] != progs[1]);
  141. #if 0
  142. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[0],
  143. strlen(prog0),
  144. (const GLubyte *) prog0);
  145. assert(glIsProgramNV(progs[0]));
  146. #endif
  147. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[1],
  148. strlen(prog1),
  149. (const GLubyte *) prog1);
  150. assert(glIsProgramNV(progs[1]));
  151. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2],
  152. strlen(prog2),
  153. (const GLubyte *) prog2);
  154. assert(glIsProgramNV(progs[2]));
  155. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2]);
  156. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3],
  157. strlen(prog3),
  158. (const GLubyte *) prog3);
  159. assert(glIsProgramNV(progs[3]));
  160. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3]);
  161. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4],
  162. strlen(prog4),
  163. (const GLubyte *) prog4);
  164. assert(glIsProgramNV(progs[4]));
  165. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4]);
  166. /* a real program */
  167. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10],
  168. strlen(prog10),
  169. (const GLubyte *) prog10);
  170. assert(glIsProgramNV(progs[10]));
  171. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10]);
  172. glProgramNamedParameter4fNV(progs[10],
  173. strlen("color"), (const GLubyte *) "color",
  174. 1, 0, 0, 1);
  175. glEnable(GL_FRAGMENT_PROGRAM_NV);
  176. glEnable(GL_ALPHA_TEST);
  177. glAlphaFunc(GL_ALWAYS, 0.0);
  178. printf("glGetError = %d\n", (int) glGetError());
  179. }
  180. int main( int argc, char *argv[] )
  181. {
  182. glutInit( &argc, argv );
  183. glutInitWindowPosition( 0, 0 );
  184. glutInitWindowSize( 250, 250 );
  185. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  186. glutCreateWindow(argv[0]);
  187. glewInit();
  188. glutReshapeFunc( Reshape );
  189. glutKeyboardFunc( Key );
  190. glutDisplayFunc( Display );
  191. Init();
  192. glutMainLoop();
  193. return 0;
  194. }