/* ================ R_GetTag ================ */ static int R_GetTag( mdvModel_t *model, int frame, const char *_tagName, int startTagIndex, mdvTag_t **outTag ) { int i; mdvTag_t *tag; mdvTagName_t *tagName; // it is possible to have a bad frame while changing models, so don't error frame = Q_bound( 0, frame, model->numFrames - 1 ); if ( startTagIndex > model->numTags ) { *outTag = NULL; return -1; } #if 1 tag = model->tags + frame * model->numTags; tagName = model->tagNames; for ( i = 0; i < model->numTags; i++, tag++, tagName++ ) { if ( ( i >= startTagIndex ) && !strcmp( tagName->name, _tagName ) ) { *outTag = tag; return i; } } #endif *outTag = NULL; return -1; }
void GLimp_InitExtraExtensions() { char *extension; const char *result[3] = { "...ignoring %s\n", "...using %s\n", "...%s not found\n" }; // GL_EXT_draw_range_elements extension = "GL_EXT_draw_range_elements"; glRefConfig.drawRangeElements = qfalse; qglMultiDrawArraysEXT = NULL; qglMultiDrawElementsEXT = NULL; if (GLimp_HaveExtension(extension)) { qglDrawRangeElementsEXT = (void *) SDL_GL_GetProcAddress("glDrawRangeElementsEXT"); if (r_ext_draw_range_elements->integer) { glRefConfig.drawRangeElements = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.drawRangeElements], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_multi_draw_arrays extension = "GL_EXT_multi_draw_arrays"; glRefConfig.multiDrawArrays = qfalse; qglMultiDrawArraysEXT = NULL; qglMultiDrawElementsEXT = NULL; if (GLimp_HaveExtension(extension)) { qglMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawArraysEXT"); qglMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC) SDL_GL_GetProcAddress("glMultiDrawElementsEXT"); if (r_ext_multi_draw_arrays->integer) { glRefConfig.multiDrawArrays = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.multiDrawArrays], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_vertex_program //glRefConfig.vertexProgram = qfalse; extension = "GL_ARB_vertex_program"; qglVertexAttrib4fARB = NULL; qglVertexAttrib4fvARB = NULL; qglVertexAttribPointerARB = NULL; qglEnableVertexAttribArrayARB = NULL; qglDisableVertexAttribArrayARB = NULL; if (GLimp_HaveExtension(extension)) { qglVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fARB"); qglVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) SDL_GL_GetProcAddress("glVertexAttrib4fvARB"); qglVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) SDL_GL_GetProcAddress("glVertexAttribPointerARB"); qglEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArrayARB"); qglDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArrayARB"); ri.Printf(PRINT_ALL, result[1], extension); //glRefConfig.vertexProgram = qtrue; } else { ri.Error(ERR_FATAL, result[2], extension); } // GL_ARB_vertex_buffer_object //glRefConfig.vertexBufferObject = qfalse; extension = "GL_ARB_vertex_buffer_object"; qglBindBufferARB = NULL; qglDeleteBuffersARB = NULL; qglGenBuffersARB = NULL; qglIsBufferARB = NULL; qglBufferDataARB = NULL; qglBufferSubDataARB = NULL; qglGetBufferSubDataARB = NULL; qglGetBufferParameterivARB = NULL; qglGetBufferPointervARB = NULL; if (GLimp_HaveExtension(extension)) { qglBindBufferARB = (PFNGLBINDBUFFERARBPROC) SDL_GL_GetProcAddress("glBindBufferARB"); qglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) SDL_GL_GetProcAddress("glDeleteBuffersARB"); qglGenBuffersARB = (PFNGLGENBUFFERSARBPROC) SDL_GL_GetProcAddress("glGenBuffersARB"); qglIsBufferARB = (PFNGLISBUFFERARBPROC) SDL_GL_GetProcAddress("glIsBufferARB"); qglBufferDataARB = (PFNGLBUFFERDATAARBPROC) SDL_GL_GetProcAddress("glBufferDataARB"); qglBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glBufferSubDataARB"); qglGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) SDL_GL_GetProcAddress("glGetBufferSubDataARB"); qglGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetBufferParameterivARB"); qglGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) SDL_GL_GetProcAddress("glGetBufferPointervARB"); ri.Printf(PRINT_ALL, result[1], extension); //glRefConfig.vertexBufferObject = qtrue; } else { ri.Error(ERR_FATAL, result[2], extension); } // GL_ARB_shader_objects extension = "GL_ARB_shader_objects"; //glRefConfig.shaderObjects = qfalse; qglDeleteObjectARB = NULL; qglGetHandleARB = NULL; qglDetachObjectARB = NULL; qglCreateShaderObjectARB = NULL; qglShaderSourceARB = NULL; qglCompileShaderARB = NULL; qglCreateProgramObjectARB = NULL; qglAttachObjectARB = NULL; qglLinkProgramARB = NULL; qglUseProgramObjectARB = NULL; qglValidateProgramARB = NULL; qglUniform1fARB = NULL; qglUniform2fARB = NULL; qglUniform3fARB = NULL; qglUniform4fARB = NULL; qglUniform1iARB = NULL; qglUniform2iARB = NULL; qglUniform3iARB = NULL; qglUniform4iARB = NULL; qglUniform1fvARB = NULL; qglUniform2fvARB = NULL; qglUniform3fvARB = NULL; qglUniform4fvARB = NULL; qglUniform2ivARB = NULL; qglUniform3ivARB = NULL; qglUniform4ivARB = NULL; qglUniformMatrix2fvARB = NULL; qglUniformMatrix3fvARB = NULL; qglUniformMatrix4fvARB = NULL; qglGetObjectParameterfvARB = NULL; qglGetObjectParameterivARB = NULL; qglGetInfoLogARB = NULL; qglGetAttachedObjectsARB = NULL; qglGetUniformLocationARB = NULL; qglGetActiveUniformARB = NULL; qglGetUniformfvARB = NULL; qglGetUniformivARB = NULL; qglGetShaderSourceARB = NULL; if (GLimp_HaveExtension(extension)) { qglDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB"); qglGetHandleARB = (PFNGLGETHANDLEARBPROC) SDL_GL_GetProcAddress("glGetHandleARB"); qglDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) SDL_GL_GetProcAddress("glDetachObjectARB"); qglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB"); qglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB"); qglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB"); qglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB"); qglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB"); qglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB"); qglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB"); qglValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) SDL_GL_GetProcAddress("glValidateProgramARB"); qglUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB"); qglUniform2fARB = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB"); qglUniform3fARB = (PFNGLUNIFORM3FARBPROC) SDL_GL_GetProcAddress("glUniform3fARB"); qglUniform4fARB = (PFNGLUNIFORM4FARBPROC) SDL_GL_GetProcAddress("glUniform4fARB"); qglUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB"); qglUniform2iARB = (PFNGLUNIFORM2IARBPROC) SDL_GL_GetProcAddress("glUniform2iARB"); qglUniform3iARB = (PFNGLUNIFORM3IARBPROC) SDL_GL_GetProcAddress("glUniform3iARB"); qglUniform4iARB = (PFNGLUNIFORM4IARBPROC) SDL_GL_GetProcAddress("glUniform4iARB"); qglUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) SDL_GL_GetProcAddress("glUniform1fvARB"); qglUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) SDL_GL_GetProcAddress("glUniform2fvARB"); qglUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) SDL_GL_GetProcAddress("glUniform3fvARB"); qglUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) SDL_GL_GetProcAddress("glUniform4fvARB"); qglUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) SDL_GL_GetProcAddress("glUniform2ivARB"); qglUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) SDL_GL_GetProcAddress("glUniform3ivARB"); qglUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) SDL_GL_GetProcAddress("glUniform4ivARB"); qglUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix2fvARB"); qglUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix3fvARB"); qglUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) SDL_GL_GetProcAddress("glUniformMatrix4fvARB"); qglGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterfvARB"); qglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB"); qglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB"); qglGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) SDL_GL_GetProcAddress("glGetAttachedObjectsARB"); qglGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB"); qglGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) SDL_GL_GetProcAddress("glGetActiveUniformARB"); qglGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) SDL_GL_GetProcAddress("glGetUniformfvARB"); qglGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) SDL_GL_GetProcAddress("glGetUniformivARB"); qglGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glGetShaderSourceARB"); ri.Printf(PRINT_ALL, result[1], extension); //glRefConfig.shaderObjects = qtrue; } else { ri.Error(ERR_FATAL, result[2], extension); } // GL_ARB_vertex_shader //glRefConfig.vertexShader = qfalse; extension = "GL_ARB_vertex_shader"; qglBindAttribLocationARB = NULL; qglGetActiveAttribARB = NULL; qglGetAttribLocationARB = NULL; if (GLimp_HaveExtension(extension)) { //int reservedComponents; //qglGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig.maxVertexUniforms); //qglGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &glConfig.maxVaryingFloats); //qglGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig.maxVertexAttribs); //reservedComponents = 16 * 10; // approximation how many uniforms we have besides the bone matrices #if 0 if (glConfig.driverType == GLDRV_MESA) { // HACK // restrict to number of vertex uniforms to 512 because of: // xreal.x86_64: nv50_program.c:4181: nv50_program_validate_data: Assertion `p->param_nr <= 512' failed glConfig.maxVertexUniforms = Q_bound(0, glConfig.maxVertexUniforms, 512); } #endif //glConfig.maxVertexSkinningBones = (int) Q_bound(0.0, (Q_max(glConfig.maxVertexUniforms - reservedComponents, 0) / 16), MAX_BONES); //glConfig.vboVertexSkinningAvailable = r_vboVertexSkinning->integer && ((glConfig.maxVertexSkinningBones >= 12) ? qtrue : qfalse); qglBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glBindAttribLocationARB"); qglGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) SDL_GL_GetProcAddress("glGetActiveAttribARB"); qglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetAttribLocationARB"); ri.Printf(PRINT_ALL, result[1], extension); //glRefConfig.vertexShader = qtrue; } else { ri.Error(ERR_FATAL, result[2], extension); } // GL_ARB_shading_language_100 extension = "GL_ARB_shading_language_100"; glRefConfig.textureFloat = qfalse; if (GLimp_HaveExtension(extension)) { char version[256]; Q_strncpyz(version, (char *) qglGetString(GL_SHADING_LANGUAGE_VERSION_ARB), sizeof(version)); sscanf(version, "%d.%d", &glRefConfig.glslMajorVersion, &glRefConfig.glslMinorVersion); ri.Printf(PRINT_ALL, "...using GLSL version %s\n", version); } else { ri.Error(ERR_FATAL, result[2], extension); } glRefConfig.memInfo = MI_NONE; if (GLimp_HaveExtension("GL_NVX_gpu_memory_info")) { glRefConfig.memInfo = MI_NVX; } else if (GLimp_HaveExtension("GL_ATI_meminfo")) { glRefConfig.memInfo = MI_ATI; } extension = "GL_ARB_texture_non_power_of_two"; glRefConfig.textureNonPowerOfTwo = qfalse; if (GLimp_HaveExtension(extension)) { if (1) //(r_ext_texture_non_power_of_two->integer) { glRefConfig.textureNonPowerOfTwo = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.textureNonPowerOfTwo], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_texture_float extension = "GL_ARB_texture_float"; glRefConfig.textureFloat = qfalse; if (GLimp_HaveExtension(extension)) { if (r_ext_texture_float->integer) { glRefConfig.textureFloat = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.textureFloat], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_half_float_pixel extension = "GL_ARB_half_float_pixel"; glRefConfig.halfFloatPixel = qfalse; if (GLimp_HaveExtension(extension)) { if (r_arb_half_float_pixel->integer) { glRefConfig.halfFloatPixel = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.halfFloatPixel], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_framebuffer_object extension = "GL_EXT_framebuffer_object"; glRefConfig.framebufferObject = qfalse; if (GLimp_HaveExtension(extension)) { glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glRefConfig.maxRenderbufferSize); glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glRefConfig.maxColorAttachments); qglIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsRenderbufferEXT"); qglBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindRenderbufferEXT"); qglDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteRenderbuffersEXT"); qglGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenRenderbuffersEXT"); qglRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) SDL_GL_GetProcAddress("glRenderbufferStorageEXT"); qglGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetRenderbufferParameterivEXT"); qglIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glIsFramebufferEXT"); qglBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) SDL_GL_GetProcAddress("glBindFramebufferEXT"); qglDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glDeleteFramebuffersEXT"); qglGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) SDL_GL_GetProcAddress("glGenFramebuffersEXT"); qglCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) SDL_GL_GetProcAddress("glCheckFramebufferStatusEXT"); qglFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture1DEXT"); qglFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture2DEXT"); qglFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) SDL_GL_GetProcAddress("glFramebufferTexture3DEXT"); qglFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) SDL_GL_GetProcAddress("glFramebufferRenderbufferEXT"); qglGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) SDL_GL_GetProcAddress("glGetFramebufferAttachmentParameterivEXT"); qglGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) SDL_GL_GetProcAddress("glGenerateMipmapEXT"); if (r_ext_framebuffer_object->value) { glRefConfig.framebufferObject = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.framebufferObject], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_packed_depth_stencil extension = "GL_EXT_packed_depth_stencil"; glRefConfig.packedDepthStencil = qfalse; if (GLimp_HaveExtension(extension)) { glRefConfig.packedDepthStencil = qtrue; ri.Printf(PRINT_ALL, result[glRefConfig.packedDepthStencil], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_occlusion_query extension = "GL_ARB_occlusion_query"; glRefConfig.occlusionQuery = qfalse; if (GLimp_HaveExtension(extension)) { qglGenQueriesARB = (PFNGLGENQUERIESARBPROC) SDL_GL_GetProcAddress("glGenQueriesARB"); qglDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC) SDL_GL_GetProcAddress("glDeleteQueriesARB"); qglIsQueryARB = (PFNGLISQUERYARBPROC) SDL_GL_GetProcAddress("glIsQueryARB"); qglBeginQueryARB = (PFNGLBEGINQUERYARBPROC) SDL_GL_GetProcAddress("glBeginQueryARB"); qglEndQueryARB = (PFNGLENDQUERYARBPROC) SDL_GL_GetProcAddress("glEndQueryARB"); qglGetQueryivARB = (PFNGLGETQUERYIVARBPROC) SDL_GL_GetProcAddress("glGetQueryivARB"); qglGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectivARB"); qglGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC) SDL_GL_GetProcAddress("glGetQueryObjectuivARB"); glRefConfig.occlusionQuery = qtrue; ri.Printf(PRINT_ALL, result[glRefConfig.occlusionQuery], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_framebuffer_blit extension = "GL_EXT_framebuffer_blit"; glRefConfig.framebufferBlit = qfalse; if (GLimp_HaveExtension(extension)) { qglBlitFramebufferEXT = (void *)SDL_GL_GetProcAddress("glBlitFramebufferEXT"); glRefConfig.framebufferBlit = qtrue; ri.Printf(PRINT_ALL, result[glRefConfig.framebufferBlit], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_framebuffer_multisample extension = "GL_EXT_framebuffer_multisample"; glRefConfig.framebufferMultisample = qfalse; if (GLimp_HaveExtension(extension)) { qglRenderbufferStorageMultisampleEXT = (void *)SDL_GL_GetProcAddress("glRenderbufferStorageMultisampleEXT"); glRefConfig.framebufferMultisample = qtrue; ri.Printf(PRINT_ALL, result[glRefConfig.framebufferMultisample], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_EXT_texture_sRGB extension = "GL_EXT_texture_sRGB"; glRefConfig.texture_srgb = qfalse; if (GLimp_HaveExtension(extension)) { if (r_srgb->integer) { glRefConfig.texture_srgb = qtrue; } ri.Printf(PRINT_ALL, result[glRefConfig.texture_srgb], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } glRefConfig.textureCompression = TCR_NONE; // GL_EXT_texture_compression_latc extension = "GL_EXT_texture_compression_latc"; if (GLimp_HaveExtension(extension)) { if (r_ext_compressed_textures->integer) { glRefConfig.textureCompression |= TCR_LATC; } ri.Printf(PRINT_ALL, result[r_ext_compressed_textures->integer ? 1 : 0], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_texture_compression_bptc extension = "GL_ARB_texture_compression_bptc"; if (GLimp_HaveExtension(extension)) { if (r_ext_compressed_textures->integer >= 2) { glRefConfig.textureCompression |= TCR_BPTC; } ri.Printf(PRINT_ALL, result[(r_ext_compressed_textures->integer >= 2) ? 1 : 0], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_draw_buffers extension = "GL_ARB_draw_buffers"; qglDrawBuffersARB = NULL; if (GLimp_HaveExtension(extension)) { qglDrawBuffersARB = (void *) SDL_GL_GetProcAddress("glDrawBuffersARB"); ri.Printf(PRINT_ALL, result[1], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } // GL_ARB_depth_clamp extension = "GL_ARB_depth_clamp"; glRefConfig.depthClamp = qfalse; if (GLimp_HaveExtension(extension)) { glRefConfig.depthClamp = qtrue; ri.Printf(PRINT_ALL, result[1], extension); } else { ri.Printf(PRINT_ALL, result[2], extension); } }
static void GLimp_InitExtensionsR2(void) { Com_Printf("Initializing OpenGL extensions\n"); // GL_ARB_depth_texture GLimp_CheckForVersionExtension("GL_ARB_depth_texture", 130, qtrue, NULL); if (GLimp_CheckForVersionExtension("GL_ARB_texture_cube_map", 130, qtrue, NULL)) { glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &glConfig2.maxCubeMapTextureSize); } GL_CheckErrors(); GLimp_CheckForVersionExtension("GL_ARB_vertex_program", 210, qtrue, NULL); GLimp_CheckForVersionExtension("GL_ARB_vertex_buffer_object", 300, qtrue, NULL); // GL_ARB_occlusion_query glConfig2.occlusionQueryAvailable = qfalse; glConfig2.occlusionQueryBits = 0; if (GLimp_CheckForVersionExtension("GL_ARB_occlusion_query", 150, qfalse, r_ext_occlusion_query)) { glConfig2.occlusionQueryAvailable = qtrue; glGetQueryivARB(GL_SAMPLES_PASSED, GL_QUERY_COUNTER_BITS, &glConfig2.occlusionQueryBits); } GL_CheckErrors(); GLimp_CheckForVersionExtension("GL_ARB_shader_objects", 210, qtrue, NULL); if (GLimp_CheckForVersionExtension("GL_ARB_vertex_shader", 210, qtrue, NULL)) { int reservedComponents; GL_CheckErrors(); glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig2.maxVertexUniforms); GL_CheckErrors(); //glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &glConfig.maxVaryingFloats); GL_CheckErrors(); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig2.maxVertexAttribs); GL_CheckErrors(); reservedComponents = 16 * 10; // approximation how many uniforms we have besides the bone matrices glConfig2.maxVertexSkinningBones = (int) Q_bound(0.0, (Q_max(glConfig2.maxVertexUniforms - reservedComponents, 0) / 16), MAX_BONES); glConfig2.vboVertexSkinningAvailable = (qboolean)(r_vboVertexSkinning->integer && ((glConfig2.maxVertexSkinningBones >= 12) ? qtrue : qfalse)); } GL_CheckErrors(); GLimp_CheckForVersionExtension("GL_ARB_fragment_shader", 210, qtrue, NULL); // GL_ARB_shading_language_100 if (GLimp_CheckForVersionExtension("GL_ARB_shading_language_100", 210, qtrue, NULL)) { Q_strncpyz(glConfig2.shadingLanguageVersion, (char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB), sizeof(glConfig2.shadingLanguageVersion)); sscanf(glConfig2.shadingLanguageVersion, "%d.%d", &glConfig2.glslMajorVersion, &glConfig2.glslMinorVersion); } GL_CheckErrors(); glConfig2.textureNPOTAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_texture_non_power_of_two", 300, qfalse, r_ext_texture_non_power_of_two)) { glConfig2.textureNPOTAvailable = qtrue; } glConfig2.drawBuffersAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_draw_buffers", /* -1 */ 300, qfalse, r_ext_draw_buffers)) { glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &glConfig2.maxDrawBuffers); glConfig2.drawBuffersAvailable = qtrue; } glConfig2.textureHalfFloatAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_half_float_pixel", 300, qfalse, r_ext_half_float_pixel)) { glConfig2.textureHalfFloatAvailable = qtrue; } glConfig2.textureFloatAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_texture_float", 300, qfalse, r_ext_texture_float)) { glConfig2.textureFloatAvailable = qtrue; } glConfig2.ARBTextureCompressionAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_texture_compression", 300, qfalse, r_ext_compressed_textures)) { glConfig2.ARBTextureCompressionAvailable = qtrue; glConfig.textureCompression = TC_NONE; } glConfig2.vertexArrayObjectAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_vertex_array_object", 300, qfalse, r_ext_vertex_array_object)) { glConfig2.vertexArrayObjectAvailable = qtrue; } // GL_EXT_texture_compression_s3tc if (GLimp_CheckForVersionExtension("GL_EXT_texture_compression_s3tc", -1, qfalse, r_ext_compressed_textures)) { glConfig.textureCompression = TC_S3TC_ARB; } glConfig2.texture3DAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_texture3D", 170, qfalse, NULL)) { glConfig2.texture3DAvailable = qtrue; } glConfig2.stencilWrapAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_stencil_wrap", 210, qfalse, r_ext_stencil_wrap)) { glConfig2.stencilWrapAvailable = qtrue; } glConfig2.textureAnisotropyAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_texture_filter_anisotropic", -1, qfalse, r_ext_texture_filter_anisotropic)) { glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig2.maxTextureAnisotropy); glConfig2.textureAnisotropyAvailable = qtrue; } GL_CheckErrors(); GLimp_CheckForVersionExtension("GL_EXT_stencil_two_side", 210, qfalse, r_ext_stencil_two_side); GLimp_CheckForVersionExtension("GL_EXT_depth_bounds_test", 170, qfalse, r_ext_depth_bounds_test); glConfig2.framebufferObjectAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_framebuffer_object", 300, qfalse, r_ext_packed_depth_stencil)) { glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glConfig2.maxRenderbufferSize); glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glConfig2.maxColorAttachments); glConfig2.framebufferObjectAvailable = qtrue; } GL_CheckErrors(); glConfig2.framebufferPackedDepthStencilAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_packed_depth_stencil", 300, qfalse, r_ext_packed_depth_stencil)) { glConfig2.framebufferPackedDepthStencilAvailable = qtrue; } glConfig2.framebufferBlitAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_EXT_framebuffer_blit", 300, qfalse, r_ext_framebuffer_blit)) { glConfig2.framebufferBlitAvailable = qtrue; } // GL_EXTX_framebuffer_mixed_formats not used glConfig2.generateMipmapAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_SGIS_generate_mipmap", 140, qfalse, r_ext_generate_mipmap)) { glConfig2.generateMipmapAvailable = qtrue; } glConfig2.getProgramBinaryAvailable = qfalse; if (GLimp_CheckForVersionExtension("GL_ARB_get_program_binary", 410, qfalse, NULL)) { int formats = 0; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &formats); if (formats) { glConfig2.getProgramBinaryAvailable = qtrue; } } // If we are in developer mode, then we will print out messages from the gfx driver if (GLimp_CheckForVersionExtension("GL_ARB_debug_output", 410, qfalse, NULL) && ri.Cvar_VariableIntegerValue("developer")) { #ifdef GL_DEBUG_OUTPUT glEnable(GL_DEBUG_OUTPUT); if (410 <= glConfig2.contextCombined) { glDebugMessageCallback(Glimp_DebugCallback, NULL); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); } else { glDebugMessageCallbackARB(Glimp_DebugCallback, NULL); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB); } #endif } }
/* =============== GLimp_InitExtensions =============== */ static void GLimp_InitExtensions(void) { ri.Printf(PRINT_ALL, "Initializing OpenGL extensions\n"); // GL_ARB_multitexture if(glConfig.driverType != GLDRV_OPENGL3) { if(GLEW_ARB_multitexture) { glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &glConfig.maxActiveTextures); if(glConfig.maxActiveTextures > 1) { ri.Printf(PRINT_ALL, "...using GL_ARB_multitexture\n"); } else { ri.Error(ERR_FATAL, "...not using GL_ARB_multitexture, < 2 texture units\n"); } } else { ri.Error(ERR_FATAL, "...GL_ARB_multitexture not found\n"); } } // GL_ARB_depth_texture if(GLEW_ARB_depth_texture) { ri.Printf(PRINT_ALL, "...using GL_ARB_depth_texture\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_depth_texture not found\n"); } // GL_ARB_texture_cube_map if(GLEW_ARB_texture_cube_map) { glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, &glConfig2.maxCubeMapTextureSize); ri.Printf(PRINT_ALL, "...using GL_ARB_texture_cube_map\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_texture_cube_map not found\n"); } GL_CheckErrors(); // GL_ARB_vertex_program if(GLEW_ARB_vertex_program) { ri.Printf(PRINT_ALL, "...using GL_ARB_vertex_program\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_vertex_program not found\n"); } // GL_ARB_vertex_buffer_object if(GLEW_ARB_vertex_buffer_object) { ri.Printf(PRINT_ALL, "...using GL_ARB_vertex_buffer_object\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_vertex_buffer_object not found\n"); } // GL_ARB_occlusion_query glConfig2.occlusionQueryAvailable = qfalse; glConfig2.occlusionQueryBits = 0; if(GLEW_ARB_occlusion_query) { if(r_ext_occlusion_query->value) { glConfig2.occlusionQueryAvailable = qtrue; glGetQueryivARB(GL_SAMPLES_PASSED, GL_QUERY_COUNTER_BITS, &glConfig2.occlusionQueryBits); ri.Printf(PRINT_ALL, "...using GL_ARB_occlusion_query\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_occlusion_query\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_occlusion_query not found\n"); } GL_CheckErrors(); // GL_ARB_shader_objects if(GLEW_ARB_shader_objects) { ri.Printf(PRINT_ALL, "...using GL_ARB_shader_objects\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_shader_objects not found\n"); } // GL_ARB_vertex_shader if(GLEW_ARB_vertex_shader) { int reservedComponents; GL_CheckErrors(); glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &glConfig2.maxVertexUniforms); GL_CheckErrors(); //glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &glConfig.maxVaryingFloats); GL_CheckErrors(); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &glConfig2.maxVertexAttribs); GL_CheckErrors(); reservedComponents = 16 * 10; // approximation how many uniforms we have besides the bone matrices /* if(glConfig.driverType == GLDRV_MESA) { // HACK // restrict to number of vertex uniforms to 512 because of: // xreal.x86_64: nv50_program.c:4181: nv50_program_validate_data: Assertion `p->param_nr <= 512' failed glConfig2.maxVertexUniforms = Q_bound(0, glConfig2.maxVertexUniforms, 512); } */ glConfig2.maxVertexSkinningBones = (int) Q_bound(0.0, (Q_max(glConfig2.maxVertexUniforms - reservedComponents, 0) / 16), MAX_BONES); glConfig2.vboVertexSkinningAvailable = r_vboVertexSkinning->integer && ((glConfig2.maxVertexSkinningBones >= 12) ? qtrue : qfalse); ri.Printf(PRINT_ALL, "...using GL_ARB_vertex_shader\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_vertex_shader not found\n"); } GL_CheckErrors(); // GL_ARB_fragment_shader if(GLEW_ARB_fragment_shader) { ri.Printf(PRINT_ALL, "...using GL_ARB_fragment_shader\n"); } else { ri.Error(ERR_FATAL, "...GL_ARB_fragment_shader not found\n"); } // GL_ARB_shading_language_100 if(GLEW_ARB_shading_language_100) { Q_strncpyz(glConfig2.shadingLanguageVersion, (char*)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB), sizeof(glConfig2.shadingLanguageVersion)); ri.Printf(PRINT_ALL, "...using GL_ARB_shading_language_100\n"); } else { ri.Printf(ERR_FATAL, "...GL_ARB_shading_language_100 not found\n"); } GL_CheckErrors(); // GL_ARB_texture_non_power_of_two glConfig2.textureNPOTAvailable = qfalse; if(GLEW_ARB_texture_non_power_of_two) { if(r_ext_texture_non_power_of_two->integer) { glConfig2.textureNPOTAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_texture_non_power_of_two\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_texture_non_power_of_two\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_texture_non_power_of_two not found\n"); } // GL_ARB_draw_buffers glConfig2.drawBuffersAvailable = qfalse; if(GLEW_ARB_draw_buffers) { glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &glConfig2.maxDrawBuffers); if(r_ext_draw_buffers->integer) { glConfig2.drawBuffersAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_draw_buffers\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_draw_buffers\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_draw_buffers not found\n"); } // GL_ARB_half_float_pixel glConfig2.textureHalfFloatAvailable = qfalse; if(GLEW_ARB_half_float_pixel) { if(r_ext_half_float_pixel->integer) { glConfig2.textureHalfFloatAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_half_float_pixel\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_half_float_pixel\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_half_float_pixel not found\n"); } // GL_ARB_texture_float glConfig2.textureFloatAvailable = qfalse; if(GLEW_ARB_texture_float) { if(r_ext_texture_float->integer) { glConfig2.textureFloatAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_texture_float\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_texture_float\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_texture_float not found\n"); } // GL_ARB_texture_compression glConfig.textureCompression = TC_NONE; if(GLEW_ARB_texture_compression) { if(r_ext_compressed_textures->integer) { glConfig2.ARBTextureCompressionAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_texture_compression\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_texture_compression\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_texture_compression not found\n"); } // GL_ARB_vertex_array_object glConfig2.vertexArrayObjectAvailable = qfalse; if(GLEW_ARB_vertex_array_object) { if(r_ext_vertex_array_object->integer) { glConfig2.vertexArrayObjectAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_ARB_vertex_array_object\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ARB_vertex_array_object\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ARB_vertex_array_object not found\n"); } // GL_EXT_texture_compression_s3tc if(GLEW_EXT_texture_compression_s3tc) { if(r_ext_compressed_textures->integer) { glConfig.textureCompression = TC_S3TC; ri.Printf(PRINT_ALL, "...using GL_EXT_texture_compression_s3tc\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_texture_compression_s3tc\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_texture_compression_s3tc not found\n"); } // GL_EXT_texture3D glConfig2.texture3DAvailable = qfalse; if(GLEW_EXT_texture3D) { //if(r_ext_texture3d->value) { glConfig2.texture3DAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_texture3D\n"); } /* else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_texture3D\n"); } */ } else { ri.Printf(PRINT_ALL, "...GL_EXT_texture3D not found\n"); } // GL_EXT_stencil_wrap glConfig2.stencilWrapAvailable = qfalse; if(GLEW_EXT_stencil_wrap) { if(r_ext_stencil_wrap->value) { glConfig2.stencilWrapAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_stencil_wrap\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_stencil_wrap\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_stencil_wrap not found\n"); } // GL_EXT_texture_filter_anisotropic glConfig2.textureAnisotropyAvailable = qfalse; if(GLEW_EXT_texture_filter_anisotropic) { glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glConfig2.maxTextureAnisotropy); if(r_ext_texture_filter_anisotropic->value) { glConfig2.textureAnisotropyAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_texture_filter_anisotropic\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_texture_filter_anisotropic\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_texture_filter_anisotropic not found\n"); } GL_CheckErrors(); // GL_EXT_stencil_two_side if(GLEW_EXT_stencil_two_side) { if(r_ext_stencil_two_side->value) { ri.Printf(PRINT_ALL, "...using GL_EXT_stencil_two_side\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_stencil_two_side\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_stencil_two_side not found\n"); } // GL_EXT_depth_bounds_test if(GLEW_EXT_depth_bounds_test) { if(r_ext_depth_bounds_test->value) { ri.Printf(PRINT_ALL, "...using GL_EXT_depth_bounds_test\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_depth_bounds_test\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_depth_bounds_test not found\n"); } // GL_EXT_framebuffer_object glConfig2.framebufferObjectAvailable = qfalse; if(GLEW_EXT_framebuffer_object) { glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &glConfig2.maxRenderbufferSize); glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &glConfig2.maxColorAttachments); if(r_ext_framebuffer_object->value) { glConfig2.framebufferObjectAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_framebuffer_object\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_framebuffer_object\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_framebuffer_object not found\n"); } GL_CheckErrors(); // GL_EXT_packed_depth_stencil glConfig2.framebufferPackedDepthStencilAvailable = qfalse; if(GLEW_EXT_packed_depth_stencil && glConfig.driverType != GLDRV_MESA) { if(r_ext_packed_depth_stencil->integer) { glConfig2.framebufferPackedDepthStencilAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_packed_depth_stencil\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_packed_depth_stencil\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_packed_depth_stencil not found\n"); } // GL_EXT_framebuffer_blit glConfig2.framebufferBlitAvailable = qfalse; if(GLEW_EXT_framebuffer_blit) { if(r_ext_framebuffer_blit->integer) { glConfig2.framebufferBlitAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXT_framebuffer_blit\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXT_framebuffer_blit\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXT_framebuffer_blit not found\n"); } // GL_EXTX_framebuffer_mixed_formats /* glConfig.framebufferMixedFormatsAvailable = qfalse; if(GLEW_EXTX_framebuffer_mixed_formats) { if(r_extx_framebuffer_mixed_formats->integer) { glConfig.framebufferMixedFormatsAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_EXTX_framebuffer_mixed_formats\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_EXTX_framebuffer_mixed_formats\n"); } } else { ri.Printf(PRINT_ALL, "...GL_EXTX_framebuffer_mixed_formats not found\n"); } */ // GL_ATI_separate_stencil if(GLEW_ATI_separate_stencil) { if(r_ext_separate_stencil->value) { ri.Printf(PRINT_ALL, "...using GL_ATI_separate_stencil\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_ATI_separate_stencil\n"); } } else { ri.Printf(PRINT_ALL, "...GL_ATI_separate_stencil not found\n"); } // GL_SGIS_generate_mipmap glConfig2.generateMipmapAvailable = qfalse; if(GLEW_SGIS_generate_mipmap) { if(r_ext_generate_mipmap->value) { glConfig2.generateMipmapAvailable = qtrue; ri.Printf(PRINT_ALL, "...using GL_SGIS_generate_mipmap\n"); } else { ri.Printf(PRINT_ALL, "...ignoring GL_SGIS_generate_mipmap\n"); } } else { ri.Printf(PRINT_ALL, "...GL_SGIS_generate_mipmap not found\n"); } // GL_GREMEDY_string_marker if(GLEW_GREMEDY_string_marker) { ri.Printf(PRINT_ALL, "...using GL_GREMEDY_string_marker\n"); } else { ri.Printf(PRINT_ALL, "...GL_GREMEDY_string_marker not found\n"); } }