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

流媒体/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_cgxgl.c,v 1.4 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. /* StormMesa implementation of SDL OpenGL support */
  23. #include "SDL_error.h"
  24. #include "SDL_cgxgl_c.h"
  25. #include "SDL_cgxvideo.h"
  26. #ifdef HAVE_OPENGL
  27. AmigaMesaContext glcont=NULL;
  28. #endif
  29. /* Init OpenGL */
  30. int CGX_GL_Init(_THIS)
  31. {
  32. #ifdef HAVE_OPENGL
  33.    int i = 0;
  34. struct TagItem attributes [ 14 ]; /* 14 should be more than enough :) */
  35.    struct Window *win = (struct Window *)SDL_Window;
  36. // default config. Always used...
  37. attributes[i].ti_Tag = AMA_Window; attributes[i++].ti_Data = (unsigned long)win;
  38. attributes[i].ti_Tag = AMA_Left; attributes[i++].ti_Data = 0;
  39. attributes[i].ti_Tag = AMA_Bottom; attributes[i++].ti_Data = 0;
  40. attributes[i].ti_Tag = AMA_Width; attributes[i++].ti_Data = win->Width-win->BorderLeft-win->BorderRight;
  41. attributes[i].ti_Tag = AMA_Height; attributes[i++].ti_Data = win->Height-win->BorderBottom-win->BorderTop;
  42. attributes[i].ti_Tag = AMA_DirectRender; attributes[i++].ti_Data = GL_TRUE;
  43. // double buffer ?
  44. attributes[i].ti_Tag = AMA_DoubleBuf;
  45. if ( this->gl_config.double_buffer ) {
  46. attributes[i++].ti_Data = GL_TRUE;
  47. }
  48. else {
  49. attributes[i++].ti_Data = GL_FALSE;
  50. }
  51. // RGB(A) Mode ?
  52. attributes[i].ti_Tag = AMA_RGBMode;
  53. if ( this->gl_config.red_size   != 0 &&
  54.      this->gl_config.blue_size  != 0 &&
  55.      this->gl_config.green_size != 0 ) {
  56. attributes[i++].ti_Data = GL_TRUE;
  57. }
  58. else {
  59. attributes[i++].ti_Data = GL_FALSE;
  60. }
  61. // no depth buffer ?
  62. if ( this->gl_config.depth_size == 0 ) {
  63. attributes[i].ti_Tag = AMA_NoDepth;
  64. attributes[i++].ti_Data = GL_TRUE;
  65. }
  66. // no stencil buffer ?
  67. if ( this->gl_config.stencil_size == 0 ) {
  68. attributes[i].ti_Tag = AMA_NoStencil;
  69. attributes[i++].ti_Data = GL_TRUE;
  70. }
  71. // no accum buffer ?
  72. if ( this->gl_config.accum_red_size   != 0 &&
  73.      this->gl_config.accum_blue_size  != 0 &&
  74.      this->gl_config.accum_green_size != 0 ) {
  75. attributes[i].ti_Tag = AMA_NoAccum;
  76. attributes[i++].ti_Data = GL_TRUE;
  77. }
  78. // done...
  79. attributes[i].ti_Tag = TAG_DONE;
  80. glcont = AmigaMesaCreateContext(attributes);
  81. if ( glcont == NULL ) {
  82. SDL_SetError("Couldn't create OpenGL context");
  83. return(-1);
  84. }
  85. this->gl_data->gl_active = 1;
  86. this->gl_config.driver_loaded = 1;
  87. return(0);
  88. #else
  89. SDL_SetError("OpenGL support not configured");
  90. return(-1);
  91. #endif
  92. }
  93. /* Quit OpenGL */
  94. void CGX_GL_Quit(_THIS)
  95. {
  96. #ifdef HAVE_OPENGL
  97. if ( glcont != NULL ) {
  98. AmigaMesaDestroyContext(glcont);
  99. glcont = NULL;
  100. this->gl_data->gl_active = 0;
  101. this->gl_config.driver_loaded = 0;
  102. }
  103. #endif
  104. }
  105. /* Attach context to another window */
  106. int CGX_GL_Update(_THIS)
  107. {
  108. #ifdef HAVE_OPENGL
  109. struct TagItem tags[2];
  110. struct Window *win = (struct Window*)SDL_Window;
  111. if(glcont == NULL) {
  112. return -1; //should never happen
  113. }
  114. tags[0].ti_Tag = AMA_Window;
  115. tags[0].ti_Data = (unsigned long)win;
  116. tags[1].ti_Tag = TAG_DONE;
  117. AmigaMesaSetRast(glcont, tags);
  118. return 0;
  119. #else
  120. SDL_SetError("OpenGL support not configured");
  121. return -1;
  122. #endif
  123. }
  124. #ifdef HAVE_OPENGL
  125. /* Make the current context active */
  126. int CGX_GL_MakeCurrent(_THIS)
  127. {
  128. if(glcont == NULL)
  129. return -1;
  130. AmigaMesaMakeCurrent(glcont, glcont->buffer);
  131. return 0;
  132. }
  133. void CGX_GL_SwapBuffers(_THIS)
  134. {
  135. AmigaMesaSwapBuffers(glcont);
  136. }
  137. int CGX_GL_GetAttribute(_THIS, SDL_GLattr attrib, int* value) {
  138. GLenum mesa_attrib;
  139. switch(attrib) {
  140. case SDL_GL_RED_SIZE:
  141. mesa_attrib = GL_RED_BITS;
  142. break;
  143. case SDL_GL_GREEN_SIZE:
  144. mesa_attrib = GL_GREEN_BITS;
  145. break;
  146. case SDL_GL_BLUE_SIZE:
  147. mesa_attrib = GL_BLUE_BITS;
  148. break;
  149. case SDL_GL_ALPHA_SIZE:
  150. mesa_attrib = GL_ALPHA_BITS;
  151. break;
  152. case SDL_GL_DOUBLEBUFFER:
  153. mesa_attrib = GL_DOUBLEBUFFER;
  154. break;
  155. case SDL_GL_DEPTH_SIZE:
  156. mesa_attrib = GL_DEPTH_BITS;
  157. break;
  158. case SDL_GL_STENCIL_SIZE:
  159. mesa_attrib = GL_STENCIL_BITS;
  160. break;
  161. case SDL_GL_ACCUM_RED_SIZE:
  162. mesa_attrib = GL_ACCUM_RED_BITS;
  163. break;
  164. case SDL_GL_ACCUM_GREEN_SIZE:
  165. mesa_attrib = GL_ACCUM_GREEN_BITS;
  166. break;
  167. case SDL_GL_ACCUM_BLUE_SIZE:
  168. mesa_attrib = GL_ACCUM_BLUE_BITS;
  169. break;
  170. case SDL_GL_ACCUM_ALPHA_SIZE:
  171. mesa_attrib = GL_ACCUM_ALPHA_BITS;
  172. break;
  173. default :
  174. return -1;
  175. }
  176. AmigaMesaGetConfig(glcont->visual, mesa_attrib, value);
  177. return 0;
  178. }
  179. void *CGX_GL_GetProcAddress(_THIS, const char *proc) {
  180. void *func = NULL;
  181. func = AmiGetGLProc(proc);
  182. return func;
  183. }
  184. int CGX_GL_LoadLibrary(_THIS, const char *path) {
  185. /* Library is always open */
  186. this->gl_config.driver_loaded = 1;
  187. return 0;
  188. }
  189. #endif /* HAVE_OPENGL */