diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 54bfa76f7..5fedc25fd 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -537,6 +537,10 @@ void LLViewerShaderMgr::setShaders() { gViewerWindow->setCursor(UI_CURSOR_ARROW); } + + LLWaterParamManager::instance()->updateShaderLinks(); + LLWLParamManager::instance()->updateShaderLinks(); + gPipeline.createGLBuffers(); reentrance = false; } diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index bf8956960..4943426ba 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -227,14 +227,10 @@ void LLWaterParamManager::propagateParameters(void) if(gPipeline.canUseVertexShaders()) { LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; - end_shaders = LLViewerShaderMgr::instance()->endShaders(); - for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + end_shaders = mShaderList.end(); + for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter) { - if (shaders_iter->mProgramObject != 0 - && shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER) - { - shaders_iter->mUniformsDirty = TRUE; - } + shaders_iter->mUniformsDirty = TRUE; } } @@ -260,6 +256,28 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader) } } +void LLWaterParamManager::updateShaderLinks() +{ + mShaderList.clear(); + LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; + end_shaders = LLViewerShaderMgr::instance()->endShaders(); + for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + { + if (shaders_iter->mProgramObject != 0 + && shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER) + { + if( glGetUniformLocationARB(shaders_iter->mProgramObject,"lightnorm")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"camPosLocal")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogColor")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"waterPlane")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogDensity")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"waterFogKS")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"distance_multiplier")>=0) + mShaderList.push_back(&(*shaders_iter)); + } + } +} + void LLWaterParamManager::update(LLViewerCamera * cam) { LLFastTimer ftm(LLFastTimer::FTM_UPDATE_WLPARAM); @@ -316,14 +334,10 @@ void LLWaterParamManager::update(LLViewerCamera * cam) mWaterFogKS = 1.f/llmax(sunMoonDir.mV[2], WATER_FOG_LIGHT_CLAMP); LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; - end_shaders = LLViewerShaderMgr::instance()->endShaders(); - for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + end_shaders = mShaderList.end(); + for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter) { - if (shaders_iter->mProgramObject != 0 - && shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER) - { - shaders_iter->mUniformsDirty = TRUE; - } + shaders_iter->mUniformsDirty = TRUE; } } } diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h index babaf0076..36db23929 100644 --- a/indra/newview/llwaterparammanager.h +++ b/indra/newview/llwaterparammanager.h @@ -225,6 +225,8 @@ public: LLWaterParamManager(); ~LLWaterParamManager(); + void updateShaderLinks(); + /// load a preset file void loadAllPresets(const std::string & fileName); @@ -319,6 +321,7 @@ public: private: LLVector4 mWaterPlane; F32 mWaterFogKS; + std::vector mShaderList; // our parameter manager singleton instance static LLWaterParamManager * sInstance; diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index d3fc32835..801d3906f 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -286,6 +286,25 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader) } +void LLWLParamManager::updateShaderLinks() +{ + mShaderList.clear(); + LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; + end_shaders = LLViewerShaderMgr::instance()->endShaders(); + for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + { + if (shaders_iter->mProgramObject != 0 + && (gPipeline.canUseWindLightShaders() || shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)) + { + if( glGetUniformLocationARB(shaders_iter->mProgramObject,"lightnorm")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"camPosLocal")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"scene_light_strength")>=0 || + glGetUniformLocationARB(shaders_iter->mProgramObject,"cloud_pos_density1")>=0) + mShaderList.push_back(&(*shaders_iter)); + } + } +} + void LLWLParamManager::propagateParameters(void) { LLFastTimer ftm(LLFastTimer::FTM_UPDATE_WLPARAM); @@ -338,15 +357,10 @@ void LLWLParamManager::propagateParameters(void) // bind the variables for all shaders only if we're using WindLight LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; - end_shaders = LLViewerShaderMgr::instance()->endShaders(); - for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + end_shaders = mShaderList.end(); + for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter) { - if (shaders_iter->mProgramObject != 0 - && (gPipeline.canUseWindLightShaders() - || shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)) - { - shaders_iter->mUniformsDirty = TRUE; - } + shaders_iter->mUniformsDirty = TRUE; } // get the cfr version of the sun's direction @@ -401,15 +415,10 @@ void LLWLParamManager::update(LLViewerCamera * cam) mRotatedLightDir = LLVector4(lightNorm3, 0.f); LLViewerShaderMgr::shader_iter shaders_iter, end_shaders; - end_shaders = LLViewerShaderMgr::instance()->endShaders(); - for(shaders_iter = LLViewerShaderMgr::instance()->beginShaders(); shaders_iter != end_shaders; ++shaders_iter) + end_shaders = mShaderList.end(); + for(shaders_iter = mShaderList.begin(); shaders_iter != end_shaders; ++shaders_iter) { - if (shaders_iter->mProgramObject != 0 - && (gPipeline.canUseWindLightShaders() - || shaders_iter->mShaderGroup == LLGLSLShader::SG_WATER)) - { - shaders_iter->mUniformsDirty = TRUE; - } + shaders_iter->mUniformsDirty = TRUE; } } } diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h index a117dc1b0..b98334c8a 100644 --- a/indra/newview/llwlparammanager.h +++ b/indra/newview/llwlparammanager.h @@ -129,6 +129,8 @@ public: LLWLParamManager(); ~LLWLParamManager(); + void updateShaderLinks(); + /// load a preset file void loadPresets(const std::string & fileName); @@ -254,6 +256,7 @@ public: private: + std::vector mShaderList; // our parameter manager singleton instance static LLWLParamManager * sInstance;