Clone of mesa.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /* $Id: glstate.c,v 1.1 1999/08/19 00:55:42 jtg Exp $ */
  2. /*
  3. * Print GL state information (for debugging)
  4. * Copyright (C) 1998 Brian Paul
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Library General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Library General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Library General Public
  17. * License along with this library; if not, write to the Free
  18. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. /*
  21. * $Log: glstate.c,v $
  22. * Revision 1.1 1999/08/19 00:55:42 jtg
  23. * Initial revision
  24. *
  25. * Revision 1.4 1999/06/19 01:36:43 brianp
  26. * more features added
  27. *
  28. * Revision 1.3 1999/02/24 05:16:20 brianp
  29. * added still more records to EnumTable
  30. *
  31. * Revision 1.2 1998/11/24 03:47:54 brianp
  32. * added more records to EnumTable
  33. *
  34. * Revision 1.1 1998/11/24 03:41:16 brianp
  35. * Initial revision
  36. *
  37. */
  38. #include <assert.h>
  39. #include <GL/gl.h>
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include "glstate.h"
  43. #define FLOAT 1
  44. #define INT 2
  45. #define DOUBLE 3
  46. #define BOOLEAN 4
  47. #define ENUM 5
  48. #define VOID 6
  49. #define LAST_TOKEN ~0
  50. struct EnumRecord {
  51. GLenum enumerator; /* GLenum constant */
  52. const char *string; /* string name */
  53. int getType; /* INT, FLOAT, DOUBLE, BOOLEAN, ENUM, or VOID */
  54. int getCount; /* number of values returned by the glGet*v() call */
  55. };
  56. /* XXX Lots more records to add here! Help, anyone? */
  57. static struct EnumRecord EnumTable[] = {
  58. { GL_ACCUM_RED_BITS, "GL_ACCUM_RED_BITS", INT, 1 },
  59. { GL_ACCUM_GREEN_BITS, "GL_ACCUM_GREEN_BITS", INT, 1 },
  60. { GL_ACCUM_BLUE_BITS, "GL_ACCUM_BLUE_BITS", INT, 1 },
  61. { GL_ACCUM_ALPHA_BITS, "GL_ACCUM_ALPHA_BITS", INT, 1 },
  62. { GL_ACCUM_CLEAR_VALUE, "GL_ACCUM_CLEAR_VALUE", FLOAT, 4 },
  63. { GL_ALPHA_BIAS, "GL_ALPHA_BIAS", FLOAT, 1 },
  64. { GL_ALPHA_BITS, "GL_ALPHA_BITS", INT, 1 },
  65. { GL_ALPHA_SCALE, "GL_ALPHA_SCALE", FLOAT, 1 },
  66. { GL_ALPHA_TEST, "GL_ALPHA_TEST", BOOLEAN, 1 },
  67. { GL_ALPHA_TEST_FUNC, "GL_ALPHA_TEST_FUNC", ENUM, 1 },
  68. { GL_ALWAYS, "GL_ALWAYS", ENUM, 0 },
  69. { GL_ALPHA_TEST_REF, "GL_ALPHA_TEST_REF", FLOAT, 1 },
  70. { GL_ATTRIB_STACK_DEPTH, "GL_ATTRIB_STACK_DEPTH", INT, 1 },
  71. { GL_AUTO_NORMAL, "GL_AUTO_NORMAL", BOOLEAN, 1 },
  72. { GL_AUX_BUFFERS, "GL_AUX_BUFFERS", INT, 1 },
  73. { GL_BLEND, "GL_BLEND", BOOLEAN, 1 },
  74. { GL_BLEND_DST, "GL_BLEND_DST", ENUM, 1 },
  75. { GL_BLEND_SRC, "GL_BLEND_SRC", ENUM, 1 },
  76. { GL_BLUE_BIAS, "GL_BLUE_BIAS", FLOAT, 1 },
  77. { GL_BLUE_BITS, "GL_BLUE_BITS", INT, 1 },
  78. { GL_BLUE_SCALE, "GL_BLUE_SCALE", FLOAT, 1 },
  79. { GL_CLAMP_TO_EDGE, "GL_CLAMP_TO_EDGE", ENUM, 0 },
  80. { GL_CLEAR, "GL_CLEAR", ENUM, 0 },
  81. { GL_CLIENT_ATTRIB_STACK_DEPTH, "GL_CLIENT_ATTRIB_STACK_DEPTH", INT, 1 },
  82. { GL_CLIP_PLANE0, "GL_CLIP_PLANE0", BOOLEAN, 1 },
  83. { GL_CLIP_PLANE1, "GL_CLIP_PLANE1", BOOLEAN, 1 },
  84. { GL_CLIP_PLANE2, "GL_CLIP_PLANE2", BOOLEAN, 1 },
  85. { GL_CLIP_PLANE3, "GL_CLIP_PLANE3", BOOLEAN, 1 },
  86. { GL_CLIP_PLANE4, "GL_CLIP_PLANE4", BOOLEAN, 1 },
  87. { GL_CLIP_PLANE5, "GL_CLIP_PLANE5", BOOLEAN, 1 },
  88. { GL_COEFF, "GL_COEEF", ENUM, 0 },
  89. { GL_COLOR, "GL_COLOR", ENUM, 0 },
  90. { GL_COLOR_BUFFER_BIT, "GL_COLOR_BUFFER_BIT", ENUM, 0 },
  91. { GL_COLOR_CLEAR_VALUE, "GL_COLOR_CLEAR_VALUE", FLOAT, 4 },
  92. { GL_COLOR_INDEX, "GL_COLOR_INDEX", ENUM, 0 },
  93. { GL_COLOR_MATERIAL, "GL_COLOR_MATERIAL", BOOLEAN, 1 },
  94. { GL_COLOR_MATERIAL_FACE, "GL_COLOR_MATERIAL_FACE", ENUM, 1 },
  95. { GL_COLOR_MATERIAL_PARAMETER, "GL_COLOR_MATERIAL_PARAMETER", ENUM, 1 },
  96. { GL_COLOR_WRITEMASK, "GL_COLOR_WRITEMASK", BOOLEAN, 4 },
  97. { GL_COMPILE, "GL_COMPILE", ENUM, 0 },
  98. { GL_COMPILE_AND_EXECUTE, "GL_COMPILE_AND_EXECUTE", ENUM, 0 },
  99. { GL_COPY, "GL_COPY", ENUM, 0 },
  100. { GL_COPY_INVERTED, "GL_COPY_INVERTED", ENUM, 0 },
  101. { GL_COPY_PIXEL_TOKEN, "GL_COPY_PIXEL_TOKEN", ENUM, 0 },
  102. { GL_CULL_FACE, "GL_CULL_FACE", BOOLEAN, 1 },
  103. { GL_CULL_FACE_MODE, "GL_CULL_FACE_MODE", ENUM, 1 },
  104. { GL_CURRENT_BIT, "GL_CURRENT_BIT", ENUM, 0 },
  105. { GL_CURRENT_COLOR, "GL_CURRENT_COLOR", FLOAT, 4 },
  106. { GL_CURRENT_INDEX, "GL_CURRENT_INDEX", INT, 1 },
  107. { GL_CURRENT_NORMAL, "GL_CURRENT_NORMAL", FLOAT, 3 },
  108. { GL_CURRENT_RASTER_COLOR, "GL_CURRENT_RASTER_COLOR", FLOAT, 4 },
  109. { GL_CURRENT_RASTER_DISTANCE, "GL_CURRENT_RASTER_DISTANCE", FLOAT, 1 },
  110. { GL_CURRENT_RASTER_INDEX, "GL_CURRENT_RASTER_INDEX", INT, 1 },
  111. { GL_CURRENT_RASTER_POSITION, "GL_CURRENT_RASTER_POSITION", FLOAT, 4 },
  112. { GL_CURRENT_RASTER_TEXTURE_COORDS, "GL_CURRENT_RASTER_TEXTURE_COORDS", FLOAT, 4 },
  113. { GL_CURRENT_RASTER_POSITION_VALID, "GL_CURRENT_RASTER_POSITION_VALID", BOOLEAN, 1 },
  114. { GL_CURRENT_TEXTURE_COORDS, "GL_CURRENT_TEXTURE_COORDS", FLOAT, 4 },
  115. { GL_CW, "GL_CW", ENUM, 0 },
  116. { GL_CCW, "GL_CCW", ENUM, 0 },
  117. { GL_DECAL, "GL_DECAL", ENUM, 0 },
  118. { GL_DECR, "GL_DECR", ENUM, 0 },
  119. { GL_DEPTH, "GL_DEPTH", ENUM, 0 },
  120. { GL_DEPTH_BIAS, "GL_DEPTH_BIAS", FLOAT, 1 },
  121. { GL_DEPTH_BITS, "GL_DEPTH_BITS", INT, 1 },
  122. { GL_DEPTH_BUFFER_BIT, "GL_DEPTH_BUFFER_BIT", ENUM, 0 },
  123. { GL_DEPTH_CLEAR_VALUE, "GL_DEPTH_CLEAR_VALUE", FLOAT, 1 },
  124. { GL_DEPTH_COMPONENT, "GL_DEPTH_COMPONENT", ENUM, 0 },
  125. { GL_DEPTH_FUNC, "GL_DEPTH_FUNC", ENUM, 1 },
  126. { GL_DEPTH_RANGE, "GL_DEPTH_RANGE", FLOAT, 2 },
  127. { GL_DEPTH_SCALE, "GL_DEPTH_SCALE", FLOAT, 1 },
  128. { GL_DEPTH_TEST, "GL_DEPTH_TEST", ENUM, 1 },
  129. { GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK", BOOLEAN, 1 },
  130. { GL_DIFFUSE, "GL_DIFFUSE", ENUM, 0 }, /*XXX*/
  131. { GL_DITHER, "GL_DITHER", BOOLEAN, 1 },
  132. { GL_DOMAIN, "GL_DOMAIN", ENUM, 0 },
  133. { GL_DONT_CARE, "GL_DONT_CARE", ENUM, 0 },
  134. { GL_DOUBLE, "GL_DOUBLE", ENUM, 0 },
  135. { GL_DOUBLEBUFFER, "GL_DOUBLEBUFFER", BOOLEAN, 1},
  136. { GL_DRAW_BUFFER, "GL_DRAW_BUFFER", ENUM, 1 },
  137. { GL_DRAW_PIXEL_TOKEN, "GL_DRAW_PIXEL_TOKEN", ENUM, 0 },
  138. { GL_DST_ALPHA, "GL_DST_ALPHA", ENUM, 0 },
  139. { GL_DST_COLOR, "GL_DST_COLOR", ENUM, 0 },
  140. { GL_EDGE_FLAG, "GL_EDGE_FLAG", BOOLEAN, 1 },
  141. /* XXX GL_EDGE_FLAG_ARRAY_* */
  142. { GL_EMISSION, "GL_EMISSION", ENUM, 0 }, /* XXX */
  143. { GL_ENABLE_BIT, "GL_ENABLE_BIT", ENUM, 0 },
  144. { GL_EQUAL, "GL_EQUAL", ENUM, 0 },
  145. { GL_EQUIV, "GL_EQUIV", ENUM, 0 },
  146. { GL_EVAL_BIT, "GL_EVAL_BIT", ENUM, 0 },
  147. { GL_EXP, "GL_EXP", ENUM, 0 },
  148. { GL_EXP2, "GL_EXP2", ENUM, 0 },
  149. { GL_EXTENSIONS, "GL_EXTENSIONS", ENUM, 0 },
  150. { GL_EYE_LINEAR, "GL_EYE_LINEAR", ENUM, 0 },
  151. { GL_EYE_PLANE, "GL_EYE_PLANE", ENUM, 0 },
  152. { GL_FALSE, "GL_FALSE", ENUM, 0 },
  153. { GL_FASTEST, "GL_FASTEST", ENUM, 0 },
  154. { GL_FEEDBACK, "GL_FEEDBACK", ENUM, 0 },
  155. { GL_FEEDBACK_BUFFER_POINTER, "GL_FEEDBACK_BUFFER_POINTER", VOID, 0 },
  156. { GL_FEEDBACK_BUFFER_SIZE, "GL_FEEDBACK_BUFFER_SIZE", INT, 1 },
  157. { GL_FEEDBACK_BUFFER_TYPE, "GL_FEEDBACK_BUFFER_TYPE", INT, 1 },
  158. { GL_FILL, "GL_FILL", ENUM, 0 },
  159. { GL_FLAT, "GL_FLAT", ENUM, 0 },
  160. { GL_FLOAT, "GL_FLOAT", ENUM, 0 },
  161. { GL_FOG, "GL_FOG", BOOLEAN, 1 },
  162. { GL_FOG_BIT, "GL_FOG_BIT", ENUM, 0 },
  163. { GL_FOG_COLOR, "GL_FOG_COLOR", FLOAT, 4 },
  164. { GL_FOG_DENSITY, "GL_FOG_DENSITY", FLOAT, 1 },
  165. { GL_FOG_END, "GL_FOG_END", FLOAT, 1 },
  166. { GL_FOG_HINT, "GL_FOG_HINT", ENUM, 1 },
  167. { GL_FOG_INDEX, "GL_FOG_INDEX", INT, 1 },
  168. { GL_FOG_MODE, "GL_FOG_MODE", ENUM, 1 },
  169. { GL_FOG_START, "GL_FOG_START", FLOAT, 1 },
  170. { GL_FRONT, "GL_FRONT", ENUM, 0 },
  171. { GL_FRONT_AND_BACK, "GL_FRONT_AND_BACK", ENUM, 0 },
  172. { GL_FRONT_FACE, "GL_FRONT_FACE", ENUM, 1 },
  173. { GL_FRONT_LEFT, "GL_FRONT_LEFT", ENUM, 0 },
  174. { GL_FRONT_RIGHT, "GL_FRONT_RIGHT", ENUM, 0 },
  175. { GL_GEQUAL, "GL_GEQUAL", ENUM, 0 },
  176. { GL_GREATER, "GL_GREATER", ENUM, 0 },
  177. { GL_GREEN, "GL_GREEN", ENUM, 0 },
  178. { GL_GREEN_BIAS, "GL_GREEN_BIAS", FLOAT, 1 },
  179. { GL_GREEN_BITS, "GL_GREEN_BITS", INT, 1 },
  180. { GL_GREEN_SCALE, "GL_GREEN_SCALE", FLOAT, 1 },
  181. { GL_LESS, "GL_LESS", ENUM, 0 },
  182. { GL_LEQUAL, "GL_LEQUAL", ENUM, 0 },
  183. { GL_LIGHTING, "GL_LIGHTING", BOOLEAN, 1 },
  184. { GL_LINE_SMOOTH, "GL_LINE_SMOOTH", BOOLEAN, 1 },
  185. { GL_LINE_STIPPLE, "GL_LINE_STIPPLE", BOOLEAN, 1 },
  186. { GL_LINE_STIPPLE_PATTERN, "GL_LINE_STIPPLE_PATTERN", INT, 1 },
  187. { GL_LINE_STIPPLE_REPEAT, "GL_LINE_STIPPLE_REPEAT", INT, 1 },
  188. { GL_LINE_WIDTH, "GL_LINE_WIDTH", FLOAT, 1 },
  189. { GL_MODELVIEW_MATRIX, "GL_MODELVIEW_MATRIX", DOUBLE, 16 },
  190. { GL_NEVER, "GL_NEVER", ENUM, 0 },
  191. { GL_NOTEQUAL, "GL_NOTEQUAL", ENUM, 0 },
  192. { GL_PROJECTION_MATRIX, "GL_PROJECTION_MATRIX", FLOAT, 16 },
  193. { GL_PACK_SWAP_BYTES, "GL_PACK_SWAP_BYTES", INT, 1 },
  194. { GL_PACK_LSB_FIRST, "GL_PACK_LSB_FIRST", INT, 1 },
  195. { GL_PACK_ROW_LENGTH, "GL_PACK_ROW_LENGTH", INT, 1 },
  196. { GL_PACK_SKIP_PIXELS, "GL_PACK_SKIP_PIXELS", INT, 1 },
  197. { GL_PACK_SKIP_ROWS, "GL_PACK_SKIP_ROWS", INT, 1 },
  198. { GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT", INT, 1 },
  199. { GL_TRUE, "GL_TRUE", ENUM, 0 },
  200. { GL_UNPACK_SWAP_BYTES, "GL_UNPACK_SWAP_BYTES", INT, 1 },
  201. { GL_UNPACK_LSB_FIRST, "GL_UNPACK_LSB_FIRST", INT, 1 },
  202. { GL_UNPACK_ROW_LENGTH, "GL_UNPACK_ROW_LENGTH", INT, 1 },
  203. { GL_UNPACK_SKIP_PIXELS, "GL_UNPACK_SKIP_PIXELS", INT, 1 },
  204. { GL_UNPACK_SKIP_ROWS, "GL_UNPACK_SKIP_ROWS", INT, 1 },
  205. { GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT", INT, 1 },
  206. { GL_VIEWPORT, "GL_VIEWPORT", INT, 4 },
  207. /*
  208. * Extensions
  209. */
  210. #if defined(GL_EXT_blend_minmax)
  211. { GL_BLEND_EQUATION_EXT, "GL_BLEND_EQUATION_EXT", ENUM, 1 },
  212. #endif
  213. #if defined(GL_EXT_blend_color)
  214. { GL_BLEND_COLOR_EXT, "GL_BLEND_COLOR_EXT", FLOAT, 4 },
  215. #endif
  216. #if defined(GL_EXT_point_parameters)
  217. { GL_DISTANCE_ATTENUATION_EXT, "GL_DISTANCE_ATTENUATION_EXT", FLOAT, 1 },
  218. #endif
  219. #if defined(GL_INGR_blend_func_separate)
  220. { GL_BLEND_SRC_RGB_INGR, "GL_BLEND_SRC_RGB_INGR", ENUM, 1 },
  221. { GL_BLEND_DST_RGB_INGR, "GL_BLEND_DST_RGB_INGR", ENUM, 1 },
  222. { GL_BLEND_SRC_ALPHA_INGR, "GL_BLEND_SRC_ALPHA_INGR", ENUM, 1 },
  223. { GL_BLEND_DST_ALPHA_INGR, "GL_BLEND_DST_ALPHA_INGR", ENUM, 1 },
  224. #endif
  225. { LAST_TOKEN, "", 0, 0 }
  226. };
  227. static const struct EnumRecord *FindRecord( GLenum var )
  228. {
  229. int i;
  230. for (i = 0; EnumTable[i].enumerator != LAST_TOKEN; i++) {
  231. if (EnumTable[i].enumerator == var) {
  232. return &EnumTable[i];
  233. }
  234. }
  235. return NULL;
  236. }
  237. /*
  238. * Return the string label for the given enum.
  239. */
  240. const char *GetEnumString( GLenum var )
  241. {
  242. const struct EnumRecord *rec = FindRecord(var);
  243. if (rec)
  244. return rec->string;
  245. else
  246. return NULL;
  247. }
  248. /*
  249. * Print current value of the given state variable.
  250. */
  251. void PrintState( int indent, GLenum var )
  252. {
  253. const struct EnumRecord *rec = FindRecord(var);
  254. while (indent-- > 0)
  255. putchar(' ');
  256. if (rec) {
  257. if (rec->getCount <= 0) {
  258. assert(rec->getType == ENUM);
  259. printf("%s is not a state variable\n", rec->string);
  260. }
  261. else {
  262. switch (rec->getType) {
  263. case INT:
  264. {
  265. GLint values[100];
  266. int i;
  267. glGetIntegerv(rec->enumerator, values);
  268. printf("%s = ", rec->string);
  269. for (i = 0; i < rec->getCount; i++)
  270. printf("%d ", values[i]);
  271. printf("\n");
  272. }
  273. break;
  274. case FLOAT:
  275. {
  276. GLfloat values[100];
  277. int i;
  278. glGetFloatv(rec->enumerator, values);
  279. printf("%s = ", rec->string);
  280. for (i = 0; i < rec->getCount; i++)
  281. printf("%f ", values[i]);
  282. printf("\n");
  283. }
  284. break;
  285. case DOUBLE:
  286. {
  287. GLdouble values[100];
  288. int i;
  289. glGetDoublev(rec->enumerator, values);
  290. printf("%s = ", rec->string);
  291. for (i = 0; i < rec->getCount; i++)
  292. printf("%f ", (float) values[i]);
  293. printf("\n");
  294. }
  295. break;
  296. case BOOLEAN:
  297. {
  298. GLboolean values[100];
  299. int i;
  300. glGetBooleanv(rec->enumerator, values);
  301. printf("%s = ", rec->string);
  302. for (i = 0; i < rec->getCount; i++)
  303. printf("%s ", values[i] ? "GL_TRUE" : "GL_FALSE");
  304. printf("\n");
  305. }
  306. break;
  307. case ENUM:
  308. {
  309. GLint values[100];
  310. int i;
  311. glGetIntegerv(rec->enumerator, values);
  312. printf("%s = ", rec->string);
  313. for (i = 0; i < rec->getCount; i++) {
  314. const char *str = GetEnumString((GLenum) values[i]);
  315. if (str)
  316. printf("%s ", str);
  317. else
  318. printf("??? ");
  319. }
  320. printf("\n");
  321. }
  322. break;
  323. case VOID:
  324. {
  325. GLvoid *values[100];
  326. int i;
  327. glGetPointerv(rec->enumerator, values);
  328. printf("%s = ", rec->string);
  329. for (i = 0; i < rec->getCount; i++) {
  330. printf("%p ", values[i]);
  331. }
  332. printf("\n");
  333. }
  334. break;
  335. default:
  336. printf("fatal error in PrintState()\n");
  337. abort();
  338. }
  339. }
  340. }
  341. else {
  342. printf("Unknown GLenum passed to PrintState()\n");
  343. }
  344. }
  345. /*
  346. * Print all glPixelStore-related state.
  347. * NOTE: Should write similar functions for lighting, texturing, etc.
  348. */
  349. void PrintPixelStoreState( void )
  350. {
  351. const GLenum enums[] = {
  352. GL_PACK_SWAP_BYTES,
  353. GL_PACK_LSB_FIRST,
  354. GL_PACK_ROW_LENGTH,
  355. GL_PACK_SKIP_PIXELS,
  356. GL_PACK_SKIP_ROWS,
  357. GL_PACK_ALIGNMENT,
  358. GL_UNPACK_SWAP_BYTES,
  359. GL_UNPACK_LSB_FIRST,
  360. GL_UNPACK_ROW_LENGTH,
  361. GL_UNPACK_SKIP_PIXELS,
  362. GL_UNPACK_SKIP_ROWS,
  363. GL_UNPACK_ALIGNMENT,
  364. 0
  365. };
  366. int i;
  367. printf("Pixel pack/unpack state:\n");
  368. for (i = 0; enums[i]; i++) {
  369. PrintState(3, enums[i]);
  370. }
  371. }
  372. /*
  373. * Print all state for the given attribute group.
  374. */
  375. void PrintAttribState( GLbitfield attrib )
  376. {
  377. static const GLenum depth_buffer_enums[] = {
  378. GL_DEPTH_FUNC,
  379. GL_DEPTH_CLEAR_VALUE,
  380. GL_DEPTH_TEST,
  381. GL_DEPTH_WRITEMASK,
  382. 0
  383. };
  384. static const GLenum fog_enums[] = {
  385. GL_FOG,
  386. GL_FOG_COLOR,
  387. GL_FOG_DENSITY,
  388. GL_FOG_START,
  389. GL_FOG_END,
  390. GL_FOG_INDEX,
  391. GL_FOG_MODE,
  392. 0
  393. };
  394. static const GLenum line_enums[] = {
  395. GL_LINE_SMOOTH,
  396. GL_LINE_STIPPLE,
  397. GL_LINE_STIPPLE_PATTERN,
  398. GL_LINE_STIPPLE_REPEAT,
  399. GL_LINE_WIDTH,
  400. 0
  401. };
  402. const GLenum *enumList = NULL;
  403. switch (attrib) {
  404. case GL_DEPTH_BUFFER_BIT:
  405. enumList = depth_buffer_enums;
  406. printf("GL_DEPTH_BUFFER_BIT state:\n");
  407. break;
  408. case GL_FOG_BIT:
  409. enumList = fog_enums;
  410. printf("GL_FOG_BIT state:\n");
  411. break;
  412. case GL_LINE_BIT:
  413. enumList = line_enums;
  414. printf("GL_LINE_BIT state:\n");
  415. break;
  416. default:
  417. printf("Bad value in PrintAttribState()\n");
  418. }
  419. if (enumList) {
  420. int i;
  421. for (i = 0; enumList[i]; i++)
  422. PrintState(3, enumList[i]);
  423. }
  424. }
  425. /*#define TEST*/
  426. #ifdef TEST
  427. #include <GL/glut.h>
  428. int main( int argc, char *argv[] )
  429. {
  430. glutInit( &argc, argv );
  431. glutInitWindowPosition(0, 0);
  432. glutInitWindowSize(400, 300);
  433. glutInitDisplayMode(GLUT_RGB);
  434. glutCreateWindow(argv[0]);
  435. PrintAttribState(GL_DEPTH_BUFFER_BIT);
  436. PrintAttribState(GL_FOG_BIT);
  437. PrintAttribState(GL_LINE_BIT);
  438. PrintState(0, GL_ALPHA_BITS);
  439. PrintState(0, GL_VIEWPORT);
  440. PrintState(0, GL_ALPHA_TEST_FUNC);
  441. PrintState(0, GL_MODELVIEW_MATRIX);
  442. PrintState(0, GL_ALWAYS);
  443. PrintPixelStoreState();
  444. return 0;
  445. }
  446. #endif