void CGlobalRendering::PostInit() { supportNPOTs = GLEW_ARB_texture_non_power_of_two; haveARB = GLEW_ARB_vertex_program && GLEW_ARB_fragment_program; haveGLSL = (glGetString(GL_SHADING_LANGUAGE_VERSION) != NULL); haveGLSL &= GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader; haveGLSL &= !!GLEW_VERSION_2_0; // we want OpenGL 2.0 core functions { const char* glVendor = (const char*) glGetString(GL_VENDOR); const char* glRenderer = (const char*) glGetString(GL_RENDERER); const std::string vendor = (glVendor != NULL)? StringToLower(std::string(glVendor)): ""; const std::string renderer = (glRenderer != NULL)? StringToLower(std::string(glRenderer)): ""; haveATI = (vendor.find("ati ") != std::string::npos) || (vendor.find("amd ") != std::string::npos); haveMesa = (renderer.find("mesa ") != std::string::npos); haveIntel = (vendor.find("intel ") != std::string::npos); haveNvidia = (vendor.find("nvidia ") != std::string::npos); //FIXME Neither Intel's nor Mesa's GLSL implementation seem to be in a workable state atm (date: Nov. 2011) haveGLSL &= !haveIntel; haveGLSL &= !haveMesa; if (haveATI) { // x-series doesn't support NPOTs (but hd-series does) supportNPOTs = (renderer.find(" x") == std::string::npos && renderer.find(" 9") == std::string::npos); } } // use some ATI bugfixes? const int atiHacksCfg = configHandler->GetInt("AtiHacks"); atiHacks = haveATI && (atiHacksCfg < 0); // runtime detect atiHacks |= (atiHacksCfg > 0); // user override // Runtime compress textures? if (GLEW_ARB_texture_compression) { // we don't even need to check it, 'cos groundtextures must have that extension // default to off because it reduces quality (smallest mipmap level is bigger) compressTextures = configHandler->GetBool("CompressTextures"); } // maximum 2D texture size { glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); } // detect if GL_DEPTH_COMPONENT24 is supported (many ATIs don't do so) { // ATI seems to support GL_DEPTH_COMPONENT24 for static textures, but you can't render to them /* GLint state = 0; glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 16, 16, 0, GL_LUMINANCE, GL_FLOAT, NULL); glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &state); support24bitDepthBuffers = (state > 0); */ support24bitDepthBuffers = false; if (FBO::IsSupported() && !atiHacks) { const int fboSizeX = 16, fboSizeY = 16; FBO fbo; fbo.Bind(); fbo.CreateRenderBuffer(GL_COLOR_ATTACHMENT0_EXT, GL_RGBA8, fboSizeX, fboSizeY); fbo.CreateRenderBuffer(GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_COMPONENT24, fboSizeX, fboSizeY); const GLenum status = fbo.GetStatus(); fbo.Unbind(); support24bitDepthBuffers = (status == GL_FRAMEBUFFER_COMPLETE_EXT); } } // print info LOG( "GL info:\n" "\thaveARB: %i, haveGLSL: %i, ATI hacks: %i\n" "\tFBO support: %i, NPOT-texture support: %i, 24bit Z-buffer support: %i\n" "\tmaximum texture size: %i, compress MIP-map textures: %i", haveARB, haveGLSL, atiHacks, FBO::IsSupported(), supportNPOTs, support24bitDepthBuffers, maxTextureSize, compressTextures ); }
void CGlobalRendering::PostInit() { supportNPOTs = GLEW_ARB_texture_non_power_of_two; haveARB = GLEW_ARB_vertex_program && GLEW_ARB_fragment_program; haveGLSL = (glGetString(GL_SHADING_LANGUAGE_VERSION) != NULL); haveGLSL &= GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader; haveGLSL &= !!GLEW_VERSION_2_0; // we want OpenGL 2.0 core functions { const char* glVendor = (const char*) glGetString(GL_VENDOR); const char* glRenderer = (const char*) glGetString(GL_RENDERER); const std::string vendor = (glVendor != NULL)? StringToLower(std::string(glVendor)): ""; const std::string renderer = (glRenderer != NULL)? StringToLower(std::string(glRenderer)): ""; haveATI = (vendor.find("ati ") != std::string::npos) || (vendor.find("amd ") != std::string::npos); haveMesa = (renderer.find("mesa ") != std::string::npos) || (renderer.find("gallium ") != std::string::npos); haveIntel = (vendor.find("intel") != std::string::npos); haveNvidia = (vendor.find("nvidia ") != std::string::npos); //FIXME Neither Intel's nor Mesa's GLSL implementation seem to be in a workable state atm (date: Nov. 2011) haveGLSL &= !haveIntel; haveGLSL &= !haveMesa; //FIXME add an user config to force enable it! if (haveATI) { // x-series doesn't support NPOTs (but hd-series does) supportNPOTs = (renderer.find(" x") == std::string::npos && renderer.find(" 9") == std::string::npos); } } // use some ATI bugfixes? const int atiHacksCfg = configHandler->GetInt("AtiHacks"); atiHacks = haveATI && (atiHacksCfg < 0); // runtime detect atiHacks |= (atiHacksCfg > 0); // user override // Runtime compress textures? if (GLEW_ARB_texture_compression) { // we don't even need to check it, 'cos groundtextures must have that extension // default to off because it reduces quality (smallest mipmap level is bigger) compressTextures = configHandler->GetBool("CompressTextures"); } #ifdef GLEW_NV_primitive_restart supportRestartPrimitive = !!(GLEW_NV_primitive_restart); #endif // maximum 2D texture size { glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); } // retrieve maximu smoothed PointSize float2 aliasedPointSizeRange, smoothPointSizeRange; glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, (GLfloat*)&aliasedPointSizeRange); glGetFloatv(GL_SMOOTH_POINT_SIZE_RANGE, (GLfloat*)&smoothPointSizeRange); maxSmoothPointSize = std::min(aliasedPointSizeRange.y, smoothPointSizeRange.y); // some GLSL relevant information { glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &glslMaxUniformBufferBindings); glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &glslMaxUniformBufferSize); glGetIntegerv(GL_MAX_VARYING_FLOATS, &glslMaxVaryings); glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &glslMaxAttributes); glGetIntegerv(GL_MAX_DRAW_BUFFERS, &glslMaxDrawBuffers); glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &glslMaxRecommendedIndices); glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &glslMaxRecommendedVertices); glslMaxVaryings /= 4; // GL_MAX_VARYING_FLOATS returns max individual floats, we want float4 } // detect if GL_DEPTH_COMPONENT24 is supported (many ATIs don't do so) { // ATI seems to support GL_DEPTH_COMPONENT24 for static textures, but you can't render to them /* GLint state = 0; glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 16, 16, 0, GL_LUMINANCE, GL_FLOAT, NULL); glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &state); support24bitDepthBuffers = (state > 0); */ support24bitDepthBuffers = false; if (FBO::IsSupported() && !atiHacks) { const int fboSizeX = 16, fboSizeY = 16; FBO fbo; fbo.Bind(); fbo.CreateRenderBuffer(GL_COLOR_ATTACHMENT0_EXT, GL_RGBA8, fboSizeX, fboSizeY); fbo.CreateRenderBuffer(GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_COMPONENT24, fboSizeX, fboSizeY); const GLenum status = fbo.GetStatus(); fbo.Unbind(); support24bitDepthBuffers = (status == GL_FRAMEBUFFER_COMPLETE_EXT); } } // print info LOG( "GL info:\n" "\thaveARB: %i, haveGLSL: %i, ATI hacks: %i\n" "\tFBO support: %i, NPOT-texture support: %i, 24bit Z-buffer support: %i\n" "\tmaximum texture size: %i, compress MIP-map textures: %i\n" "\tmaximum SmoothPointSize: %0.0f, maximum vec4 varying/attributes: %i/%i\n" "\tmaximum drawbuffers: %i, maximum recommended indices/vertices: %i/%i\n" "\tnumber of UniformBufferBindings: %i (%ikB)", haveARB, haveGLSL, atiHacks, FBO::IsSupported(), supportNPOTs, support24bitDepthBuffers, maxTextureSize, compressTextures, maxSmoothPointSize, glslMaxVaryings, glslMaxAttributes, glslMaxDrawBuffers, glslMaxRecommendedIndices, glslMaxRecommendedVertices, glslMaxUniformBufferBindings, glslMaxUniformBufferSize / 1024 ); teamNanospray = configHandler->GetBool("TeamNanoSpray"); }