40 {
false,
false, 1, {
"GL_EXT_fog_coord" }, 2, {
41 "glFogCoordfEXT",
"glFogCoordPointerEXT" } },
45 {
true,
false, 1, {
"GL_ARB_multitexture" } , 3, {
46 "glMultiTexCoord2fARB",
"glActiveTextureARB",
"glClientActiveTextureARB" } },
49 {
true,
false, 2, {
"GL_ARB_texture_env_add",
"GL_EXT_texture_env_add" }, 0, { NULL } },
52 {
false,
false, 1, {
"GL_ARB_texture_compression" }, 3, {
53 "glCompressedTexImage2D",
"glCompressedTexSubImage2D",
"glGetCompressedTexImageARB" } },
56 {
false,
false, 1, {
"GL_EXT_texture_compression_s3tc" }, 0, { NULL } },
59 {
false,
false, 1, {
"GL_EXT_texture_filter_anisotropic" }, 0, { NULL } },
69 {
false,
false, 2, {
"GL_ARB_texture_env_combine",
"GL_EXT_texture_env_combine" }, 0, { NULL } },
72 {
false,
false, 1, {
"GL_EXT_compiled_vertex_array" }, 2, {
73 "glLockArraysEXT",
"glUnlockArraysEXT" } },
80 {
true,
false, 1, {
"GL_EXT_draw_range_elements" }, 1, {
81 "glDrawRangeElements" } },
84 {
false,
false, 1, {
"GL_ARB_texture_mirrored_repeat" }, 0, { NULL } },
87 {
false,
false, 1, {
"GL_ARB_texture_non_power_of_two" }, 0, { NULL } },
90 {
false,
false, 1, {
"GL_ARB_vertex_buffer_object" }, 6, {
91 "glBindBufferARB",
"glDeleteBuffersARB",
"glGenBuffersARB",
"glBufferDataARB",
92 "glMapBufferARB",
"glUnmapBufferARB" } },
95 {
false,
false, 2, {
"GL_ARB_pixel_buffer_object",
"GL_EXT_pixel_buffer_object" }, 7, {
96 "glBindBufferARB",
"glDeleteBuffersARB",
"glGenBuffersARB",
"glBufferDataARB",
97 "glBufferSubDataARB",
"glMapBufferARB",
"glUnmapBufferARB" } },
100 {
false,
false, 1, {
"GL_SGIS_generate_mipmap" }, 0, { NULL } },
103 {
false,
false, 1, {
"GL_EXT_framebuffer_object" }, 16, {
104 "glIsRenderbufferEXT",
"glBindRenderbufferEXT",
"glDeleteRenderbuffersEXT",
"glGenRenderbuffersEXT",
105 "glRenderbufferStorageEXT",
"glGetRenderbufferParameterivEXT",
"glIsFramebufferEXT",
"glBindFramebufferEXT",
106 "glDeleteFramebuffersEXT",
"glGenFramebuffersEXT",
"glCheckFramebufferStatusEXT",
"glFramebufferTexture2DEXT",
107 "glFramebufferRenderbufferEXT",
"glGetFramebufferAttachmentParameterivEXT",
"glGenerateMipmapEXT",
"glDrawBuffers" } },
112 {
false,
false, 3, {
"GL_ARB_texture_rectangle",
"GL_EXT_texture_rectangle",
"GL_NV_texture_rectangle" }, 0, { NULL } },
115 {
true,
false, 1, {
"GL_EXT_bgra" }, 0, { NULL } },
118 {
false,
false, 2, {
"GL_ARB_texture_cube_map",
"GL_EXT_texture_cube_map" }, 0, { NULL } },
121 {
false,
false, 1, {
"GL_EXT_texture_lod_bias" }, 0, { NULL } },
124 {
false,
false, 2, {
"GL_ARB_point_sprite",
"NV_point_sprite" }, 0, { NULL } },
128 {
false,
false, 1, {
"GL_ARB_shading_language_100" }, 0, { NULL } },
131 {
false,
false, 1, {
"GL_ARB_shader_objects" }, 19, {
"glDeleteObjectARB",
"glCreateShaderObjectARB",
"glShaderSourceARB",
132 "glCompileShaderARB",
"glGetObjectParameterivARB",
"glGetInfoLogARB",
"glCreateProgramObjectARB",
133 "glAttachObjectARB",
"glLinkProgramARB",
"glUseProgramObjectARB",
"glValidateProgramARB",
"glGetUniformLocationARB",
134 "glGetUniformivARB",
"glUniform1fARB",
"glUniform2fARB",
"glUniform3fARB",
"glUniform4fARB",
"glUniform1iARB",
"glUniformMatrix4fvARB" } },
138 {
false,
false, 1, {
"GL_ARB_vertex_shader" }, 4, {
"glEnableVertexAttribArrayARB",
"glDisableVertexAttribArrayARB",
139 "glGetAttribLocationARB",
"glVertexAttribPointerARB" } },
142 {
false,
false, 1, {
"GL_ARB_fragment_shader" }, 0, { NULL } },
145 {
false,
false, 3, {
"GL_ARB_shader_texture_lod",
"GL_NV_vertex_program3",
"GL_ATI_shader_texture_lod" }, 0, { NULL } },
147 {
false,
false, 1, {
"GL_ARB_texture_float" }, 0, { NULL } },
149 {
false,
false, 1, {
"GL_ARB_draw_elements_base_vertex" }, 4, {
"glDrawElementsBaseVertex",
"glDrawRangeElementsBaseVertex",
150 "glDrawElementsInstancedBaseVertex",
"glMultiDrawElementsBaseVertex" } },
152 {
false,
false, 1, {
"GL_EXT_framebuffer_blit" }, 1, {
"glBlitFramebufferEXT" } },
155 {
false,
false, 1, {
"GL_EXT_geometry_shader4" }, 2, {
"glProgramParameteriEXT",
"glFramebufferTextureEXT" } },
158 {
false,
false, 1, {
"GL_EXT_texture_array" }, 1, {
"glTexImage3D" } },
160 {
false,
false, 1, {
"GL_ARB_uniform_buffer_object" }, 7, {
"glGetUniformIndices",
"glGetActiveUniformsiv",
"glGetActiveUniformName",
161 "glGetUniformBlockIndex",
"glGetActiveUniformBlockiv",
"glGetActiveUniformBlockName",
"glUniformBlockBinding" } },
163 {
false,
false, 1, {
"GL_EXT_transform_feedback" }, 7, {
"glBeginTransformFeedbackEXT",
"glEndTransformFeedbackEXT",
"glBindBufferRangeEXT",
164 "glBindBufferOffsetEXT",
"glBindBufferBaseEXT",
"glTransformFeedbackVaryingsEXT",
"glGetTransformFeedbackVaryingEXT" } },
166 {
false,
false, 1, {
"GL_ARB_draw_instanced" }, 2, {
"glDrawArraysInstancedARB",
"glDrawElementsInstancedARB" } },
168 {
false,
false, 1, {
"GL_ARB_texture_buffer_object" }, 1, {
"glTexBufferARB" } }
178 {
"glFogCoordfEXT", 0 },
179 {
"glFogCoordPointerEXT", 0 },
180 {
"glMultiTexCoord2fARB", 0 },
181 {
"glActiveTextureARB", 0 },
182 {
"glClientActiveTextureARB", 0 },
183 {
"glCompressedTexImage2D", 0 },
184 {
"glCompressedTexSubImage2D", 0 },
185 {
"glGetCompressedTexImageARB", 0 },
188 {
"glLockArraysEXT", 0 },
189 {
"glUnlockArraysEXT", 0 },
192 {
"glDrawRangeElements", 0 },
193 {
"glBindBufferARB", 0 },
194 {
"glDeleteBuffersARB", 0 },
195 {
"glGenBuffersARB", 0 },
196 {
"glBufferDataARB", 0 },
197 {
"glBufferSubDataARB", 0 },
198 {
"glMapBufferARB", 0 },
199 {
"glUnmapBufferARB", 0 },
200 {
"glIsRenderbufferEXT", 0 },
201 {
"glBindRenderbufferEXT", 0 },
202 {
"glDeleteRenderbuffersEXT", 0 },
203 {
"glGenRenderbuffersEXT", 0 },
204 {
"glRenderbufferStorageEXT", 0 },
205 {
"glGetRenderbufferParameterivEXT", 0 },
206 {
"glIsFramebufferEXT", 0 },
207 {
"glBindFramebufferEXT", 0 },
208 {
"glDeleteFramebuffersEXT", 0 },
209 {
"glGenFramebuffersEXT", 0 },
210 {
"glCheckFramebufferStatusEXT", 0 },
211 {
"glFramebufferTexture2DEXT", 0 },
212 {
"glFramebufferRenderbufferEXT", 0 },
213 {
"glGetFramebufferAttachmentParameterivEXT", 0 },
214 {
"glGenerateMipmapEXT", 0 },
215 {
"glDeleteObjectARB", 0 },
216 {
"glCreateShaderObjectARB", 0 },
217 {
"glShaderSourceARB", 0 },
218 {
"glCompileShaderARB", 0 },
219 {
"glGetObjectParameterivARB", 0 },
220 {
"glGetInfoLogARB", 0 },
221 {
"glCreateProgramObjectARB", 0 },
222 {
"glAttachObjectARB", 0 },
223 {
"glLinkProgramARB", 0 },
224 {
"glUseProgramObjectARB", 0 },
225 {
"glValidateProgramARB", 0 },
226 {
"glEnableVertexAttribArrayARB", 0 },
227 {
"glDisableVertexAttribArrayARB", 0 },
228 {
"glGetAttribLocationARB", 0 },
229 {
"glVertexAttribPointerARB", 0 },
230 {
"glGetUniformLocationARB", 0 },
231 {
"glGetUniformivARB", 0 },
232 {
"glUniform1fARB", 0 },
233 {
"glUniform2fARB", 0 },
234 {
"glUniform3fARB", 0 },
235 {
"glUniform4fARB", 0 },
236 {
"glUniform3fvARB", 0 },
237 {
"glUniform4fvARB", 0 },
238 {
"glUniform1iARB", 0 },
239 {
"glUniformMatrix4fvARB", 0 },
240 {
"glDrawBuffers", 0 },
241 {
"glDrawElementsBaseVertex", 0 },
242 {
"glDrawRangeElementsBaseVertex", 0 },
243 {
"glDrawElementsInstancedBaseVertex", 0 },
244 {
"glMultiDrawElementsBaseVertex", 0 },
245 {
"glBlitFramebufferEXT", 0},
246 {
"glProgramParameteriEXT", 0 },
247 {
"glTexImage3D", 0 },
248 {
"glFramebufferTextureEXT", 0 },
249 {
"glGetUniformIndices", 0 },
250 {
"glGetActiveUniformsiv", 0 },
251 {
"glGetActiveUniformName", 0 },
252 {
"glGetUniformBlockIndex", 0 },
253 {
"glGetActiveUniformBlockiv", 0 },
254 {
"glGetActiveUniformBlockName", 0 },
255 {
"glUniformBlockBinding", 0 },
256 {
"glBeginTransformFeedbackEXT", 0 },
257 {
"glEndTransformFeedbackEXT", 0 },
258 {
"glBindBufferRangeEXT", 0 },
259 {
"glBindBufferOffsetEXT", 0 },
260 {
"glBindBufferBaseEXT", 0 },
261 {
"glTransformFeedbackVaryingsEXT", 0 },
262 {
"glGetTransformFeedbackVaryingEXT", 0 },
263 {
"glDrawArraysInstancedARB", 0 },
264 {
"glDrawElementsInstancedARB", 0 },
265 {
"glTexBufferARB", 0 }
270 {
"wglSwapIntervalEXT", 0 },
271 {
"glXSwapIntervalSGI", 0 }
276 #define GET_PROC_ADDRESS(x) wglGetProcAddress((x))
278 #define GET_PROC_ADDRESS(x) SDL_GL_GetProcAddress((x))
282 static inline int opengl_find_extension(
const char *ext_to_find)
291 static int opengl_get_extensions_special()
293 int i, num_found = 0;
297 func = &GL_EXT_Special[
i];
319 if ( !strcmp(GL_Functions[i].function_name, name) ) {
320 return &GL_Functions[
i];
331 int i, j, k, num_found = 0;
338 ext = &GL_Extensions[
i];
341 while ( !ext->
enabled && (k < ext->num_extensions) ) {
369 Error(
LOCATION,
"The required OpenGL extension '%s' is not fully supported by your current driver version or graphics card.\n", ext->
extension_name[k] );
381 Error(
LOCATION,
"The required OpenGL extension '%s' is not supported by your current driver version or graphics card.\n", ext->
extension_name[k] );
391 num_found += opengl_get_extensions_special();
436 mprintf((
" No hardware support for shadow mapping. Shadows will be disabled. \n"));
441 int ver = 0, major = 0, minor = 0;
444 sscanf(glsl_ver,
"%d.%d", &major, &minor);
445 ver = (major * 100) + minor;
465 mprintf((
" No hardware support for deferred lighting. Deferred lighting will be disabled. \n"));
471 GLint max_texture_units;
476 if (max_texture_units < 6) {
477 mprintf((
"Not enough texture units for height map support. We need at least 6, we found %d.\n", max_texture_units ));
479 }
else if (max_texture_units < 5) {
480 mprintf((
"Not enough texture units for height and normal map support. We need at least 5, we found %d.\n", max_texture_units ));
483 }
else if (max_texture_units < 4) {
484 mprintf((
"Not enough texture units found for GLSL support. We need at least 4, we found %d.\n", max_texture_units ));
#define OGL_EXT_GEOMETRY_SHADER4
#define OGL_EXT_FRAMEBUFFER_OBJECT
ogl_function * get_ogl_function(const char *name)
#define NUM_OGL_EXT_SPECIAL
#define OGL_EXT_TEXTURE_ARRAY
#define OGL_ARB_FLOATING_POINT_TEXTURES
ogl_function GL_Functions[NUM_OGL_FUNCTIONS]
#define OGL_ARB_DRAW_ELEMENTS_BASE_VERTEX
#define OGL_ARB_VERTEX_SHADER
#define NUM_OGL_EXTENSIONS
#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB
#define OGL_EXT_FOG_COORD
int Texture_compression_available
void opengl_extensions_init()
int Use_compressed_textures
#define OGL_ARB_FRAGMENT_SHADER
ogl_extension GL_Extensions[NUM_OGL_EXTENSIONS]
int opengl_get_extensions()
#define OGL_ARB_TEXTURE_CUBE_MAP
#define GET_PROC_ADDRESS(x)
#define OGL_ARB_PIXEL_BUFFER_OBJECT
#define Is_Extension_Enabled(x)
int Cmdline_shadow_quality
int Cmdline_no_deferred_lighting
WINGDIAPI void APIENTRY glGetIntegerv(GLenum pname, GLint *params)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
const char * extension_name[3]
GLuint const GLchar * name
ogl_function GL_EXT_Special[NUM_OGL_EXT_SPECIAL]
#define OGL_ARB_VERTEX_BUFFER_OBJECT
char * OGL_extension_string
const char * function_names[20]
#define NUM_OGL_FUNCTIONS
#define GL_SHADING_LANGUAGE_VERSION
#define OGL_EXT_TEXTURE_COMPRESSION_S3TC
#define OGL_ARB_TEXTURE_COMPRESSION
#define OGL_ARB_SHADER_OBJECTS
WINGDIAPI const GLubyte *APIENTRY glGetString(GLenum name)
bool is_minimum_GLSL_version()
#define OGL_ARB_TEXTURE_ENV_COMBINE
const char * function_name