SDL_wingl.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_wingl.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /* WGL implementation of SDL OpenGL support */
  23. #include "SDL_opengl.h"
  24. #include "SDL_error.h"
  25. #include "SDL_lowvideo.h"
  26. #include "SDL_wingl_c.h"
  27. #ifdef HAVE_OPENGL
  28. #define DEFAULT_GL_DRIVER_PATH "OPENGL32.DLL"
  29. #endif
  30. int WIN_GL_SetupWindow(_THIS)
  31. {
  32. int retval;
  33. #ifdef HAVE_OPENGL
  34. int pixel_format;
  35. /* load the gl driver from a default path */
  36. if ( ! this->gl_config.driver_loaded ) {
  37. /* no driver has been loaded, use default (ourselves) */
  38. if ( WIN_GL_LoadLibrary(this, NULL) < 0 ) {
  39. return(-1);
  40. }
  41. }
  42. /* Get the window device context for our OpenGL drawing */
  43. GL_hdc = GetDC(SDL_Window);
  44. if ( GL_hdc == NULL ) {
  45. SDL_SetError("Unable to get DC for SDL_Window");
  46. return(-1);
  47. }
  48. /* Set up the pixel format descriptor with our needed format */
  49. memset(&GL_pfd, 0, sizeof(GL_pfd));
  50. GL_pfd.nSize = sizeof(GL_pfd);
  51. GL_pfd.nVersion = 1;
  52. GL_pfd.dwFlags = (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL);
  53. if ( this->gl_config.double_buffer ) {
  54. GL_pfd.dwFlags |= PFD_DOUBLEBUFFER;
  55. }
  56. GL_pfd.iPixelType = PFD_TYPE_RGBA;
  57. GL_pfd.cColorBits = this->gl_config.buffer_size;
  58. GL_pfd.cRedBits = this->gl_config.red_size;
  59. GL_pfd.cGreenBits = this->gl_config.green_size;
  60. GL_pfd.cBlueBits = this->gl_config.blue_size;
  61. GL_pfd.cAlphaBits = this->gl_config.alpha_size;
  62. GL_pfd.cAccumRedBits = this->gl_config.accum_red_size;
  63. GL_pfd.cAccumGreenBits = this->gl_config.accum_green_size;
  64. GL_pfd.cAccumBlueBits = this->gl_config.accum_blue_size;
  65. GL_pfd.cAccumAlphaBits = this->gl_config.accum_alpha_size;
  66. GL_pfd.cAccumBits =
  67. (GL_pfd.cAccumRedBits + GL_pfd.cAccumGreenBits +
  68.  GL_pfd.cAccumBlueBits + GL_pfd.cAccumAlphaBits);
  69. GL_pfd.cDepthBits = this->gl_config.depth_size;
  70. GL_pfd.cStencilBits = this->gl_config.stencil_size;
  71. /* Choose and set the closest available pixel format */
  72. pixel_format = ChoosePixelFormat(GL_hdc, &GL_pfd);
  73. if ( !pixel_format ) {
  74. SDL_SetError("No matching GL pixel format available");
  75. return(-1);
  76. }
  77. if( !SetPixelFormat(GL_hdc, pixel_format, &GL_pfd) ) {
  78. SDL_SetError("Unable to set HDC pixel format");
  79. return(-1);
  80. }
  81. DescribePixelFormat(GL_hdc, pixel_format, sizeof(GL_pfd), &GL_pfd);
  82. GL_hrc = this->gl_data->wglCreateContext(GL_hdc);
  83. if( GL_hrc == NULL ) {
  84. SDL_SetError("Unable to create GL context");
  85. return(-1);
  86. }
  87. gl_active = 1;
  88. #else
  89. SDL_SetError("WIN driver not configured with OpenGL");
  90. #endif
  91. if ( gl_active ) {
  92. retval = 0;
  93. } else {
  94. retval = -1;
  95. }
  96. return(retval);
  97. }
  98. void WIN_GL_ShutDown(_THIS)
  99. {
  100. #ifdef HAVE_OPENGL
  101. /* Clean up OpenGL */
  102. if ( GL_hrc ) {
  103. this->gl_data->wglMakeCurrent(NULL, NULL);
  104. this->gl_data->wglDeleteContext(GL_hrc);
  105. GL_hrc = NULL;
  106. }
  107. if ( GL_hdc ) {
  108. ReleaseDC(SDL_Window, GL_hdc);
  109. GL_hdc = NULL;
  110. }
  111. gl_active = 0;
  112. WIN_GL_UnloadLibrary(this);
  113. #endif /* HAVE_OPENGL */
  114. }
  115. #ifdef HAVE_OPENGL
  116. /* Make the current context active */
  117. int WIN_GL_MakeCurrent(_THIS)
  118. {
  119. int retval;
  120. retval = 0;
  121. if ( ! this->gl_data->wglMakeCurrent(GL_hdc, GL_hrc) ) {
  122. SDL_SetError("Unable to make GL context current");
  123. retval = -1;
  124. }
  125. return(retval);
  126. }
  127. /* Get attribute data from glX. */
  128. int WIN_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value)
  129. {
  130. int retval;
  131. retval = 0;
  132. switch( attrib ) {
  133.     case SDL_GL_RED_SIZE:
  134. *value = GL_pfd.cRedBits;
  135. break;
  136.     case SDL_GL_GREEN_SIZE:
  137. *value = GL_pfd.cGreenBits;
  138. break;
  139.     case SDL_GL_BLUE_SIZE:
  140. *value = GL_pfd.cBlueBits;
  141. break;
  142.     case SDL_GL_ALPHA_SIZE:
  143. *value = GL_pfd.cAlphaBits;
  144. break;
  145.     case SDL_GL_DOUBLEBUFFER:
  146. if ( GL_pfd.dwFlags & PFD_DOUBLEBUFFER ) {
  147. *value = 1;
  148. } else {
  149. *value = 0;
  150. }
  151. break;
  152.     case SDL_GL_BUFFER_SIZE:
  153. *value = GL_pfd.cColorBits;
  154. break;
  155.     case SDL_GL_DEPTH_SIZE:
  156. *value = GL_pfd.cDepthBits;
  157. break;
  158.     case SDL_GL_STENCIL_SIZE:
  159. *value = GL_pfd.cStencilBits;
  160. break;
  161.     case SDL_GL_ACCUM_RED_SIZE:
  162. *value = GL_pfd.cAccumRedBits;
  163. break;
  164.     case SDL_GL_ACCUM_GREEN_SIZE:
  165. *value = GL_pfd.cAccumGreenBits;
  166. break;
  167.     case SDL_GL_ACCUM_BLUE_SIZE:
  168. *value = GL_pfd.cAccumBlueBits;
  169. break;
  170.     case SDL_GL_ACCUM_ALPHA_SIZE:
  171. *value = GL_pfd.cAccumAlphaBits;
  172. break;
  173.     default:
  174. retval = -1;
  175. break;
  176. }
  177. return retval;
  178. }
  179. void WIN_GL_SwapBuffers(_THIS)
  180. {
  181. SwapBuffers(GL_hdc);
  182. }
  183. #endif /* HAVE_OPENGL */
  184. #ifdef HAVE_OPENGL
  185. void WIN_GL_UnloadLibrary(_THIS)
  186. {
  187. if ( this->gl_config.driver_loaded ) {
  188. FreeLibrary((HMODULE)this->gl_config.dll_handle);
  189. this->gl_data->wglGetProcAddress = NULL;
  190. this->gl_data->wglCreateContext = NULL;
  191. this->gl_data->wglDeleteContext = NULL;
  192. this->gl_data->wglMakeCurrent = NULL;
  193. this->gl_config.dll_handle = NULL;
  194. this->gl_config.driver_loaded = 0;
  195. }
  196. }
  197. /* Passing a NULL path means load pointers from the application */
  198. int WIN_GL_LoadLibrary(_THIS, const char* path) 
  199. {
  200. HMODULE handle;
  201.   if ( gl_active ) {
  202.   SDL_SetError("OpenGL context already created");
  203.   return -1;
  204.   }
  205. if ( path == NULL ) {
  206. path = DEFAULT_GL_DRIVER_PATH;
  207. }
  208. handle = LoadLibrary(path);
  209. if ( handle == NULL ) {
  210. SDL_SetError("Could not load OpenGL library");
  211. return -1;
  212. }
  213. /* Unload the old driver and reset the pointers */
  214. WIN_GL_UnloadLibrary(this);
  215. /* Load new function pointers */
  216. this->gl_data->wglGetProcAddress = (void * (WINAPI *)(const char *))
  217. GetProcAddress(handle, "wglGetProcAddress");
  218. this->gl_data->wglCreateContext = (HGLRC (WINAPI *)(HDC))
  219. GetProcAddress(handle, "wglCreateContext");
  220. this->gl_data->wglDeleteContext = (BOOL (WINAPI *)(HGLRC))
  221. GetProcAddress(handle, "wglDeleteContext");
  222. this->gl_data->wglMakeCurrent = (BOOL (WINAPI *)(HDC, HGLRC))
  223. GetProcAddress(handle, "wglMakeCurrent");
  224. if ( (this->gl_data->wglGetProcAddress == NULL) ||
  225.      (this->gl_data->wglCreateContext == NULL) ||
  226.      (this->gl_data->wglDeleteContext == NULL) ||
  227.      (this->gl_data->wglMakeCurrent == NULL) ) {
  228. SDL_SetError("Could not retrieve OpenGL functions");
  229. FreeLibrary(handle);
  230. return -1;
  231. }
  232. this->gl_config.dll_handle = handle;
  233. strcpy(this->gl_config.driver_path, path);
  234. this->gl_config.driver_loaded = 1;
  235. return 0;
  236. }
  237. void *WIN_GL_GetProcAddress(_THIS, const char* proc)
  238. {
  239. void *func;
  240. /* This is to pick up extensions */
  241. func = this->gl_data->wglGetProcAddress(proc);
  242. if ( ! func ) {
  243. /* This is probably a normal GL function */
  244. func = GetProcAddress(this->gl_config.dll_handle, proc);
  245. }
  246. return func;
  247. }
  248. #endif /* HAVE_OPENGL */