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.

sotest.c 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. /*
  2. * GL_ARB_shader_objects & GL_ARB_vertex_shader interface test application.
  3. * Neither compiler nor executor is being tested here, although some simple shader
  4. * compilation tests are performed.
  5. *
  6. * Perfectly valid behaviour produces output that does not have a line
  7. * beginning with three stars (***).
  8. *
  9. * Author: Michal Krol
  10. */
  11. #include "framework.h"
  12. enum TEST_TYPE
  13. {
  14. TT_GETERROR_NOERROR,
  15. TT_GETERROR_INVALIDVALUE,
  16. TT_GETERROR_INVALIDOPERATION,
  17. TT_PARAM1_ZERO,
  18. TT_PARAM1_NONZERO
  19. };
  20. static enum TEST_TYPE current_test;
  21. static void begintest (enum TEST_TYPE type, const char *name)
  22. {
  23. current_test = type;
  24. printf ("\n BEGIN TEST: %s\n", name);
  25. while (glGetError () != GL_NO_ERROR)
  26. ;
  27. }
  28. static void endtest1 (GLuint param1)
  29. {
  30. const char *msg = NULL;
  31. switch (current_test)
  32. {
  33. case TT_GETERROR_NOERROR:
  34. if (glGetError () != GL_NO_ERROR)
  35. msg = "glGetError () does not return GL_NO_ERROR";
  36. break;
  37. case TT_GETERROR_INVALIDVALUE:
  38. if (glGetError () != GL_INVALID_VALUE)
  39. msg = "glGetError () does not return GL_INVALID_VALUE";
  40. break;
  41. case TT_GETERROR_INVALIDOPERATION:
  42. if (glGetError () != GL_INVALID_OPERATION)
  43. msg = "glGetError () does not return GL_INVALID_OPERATION";
  44. break;
  45. case TT_PARAM1_ZERO:
  46. if (param1)
  47. msg = "The parameter is not zero";
  48. break;
  49. case TT_PARAM1_NONZERO:
  50. if (!param1)
  51. msg = "The parameter is not non-zero";
  52. break;
  53. default:
  54. assert (0);
  55. }
  56. if (msg == NULL)
  57. printf (" OK\n");
  58. else
  59. printf ("*** %s\n", msg);
  60. while (glGetError () != GL_NO_ERROR)
  61. ;
  62. }
  63. static void endtest ()
  64. {
  65. endtest1 (0);
  66. }
  67. static GLhandleARB vert = 0;
  68. static GLhandleARB frag = 0;
  69. static GLhandleARB prog = 0;
  70. static GLhandleARB find_invalid_handle ()
  71. {
  72. GLhandleARB handle;
  73. for (handle = 1; handle < 16; handle++)
  74. if (handle != vert && handle != frag && handle != prog)
  75. return handle;
  76. assert (0);
  77. return 0;
  78. }
  79. static const char *invsynvertsrc =
  80. "void main () {\n"
  81. " gl_Position = gl_ModelViewMatrix ! gl_Vertex;\n" /* unexpected token */
  82. "}\n"
  83. ;
  84. static const char *invsemvertsrc =
  85. "void main () {\n"
  86. " gl_Position = gl_ModelviewMatrix * gl_Vertex;\n" /* undeclared identifier */
  87. "}\n"
  88. ;
  89. static const char *uniforms =
  90. "uniform vec4 CommonUniform;\n"
  91. ;
  92. static const char *validvertsrc =
  93. "uniform vec4 VertexUniform;\n"
  94. "attribute vec4 FirstAttrib;\n"
  95. "attribute vec4 SecondAttrib;\n"
  96. "void main () {\n"
  97. " gl_Position = gl_ModelViewMatrix * gl_Vertex + CommonUniform + VertexUniform\n"
  98. " + FirstAttrib + SecondAttrib;\n"
  99. "}\n"
  100. ;
  101. static const char *invsynfragsrc =
  102. "void main () {\n"
  103. " gl_FragColor = gl_Color\n" /* missing ; */
  104. "}\n"
  105. ;
  106. static const char *invsemfragsrc =
  107. "void main () {\n"
  108. " gl_FragColor = gl_FrontColor;\n" /* gl_FrontColor only in vertex shader */
  109. "}\n"
  110. ;
  111. static const char *validfragsrc =
  112. "uniform vec4 FragmentUniform;\n"
  113. "void main () {\n"
  114. " gl_FragColor = gl_Color + CommonUniform + FragmentUniform;\n"
  115. "}\n"
  116. ;
  117. void InitScene (void)
  118. {
  119. GLint params[1];
  120. const char *tab[2];
  121. /*
  122. * GL should silently ignore calls that delete object 0.
  123. */
  124. begintest (TT_GETERROR_NOERROR, "glDeleteObject(0)");
  125. glDeleteObjectARB (0);
  126. endtest ();
  127. /*
  128. * GL generates an error on invalid object handle.
  129. */
  130. begintest (TT_GETERROR_INVALIDVALUE, "Pass invalid non-zero object handle");
  131. glDeleteObjectARB (find_invalid_handle ());
  132. endtest ();
  133. glUseProgramObjectARB (find_invalid_handle ());
  134. endtest ();
  135. /*
  136. * Create object. GL should return unique non-zero values.
  137. */
  138. begintest (TT_PARAM1_NONZERO, "Create object");
  139. vert = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
  140. endtest1 (vert);
  141. frag = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
  142. endtest1 (frag);
  143. prog = glCreateProgramObjectARB ();
  144. endtest1 (prog);
  145. endtest1 (vert != frag && frag != prog && prog != vert);
  146. /*
  147. * Link empty program.
  148. */
  149. begintest (TT_PARAM1_NONZERO, "Link empty program");
  150. glLinkProgramARB (prog);
  151. endtest1 (CheckObjectStatus (prog));
  152. /*
  153. * Use empty program object. Empty program objects are valid.
  154. */
  155. begintest (TT_GETERROR_NOERROR, "Use empty program object");
  156. glUseProgramObjectARB (prog);
  157. endtest ();
  158. /*
  159. * Attach invalid object handles. Program object 0 should not be accepted.
  160. */
  161. begintest (TT_GETERROR_INVALIDVALUE, "Attach invalid object handle");
  162. glAttachObjectARB (0, find_invalid_handle ());
  163. endtest ();
  164. glAttachObjectARB (0, frag);
  165. endtest ();
  166. glAttachObjectARB (find_invalid_handle (), find_invalid_handle ());
  167. endtest ();
  168. glAttachObjectARB (find_invalid_handle (), frag);
  169. endtest ();
  170. glAttachObjectARB (prog, find_invalid_handle ());
  171. endtest ();
  172. /*
  173. * Attach valid object handles with wrong semantics.
  174. */
  175. begintest (TT_GETERROR_INVALIDOPERATION, "Attach object badly");
  176. glAttachObjectARB (vert, frag);
  177. endtest ();
  178. glAttachObjectARB (vert, prog);
  179. endtest ();
  180. glAttachObjectARB (prog, prog);
  181. endtest ();
  182. /*
  183. * Detach non-attached object.
  184. */
  185. begintest (TT_GETERROR_INVALIDOPERATION, "Detach non-attached object");
  186. glDetachObjectARB (prog, vert);
  187. endtest ();
  188. glDetachObjectARB (prog, frag);
  189. endtest ();
  190. /*
  191. * Attach shader.
  192. */
  193. begintest (TT_GETERROR_NOERROR, "Attach shader to program object");
  194. glAttachObjectARB (prog, vert);
  195. endtest ();
  196. glAttachObjectARB (prog, frag);
  197. endtest ();
  198. /*
  199. * Attach object twice.
  200. */
  201. begintest (TT_GETERROR_INVALIDOPERATION, "Attach object twice");
  202. glAttachObjectARB (prog, vert);
  203. endtest ();
  204. glAttachObjectARB (prog, frag);
  205. endtest ();
  206. /*
  207. * Detach attached object.
  208. */
  209. begintest (TT_GETERROR_NOERROR, "Detach attached object");
  210. glDetachObjectARB (prog, vert);
  211. endtest ();
  212. glDetachObjectARB (prog, frag);
  213. endtest ();
  214. /*
  215. * Attach shader again.
  216. */
  217. begintest (TT_GETERROR_NOERROR, "Attach shader again");
  218. glAttachObjectARB (prog, vert);
  219. endtest ();
  220. glAttachObjectARB (prog, frag);
  221. endtest ();
  222. /*
  223. * Delete attached object.
  224. */
  225. begintest (TT_GETERROR_NOERROR, "Delete attached object");
  226. glDeleteObjectARB (vert);
  227. endtest ();
  228. glDeleteObjectARB (frag);
  229. endtest ();
  230. /*
  231. * Query delete status. It should return TRUE. Object handles are still valid
  232. * as they are referenced by program object container.
  233. */
  234. begintest (TT_PARAM1_NONZERO, "Query delete status");
  235. glGetObjectParameterivARB (vert, GL_OBJECT_DELETE_STATUS_ARB, params);
  236. endtest1 (params[0]);
  237. glGetObjectParameterivARB (frag, GL_OBJECT_DELETE_STATUS_ARB, params);
  238. endtest1 (params[0]);
  239. /*
  240. * Delete already deleted attached object. The behaviour is undefined, but we
  241. * check for no errors. The object still exists, so the handle value is okay.
  242. * In other words, these calls should be silently ignored by GL.
  243. */
  244. begintest (TT_GETERROR_NOERROR, "Delete already deleted attached object");
  245. glDeleteObjectARB (vert);
  246. endtest ();
  247. glDeleteObjectARB (frag);
  248. endtest ();
  249. /*
  250. * Compile shader source with syntax error.
  251. */
  252. begintest (TT_PARAM1_ZERO, "Compile shader source with syntax error");
  253. glShaderSourceARB (vert, 1, &invsynvertsrc, NULL);
  254. glCompileShaderARB (vert);
  255. endtest1 (CheckObjectStatus (vert));
  256. glShaderSourceARB (frag, 1, &invsynfragsrc, NULL);
  257. glCompileShaderARB (frag);
  258. endtest1 (CheckObjectStatus (frag));
  259. /*
  260. * Compile shader source with semantic error.
  261. */
  262. begintest (TT_PARAM1_ZERO, "Compile shader source with semantic error");
  263. glShaderSourceARB (vert, 1, &invsemvertsrc, NULL);
  264. glCompileShaderARB (vert);
  265. endtest1 (CheckObjectStatus (vert));
  266. glShaderSourceARB (frag, 1, &invsemfragsrc, NULL);
  267. glCompileShaderARB (frag);
  268. endtest1 (CheckObjectStatus (frag));
  269. /*
  270. * Link ill-formed vertex-fragment program.
  271. */
  272. begintest (TT_PARAM1_ZERO, "Link ill-formed vertex-fragment program");
  273. glLinkProgramARB (prog);
  274. endtest1 (CheckObjectStatus (prog));
  275. /*
  276. * Use badly linked program object.
  277. */
  278. begintest (TT_GETERROR_INVALIDOPERATION, "Use badly linked program object");
  279. glUseProgramObjectARB (prog);
  280. endtest ();
  281. /*
  282. * Compile well-formed shader source. Check if multi-string sources can be handled.
  283. */
  284. begintest (TT_PARAM1_NONZERO, "Compile well-formed shader source");
  285. tab[0] = uniforms;
  286. tab[1] = validvertsrc;
  287. glShaderSourceARB (vert, 2, tab, NULL);
  288. glCompileShaderARB (vert);
  289. endtest1 (CheckObjectStatus (vert));
  290. tab[0] = uniforms;
  291. tab[1] = validfragsrc;
  292. glShaderSourceARB (frag, 2, tab, NULL);
  293. glCompileShaderARB (frag);
  294. endtest1 (CheckObjectStatus (frag));
  295. /*
  296. * Link vertex-fragment program.
  297. */
  298. begintest (TT_PARAM1_NONZERO, "Link vertex-fragment program");
  299. glLinkProgramARB (prog);
  300. endtest1 (CheckObjectStatus (prog));
  301. /*
  302. * Use valid linked program object.
  303. */
  304. begintest (TT_GETERROR_NOERROR, "Use linked program object");
  305. glUseProgramObjectARB (prog);
  306. endtest ();
  307. /*
  308. * Get current program.
  309. */
  310. begintest (TT_PARAM1_NONZERO, "Get current program");
  311. endtest1 (glGetHandleARB (GL_PROGRAM_OBJECT_ARB) == prog);
  312. /*
  313. * Use 0 program object.
  314. */
  315. begintest (TT_GETERROR_NOERROR, "Use 0 program object");
  316. glUseProgramObjectARB (0);
  317. endtest ();
  318. /*
  319. * Query uniform location. Uniforms with gl_ prefix cannot be queried.
  320. */
  321. begintest (TT_PARAM1_NONZERO, "Query uniform location");
  322. endtest1 (glGetUniformLocationARB (prog, "gl_ModelViewMatrix") == -1);
  323. endtest1 (glGetUniformLocationARB (prog, "UniformThatDoesNotExist") == -1);
  324. endtest1 (glGetUniformLocationARB (prog, "") == -1);
  325. endtest1 (glGetUniformLocationARB (prog, "CommonUniform") != -1);
  326. endtest1 (glGetUniformLocationARB (prog, "VertexUniform") != -1);
  327. endtest1 (glGetUniformLocationARB (prog, "FragmentUniform") != -1);
  328. /*
  329. * Query attrib location. Attribs with gl_ prefix cannot be queried.
  330. * When gl_Vertex is used, none of the generic attribs can have index 0.
  331. */
  332. begintest (TT_PARAM1_NONZERO, "Query attrib location");
  333. endtest1 (glGetAttribLocationARB (prog, "gl_Vertex") == -1);
  334. endtest1 (glGetAttribLocationARB (prog, "AttribThatDoesNotExist") == -1);
  335. endtest1 (glGetAttribLocationARB (prog, "") == -1);
  336. endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") > 0);
  337. endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") > 0);
  338. /*
  339. * Bind attrib locations, link and check if locations are correct.
  340. */
  341. begintest (TT_PARAM1_NONZERO, "Bind attrib location #1");
  342. glBindAttribLocationARB (prog, 1, "FirstAttrib");
  343. glBindAttribLocationARB (prog, 2, "SecondAttrib");
  344. glLinkProgramARB (prog);
  345. endtest1 (CheckObjectStatus (prog));
  346. endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") == 1);
  347. endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") == 2);
  348. /*
  349. * Bind attrib locations in different order. Link and check if locations are correct.
  350. */
  351. begintest (TT_PARAM1_NONZERO, "Bind attrib location #2");
  352. glBindAttribLocationARB (prog, 1, "SecondAttrib");
  353. glBindAttribLocationARB (prog, 2, "FirstAttrib");
  354. glLinkProgramARB (prog);
  355. endtest1 (CheckObjectStatus (prog));
  356. endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") == 1);
  357. endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") == 2);
  358. /*
  359. * Detach deleted object.
  360. */
  361. begintest (TT_GETERROR_NOERROR, "Detach deleted object");
  362. glDetachObjectARB (prog, vert);
  363. endtest ();
  364. glDetachObjectARB (prog, frag);
  365. endtest ();
  366. /*
  367. * Delete deleted detached object.
  368. */
  369. begintest (TT_GETERROR_INVALIDVALUE, "Delete deleted detached object");
  370. glDeleteObjectARB (vert);
  371. endtest ();
  372. glDeleteObjectARB (frag);
  373. endtest ();
  374. exit (0);
  375. }
  376. void RenderScene (void)
  377. {
  378. /* never reached */
  379. assert (0);
  380. }
  381. int main (int argc, char *argv[])
  382. {
  383. InitFramework (&argc, argv);
  384. return 0;
  385. }