/** * @file llfloaterhardwaresettings.cpp * @brief Menu of all the different graphics hardware settings * * $LicenseInfo:firstyear=2001&license=viewergpl$ * * Copyright (c) 2001-2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at * http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, * and agree to abide by those obligations. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llfloaterhardwaresettings.h" #include "llfloaterpreference.h" #include "llviewerwindow.h" #include "llwindow.h" #include "llviewercontrol.h" #include "llviewertexturelist.h" #include "llfeaturemanager.h" #include "llstartup.h" #include "llradiogroup.h" #include "lluictrlfactory.h" #include "llimagegl.h" #include "pipeline.h" LLFloaterHardwareSettings* LLFloaterHardwareSettings::sHardwareSettings = NULL; LLFloaterHardwareSettings::LLFloaterHardwareSettings() : LLFloater(std::string("Hardware Settings Floater")) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hardware_settings.xml"); // load it up initCallbacks(); } LLFloaterHardwareSettings::~LLFloaterHardwareSettings() { } void LLFloaterHardwareSettings::onClickHelp(void* data) { const char* xml_alert = "HardwareSettingsHelpButton"; LLNotifications::instance().add(xml_alert); } void LLFloaterHardwareSettings::initCallbacks(void) { } // menu maintenance functions void LLFloaterHardwareSettings::refresh() { LLPanel::refresh(); mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable"); mUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic"); mFSAASamples = gSavedSettings.getU32("RenderFSAASamples"); mGamma = gSavedSettings.getF32("RenderGamma"); mVideoCardMem = gSavedSettings.getS32("TextureMemory"); mFogRatio = gSavedSettings.getF32("RenderFogRatio"); mProbeHardwareOnStartup = gSavedSettings.getBOOL("ProbeHardwareOnStartup"); childSetValue("fsaa", (LLSD::Integer) mFSAASamples); refreshEnabledState(); } void LLFloaterHardwareSettings::refreshEnabledState() { S32 min_tex_mem = LLViewerTextureList::getMinVideoRamSetting(); S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(); childSetMinValue("GrapicsCardTextureMemory", min_tex_mem); childSetMaxValue("GrapicsCardTextureMemory", max_tex_mem); mLastVBOState = LLVertexBuffer::sEnableVBOs; if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") || !gGLManager.mHasVertexBufferObject) { childSetEnabled("vbo", FALSE); //Streaming VBOs -Shyotl childSetEnabled("vbo_stream", FALSE); } else { childSetEnabled("vbo_stream", LLVertexBuffer::sEnableVBOs); } childSetEnabled("fbo",gGLManager.mHasFramebufferObject && !LLPipeline::sRenderDeferred); // if no windlight shaders, turn off nighttime brightness, gamma, and fog distance childSetEnabled("gamma", !gPipeline.canUseWindLightShaders()); childSetEnabled("(brightness, lower is brighter)", !gPipeline.canUseWindLightShaders()); childSetEnabled("fog", !gPipeline.canUseWindLightShaders()); } // static instance of it LLFloaterHardwareSettings* LLFloaterHardwareSettings::instance() { if (!sHardwareSettings) { sHardwareSettings = new LLFloaterHardwareSettings(); sHardwareSettings->close(); } return sHardwareSettings; } void LLFloaterHardwareSettings::show() { LLFloaterHardwareSettings* hardSettings = instance(); hardSettings->refresh(); hardSettings->center(); // comment in if you want the menu to rebuild each time //LLUICtrlFactory::getInstance()->buildFloater(hardSettings, "floater_hardware_settings.xml"); //hardSettings->initCallbacks(); hardSettings->open(); } bool LLFloaterHardwareSettings::isOpen() { if (sHardwareSettings != NULL) { return true; } return false; } // virtual void LLFloaterHardwareSettings::onClose(bool app_quitting) { if (sHardwareSettings) { sHardwareSettings->setVisible(FALSE); } } // virtual void LLFloaterHardwareSettings::draw() { if(mLastVBOState == !LLVertexBuffer::sEnableVBOs) refreshEnabledState(); LLFloater::draw(); } //============================================================================ BOOL LLFloaterHardwareSettings::postBuild() { childSetAction("OK", onBtnOK, this); refresh(); return TRUE; } void LLFloaterHardwareSettings::apply() { //Still do a bit of voodoo here. V2 forces restart to change FSAA with FBOs off. //Let's not do that, and instead do pre-V2 FSAA change handling for that particular case if(!LLRenderTarget::sUseFBO && (mFSAASamples != (U32)childGetValue("fsaa").asInteger())) { BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED); LLWindow* window = gViewerWindow->getWindow(); LLCoordScreen size; window->getSize(&size); gViewerWindow->changeDisplaySettings(window->getFullscreen(), size, gSavedSettings.getBOOL("DisableVerticalSync"), logged_in); } refresh(); } void LLFloaterHardwareSettings::cancel() { gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO); gSavedSettings.setBOOL("RenderUseFBO", mUseFBO); gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso); gSavedSettings.setU32("RenderFSAASamples", mFSAASamples); gSavedSettings.setF32("RenderGamma", mGamma); gSavedSettings.setS32("TextureMemory", mVideoCardMem); gSavedSettings.setF32("RenderFogRatio", mFogRatio); gSavedSettings.setBOOL("ProbeHardwareOnStartup", mProbeHardwareOnStartup ); close(); } // static void LLFloaterHardwareSettings::onBtnOK( void* userdata ) { LLFloaterHardwareSettings *fp =(LLFloaterHardwareSettings *)userdata; fp->apply(); fp->close(false); }