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

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