Clone of mesa.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

fptest1.c 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. #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. 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. static const char *prog0 =
  47. "!!FP1.0\n"
  48. "MUL o[COLR], R0, f[WPOS]; \n"
  49. "ADD o[COLH], H3, f[TEX0]; \n"
  50. "ADD_SAT o[COLH], H3, f[TEX0]; \n"
  51. "ADDX o[COLH], H3, f[TEX0]; \n"
  52. "ADDHC o[COLH], H3, f[TEX0]; \n"
  53. "ADDXC o[COLH], H3, f[TEX0]; \n"
  54. "ADDXC_SAT o[COLH], H30, f[TEX0]; \n"
  55. "MUL o[COLR].xy, R0.wzyx, f[WPOS]; \n"
  56. "MUL o[COLR], H0, f[WPOS]; \n"
  57. "MUL o[COLR], -H0, f[WPOS]; \n"
  58. "MOV RC, H1; \n"
  59. "MOV HC, H2; \n"
  60. "END \n"
  61. ;
  62. /* masked updates, defines, declarations */
  63. static const char *prog1 =
  64. "!!FP1.0\n"
  65. "DEFINE foo = {1, 2, 3, 4}; \n"
  66. "DEFINE foo2 = 5; \n"
  67. "DECLARE foo3 = {5, 6, 7, 8}; \n"
  68. "DECLARE bar = 3; \n"
  69. "DECLARE bar2; \n"
  70. "DECLARE bar3 = bar; \n"
  71. "#DECLARE bar4 = { a, b, c, d }; \n"
  72. "MOV o[COLR].xy, R0; \n"
  73. "MOV o[COLR] (NE), R0; \n"
  74. "MOV o[COLR] (NE.wzyx), R0; \n"
  75. "MOV o[COLR].xy (NE.wzyx), R0; \n"
  76. "MOV RC.x (EQ), R1.x; \n"
  77. "KIL NE; \n"
  78. "KIL EQ.xyxy; \n"
  79. "END \n"
  80. ;
  81. /* texture instructions */
  82. static const char *prog2 =
  83. "!!FP1.0\n"
  84. "TEX R0, f[TEX0], TEX0, 2D; \n"
  85. "TEX R1, f[TEX1], TEX1, CUBE; \n"
  86. "TEX R2, f[TEX2], TEX2, 3D; \n"
  87. "TXP R3, f[TEX3], TEX3, RECT; \n"
  88. "TXD R3, R2, R1, f[TEX3], TEX3, RECT; \n"
  89. "MUL o[COLR], R0, f[COL0]; \n"
  90. "END \n"
  91. ;
  92. /* test negation, absolute value */
  93. static const char *prog3 =
  94. "!!FP1.0\n"
  95. "MOV R0, -R1; \n"
  96. "MOV R0, +R1; \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 o[COLR], R0; \n"
  104. "END \n"
  105. ;
  106. /* literal constant sources */
  107. static const char *prog4 =
  108. "!!FP1.0\n"
  109. "DEFINE Pi = 3.14159; \n"
  110. "MOV R0, {1, -2, +3, 4}; \n"
  111. "MOV R0, 5; \n"
  112. "MOV R0, -5; \n"
  113. "MOV R0, +5; \n"
  114. "MOV R0, Pi; \n"
  115. "MOV o[COLR], R0; \n"
  116. "END \n"
  117. ;
  118. /* change the fragment color in a simple way */
  119. static const char *prog10 =
  120. "!!FP1.0\n"
  121. "DEFINE blue = {0, 0, 1, 0};\n"
  122. "DECLARE color; \n"
  123. "MOV R0, f[COL0]; \n"
  124. "#ADD o[COLR], R0, f[COL0]; \n"
  125. "#ADD o[COLR], blue, f[COL0]; \n"
  126. "#ADD o[COLR], {1, 0, 0, 0}, f[COL0]; \n"
  127. "ADD o[COLR], color, f[COL0]; \n"
  128. "END \n"
  129. ;
  130. GLuint progs[20];
  131. if (!glutExtensionSupported ("GL_NV_fragment_program")) {
  132. printf("Sorry, this program requires GL_NV_fragment_program\n");
  133. exit(1);
  134. }
  135. glGenProgramsNV(20, progs);
  136. assert(progs[0]);
  137. assert(progs[1]);
  138. assert(progs[0] != progs[1]);
  139. #if 0
  140. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[0],
  141. strlen(prog0),
  142. (const GLubyte *) prog0);
  143. assert(glIsProgramNV(progs[0]));
  144. #endif
  145. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[1],
  146. strlen(prog1),
  147. (const GLubyte *) prog1);
  148. assert(glIsProgramNV(progs[1]));
  149. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2],
  150. strlen(prog2),
  151. (const GLubyte *) prog2);
  152. assert(glIsProgramNV(progs[2]));
  153. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[2]);
  154. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3],
  155. strlen(prog3),
  156. (const GLubyte *) prog3);
  157. assert(glIsProgramNV(progs[3]));
  158. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[3]);
  159. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4],
  160. strlen(prog4),
  161. (const GLubyte *) prog4);
  162. assert(glIsProgramNV(progs[4]));
  163. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[4]);
  164. /* a real program */
  165. glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10],
  166. strlen(prog10),
  167. (const GLubyte *) prog10);
  168. assert(glIsProgramNV(progs[10]));
  169. glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, progs[10]);
  170. glProgramNamedParameter4fNV(progs[10],
  171. strlen("color"), (const GLubyte *) "color",
  172. 1, 0, 0, 1);
  173. glEnable(GL_FRAGMENT_PROGRAM_NV);
  174. glEnable(GL_ALPHA_TEST);
  175. glAlphaFunc(GL_ALWAYS, 0.0);
  176. printf("glGetError = %d\n", (int) glGetError());
  177. }
  178. int main( int argc, char *argv[] )
  179. {
  180. glutInit( &argc, argv );
  181. glutInitWindowPosition( 0, 0 );
  182. glutInitWindowSize( 250, 250 );
  183. glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
  184. glutCreateWindow(argv[0]);
  185. glutReshapeFunc( Reshape );
  186. glutKeyboardFunc( Key );
  187. glutDisplayFunc( Display );
  188. Init();
  189. glutMainLoop();
  190. return 0;
  191. }