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.

ugldrawpix.c 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. /*
  2. * glDrawPixels demo/test/benchmark
  3. *
  4. * Brian Paul September 25, 1997 This file is in the public domain.
  5. *
  6. * Conversion to UGL/Mesa by Stephane Raimbault july, 2001
  7. */
  8. /*
  9. * Revision 1.2 2001/09/10 19:21:13 brianp
  10. * WindML updates (Stephane Raimbault)
  11. *
  12. * Revision 1.1 2001/08/20 16:07:11 brianp
  13. * WindML driver (Stephane Raimbault)
  14. *
  15. * Revision 1.5 2000/12/24 22:53:54 pesco
  16. * * demos/Makefile.am (INCLUDES): Added -I$(top_srcdir)/util.
  17. * * demos/Makefile.X11, demos/Makefile.BeOS-R4, demos/Makefile.cygnus:
  18. * Essentially the same.
  19. * Program files updated to include "readtex.c", not "../util/readtex.c".
  20. * * demos/reflect.c: Likewise for "showbuffer.c".
  21. *
  22. *
  23. * * Makefile.am (EXTRA_DIST): Added top-level regular files.
  24. *
  25. * * include/GL/Makefile.am (INC_X11): Added glxext.h.
  26. *
  27. *
  28. * * src/GGI/include/ggi/mesa/Makefile.am (EXTRA_HEADERS): Include
  29. * Mesa GGI headers in dist even if HAVE_GGI is not given.
  30. *
  31. * * configure.in: Look for GLUT and demo source dirs in $srcdir.
  32. *
  33. * * src/swrast/Makefile.am (libMesaSwrast_la_SOURCES): Set to *.[ch].
  34. * More source list updates in various Makefile.am's.
  35. *
  36. * * Makefile.am (dist-hook): Remove CVS directory from distribution.
  37. * (DIST_SUBDIRS): List all possible subdirs here.
  38. * (SUBDIRS): Only list subdirs selected for build again.
  39. * The above two applied to all subdir Makefile.am's also.
  40. *
  41. * Revision 1.4 2000/09/08 21:45:21 brianp
  42. * added dither key option
  43. *
  44. * Revision 1.3 1999/10/28 18:23:29 brianp
  45. * minor changes to Usage() function
  46. *
  47. * Revision 1.2 1999/10/21 22:13:58 brianp
  48. * added f key to toggle front/back drawing
  49. *
  50. * Revision 1.1.1.1 1999/08/19 00:55:40 jtg
  51. * Imported sources
  52. *
  53. * Revision 3.3 1999/03/28 18:18:33 brianp
  54. * minor clean-up
  55. *
  56. * Revision 3.2 1998/11/05 04:34:04 brianp
  57. * moved image files to ../images/ directory
  58. *
  59. * Revision 3.1 1998/02/22 16:43:17 brianp
  60. * added a few casts to silence compiler warnings
  61. *
  62. * Revision 3.0 1998/02/14 18:42:29 brianp
  63. * initial rev
  64. *
  65. */
  66. #include <stdio.h>
  67. #include <stdlib.h>
  68. #include <math.h>
  69. #include <tickLib.h>
  70. #include <ugl/ugl.h>
  71. #include <ugl/uglucode.h>
  72. #include <ugl/uglevent.h>
  73. #include <ugl/uglinput.h>
  74. #include <GL/uglmesa.h>
  75. #include <GL/glu.h>
  76. #include "../util/readtex.h"
  77. #define IMAGE_FILE "Mesa/images/wrs_logo.rgb"
  78. UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId;
  79. UGL_LOCAL UGL_EVENT_Q_ID qId;
  80. UGL_LOCAL volatile UGL_BOOL stopWex;
  81. UGL_LOCAL UGL_MESA_CONTEXT umc;
  82. UGL_LOCAL int ImgWidth, ImgHeight;
  83. UGL_LOCAL GLenum ImgFormat;
  84. UGL_LOCAL GLubyte *Image;
  85. UGL_LOCAL int Xpos, Ypos;
  86. UGL_LOCAL int SkipPixels, SkipRows;
  87. UGL_LOCAL int DrawWidth, DrawHeight;
  88. UGL_LOCAL float Xzoom, Yzoom;
  89. UGL_LOCAL GLboolean Scissor;
  90. UGL_LOCAL GLboolean DrawFront;
  91. UGL_LOCAL GLboolean Dither;
  92. UGL_LOCAL void cleanUp (void);
  93. UGL_LOCAL void reset(void)
  94. {
  95. Xpos = Ypos = 20;
  96. DrawWidth = ImgWidth;
  97. DrawHeight = ImgHeight;
  98. SkipPixels = SkipRows = 0;
  99. Scissor = GL_FALSE;
  100. Xzoom = Yzoom = 1.0;
  101. }
  102. UGL_LOCAL void initGL(GLboolean ciMode, GLsizei width, GLsizei height)
  103. {
  104. printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
  105. printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
  106. printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
  107. Image = LoadRGBImage(IMAGE_FILE, &ImgWidth, &ImgHeight, &ImgFormat);
  108. if (!Image)
  109. {
  110. printf("Couldn't read %s\n", IMAGE_FILE);
  111. cleanUp();
  112. exit(1);
  113. }
  114. glScissor(width/4, height/4, width/2, height/2);
  115. if (ciMode)
  116. {
  117. /* Convert RGB image to grayscale */
  118. GLubyte *indexImage = malloc( ImgWidth * ImgHeight );
  119. GLint i;
  120. for (i=0; i<ImgWidth*ImgHeight; i++)
  121. {
  122. int gray = Image[i*3] + Image[i*3+1] + Image[i*3+2];
  123. indexImage[i] = gray / 3;
  124. }
  125. free(Image);
  126. Image = indexImage;
  127. ImgFormat = GL_COLOR_INDEX;
  128. for (i=0;i<255;i++)
  129. {
  130. float g = i / 255.0;
  131. uglMesaSetColor(i, g, g, g);
  132. }
  133. }
  134. printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
  135. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  136. glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
  137. reset();
  138. glViewport( 0, 0, width, height );
  139. glMatrixMode( GL_PROJECTION );
  140. glLoadIdentity();
  141. glOrtho( 0.0, width, 0.0, height, -1.0, 1.0 );
  142. glMatrixMode( GL_MODELVIEW );
  143. glLoadIdentity();
  144. }
  145. UGL_LOCAL void drawGL(void)
  146. {
  147. glClear(GL_COLOR_BUFFER_BIT);
  148. /* This allows negative raster positions: */
  149. glRasterPos2i(0, 0);
  150. glBitmap(0, 0, 0, 0, Xpos, Ypos, NULL);
  151. glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
  152. glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
  153. glPixelZoom( Xzoom, Yzoom );
  154. if (Scissor)
  155. glEnable(GL_SCISSOR_TEST);
  156. glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
  157. glDisable(GL_SCISSOR_TEST);
  158. uglMesaSwapBuffers();
  159. }
  160. UGL_LOCAL void benchmark( void )
  161. {
  162. int startTick, endTick, ticksBySec;
  163. int draws;
  164. double seconds, pixelsPerSecond;
  165. printf("Benchmarking (4 sec)...\n");
  166. /* GL set-up */
  167. glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
  168. glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
  169. glPixelZoom( Xzoom, Yzoom );
  170. if (Scissor)
  171. glEnable(GL_SCISSOR_TEST);
  172. if (DrawFront)
  173. glDrawBuffer(GL_FRONT);
  174. else
  175. glDrawBuffer(GL_BACK);
  176. /* Run timing test */
  177. draws = 0;
  178. ticksBySec = sysClkRateGet ();
  179. startTick = tickGet();
  180. do {
  181. glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
  182. draws++;
  183. endTick = tickGet ();
  184. } while ((endTick - startTick)/ticksBySec < 4); /* 4 seconds */
  185. /* GL clean-up */
  186. glDisable(GL_SCISSOR_TEST);
  187. /* Results */
  188. seconds = (endTick - startTick)/ticksBySec;
  189. pixelsPerSecond = draws * DrawWidth * DrawHeight / seconds;
  190. printf("Result: %d draws in %f seconds = %f pixels/sec\n",
  191. draws, seconds, pixelsPerSecond);
  192. }
  193. UGL_LOCAL void echoUse(void)
  194. {
  195. printf("Keys:\n");
  196. printf(" SPACE Reset Parameters\n");
  197. printf(" Up/Down Move image up/down\n");
  198. printf(" Left/Right Move image left/right\n");
  199. printf(" x Decrease X-axis PixelZoom\n");
  200. printf(" X Increase X-axis PixelZoom\n");
  201. printf(" y Decrease Y-axis PixelZoom\n");
  202. printf(" Y Increase Y-axis PixelZoom\n");
  203. printf(" w Decrease glDrawPixels width*\n");
  204. printf(" W Increase glDrawPixels width*\n");
  205. printf(" h Decrease glDrawPixels height*\n");
  206. printf(" H Increase glDrawPixels height*\n");
  207. printf(" p Decrease GL_UNPACK_SKIP_PIXELS*\n");
  208. printf(" P Increase GL_UNPACK_SKIP_PIXELS*\n");
  209. printf(" r Decrease GL_UNPACK_SKIP_ROWS*\n");
  210. printf(" R Increase GL_UNPACK_SKIP_ROWS*\n");
  211. printf(" s Toggle GL_SCISSOR_TEST\n");
  212. printf(" f Toggle front/back buffer drawing\n");
  213. printf(" d Toggle dithering\n");
  214. printf(" b Benchmark test\n");
  215. printf(" ESC Exit\n");
  216. printf("* Warning: no limits are imposed on these parameters so it's\n");
  217. printf(" possible to cause a segfault if you go too far.\n");
  218. }
  219. UGL_LOCAL void readKey(UGL_WCHAR key)
  220. {
  221. switch (key)
  222. {
  223. case UGL_UNI_SPACE:
  224. reset();
  225. break;
  226. case 'd':
  227. Dither = !Dither;
  228. if (Dither)
  229. glEnable(GL_DITHER);
  230. else
  231. glDisable(GL_DITHER);
  232. break;
  233. case 'w':
  234. if (DrawWidth > 0)
  235. DrawWidth--;
  236. break;
  237. case 'W':
  238. DrawWidth++;
  239. break;
  240. case 'h':
  241. if (DrawHeight > 0)
  242. DrawHeight--;
  243. break;
  244. case 'H':
  245. DrawHeight++;
  246. break;
  247. case 'p':
  248. if (SkipPixels > 0)
  249. SkipPixels--;
  250. break;
  251. case 'P':
  252. SkipPixels++;
  253. break;
  254. case 'r':
  255. if (SkipRows > 0)
  256. SkipRows--;
  257. break;
  258. case 'R':
  259. SkipRows++;
  260. break;
  261. case 's':
  262. Scissor = !Scissor;
  263. break;
  264. case 'x':
  265. Xzoom -= 0.1;
  266. break;
  267. case 'X':
  268. Xzoom += 0.1;
  269. break;
  270. case 'y':
  271. Yzoom -= 0.1;
  272. break;
  273. case 'Y':
  274. Yzoom += 0.1;
  275. break;
  276. case 'b':
  277. benchmark();
  278. break;
  279. case 'f':
  280. DrawFront = !DrawFront;
  281. if (DrawFront)
  282. glDrawBuffer(GL_FRONT);
  283. else
  284. glDrawBuffer(GL_BACK);
  285. printf("glDrawBuffer(%s)\n", DrawFront ? "GL_FRONT" : "GL_BACK");
  286. break;
  287. case UGL_UNI_UP_ARROW:
  288. Ypos += 1;
  289. break;
  290. case UGL_UNI_DOWN_ARROW:
  291. Ypos -= 1;
  292. break;
  293. case UGL_UNI_LEFT_ARROW:
  294. Xpos -= 1;
  295. break;
  296. case UGL_UNI_RIGHT_ARROW:
  297. Xpos += 1;
  298. break;
  299. case UGL_UNI_ESCAPE:
  300. stopWex = UGL_TRUE;
  301. break;
  302. }
  303. }
  304. UGL_LOCAL void loopEvent(void)
  305. {
  306. UGL_EVENT event;
  307. UGL_INPUT_EVENT * pInputEvent;
  308. UGL_FOREVER
  309. {
  310. if (uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT)
  311. != UGL_STATUS_Q_EMPTY)
  312. {
  313. pInputEvent = (UGL_INPUT_EVENT *)&event;
  314. if (pInputEvent->header.type == UGL_EVENT_TYPE_KEYBOARD &&
  315. pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
  316. readKey(pInputEvent->type.keyboard.key);
  317. }
  318. drawGL();
  319. if (stopWex)
  320. break;
  321. }
  322. }
  323. UGL_LOCAL void cleanUp (void)
  324. {
  325. uglEventQDestroy (eventServiceId, qId);
  326. uglMesaDestroyContext();
  327. uglDeinitialize ();
  328. }
  329. void windMLDrawPix (UGL_BOOL windMLMode);
  330. void ugldrawpix (void)
  331. {
  332. taskSpawn ("tDrawPix", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLDrawPix,
  333. UGL_FALSE,1,2,3,4,5,6,7,8,9);
  334. }
  335. void windMLDrawPix (UGL_BOOL windMLMode)
  336. {
  337. UGL_INPUT_DEVICE_ID keyboardDevId;
  338. GLuint ciMode;
  339. GLsizei width, height;
  340. Image = NULL;
  341. Scissor = GL_FALSE;
  342. DrawFront = GL_FALSE;
  343. Dither = GL_TRUE;
  344. uglInitialize ();
  345. uglDriverFind (UGL_KEYBOARD_TYPE, 0,
  346. (UGL_UINT32 *)&keyboardDevId);
  347. uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId);
  348. qId = uglEventQCreate (eventServiceId, 100);
  349. /* Double buffering */
  350. if (windMLMode)
  351. umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE
  352. | UGL_MESA_WINDML_EXCLUSIVE, NULL);
  353. else
  354. umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL);
  355. if (umc == NULL)
  356. {
  357. uglDeinitialize ();
  358. return;
  359. }
  360. uglMesaMakeCurrentContext(umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
  361. UGL_MESA_FULLSCREEN_HEIGHT);
  362. uglMesaGetIntegerv(UGL_MESA_COLOR_INDEXED, &ciMode);
  363. uglMesaGetIntegerv(UGL_MESA_WIDTH, &width);
  364. uglMesaGetIntegerv(UGL_MESA_HEIGHT, &height);
  365. initGL(ciMode, width, height);
  366. echoUse();
  367. stopWex = UGL_FALSE;
  368. loopEvent();
  369. cleanUp();
  370. free(Image);
  371. return;
  372. }