1 // This file may be redistributed and modified only under the terms of
2 // the GNU Lesser General Public License (See COPYING for details).
3 // Copyright (C) 2003-2005 Simon Goodall
4 
5 #include <sage/sage_glx.h>
6 #include "SDL.h"
7 #include <sage/utility.h>
8 
9 #ifdef SAGE_GLX_VERSION_1_3
10 PFNGLXGETFBCONFIGATTRIBPROC SAGE_glXGetFBConfigAttrib = NULL;
11 PFNGLXCREATEWINDOWPROC SAGE_glXCreateWindow = NULL;
12 PFNGLXDESTROYWINDOWPROC SAGE_glXDestroyWindow = NULL;
13 PFNGLXCREATEPIXMAPPROC SAGE_glXCreatePixmap = NULL;
14 PFNGLXDESTROYPIXMAPPROC SAGE_glXDestroyPixmap = NULL;
15 PFNGLXCREATEPBUFFERPROC SAGE_glXCreatePbuffer = NULL;
16 PFNGLXDESTROYPBUFFERPROC SAGE_glXDestroyPbuffer = NULL;
17 PFNGLXQUERYDRAWABLEPROC SAGE_glXQueryDrawable = NULL;
18 PFNGLXCREATENEWCONTEXTPROC SAGE_glXCreateNewContext = NULL;
19 PFNGLXMAKECONTEXTCURRENTPROC SAGE_glXMakeContextCurrent = NULL;
20 PFNGLXGETCURRENTREADDRAWABLEPROC SAGE_glXGetCurrentReadDrawable = NULL;
21 PFNGLXQUERYCONTEXTPROC SAGE_glXQueryContext = NULL;
22 PFNGLXSELECTEVENTPROC SAGE_glXSelectEvent = NULL;
23 PFNGLXGETSELECTEDEVENTPROC SAGE_glXGetSelectedEvent = NULL;
24 #endif
25 #ifdef SAGE_GLX_VERSION_1_4
26 #endif
27 #ifdef SAGE_GLX_ARB_get_proc_address
28 #endif
29 #ifdef SAGE_GLX_ARB_multisample
30 #endif
31 #ifdef SAGE_GLX_SGIS_multisample
32 #endif
33 #ifdef SAGE_GLX_EXT_visual_info
34 #endif
35 #ifdef SAGE_GLX_SGI_swap_control
36 PFNGLXSWAPINTERVALSGIPROC SAGE_glXSwapIntervalSGI = NULL;
37 #endif
38 #ifdef SAGE_GLX_SGI_video_sync
39 PFNGLXGETVIDEOSYNCSGIPROC SAGE_glXGetVideoSyncSGI = NULL;
40 PFNGLXWAITVIDEOSYNCSGIPROC SAGE_glXWaitVideoSyncSGI = NULL;
41 #endif
42 #ifdef SAGE_GLX_SGI_make_current_read
43 PFNGLXMAKECURRENTREADSGIPROC SAGE_glXMakeCurrentReadSGI = NULL;
44 PFNGLXGETCURRENTREADDRAWABLESGIPROC SAGE_glXGetCurrentReadDrawableSGI = NULL;
45 #endif
46 #ifdef SAGE_GLX_SGIX_video_source
47 PFNGLXCREATEGLXVIDEOSOURCESGIXPROC SAGE_glXCreateGLXVideoSourceSGIX = NULL;
48 PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC SAGE_glXDestroyGLXVideoSourceSGIX = NULL;
49 #endif
50 #ifdef SAGE_GLX_EXT_visual_rating
51 #endif
52 #ifdef SAGE_GLX_EXT_import_context
53 PFNGLXQUERYCONTEXTINFOEXTPROC SAGE_glXQueryContextInfoEXT = NULL;
54 PFNGLXGETCONTEXTIDEXTPROC SAGE_glXGetContextIDEXT = NULL;
55 PFNGLXIMPORTCONTEXTEXTPROC SAGE_glXImportContextEXT = NULL;
56 PFNGLXFREECONTEXTEXTPROC SAGE_glXFreeContextEXT = NULL;
57 #endif
58 #ifdef SAGE_GLX_SGIX_fbconfig
59 PFNGLXGETFBCONFIGATTRIBSGIXPROC SAGE_glXGetFBConfigAttribSGIX = NULL;
60 PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC SAGE_glXCreateGLXPixmapWithConfigSGIX = NULL;
61 PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC SAGE_glXCreateContextWithConfigSGIX = NULL;
62 PFNGLXGETFBCONFIGFROMVISUALSGIXPROC SAGE_glXGetFBConfigFromVisualSGIX = NULL;
63 #endif
64 #ifdef SAGE_GLX_SGIX_pbuffer
65 PFNGLXCREATEGLXPBUFFERSGIXPROC SAGE_glXCreateGLXPbufferSGIX = NULL;
66 PFNGLXDESTROYGLXPBUFFERSGIXPROC SAGE_glXDestroyGLXPbufferSGIX = NULL;
67 PFNGLXQUERYGLXPBUFFERSGIXPROC SAGE_glXQueryGLXPbufferSGIX = NULL;
68 PFNGLXSELECTEVENTSGIXPROC SAGE_glXSelectEventSGIX = NULL;
69 PFNGLXGETSELECTEDEVENTSGIXPROC SAGE_glXGetSelectedEventSGIX = NULL;
70 #endif
71 #ifdef SAGE_GLX_SGI_cushion
72 PFNGLXCUSHIONSGIPROC SAGE_glXCushionSGI = NULL;
73 #endif
74 #ifdef SAGE_GLX_SGIX_video_resize
75 PFNGLXBINDCHANNELTOWINDOWSGIXPROC SAGE_glXBindChannelToWindowSGIX = NULL;
76 PFNGLXCHANNELRECTSGIXPROC SAGE_glXChannelRectSGIX = NULL;
77 PFNGLXQUERYCHANNELRECTSGIXPROC SAGE_glXQueryChannelRectSGIX = NULL;
78 PFNGLXQUERYCHANNELDELTASSGIXPROC SAGE_glXQueryChannelDeltasSGIX = NULL;
79 PFNGLXCHANNELRECTSYNCSGIXPROC SAGE_glXChannelRectSyncSGIX = NULL;
80 #endif
81 #ifdef SAGE_GLX_SGIX_dmbuffer
82 PFNGLXASSOCIATEDMPBUFFERSGIXPROC SAGE_glXAssociateDMPbufferSGIX = NULL;
83 #endif
84 #ifdef SAGE_GLX_SGIX_swap_group
85 PFNGLXJOINSWAPGROUPSGIXPROC SAGE_glXJoinSwapGroupSGIX = NULL;
86 #endif
87 #ifdef SAGE_GLX_SGIX_swap_barrier
88 PFNGLXBINDSWAPBARRIERSGIXPROC SAGE_glXBindSwapBarrierSGIX = NULL;
89 PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC SAGE_glXQueryMaxSwapBarriersSGIX = NULL;
90 #endif
91 #ifdef SAGE_GLX_SUN_get_transparent_index
92 PFNGLXGETTRANSPARENTINDEXSUNPROC SAGE_glXGetTransparentIndexSUN = NULL;
93 #endif
94 #ifdef SAGE_GLX_MESA_copy_sub_buffer
95 PFNGLXCOPYSUBBUFFERMESAPROC SAGE_glXCopySubBufferMESA = NULL;
96 #endif
97 #ifdef SAGE_GLX_MESA_pixmap_colormap
98 PFNGLXCREATEGLXPIXMAPMESAPROC SAGE_glXCreateGLXPixmapMESA = NULL;
99 #endif
100 #ifdef SAGE_GLX_MESA_release_buffers
101 PFNGLXRELEASEBUFFERSMESAPROC SAGE_glXReleaseBuffersMESA = NULL;
102 #endif
103 #ifdef SAGE_GLX_MESA_set_3dfx_mode
104 PFNGLXSET3DFXMODEMESAPROC SAGE_glXSet3DfxModeMESA = NULL;
105 #endif
106 #ifdef SAGE_GLX_SGIX_visual_select_group
107 #endif
108 #ifdef SAGE_GLX_OML_swap_method
109 #endif
110 #ifdef SAGE_GLX_OML_sync_control
111 PFNGLXGETSYNCVALUESOMLPROC SAGE_glXGetSyncValuesOML = NULL;
112 PFNGLXGETMSCRATEOMLPROC SAGE_glXGetMscRateOML = NULL;
113 PFNGLXWAITFORMSCOMLPROC SAGE_glXWaitForMscOML = NULL;
114 PFNGLXWAITFORSBCOMLPROC SAGE_glXWaitForSbcOML = NULL;
115 #endif
116 
117 int sage_glx_ext[SAGE_GLX_LAST_EXTENSION];
118 
sage_glx_init(void)119 void sage_glx_init(void) {
120 #ifdef SAGE_GLX_VERSION_1_3
121   SAGE_glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)SDL_GL_GetProcAddress("glXGetFBConfigAttrib");
122   SAGE_glXCreateWindow = (PFNGLXCREATEWINDOWPROC)SDL_GL_GetProcAddress("glXCreateWindow");
123   SAGE_glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)SDL_GL_GetProcAddress("glXDestroyWindow");
124   SAGE_glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)SDL_GL_GetProcAddress("glXCreatePixmap");
125   SAGE_glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)SDL_GL_GetProcAddress("glXDestroyPixmap");
126   SAGE_glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)SDL_GL_GetProcAddress("glXCreatePbuffer");
127   SAGE_glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)SDL_GL_GetProcAddress("glXDestroyPbuffer");
128   SAGE_glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)SDL_GL_GetProcAddress("glXQueryDrawable");
129   SAGE_glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)SDL_GL_GetProcAddress("glXCreateNewContext");
130   SAGE_glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)SDL_GL_GetProcAddress("glXMakeContextCurrent");
131   SAGE_glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)SDL_GL_GetProcAddress("glXGetCurrentReadDrawable");
132   SAGE_glXQueryContext = (PFNGLXQUERYCONTEXTPROC)SDL_GL_GetProcAddress("glXQueryContext");
133   SAGE_glXSelectEvent = (PFNGLXSELECTEVENTPROC)SDL_GL_GetProcAddress("glXSelectEvent");
134   SAGE_glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)SDL_GL_GetProcAddress("glXGetSelectedEvent");
135 #endif
136 #ifdef SAGE_GLX_VERSION_1_4
137 #endif
138 #ifdef SAGE_GLX_ARB_get_proc_address
139 #endif
140 #ifdef SAGE_GLX_ARB_multisample
141 #endif
142 #ifdef SAGE_GLX_SGIS_multisample
143 #endif
144 #ifdef SAGE_GLX_EXT_visual_info
145 #endif
146 #ifdef SAGE_GLX_SGI_swap_control
147   SAGE_glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)SDL_GL_GetProcAddress("glXSwapIntervalSGI");
148 #endif
149 #ifdef SAGE_GLX_SGI_video_sync
150   SAGE_glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)SDL_GL_GetProcAddress("glXGetVideoSyncSGI");
151   SAGE_glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)SDL_GL_GetProcAddress("glXWaitVideoSyncSGI");
152 #endif
153 #ifdef SAGE_GLX_SGI_make_current_read
154   SAGE_glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)SDL_GL_GetProcAddress("glXMakeCurrentReadSGI");
155   SAGE_glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)SDL_GL_GetProcAddress("glXGetCurrentReadDrawableSGI");
156 #endif
157 #ifdef SAGE_GLX_SGIX_video_source
158   SAGE_glXCreateGLXVideoSourceSGIX = (PFNGLXCREATEGLXVIDEOSOURCESGIXPROC)SDL_GL_GetProcAddress("glXCreateGLXVideoSourceSGIX");
159   SAGE_glXDestroyGLXVideoSourceSGIX = (PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC)SDL_GL_GetProcAddress("glXDestroyGLXVideoSourceSGIX");
160 #endif
161 #ifdef SAGE_GLX_EXT_visual_rating
162 #endif
163 #ifdef SAGE_GLX_EXT_import_context
164   SAGE_glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)SDL_GL_GetProcAddress("glXQueryContextInfoEXT");
165   SAGE_glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)SDL_GL_GetProcAddress("glXGetContextIDEXT");
166   SAGE_glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)SDL_GL_GetProcAddress("glXImportContextEXT");
167   SAGE_glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)SDL_GL_GetProcAddress("glXFreeContextEXT");
168 #endif
169 #ifdef SAGE_GLX_SGIX_fbconfig
170   SAGE_glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)SDL_GL_GetProcAddress("glXGetFBConfigAttribSGIX");
171   SAGE_glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)SDL_GL_GetProcAddress("glXCreateGLXPixmapWithConfigSGIX");
172   SAGE_glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)SDL_GL_GetProcAddress("glXCreateContextWithConfigSGIX");
173   SAGE_glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)SDL_GL_GetProcAddress("glXGetFBConfigFromVisualSGIX");
174 #endif
175 #ifdef SAGE_GLX_SGIX_pbuffer
176   SAGE_glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)SDL_GL_GetProcAddress("glXCreateGLXPbufferSGIX");
177   SAGE_glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)SDL_GL_GetProcAddress("glXDestroyGLXPbufferSGIX");
178   SAGE_glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)SDL_GL_GetProcAddress("glXQueryGLXPbufferSGIX");
179   SAGE_glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)SDL_GL_GetProcAddress("glXSelectEventSGIX");
180   SAGE_glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)SDL_GL_GetProcAddress("glXGetSelectedEventSGIX");
181 #endif
182 #ifdef SAGE_GLX_SGI_cushion
183   SAGE_glXCushionSGI = (PFNGLXCUSHIONSGIPROC)SDL_GL_GetProcAddress("glXCushionSGI");
184 #endif
185 #ifdef SAGE_GLX_SGIX_video_resize
186   SAGE_glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)SDL_GL_GetProcAddress("glXBindChannelToWindowSGIX");
187   SAGE_glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)SDL_GL_GetProcAddress("glXChannelRectSGIX");
188   SAGE_glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)SDL_GL_GetProcAddress("glXQueryChannelRectSGIX");
189   SAGE_glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)SDL_GL_GetProcAddress("glXQueryChannelDeltasSGIX");
190   SAGE_glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)SDL_GL_GetProcAddress("glXChannelRectSyncSGIX");
191 #endif
192 #ifdef SAGE_GLX_SGIX_dmbuffer
193   SAGE_glXAssociateDMPbufferSGIX = (PFNGLXASSOCIATEDMPBUFFERSGIXPROC)SDL_GL_GetProcAddress("glXAssociateDMPbufferSGIX");
194 #endif
195 #ifdef SAGE_GLX_SGIX_swap_group
196   SAGE_glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)SDL_GL_GetProcAddress("glXJoinSwapGroupSGIX");
197 #endif
198 #ifdef SAGE_GLX_SGIX_swap_barrier
199   SAGE_glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)SDL_GL_GetProcAddress("glXBindSwapBarrierSGIX");
200   SAGE_glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)SDL_GL_GetProcAddress("glXQueryMaxSwapBarriersSGIX");
201 #endif
202 #ifdef SAGE_GLX_SUN_get_transparent_index
203   SAGE_glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)SDL_GL_GetProcAddress("glXGetTransparentIndexSUN");
204 #endif
205 #ifdef SAGE_GLX_MESA_copy_sub_buffer
206   SAGE_glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)SDL_GL_GetProcAddress("glXCopySubBufferMESA");
207 #endif
208 #ifdef SAGE_GLX_MESA_pixmap_colormap
209   SAGE_glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)SDL_GL_GetProcAddress("glXCreateGLXPixmapMESA");
210 #endif
211 #ifdef SAGE_GLX_MESA_release_buffers
212   SAGE_glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)SDL_GL_GetProcAddress("glXReleaseBuffersMESA");
213 #endif
214 #ifdef SAGE_GLX_MESA_set_3dfx_mode
215   SAGE_glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)SDL_GL_GetProcAddress("glXSet3DfxModeMESA");
216 #endif
217 #ifdef SAGE_GLX_SGIX_visual_select_group
218 #endif
219 #ifdef SAGE_GLX_OML_swap_method
220 #endif
221 #ifdef SAGE_GLX_OML_sync_control
222   SAGE_glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)SDL_GL_GetProcAddress("glXGetSyncValuesOML");
223   SAGE_glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)SDL_GL_GetProcAddress("glXGetMscRateOML");
224   SAGE_glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)SDL_GL_GetProcAddress("glXWaitForMscOML");
225   SAGE_glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)SDL_GL_GetProcAddress("glXWaitForSbcOML");
226 #endif
227  sage_glx_ext[GLX_VERSION_1_3] = isExtensionSupported("GLX_VERSION_1_3");
228  sage_glx_ext[GLX_VERSION_1_4] = isExtensionSupported("GLX_VERSION_1_4");
229  sage_glx_ext[GLX_ARB_GET_PROC_ADDRESS] = isExtensionSupported("GLX_ARB_get_proc_address");
230  sage_glx_ext[GLX_ARB_MULTISAMPLE] = isExtensionSupported("GLX_ARB_multisample");
231  sage_glx_ext[GLX_SGIS_MULTISAMPLE] = isExtensionSupported("GLX_SGIS_multisample");
232  sage_glx_ext[GLX_EXT_VISUAL_INFO] = isExtensionSupported("GLX_EXT_visual_info");
233  sage_glx_ext[GLX_SGI_SWAP_CONTROL] = isExtensionSupported("GLX_SGI_swap_control");
234  sage_glx_ext[GLX_SGI_VIDEO_SYNC] = isExtensionSupported("GLX_SGI_video_sync");
235  sage_glx_ext[GLX_SGI_MAKE_CURRENT_READ] = isExtensionSupported("GLX_SGI_make_current_read");
236  sage_glx_ext[GLX_SGIX_VIDEO_SOURCE] = isExtensionSupported("GLX_SGIX_video_source");
237  sage_glx_ext[GLX_EXT_VISUAL_RATING] = isExtensionSupported("GLX_EXT_visual_rating");
238  sage_glx_ext[GLX_EXT_IMPORT_CONTEXT] = isExtensionSupported("GLX_EXT_import_context");
239  sage_glx_ext[GLX_SGIX_FBCONFIG] = isExtensionSupported("GLX_SGIX_fbconfig");
240  sage_glx_ext[GLX_SGIX_PBUFFER] = isExtensionSupported("GLX_SGIX_pbuffer");
241  sage_glx_ext[GLX_SGI_CUSHION] = isExtensionSupported("GLX_SGI_cushion");
242  sage_glx_ext[GLX_SGIX_VIDEO_RESIZE] = isExtensionSupported("GLX_SGIX_video_resize");
243  sage_glx_ext[GLX_SGIX_DMBUFFER] = isExtensionSupported("GLX_SGIX_dmbuffer");
244  sage_glx_ext[GLX_SGIX_SWAP_GROUP] = isExtensionSupported("GLX_SGIX_swap_group");
245  sage_glx_ext[GLX_SGIX_SWAP_BARRIER] = isExtensionSupported("GLX_SGIX_swap_barrier");
246  sage_glx_ext[GLX_SUN_GET_TRANSPARENT_INDEX] = isExtensionSupported("GLX_SUN_get_transparent_index");
247  sage_glx_ext[GLX_MESA_COPY_SUB_BUFFER] = isExtensionSupported("GLX_MESA_copy_sub_buffer");
248  sage_glx_ext[GLX_MESA_PIXMAP_COLORMAP] = isExtensionSupported("GLX_MESA_pixmap_colormap");
249  sage_glx_ext[GLX_MESA_RELEASE_BUFFERS] = isExtensionSupported("GLX_MESA_release_buffers");
250  sage_glx_ext[GLX_MESA_SET_3DFX_MODE] = isExtensionSupported("GLX_MESA_set_3dfx_mode");
251  sage_glx_ext[GLX_SGIX_VISUAL_SELECT_GROUP] = isExtensionSupported("GLX_SGIX_visual_select_group");
252  sage_glx_ext[GLX_OML_SWAP_METHOD] = isExtensionSupported("GLX_OML_swap_method");
253  sage_glx_ext[GLX_OML_SYNC_CONTROL] = isExtensionSupported("GLX_OML_sync_control");
254 }
255