ruby-glfw 0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. data/README +1 -0
  2. data/README.API +73 -0
  3. data/Rakefile +120 -0
  4. data/examples/boing.rb +519 -0
  5. data/examples/gears.rb +327 -0
  6. data/examples/keytest.rb +117 -0
  7. data/examples/listmodes.rb +20 -0
  8. data/examples/mipmaps.rb +104 -0
  9. data/examples/mipmaps.tga +0 -0
  10. data/examples/particles.rb +837 -0
  11. data/examples/pong3d.rb +741 -0
  12. data/examples/pong3d_field.tga +0 -0
  13. data/examples/pong3d_instr.tga +0 -0
  14. data/examples/pong3d_menu.tga +0 -0
  15. data/examples/pong3d_title.tga +0 -0
  16. data/examples/pong3d_winner1.tga +0 -0
  17. data/examples/pong3d_winner2.tga +0 -0
  18. data/examples/splitview.rb +432 -0
  19. data/examples/triangle.rb +89 -0
  20. data/examples/wave.rb +294 -0
  21. data/ext/glfw/glfw.c +1094 -0
  22. data/ext/glfw/mkrf_conf.rb +70 -0
  23. data/glfw-src/Makefile +220 -0
  24. data/glfw-src/compile.ami +61 -0
  25. data/glfw-src/compile.bat +217 -0
  26. data/glfw-src/compile.sh +607 -0
  27. data/glfw-src/docs/Makefile +57 -0
  28. data/glfw-src/docs/Reference.pdf +0 -0
  29. data/glfw-src/docs/UsersGuide.pdf +0 -0
  30. data/glfw-src/docs/cleanup.bat +22 -0
  31. data/glfw-src/docs/glfwdoc.sty +80 -0
  32. data/glfw-src/docs/glfwrm.tex +3034 -0
  33. data/glfw-src/docs/glfwug.tex +2024 -0
  34. data/glfw-src/docs/readme.txt +80 -0
  35. data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
  36. data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
  37. data/glfw-src/examples/Makefile.dos.djgpp +71 -0
  38. data/glfw-src/examples/Makefile.macosx.gcc +96 -0
  39. data/glfw-src/examples/Makefile.win32.bcc +75 -0
  40. data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
  41. data/glfw-src/examples/Makefile.win32.cygwin +79 -0
  42. data/glfw-src/examples/Makefile.win32.lcc +74 -0
  43. data/glfw-src/examples/Makefile.win32.mgw +75 -0
  44. data/glfw-src/examples/Makefile.win32.msvc +74 -0
  45. data/glfw-src/examples/Makefile.win32.ow +74 -0
  46. data/glfw-src/examples/Makefile.win32.pellesc +74 -0
  47. data/glfw-src/examples/Makefile.x11.in +54 -0
  48. data/glfw-src/examples/boing.c +606 -0
  49. data/glfw-src/examples/bundle.sh +46 -0
  50. data/glfw-src/examples/gears.c +382 -0
  51. data/glfw-src/examples/keytest.c +264 -0
  52. data/glfw-src/examples/listmodes.c +48 -0
  53. data/glfw-src/examples/mipmaps.c +126 -0
  54. data/glfw-src/examples/mipmaps.tga +0 -0
  55. data/glfw-src/examples/mtbench.c +301 -0
  56. data/glfw-src/examples/mthello.c +48 -0
  57. data/glfw-src/examples/particles.c +1148 -0
  58. data/glfw-src/examples/pong3d.c +839 -0
  59. data/glfw-src/examples/pong3d_field.tga +0 -0
  60. data/glfw-src/examples/pong3d_instr.tga +0 -0
  61. data/glfw-src/examples/pong3d_menu.tga +0 -0
  62. data/glfw-src/examples/pong3d_title.tga +0 -0
  63. data/glfw-src/examples/pong3d_winner1.tga +0 -0
  64. data/glfw-src/examples/pong3d_winner2.tga +0 -0
  65. data/glfw-src/examples/splitview.c +506 -0
  66. data/glfw-src/examples/triangle.c +108 -0
  67. data/glfw-src/examples/wave.c +397 -0
  68. data/glfw-src/images/opengl.gif +0 -0
  69. data/glfw-src/images/osicert.gif +0 -0
  70. data/glfw-src/include/GL/glfw.h +486 -0
  71. data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
  72. data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
  73. data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
  74. data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
  75. data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
  76. data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
  77. data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
  78. data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
  79. data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
  80. data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
  81. data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
  82. data/glfw-src/lib/amigaos/platform.h +337 -0
  83. data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
  84. data/glfw-src/lib/dos/dos_enable.c +51 -0
  85. data/glfw-src/lib/dos/dos_events.c +173 -0
  86. data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
  87. data/glfw-src/lib/dos/dos_glext.c +59 -0
  88. data/glfw-src/lib/dos/dos_init.c +105 -0
  89. data/glfw-src/lib/dos/dos_irq.s +246 -0
  90. data/glfw-src/lib/dos/dos_joystick.c +94 -0
  91. data/glfw-src/lib/dos/dos_keyboard.c +694 -0
  92. data/glfw-src/lib/dos/dos_mouse.c +337 -0
  93. data/glfw-src/lib/dos/dos_thread.c +267 -0
  94. data/glfw-src/lib/dos/dos_time.c +309 -0
  95. data/glfw-src/lib/dos/dos_window.c +563 -0
  96. data/glfw-src/lib/dos/platform.h +341 -0
  97. data/glfw-src/lib/enable.c +295 -0
  98. data/glfw-src/lib/fullscreen.c +95 -0
  99. data/glfw-src/lib/glext.c +201 -0
  100. data/glfw-src/lib/image.c +629 -0
  101. data/glfw-src/lib/init.c +108 -0
  102. data/glfw-src/lib/input.c +280 -0
  103. data/glfw-src/lib/internal.h +210 -0
  104. data/glfw-src/lib/joystick.c +101 -0
  105. data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
  106. data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
  107. data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
  108. data/glfw-src/lib/macosx/macosx_enable.c +42 -0
  109. data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
  110. data/glfw-src/lib/macosx/macosx_glext.c +52 -0
  111. data/glfw-src/lib/macosx/macosx_init.c +194 -0
  112. data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
  113. data/glfw-src/lib/macosx/macosx_thread.c +414 -0
  114. data/glfw-src/lib/macosx/macosx_time.c +112 -0
  115. data/glfw-src/lib/macosx/macosx_window.c +1279 -0
  116. data/glfw-src/lib/macosx/platform.h +349 -0
  117. data/glfw-src/lib/stream.c +194 -0
  118. data/glfw-src/lib/tga.c +405 -0
  119. data/glfw-src/lib/thread.c +340 -0
  120. data/glfw-src/lib/time.c +83 -0
  121. data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
  122. data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
  123. data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
  124. data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
  125. data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
  126. data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
  127. data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
  128. data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
  129. data/glfw-src/lib/win32/glfwdll.def +67 -0
  130. data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
  131. data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
  132. data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
  133. data/glfw-src/lib/win32/libglfw.pc.in +11 -0
  134. data/glfw-src/lib/win32/platform.h +474 -0
  135. data/glfw-src/lib/win32/win32_dllmain.c +60 -0
  136. data/glfw-src/lib/win32/win32_enable.c +155 -0
  137. data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
  138. data/glfw-src/lib/win32/win32_glext.c +85 -0
  139. data/glfw-src/lib/win32/win32_init.c +356 -0
  140. data/glfw-src/lib/win32/win32_joystick.c +234 -0
  141. data/glfw-src/lib/win32/win32_thread.c +511 -0
  142. data/glfw-src/lib/win32/win32_time.c +146 -0
  143. data/glfw-src/lib/win32/win32_window.c +1714 -0
  144. data/glfw-src/lib/window.c +727 -0
  145. data/glfw-src/lib/x11/Makefile.x11.in +243 -0
  146. data/glfw-src/lib/x11/platform.h +415 -0
  147. data/glfw-src/lib/x11/x11_enable.c +51 -0
  148. data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
  149. data/glfw-src/lib/x11/x11_glext.c +69 -0
  150. data/glfw-src/lib/x11/x11_init.c +275 -0
  151. data/glfw-src/lib/x11/x11_joystick.c +371 -0
  152. data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
  153. data/glfw-src/lib/x11/x11_thread.c +507 -0
  154. data/glfw-src/lib/x11/x11_time.c +154 -0
  155. data/glfw-src/lib/x11/x11_window.c +1746 -0
  156. data/glfw-src/license.txt +21 -0
  157. data/glfw-src/readme.html +927 -0
  158. data/glfw-src/support/d/examples/Makefile +59 -0
  159. data/glfw-src/support/d/examples/boing.d +610 -0
  160. data/glfw-src/support/d/examples/gears.d +379 -0
  161. data/glfw-src/support/d/examples/keytest.d +272 -0
  162. data/glfw-src/support/d/examples/listmodes.d +48 -0
  163. data/glfw-src/support/d/examples/mipmaps.d +126 -0
  164. data/glfw-src/support/d/examples/mtbench.d +304 -0
  165. data/glfw-src/support/d/examples/mthello.d +54 -0
  166. data/glfw-src/support/d/examples/particles.d +1150 -0
  167. data/glfw-src/support/d/examples/pong3d.d +840 -0
  168. data/glfw-src/support/d/examples/splitview.d +486 -0
  169. data/glfw-src/support/d/examples/triangle.d +108 -0
  170. data/glfw-src/support/d/examples/wave.d +400 -0
  171. data/glfw-src/support/d/imports/gl.d +4539 -0
  172. data/glfw-src/support/d/imports/glfw.d +349 -0
  173. data/glfw-src/support/d/imports/glu.d +328 -0
  174. data/glfw-src/support/d/lib/glfwdll.def +64 -0
  175. data/glfw-src/support/d/lib/glu32.def +56 -0
  176. data/glfw-src/support/d/lib/makefile +12 -0
  177. data/glfw-src/support/d/lib/opengl32.def +372 -0
  178. data/glfw-src/support/d/readme.html +83 -0
  179. data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
  180. data/glfw-src/support/delphi/lib/glfw.pas +437 -0
  181. data/glfw-src/support/delphi/readme.html +97 -0
  182. data/glfw-src/support/lua/examples/gears.lua +383 -0
  183. data/glfw-src/support/lua/examples/test1.lua +68 -0
  184. data/glfw-src/support/lua/readme.html +128 -0
  185. data/glfw-src/support/lua/src/luaglfw.c +1179 -0
  186. data/glfw-src/support/lua/src/luaglfw.h +48 -0
  187. data/glfw-src/support/lua/src/runlua.c +82 -0
  188. data/glfw-src/support/masm/examples/fpc.mac +47 -0
  189. data/glfw-src/support/masm/examples/makeit.bat +66 -0
  190. data/glfw-src/support/masm/examples/triangle.asm +232 -0
  191. data/glfw-src/support/masm/include/glfw.inc +326 -0
  192. data/glfw-src/support/masm/include/glu32.inc +55 -0
  193. data/glfw-src/support/masm/include/opengl32.inc +372 -0
  194. data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
  195. data/glfw-src/support/masm/readme.html +170 -0
  196. data/glfw-src/support/msvc80/GLFW.sln +26 -0
  197. data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
  198. data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
  199. data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
  200. data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
  201. data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
  202. data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
  203. data/glfw-src/support/visualbasic/readme.html +164 -0
  204. data/website/index.html +84 -0
  205. data/website/style.css +110 -0
  206. metadata +301 -0
@@ -0,0 +1,48 @@
1
+ //========================================================================
2
+ // This is a small test application for GLFW.
3
+ // The program lists all available fullscreen video modes.
4
+ //========================================================================
5
+
6
+ #include <stdio.h>
7
+ #include <GL/glfw.h>
8
+
9
+ // Maximum number of modes that we want to list
10
+ #define MAX_NUM_MODES 400
11
+
12
+
13
+ //========================================================================
14
+ // main()
15
+ //========================================================================
16
+
17
+ int main( void )
18
+ {
19
+ GLFWvidmode dtmode, modes[ MAX_NUM_MODES ];
20
+ int modecount, i;
21
+
22
+ // Initialize GLFW
23
+ if( !glfwInit() )
24
+ {
25
+ return 0;
26
+ }
27
+
28
+ // Show desktop video mode
29
+ glfwGetDesktopMode( &dtmode );
30
+ printf( "Desktop mode: %d x %d x %d\n\n",
31
+ dtmode.Width, dtmode.Height, dtmode.RedBits +
32
+ dtmode.GreenBits + dtmode.BlueBits );
33
+
34
+ // List available video modes
35
+ modecount = glfwGetVideoModes( modes, MAX_NUM_MODES );
36
+ printf( "Available modes:\n" );
37
+ for( i = 0; i < modecount; i ++ )
38
+ {
39
+ printf( "%3d: %d x %d x %d\n", i,
40
+ modes[i].Width, modes[i].Height, modes[i].RedBits +
41
+ modes[i].GreenBits + modes[i].BlueBits );
42
+ }
43
+
44
+ // Terminate GLFW
45
+ glfwTerminate();
46
+
47
+ return 0;
48
+ }
@@ -0,0 +1,126 @@
1
+ //========================================================================
2
+ // This is a small test application for GLFW.
3
+ // The program shows texture loading with mipmap generation and trilienar
4
+ // filtering.
5
+ // Note: For OpenGL 1.0 compability, we do not use texture objects (this
6
+ // is no issue, since we only have one texture).
7
+ //========================================================================
8
+
9
+ #include <stdio.h>
10
+ #include <GL/glfw.h>
11
+
12
+
13
+ //========================================================================
14
+ // main()
15
+ //========================================================================
16
+
17
+ int main( void )
18
+ {
19
+ int width, height, running, frames, x, y;
20
+ double t, t0, fps;
21
+ char titlestr[ 200 ];
22
+
23
+ // Initialise GLFW
24
+ glfwInit();
25
+
26
+ // Open OpenGL window
27
+ if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) )
28
+ {
29
+ glfwTerminate();
30
+ return 0;
31
+ }
32
+
33
+ // Enable sticky keys
34
+ glfwEnable( GLFW_STICKY_KEYS );
35
+
36
+ // Disable vertical sync (on cards that support it)
37
+ glfwSwapInterval( 0 );
38
+
39
+ // Load texture from file, and build all mipmap levels. The
40
+ // texture is automatically uploaded to texture memory.
41
+ if( !glfwLoadTexture2D( "mipmaps.tga", GLFW_BUILD_MIPMAPS_BIT ) )
42
+ {
43
+ glfwTerminate();
44
+ return 0;
45
+ }
46
+
47
+ // Use trilinear interpolation (GL_LINEAR_MIPMAP_LINEAR)
48
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
49
+ GL_LINEAR_MIPMAP_LINEAR );
50
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
51
+ GL_LINEAR );
52
+
53
+ // Enable texturing
54
+ glEnable( GL_TEXTURE_2D );
55
+
56
+ // Main loop
57
+ running = GL_TRUE;
58
+ frames = 0;
59
+ t0 = glfwGetTime();
60
+ while( running )
61
+ {
62
+ // Get time and mouse position
63
+ t = glfwGetTime();
64
+ glfwGetMousePos( &x, &y );
65
+
66
+ // Calculate and display FPS (frames per second)
67
+ if( (t-t0) > 1.0 || frames == 0 )
68
+ {
69
+ fps = (double)frames / (t-t0);
70
+ sprintf( titlestr, "Trilinear interpolation (%.1f FPS)", fps );
71
+ glfwSetWindowTitle( titlestr );
72
+ t0 = t;
73
+ frames = 0;
74
+ }
75
+ frames ++;
76
+
77
+ // Get window size (may be different than the requested size)
78
+ glfwGetWindowSize( &width, &height );
79
+ height = height > 0 ? height : 1;
80
+
81
+ // Set viewport
82
+ glViewport( 0, 0, width, height );
83
+
84
+ // Clear color buffer
85
+ glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
86
+ glClear( GL_COLOR_BUFFER_BIT );
87
+
88
+ // Select and setup the projection matrix
89
+ glMatrixMode( GL_PROJECTION );
90
+ glLoadIdentity();
91
+ gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f,
92
+ 50.0f );
93
+
94
+ // Select and setup the modelview matrix
95
+ glMatrixMode( GL_MODELVIEW );
96
+ glLoadIdentity();
97
+ gluLookAt( 0.0f, 3.0f, -20.0f, // Eye-position
98
+ 0.0f, -4.0f, -11.0f, // View-point
99
+ 0.0f, 1.0f, 0.0f ); // Up-vector
100
+
101
+ // Draw a textured quad
102
+ glRotatef( 0.05*(GLfloat)x + (GLfloat)t*5.0f, 0.0f, 1.0f, 0.0f );
103
+ glBegin( GL_QUADS );
104
+ glTexCoord2f( -20.0f, 20.0f );
105
+ glVertex3f( -50.0f, 0.0f, -50.0f );
106
+ glTexCoord2f( 20.0f, 20.0f );
107
+ glVertex3f( 50.0f, 0.0f, -50.0f );
108
+ glTexCoord2f( 20.0f, -20.0f );
109
+ glVertex3f( 50.0f, 0.0f, 50.0f );
110
+ glTexCoord2f( -20.0f, -20.0f );
111
+ glVertex3f( -50.0f, 0.0f, 50.0f );
112
+ glEnd();
113
+
114
+ // Swap buffers
115
+ glfwSwapBuffers();
116
+
117
+ // Check if the ESC key was pressed or the window was closed
118
+ running = !glfwGetKey( GLFW_KEY_ESC ) &&
119
+ glfwGetWindowParam( GLFW_OPENED );
120
+ }
121
+
122
+ // Close OpenGL window and terminate GLFW
123
+ glfwTerminate();
124
+
125
+ return 0;
126
+ }
@@ -0,0 +1,301 @@
1
+ //========================================================================
2
+ // Multithreading benchmark program, based on the GLFW multi threading
3
+ // support.
4
+ //
5
+ // This program can be used to get an idea of what to expect in terms of
6
+ // multithreading granularity performance.
7
+ //
8
+ // As a "bonus", this program demonstrates how to create a signal
9
+ // primitive using the GLFW mutex and condition variable primitives.
10
+ //
11
+ // Here are some benchmark results:
12
+ // (Note: these are not exact measurments, since they are subject to
13
+ // varying CPU-loads etc. Some tested systems are multi-user systems
14
+ // which were running under anything but optimal conditions)
15
+ //
16
+ // +------------+-------+-------------+-------------------+------------+
17
+ // | Processor | CPUs | OS | Context switches | Mean sleep |
18
+ // | | | | per second | time (ms) |
19
+ // +------------+-------+-------------+-------------------+------------+
20
+ // |Athlon | 1 | Linux | 161942 | 20.000 |
21
+ // |710 MHz | | 2.4.3 | | |
22
+ // +------------+-------+-------------+-------------------+------------+
23
+ // |Athlon | 1 | MS Win2k | 525230 | 10.014 |
24
+ // |710 MHz | | | | |
25
+ // +------------+-------+-------------+-------------------+------------+
26
+ // |Athlon | 1 | MS Win 98 | 23564 | 4.947 |
27
+ // |710 MHz | | | | |
28
+ // +------------+-------+-------------+-------------------+------------+
29
+ // |Pentium III | 1 | MS NT 4.0 | 304694 | 10.014 |
30
+ // |500 MHz | | | | |
31
+ // +------------+-------+-------------+-------------------+------------+
32
+ // |UltraSPARC2 | 6 | SunOS 5.6 | 120867 | 19.355 |
33
+ // |400 MHz | | | | |
34
+ // +------------+-------+-------------+-------------------+------------+
35
+ // |Alpha 21264 | 1 | OSF1 | 131993 | 3.097 |
36
+ // |500 MHz | | | | |
37
+ // +------------+-------+-------------+-------------------+------------+
38
+ // |Alpha 21264 | 2 | OSF1 | 40836 | 1.397 |
39
+ // |500 MHz | | | | |
40
+ // +------------+-------+-------------+-------------------+------------+
41
+ // |68020 (emu) | 1 | AmigaOS 3.1 | 50425 | 40.060 |
42
+ // |~200 MHz | | (WinUAE) | | |
43
+ // +------------+-------+-------------+-------------------+------------+
44
+ //
45
+ //========================================================================
46
+
47
+ #include <stdio.h>
48
+ #include <GL/glfw.h>
49
+
50
+
51
+ typedef struct {
52
+ GLFWcond cond;
53
+ GLFWmutex mutex;
54
+ int flag;
55
+ } signal_t;
56
+
57
+
58
+ signal_t gotoA, gotoB;
59
+
60
+ GLFWcond threadDone;
61
+ GLFWmutex doneMutex;
62
+ int doneCount;
63
+ int gotoACount, gotoBCount;
64
+
65
+ #define MAX_COUNT 10000
66
+
67
+
68
+ //------------------------------------------------------------------------
69
+ // InitSignal()
70
+ //------------------------------------------------------------------------
71
+
72
+ void InitSignal( signal_t *s )
73
+ {
74
+ s->cond = glfwCreateCond();
75
+ s->mutex = glfwCreateMutex();
76
+ s->flag = 0;
77
+ }
78
+
79
+
80
+ //------------------------------------------------------------------------
81
+ // KillSignal()
82
+ //------------------------------------------------------------------------
83
+
84
+ void KillSignal( signal_t *s )
85
+ {
86
+ glfwDestroyCond( s->cond );
87
+ glfwDestroyMutex( s->mutex );
88
+ s->flag = 0;
89
+ }
90
+
91
+
92
+ //------------------------------------------------------------------------
93
+ // WaitSignal()
94
+ //------------------------------------------------------------------------
95
+
96
+ void WaitSignal( signal_t *s )
97
+ {
98
+ glfwLockMutex( s->mutex );
99
+ while( !s->flag )
100
+ {
101
+ glfwWaitCond( s->cond, s->mutex, GLFW_INFINITY );
102
+ }
103
+ s->flag = 0;
104
+ glfwUnlockMutex( s->mutex );
105
+ }
106
+
107
+
108
+ //------------------------------------------------------------------------
109
+ // SetSignal()
110
+ //------------------------------------------------------------------------
111
+
112
+ void SetSignal( signal_t *s )
113
+ {
114
+ glfwLockMutex( s->mutex );
115
+ s->flag = 1;
116
+ glfwUnlockMutex( s->mutex );
117
+ glfwSignalCond( s->cond );
118
+ }
119
+
120
+
121
+ //------------------------------------------------------------------------
122
+ // threadAfun()
123
+ //------------------------------------------------------------------------
124
+
125
+ void GLFWCALL threadAfun( void * arg )
126
+ {
127
+ int done;
128
+
129
+ do
130
+ {
131
+ done = (gotoACount >= MAX_COUNT);
132
+ if( !done )
133
+ {
134
+ gotoACount ++;
135
+ SetSignal( &gotoB );
136
+ WaitSignal( &gotoA );
137
+ }
138
+ }
139
+ while( !done );
140
+
141
+ SetSignal( &gotoB );
142
+
143
+ glfwLockMutex( doneMutex );
144
+ doneCount ++;
145
+ glfwUnlockMutex( doneMutex );
146
+ glfwSignalCond( threadDone );
147
+ }
148
+
149
+
150
+ //------------------------------------------------------------------------
151
+ // threadBfun()
152
+ //------------------------------------------------------------------------
153
+
154
+ void GLFWCALL threadBfun( void * arg )
155
+ {
156
+ int done;
157
+
158
+ do
159
+ {
160
+ done = (gotoBCount >= MAX_COUNT);
161
+ if( !done )
162
+ {
163
+ gotoBCount ++;
164
+ SetSignal( &gotoA );
165
+ WaitSignal( &gotoB );
166
+ }
167
+ }
168
+ while( !done );
169
+
170
+ SetSignal( &gotoA );
171
+
172
+ glfwLockMutex( doneMutex );
173
+ doneCount ++;
174
+ glfwUnlockMutex( doneMutex );
175
+ glfwSignalCond( threadDone );
176
+ }
177
+
178
+
179
+
180
+ //------------------------------------------------------------------------
181
+ // main()
182
+ //------------------------------------------------------------------------
183
+
184
+ int main( void )
185
+ {
186
+ GLFWthread threadA, threadB;
187
+ double t1, t2, csps;
188
+ int done, count, i;
189
+
190
+ gotoACount = gotoBCount = doneCount = 0;
191
+
192
+ // Initialize GLFW
193
+ if( !glfwInit() )
194
+ {
195
+ return 0;
196
+ }
197
+
198
+ // Print some program information
199
+ printf( "\nMultithreading benchmarking program\n" );
200
+ printf( "-----------------------------------\n\n" );
201
+ printf( "This program consists of two tests. In the first test " );
202
+ printf( "two threads are created,\n" );
203
+ printf( "which continously signal/wait each other. This forces " );
204
+ printf( "the execution to\n" );
205
+ printf( "alternate between the two threads, and gives a measure " );
206
+ printf( "of the thread\n" );
207
+ printf( "synchronization granularity. In the second test, the " );
208
+ printf( "main thread is repeatedly\n" );
209
+ printf( "put to sleep for a very short interval using glfwSleep. " );
210
+ printf( "The average sleep time\n" );
211
+ printf( "is measured, which tells the minimum supported sleep " );
212
+ printf( "interval.\n\n" );
213
+ printf( "Results:\n" );
214
+ printf( "--------\n\n" );
215
+ printf( "Number of CPUs: %d\n\n", glfwGetNumberOfProcessors() );
216
+ fflush( stdout );
217
+
218
+
219
+ //------------------------------------------------------------------------
220
+ // 1) Benchmark thread synchronization granularity
221
+ //------------------------------------------------------------------------
222
+
223
+ // Init mutexes and conditions
224
+ doneMutex = glfwCreateMutex();
225
+ threadDone = glfwCreateCond();
226
+ InitSignal( &gotoA );
227
+ InitSignal( &gotoB );
228
+
229
+ // Create threads A & B
230
+ threadA = glfwCreateThread( threadAfun, NULL );
231
+ threadB = glfwCreateThread( threadBfun, NULL );
232
+ if( threadA == -1 || threadB == -1 )
233
+ {
234
+ glfwLockMutex( doneMutex );
235
+ doneCount = 2;
236
+ glfwUnlockMutex( doneMutex );
237
+ }
238
+
239
+ // Wait for both threads to be done
240
+ t1 = glfwGetTime();
241
+ glfwLockMutex( doneMutex );
242
+ do
243
+ {
244
+ done = (doneCount == 2);
245
+ if( !done )
246
+ {
247
+ glfwWaitCond( threadDone, doneMutex, GLFW_INFINITY );
248
+ }
249
+ }
250
+ while( !done );
251
+ glfwUnlockMutex( doneMutex );
252
+ t2 = glfwGetTime();
253
+
254
+ // Display results
255
+ count = gotoACount + gotoBCount;
256
+ csps = (double)count / (t2-t1);
257
+ printf( "Test 1: %.0f context switches / second (%.3f us/switch)\n",
258
+ csps, 1e6/csps );
259
+ fflush( stdout );
260
+
261
+ // Wait for threads to die
262
+ glfwWaitThread( threadA, GLFW_WAIT );
263
+ glfwWaitThread( threadB, GLFW_WAIT );
264
+
265
+ // Destroy mutexes and conditions
266
+ glfwDestroyMutex( doneMutex );
267
+ glfwDestroyCond( threadDone );
268
+ KillSignal( &gotoA );
269
+ KillSignal( &gotoB );
270
+
271
+
272
+ //------------------------------------------------------------------------
273
+ // 2) Benchmark thread sleep granularity
274
+ //------------------------------------------------------------------------
275
+
276
+ // Find an initial estimate
277
+ t1 = glfwGetTime();
278
+ for( i = 0; i < 10; i ++ )
279
+ {
280
+ glfwSleep( 0.0001 );
281
+ }
282
+ t2 = glfwGetTime();
283
+
284
+ // Sleep for roughly 1 s
285
+ count = (int)(1.0 / ((t2-t1)/10.0));
286
+ t1 = glfwGetTime();
287
+ for( i = 0; i < count; i ++ )
288
+ {
289
+ glfwSleep( 0.0001 );
290
+ }
291
+ t2 = glfwGetTime();
292
+
293
+ // Display results
294
+ printf( "Test 2: %.3f ms / sleep (mean)\n\n",
295
+ 1000.0 * (t2-t1) / (double)count );
296
+
297
+ // Terminate GLFW
298
+ glfwTerminate();
299
+
300
+ return 0;
301
+ }