Clone of mesa.
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

cltest.c 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * GL_ARB_shading_language_100 test application.
  3. *
  4. * Tests correctness of emited code. Runs multiple well-formed shaders and checks if
  5. * they produce valid results.
  6. *
  7. * Requires specific support on the GL implementation side. A special function printMESA()
  8. * must be supported in the language that prints current values of generic type
  9. * to the appropriate shader's info log, and optionally to the screen.
  10. *
  11. * Author: Michal Krol
  12. */
  13. #include "framework.h"
  14. #define EPSILON 0.0001f
  15. static GLhandleARB vert = 0;
  16. static GLhandleARB prog = 0;
  17. static int get_line (FILE *f, char *line, int size)
  18. {
  19. if (fgets (line, size, f) == NULL)
  20. return 0;
  21. if (line[strlen (line) - 1] == '\n')
  22. line[strlen (line) - 1] = '\0';
  23. return 1;
  24. }
  25. struct ATTRIB
  26. {
  27. char name[32];
  28. GLfloat value[64][4];
  29. GLuint count;
  30. };
  31. struct ATTRIBS
  32. {
  33. struct ATTRIB attrib[32];
  34. GLuint count;
  35. };
  36. struct SHADER
  37. {
  38. char code[16000];
  39. GLfloat output[1000];
  40. GLuint count;
  41. };
  42. enum SHADER_LOAD_STATE
  43. {
  44. SLS_NONE,
  45. SLS_CODE,
  46. SLS_OUTPUT
  47. };
  48. struct PROGRAM
  49. {
  50. struct PROGRAM *next;
  51. char name[256];
  52. struct ATTRIBS attribs;
  53. struct SHADER vertex;
  54. };
  55. enum PROGRAM_LOAD_STATE
  56. {
  57. PLS_NONE,
  58. PLS_ATTRIB,
  59. PLS_VERTEX
  60. };
  61. static struct PROGRAM *program = NULL;
  62. static void load_test_file (const char *filename, struct PROGRAM **program)
  63. {
  64. struct PROGRAM **currprog = program;
  65. FILE *f;
  66. char line[256];
  67. enum PROGRAM_LOAD_STATE pls = PLS_NONE;
  68. enum SHADER_LOAD_STATE sls = SLS_NONE;
  69. f = fopen (filename, "r");
  70. if (f == NULL)
  71. return;
  72. while (get_line (f, line, sizeof (line))) {
  73. if (line[0] == '$') {
  74. if (strncmp (line + 1, "program", 7) == 0) {
  75. if (*currprog != NULL)
  76. currprog = &(**currprog).next;
  77. *currprog = (struct PROGRAM *) (malloc (sizeof (struct PROGRAM)));
  78. if (*currprog == NULL)
  79. break;
  80. (**currprog).next = NULL;
  81. strcpy ((**currprog).name, line + 9);
  82. (**currprog).attribs.count = 0;
  83. (**currprog).vertex.code[0] = '\0';
  84. (**currprog).vertex.count = 0;
  85. pls = PLS_NONE;
  86. }
  87. else if (strncmp (line + 1, "attrib", 6) == 0) {
  88. if (*currprog == NULL)
  89. break;
  90. strcpy ((**currprog).attribs.attrib[(**currprog).attribs.count].name, line + 8);
  91. (**currprog).attribs.attrib[(**currprog).attribs.count].count = 0;
  92. (**currprog).attribs.count++;
  93. pls = PLS_ATTRIB;
  94. }
  95. else if (strcmp (line + 1, "vertex") == 0) {
  96. if (*currprog == NULL)
  97. break;
  98. pls = PLS_VERTEX;
  99. sls = SLS_NONE;
  100. }
  101. else if (strcmp (line + 1, "code") == 0) {
  102. if (*currprog == NULL || pls != PLS_VERTEX)
  103. break;
  104. sls = SLS_CODE;
  105. }
  106. else if (strcmp (line + 1, "output") == 0) {
  107. if (*currprog == NULL || pls != PLS_VERTEX)
  108. break;
  109. sls = SLS_OUTPUT;
  110. }
  111. }
  112. else {
  113. if ((*currprog == NULL || pls == PLS_NONE || sls == SLS_NONE) && line[0] != '\0')
  114. break;
  115. if (*currprog != NULL && pls == PLS_VERTEX) {
  116. if (sls == SLS_CODE) {
  117. strcat ((**currprog).vertex.code, line);
  118. strcat ((**currprog).vertex.code, "\n");
  119. }
  120. else if (sls == SLS_OUTPUT && line[0] != '\0') {
  121. if (strcmp (line, "true") == 0)
  122. (**currprog).vertex.output[(**currprog).vertex.count] = 1.0f;
  123. else if (strcmp (line, "false") == 0)
  124. (**currprog).vertex.output[(**currprog).vertex.count] = 0.0f;
  125. else
  126. sscanf (line, "%f", &(**currprog).vertex.output[(**currprog).vertex.count]);
  127. (**currprog).vertex.count++;
  128. }
  129. }
  130. else if (*currprog != NULL && pls == PLS_ATTRIB && line[0] != '\0') {
  131. struct ATTRIB *att = &(**currprog).attribs.attrib[(**currprog).attribs.count - 1];
  132. GLfloat *vec = att->value[att->count];
  133. sscanf (line, "%f %f %f %f", &vec[0], &vec[1], &vec[2], &vec[3]);
  134. att->count++;
  135. }
  136. }
  137. }
  138. fclose (f);
  139. }
  140. void InitScene (void)
  141. {
  142. prog = glCreateProgramObjectARB ();
  143. vert = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
  144. glAttachObjectARB (prog, vert);
  145. glDeleteObjectARB (vert);
  146. load_test_file ("cltest.txt", &program);
  147. }
  148. void RenderScene (void)
  149. {
  150. struct PROGRAM *nextprogram;
  151. char *code;
  152. GLint info_length, length;
  153. char output[65000], *p;
  154. GLuint i;
  155. if (program == NULL)
  156. exit (0);
  157. code = program->vertex.code;
  158. glShaderSourceARB (vert, 1, (const GLcharARB **) (&code), NULL);
  159. glCompileShaderARB (vert);
  160. CheckObjectStatus (vert);
  161. for (i = 0; i < program->attribs.count; i++) {
  162. const char *name = program->attribs.attrib[i].name;
  163. if (strcmp (name, "gl_Vertex") != 0)
  164. glBindAttribLocationARB (prog, i, name);
  165. }
  166. glLinkProgramARB (prog);
  167. CheckObjectStatus (prog);
  168. glUseProgramObjectARB (prog);
  169. printf ("\n--- %s\n", program->name);
  170. glGetObjectParameterivARB (vert, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_length);
  171. glBegin (GL_POINTS);
  172. if (program->attribs.count == 0) {
  173. glVertex2f (0.0f, 0.0f);
  174. }
  175. else {
  176. for (i = 0; i < program->attribs.attrib[0].count; i++) {
  177. GLuint j;
  178. for (j = 0; j < program->attribs.count; j++) {
  179. GLuint n = (j + 1) % program->attribs.count;
  180. GLfloat *vec = program->attribs.attrib[n].value[i];
  181. const char *name = program->attribs.attrib[n].name;
  182. if (strcmp (name, "gl_Vertex") == 0)
  183. glVertex4fv (vec);
  184. else
  185. glVertexAttrib4fvARB (n, vec);
  186. }
  187. }
  188. }
  189. glEnd ();
  190. glFlush ();
  191. glGetInfoLogARB (vert, sizeof (output), &length, output);
  192. p = output + info_length - 1;
  193. for (i = 0; i < program->vertex.count; i++) {
  194. GLfloat value;
  195. if (p == NULL) {
  196. printf ("*** %s\n", "I/O error");
  197. break;
  198. }
  199. if (strncmp (p, "true", 4) == 0)
  200. value = 1.0f;
  201. else if (strncmp (p, "false", 5) == 0)
  202. value = 0.0f;
  203. else if (sscanf (p, "%f", &value) != 1) {
  204. printf ("*** %s\n", "I/O error");
  205. break;
  206. }
  207. if (fabs (value - program->vertex.output[i]) > EPSILON) {
  208. printf ("*** Values are different, is %f, should be %f\n", value,
  209. program->vertex.output[i]);
  210. }
  211. p = strchr (p, '\n');
  212. if (p != NULL)
  213. p++;
  214. }
  215. if (p && *p != '\0')
  216. printf ("*** %s\n", "I/O error");
  217. nextprogram = program->next;
  218. free (program);
  219. program = nextprogram;
  220. }
  221. int main (int argc, char *argv[])
  222. {
  223. InitFramework (&argc, argv);
  224. return 0;
  225. }