Parammanagers are really not done well. Added manager-specific shader lists instead of just having them dig down the global list every update.

This commit is contained in:
Shyotl
2011-08-09 04:30:35 -05:00
parent 04ea6a967e
commit bff63ac682
5 changed files with 63 additions and 30 deletions

View File

@@ -537,6 +537,10 @@ void LLViewerShaderMgr::setShaders()
{
gViewerWindow->setCursor(UI_CURSOR_ARROW);
}
LLWaterParamManager::instance()->updateShaderLinks();
LLWLParamManager::instance()->updateShaderLinks();
gPipeline.createGLBuffers();
reentrance = false;
}

View File

@@ -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;
}
}
}

View File

@@ -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<LLGLSLShader *> mShaderList;
// our parameter manager singleton instance
static LLWaterParamManager * sInstance;

View File

@@ -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;
}
}
}

View File

@@ -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<LLGLSLShader *> mShaderList;
// our parameter manager singleton instance
static LLWLParamManager * sInstance;