diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2021-10-20 14:06:09 +0100 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2021-10-20 14:06:09 +0100 | 
| commit | da183230b0f08d50ad35330fc8ef51307a8b6f84 (patch) | |
| tree | 5cb837f469f2984ee5da54dec9d30647b4b879ab /indra | |
| parent | e0ea20a3c95197c042da9684b5e9e2f7d4f126fd (diff) | |
| parent | d2dce17803a545378407d6b7c62fdcd3007a92bc (diff) | |
Merge branch 'DRTVWR-546' of ssh://bitbucket.org/lindenlab/viewer into DRTVWR-546
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/cmake/Tracy.cmake | 2 | ||||
| -rw-r--r-- | indra/llcommon/llsd.cpp | 32 | ||||
| -rw-r--r-- | indra/llcommon/llsd.h | 12 | ||||
| -rw-r--r-- | indra/llinventory/llsettingsbase.cpp | 4 | ||||
| -rw-r--r-- | indra/llinventory/llsettingssky.cpp | 3 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 68 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 82 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolbump.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolterrain.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolwlsky.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llenvironment.cpp | 39 | ||||
| -rw-r--r-- | indra/newview/llenvironment.h | 18 | ||||
| -rw-r--r-- | indra/newview/llsettingsvo.cpp | 68 | ||||
| -rw-r--r-- | indra/newview/llsettingsvo.h | 4 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 2 | 
15 files changed, 247 insertions, 96 deletions
| diff --git a/indra/cmake/Tracy.cmake b/indra/cmake/Tracy.cmake index 1b8c3db2e2..cfff956bcf 100644 --- a/indra/cmake/Tracy.cmake +++ b/indra/cmake/Tracy.cmake @@ -7,7 +7,7 @@ if (USE_TRACY)    set(TRACY_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/tracy)   # See: indra/llcommon/llprofiler.h -  add_definitions(-DLL_PROFILER_CONFIGURATION=2) +  add_definitions(-DLL_PROFILER_CONFIGURATION=3)    use_prebuilt_binary(tracy)    if (WINDOWS) diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 57b746889d..605f6bf0e3 100644 --- a/indra/llcommon/llsd.cpp +++ b/indra/llcommon/llsd.cpp @@ -400,6 +400,7 @@ namespace  	ImplMap& ImplMap::makeMap(LLSD::Impl*& var)  	{ +        LL_PROFILE_ZONE_SCOPED;  		if (shared())  		{  			ImplMap* i = new ImplMap(mData); @@ -414,18 +415,21 @@ namespace  	bool ImplMap::has(const LLSD::String& k) const  	{ +        LL_PROFILE_ZONE_SCOPED;  		DataMap::const_iterator i = mData.find(k);  		return i != mData.end();  	}  	LLSD ImplMap::get(const LLSD::String& k) const  	{ +        LL_PROFILE_ZONE_SCOPED;  		DataMap::const_iterator i = mData.find(k);  		return (i != mData.end()) ? i->second : LLSD();  	}  	LLSD ImplMap::getKeys() const  	{  +        LL_PROFILE_ZONE_SCOPED;  		LLSD keys = LLSD::emptyArray();  		DataMap::const_iterator iter = mData.begin();  		while (iter != mData.end()) @@ -438,11 +442,13 @@ namespace  	void ImplMap::insert(const LLSD::String& k, const LLSD& v)  	{ +        LL_PROFILE_ZONE_SCOPED;  		mData.insert(DataMap::value_type(k, v));  	}  	void ImplMap::erase(const LLSD::String& k)  	{ +        LL_PROFILE_ZONE_SCOPED;  		mData.erase(k);  	} @@ -684,6 +690,7 @@ const LLSD::Impl& LLSD::Impl::safe(const Impl* impl)  ImplMap& LLSD::Impl::makeMap(Impl*& var)  { +    LL_PROFILE_ZONE_SCOPED;  	ImplMap* im = new ImplMap;  	reset(var, im);  	return *im; @@ -887,11 +894,16 @@ LLSD& LLSD::with(const String& k, const LLSD& v)  										}  void LLSD::erase(const String& k)		{ makeMap(impl).erase(k); } -LLSD&		LLSD::operator[](const String& k) -										{ return makeMap(impl).ref(k); } +LLSD& LLSD::operator[](const String& k) +{  +    LL_PROFILE_ZONE_SCOPED; +    return makeMap(impl).ref(k);  +}  const LLSD& LLSD::operator[](const String& k) const -										{ return safe(impl).ref(k); } - +{  +    LL_PROFILE_ZONE_SCOPED; +    return safe(impl).ref(k);  +}  LLSD LLSD::emptyArray()  { @@ -914,10 +926,16 @@ LLSD& LLSD::with(Integer i, const LLSD& v)  LLSD& LLSD::append(const LLSD& v)		{ return makeArray(impl).append(v); }  void LLSD::erase(Integer i)				{ makeArray(impl).erase(i); } -LLSD&		LLSD::operator[](Integer i) -										{ return makeArray(impl).ref(i); } +LLSD& LLSD::operator[](Integer i) +{  +    LL_PROFILE_ZONE_SCOPED; +    return makeArray(impl).ref(i);  +}  const LLSD& LLSD::operator[](Integer i) const -										{ return safe(impl).ref(i); } +{  +    LL_PROFILE_ZONE_SCOPED; +    return safe(impl).ref(i); +}  static const char *llsd_dump(const LLSD &llsd, bool useXMLFormat)  { diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h index 5b6d5545af..b8ddf21596 100644 --- a/indra/llcommon/llsd.h +++ b/indra/llcommon/llsd.h @@ -290,9 +290,17 @@ public:  		LLSD& with(const String&, const LLSD&);  		LLSD& operator[](const String&); -		LLSD& operator[](const char* c)			{ return (*this)[String(c)]; } +		LLSD& operator[](const char* c)			 +        {  +            LL_PROFILE_ZONE_SCOPED; +            return (*this)[String(c)];  +        }  		const LLSD& operator[](const String&) const; -		const LLSD& operator[](const char* c) const	{ return (*this)[String(c)]; } +		const LLSD& operator[](const char* c) const	 +        {  +            LL_PROFILE_ZONE_SCOPED; +            return (*this)[String(c)];  +        }  	//@}  	/** @name Array Values */ diff --git a/indra/llinventory/llsettingsbase.cpp b/indra/llinventory/llsettingsbase.cpp index 61b59e35aa..89a4eebf26 100644 --- a/indra/llinventory/llsettingsbase.cpp +++ b/indra/llinventory/llsettingsbase.cpp @@ -683,6 +683,7 @@ bool LLSettingsBase::Validator::verifyStringLength(LLSD &value, S32 length)  //=========================================================================  void LLSettingsBlender::update(const LLSettingsBase::BlendFactor& blendf)  { +    LL_PROFILE_ZONE_SCOPED;      F64 res = setBlendFactor(blendf);      llassert(res >= 0.0 && res <= 1.0);      (void)res; @@ -713,6 +714,7 @@ F64 LLSettingsBlender::setBlendFactor(const LLSettingsBase::BlendFactor& blendf_  void LLSettingsBlender::triggerComplete()  { +    LL_PROFILE_ZONE_SCOPED;      if (mTarget)          mTarget->replaceSettings(mFinal->getSettings());      LLSettingsBlender::ptr_t hold = shared_from_this();   // prevents this from deleting too soon @@ -725,11 +727,13 @@ const LLSettingsBase::BlendFactor LLSettingsBlenderTimeDelta::MIN_BLEND_DELTA(FL  LLSettingsBase::BlendFactor LLSettingsBlenderTimeDelta::calculateBlend(const LLSettingsBase::TrackPosition& spanpos, const LLSettingsBase::TrackPosition& spanlen) const  { +    LL_PROFILE_ZONE_SCOPED;      return LLSettingsBase::BlendFactor(fmod((F64)spanpos, (F64)spanlen) / (F64)spanlen);  }  bool LLSettingsBlenderTimeDelta::applyTimeDelta(const LLSettingsBase::Seconds& timedelta)  { +    LL_PROFILE_ZONE_SCOPED;      mTimeSpent += timedelta;      if (mTimeSpent > mBlendSpan) diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index 81937dbda5..00c1edb55a 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -444,6 +444,7 @@ void LLSettingsSky::replaceWithSky(LLSettingsSky::ptr_t pother)  void LLSettingsSky::blend(const LLSettingsBase::ptr_t &end, F64 blendf)   { +    LL_PROFILE_ZONE_SCOPED;      llassert(getSettingsType() == end->getSettingsType());      LLSettingsSky::ptr_t other = PTR_NAMESPACE::dynamic_pointer_cast<LLSettingsSky>(end); @@ -1022,6 +1023,7 @@ LLColor3 LLSettingsSky::getLightDiffuse() const  LLColor3 LLSettingsSky::getColor(const std::string& key, const LLColor3& default_value) const  { +    LL_PROFILE_ZONE_SCOPED;      if (mSettings.has(SETTING_LEGACY_HAZE) && mSettings[SETTING_LEGACY_HAZE].has(key))      {          return LLColor3(mSettings[SETTING_LEGACY_HAZE][key]); @@ -1035,6 +1037,7 @@ LLColor3 LLSettingsSky::getColor(const std::string& key, const LLColor3& default  F32 LLSettingsSky::getFloat(const std::string& key, F32 default_value) const  { +    LL_PROFILE_ZONE_SCOPED;      if (mSettings.has(SETTING_LEGACY_HAZE) && mSettings[SETTING_LEGACY_HAZE].has(key))      {          return mSettings[SETTING_LEGACY_HAZE][key].asReal(); diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 84eac00c65..0e4753fcc6 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -1104,6 +1104,7 @@ S32 LLGLSLShader::disableTexture(S32 uniform, LLTexUnit::eTextureType mode, LLTe  void LLGLSLShader::uniform1i(U32 index, GLint x)  { +    LL_PROFILE_ZONE_SCOPED      if (mProgramObject)      {             if (mUniform.size() <= index) @@ -1114,7 +1115,7 @@ void LLGLSLShader::uniform1i(U32 index, GLint x)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              if (iter == mValue.end() || iter->second.mV[0] != x)              {                  glUniform1iARB(mUniform[index], x); @@ -1126,6 +1127,7 @@ void LLGLSLShader::uniform1i(U32 index, GLint x)  void LLGLSLShader::uniform1f(U32 index, GLfloat x)  { +    LL_PROFILE_ZONE_SCOPED      if (mProgramObject)      {             if (mUniform.size() <= index) @@ -1136,7 +1138,7 @@ void LLGLSLShader::uniform1f(U32 index, GLfloat x)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              if (iter == mValue.end() || iter->second.mV[0] != x)              {                  glUniform1fARB(mUniform[index], x); @@ -1158,7 +1160,7 @@ void LLGLSLShader::uniform2f(U32 index, GLfloat x, GLfloat y)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(x,y,0.f,0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec))              { @@ -1181,7 +1183,7 @@ void LLGLSLShader::uniform3f(U32 index, GLfloat x, GLfloat y, GLfloat z)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(x,y,z,0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec))              { @@ -1204,7 +1206,7 @@ void LLGLSLShader::uniform4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(x,y,z,w);              if (iter == mValue.end() || shouldChange(iter->second,vec))              { @@ -1227,7 +1229,7 @@ void LLGLSLShader::uniform1iv(U32 index, U32 count, const GLint* v)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(v[0],0.f,0.f,0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)              { @@ -1250,7 +1252,7 @@ void LLGLSLShader::uniform1fv(U32 index, U32 count, const GLfloat* v)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(v[0],0.f,0.f,0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)              { @@ -1273,7 +1275,7 @@ void LLGLSLShader::uniform2fv(U32 index, U32 count, const GLfloat* v)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(v[0],v[1],0.f,0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)              { @@ -1296,7 +1298,7 @@ void LLGLSLShader::uniform3fv(U32 index, U32 count, const GLfloat* v)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(v[0],v[1],v[2],0.f);              if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)              { @@ -1319,10 +1321,11 @@ void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)          if (mUniform[index] >= 0)          { -            std::map<GLint, LLVector4>::iterator iter = mValue.find(mUniform[index]); +            const auto& iter = mValue.find(mUniform[index]);              LLVector4 vec(v[0],v[1],v[2],v[3]);              if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)              { +                LL_PROFILE_ZONE_SCOPED;                  glUniform4fvARB(mUniform[index], count, v);                  mValue[mUniform[index]] = vec;              } @@ -1460,7 +1463,7 @@ void LLGLSLShader::uniform1i(const LLStaticHashedString& uniform, GLint v)      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(v,0.f,0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec))          { @@ -1476,7 +1479,7 @@ void LLGLSLShader::uniform2i(const LLStaticHashedString& uniform, GLint i, GLint      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(i,j,0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec))          { @@ -1493,7 +1496,7 @@ void LLGLSLShader::uniform1f(const LLStaticHashedString& uniform, GLfloat v)      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(v,0.f,0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec))          { @@ -1509,7 +1512,7 @@ void LLGLSLShader::uniform2f(const LLStaticHashedString& uniform, GLfloat x, GLf      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(x,y,0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec))          { @@ -1526,7 +1529,7 @@ void LLGLSLShader::uniform3f(const LLStaticHashedString& uniform, GLfloat x, GLf      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(x,y,z,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec))          { @@ -1542,7 +1545,7 @@ void LLGLSLShader::uniform1fv(const LLStaticHashedString& uniform, U32 count, co      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(v[0],0.f,0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)          { @@ -1558,7 +1561,7 @@ void LLGLSLShader::uniform2fv(const LLStaticHashedString& uniform, U32 count, co      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(v[0],v[1],0.f,0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)          { @@ -1574,7 +1577,7 @@ void LLGLSLShader::uniform3fv(const LLStaticHashedString& uniform, U32 count, co      if (location >= 0)      { -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          LLVector4 vec(v[0],v[1],v[2],0.f);          if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)          { @@ -1591,12 +1594,11 @@ void LLGLSLShader::uniform4fv(const LLStaticHashedString& uniform, U32 count, co      if (location >= 0)      {          LLVector4 vec(v); -        std::map<GLint, LLVector4>::iterator iter = mValue.find(location); +        const auto& iter = mValue.find(location);          if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)          { -            stop_glerror(); +            LL_PROFILE_ZONE_SCOPED;              glUniform4fvARB(location, count, v); -            stop_glerror();              mValue[location] = vec;          }      } @@ -1636,3 +1638,27 @@ void LLGLSLShader::setMinimumAlpha(F32 minimum)      gGL.flush();      uniform1f(LLShaderMgr::MINIMUM_ALPHA, minimum);  } + +void LLShaderUniforms::apply(LLGLSLShader* shader) +{ +    LL_PROFILE_ZONE_SCOPED; +    for (auto& uniform : mIntegers) +    { +        shader->uniform1i(uniform.mUniform, uniform.mValue); +    } + +    for (auto& uniform : mFloats) +    { +        shader->uniform1f(uniform.mUniform, uniform.mValue); +    } + +    for (auto& uniform : mVectors) +    { +        shader->uniform4fv(uniform.mUniform, 1, uniform.mValue.mV); +    } + +    for (auto& uniform : mVector3s) +    { +        shader->uniform3fv(uniform.mUniform, 1, uniform.mValue.mV); +    } +} diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 7cf6d3c941..3b23cf1b28 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -30,6 +30,7 @@  #include "llgl.h"  #include "llrender.h"  #include "llstaticstringtable.h" +#include <unordered_map>  class LLShaderFeatures  { @@ -64,16 +65,79 @@ public:  	LLShaderFeatures();  }; +// ============= Structure for caching shader uniforms =============== +class LLGLSLShader; + +class LLShaderUniforms +{ +public: + +    template<typename T> +    struct UniformSetting +    { +        S32 mUniform; +        T mValue; +    }; + +    typedef UniformSetting<S32> IntSetting; +    typedef UniformSetting<F32> FloatSetting; +    typedef UniformSetting<LLVector4> VectorSetting; +    typedef UniformSetting<LLVector3> Vector3Setting; + +    void clear() +    { +        mIntegers.resize(0); +        mFloats.resize(0); +        mVectors.resize(0); +        mVector3s.resize(0); +    } + +    void uniform1i(S32 index, S32 value) +    { +        mIntegers.push_back({ index, value }); +    } + +    void uniform1f(S32 index, F32 value) +    { +        mFloats.push_back({ index, value }); +    } + +    void uniform4fv(S32 index, const LLVector4& value) +    { +        mVectors.push_back({ index, value }); +    } +     +    void uniform4fv(S32 index, const F32* value) +    { +        mVectors.push_back({ index, LLVector4(value) }); +    } + +    void uniform3fv(S32 index, const LLVector3& value) +    { +        mVector3s.push_back({ index, value }); +    } + +    void apply(LLGLSLShader* shader); +    + +    std::vector<IntSetting> mIntegers; +    std::vector<FloatSetting> mFloats; +    std::vector<VectorSetting> mVectors; +    std::vector<Vector3Setting> mVector3s; +};  class LLGLSLShader  {  public: -	enum  +    // enum primarily used to control application sky settings uniforms +	typedef enum   	{ -		SG_DEFAULT = 0, -		SG_SKY, -		SG_WATER -	}; +		SG_DEFAULT = 0,  // not sky or water specific +		SG_SKY,  // +		SG_WATER, +        SG_ANY, +        SG_COUNT +	} eGroup;  	static std::set<LLGLSLShader*> sInstances;  	static bool sProfileEnabled; @@ -190,13 +254,15 @@ public:  	U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())  	std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location  	LLStaticStringTable<GLint> mUniformMap; //lookup map of uniform name to uniform location -	std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name -	std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value +    typedef std::unordered_map<GLint, std::string> uniform_name_map_t; +    typedef std::unordered_map<GLint, LLVector4> uniform_value_map_t; +    uniform_name_map_t mUniformNameMap; //lookup map of uniform location to uniform name +	uniform_value_map_t mValue; //lookup map of uniform location to last known value  	std::vector<GLint> mTexture;  	S32 mTotalUniformSize;  	S32 mActiveTextureChannels;  	S32 mShaderLevel; -	S32 mShaderGroup; +	S32 mShaderGroup; // see LLGLSLShader::eGroup  	BOOL mUniformsDirty;  	LLShaderFeatures mFeatures;  	std::vector< std::pair< std::string, GLenum > > mShaderFiles; diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index f316d121ab..d75884cc16 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -1062,6 +1062,7 @@ void LLBumpImageList::updateImages()  // Note: the caller SHOULD NOT keep the pointer that this function returns.  It may be updated as more data arrives.  LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code )  { +    LL_PROFILE_ZONE_SCOPED;  	llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );  	LLViewerTexture* bump = NULL; diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 37dc80e2b7..34a8b6b2cc 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -343,8 +343,6 @@ void LLDrawPoolTerrain::renderFullShader()      LLSettingsWater::ptr_t pwater = LLEnvironment::instance().getCurrentWater(); -    ((LLSettingsVOWater*)pwater.get())->updateShader(shader); -  	//  	// detail texture 1  	// diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 0c3d8f3098..8c8dc3f3d2 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -182,8 +182,6 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca          sky_shader->bindTexture(LLShaderMgr::RAINBOW_MAP, rainbow_tex);          sky_shader->bindTexture(LLShaderMgr::HALO_MAP,  halo_tex); -        ((LLSettingsVOSky*)psky.get())->updateShader(sky_shader); -          F32 moisture_level  = (float)psky->getSkyMoistureLevel();          F32 droplet_radius  = (float)psky->getSkyDropletRadius();          F32 ice_level       = (float)psky->getSkyIceLevel(); @@ -406,8 +404,6 @@ void LLDrawPoolWLSky::renderSkyCloudsDeferred(const LLVector3& camPosLocal, F32          cloudshader->uniform1f(LLShaderMgr::CLOUD_VARIANCE, cloud_variance);          cloudshader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor()); -        ((LLSettingsVOSky*)psky.get())->updateShader(cloudshader); -  		/// Render the skydome          renderDome(camPosLocal, camHeightLocal, cloudshader); @@ -462,8 +458,6 @@ void LLDrawPoolWLSky::renderSkyClouds(const LLVector3& camPosLocal, F32 camHeigh          cloudshader->uniform1f(LLShaderMgr::CLOUD_VARIANCE, cloud_variance);          cloudshader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor()); -        ((LLSettingsVOSky*)psky.get())->updateShader(cloudshader); -  		/// Render the skydome          renderDome(camPosLocal, camHeightLocal, cloudshader); diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 8881d11802..69d3075928 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -1471,6 +1471,7 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::getSharedEnvironmentInstance()  void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool forced)  { +    LL_PROFILE_ZONE_SCOPED;      DayInstance::ptr_t pinstance = getSelectedEnvironmentInstance();      if ((mCurrentEnvironment != pinstance) || forced) @@ -1488,6 +1489,8 @@ void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool f          {              mCurrentEnvironment = pinstance;          } + +        updateSettingsUniforms();      }  } @@ -1614,6 +1617,8 @@ void LLEnvironment::update(const LLViewerCamera * cam)      stop_glerror(); +    updateSettingsUniforms(); +      // *TODO: potential optimization - this block may only need to be      // executed some of the time.  For example for water shaders only.      { @@ -1648,10 +1653,16 @@ void LLEnvironment::updateCloudScroll()  }  // static -void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLSettingsBase::ptr_t &psetting) +void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, const LLSettingsBase::ptr_t &psetting)  {      LL_RECORD_BLOCK_TIME(FTM_SHADER_PARAM_UPDATE); +    for (int i = 0; i < LLGLSLShader::SG_COUNT; ++i) +    { +        uniforms[i].clear(); +    } + +    LLShaderUniforms* shader = &uniforms[LLGLSLShader::SG_ANY];      //_WARNS("RIDER") << "----------------------------------------------------------------" << LL_ENDL;      LLSettingsBase::parammapping_t params = psetting->getParameterMap();      for (auto &it: params) @@ -1694,7 +1705,7 @@ void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLS          {              LLVector4 vect4(value);              //_WARNS("RIDER") << "pushing '" << (*it).first << "' as " << vect4 << LL_ENDL; -            shader->uniform4fv(it.second.getShaderKey(), 1, vect4.mV); +            shader->uniform4fv(it.second.getShaderKey(), vect4 );              break;          } @@ -1707,17 +1718,30 @@ void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLS          default:              break;          } -        stop_glerror();      }      //_WARNS("RIDER") << "----------------------------------------------------------------" << LL_ENDL; -    psetting->applySpecial(shader); +    psetting->applySpecial(uniforms); +} + +void LLEnvironment::updateShaderUniforms(LLGLSLShader* shader) +{ +    LL_PROFILE_ZONE_SCOPED; + +    // apply uniforms that should be applied to all shaders +    mSkyUniforms[LLGLSLShader::SG_ANY].apply(shader); +    mWaterUniforms[LLGLSLShader::SG_ANY].apply(shader); + +    // apply uniforms specific to the given shader's shader group +    auto group = shader->mShaderGroup; +    mSkyUniforms[group].apply(shader); +    mWaterUniforms[group].apply(shader);  } -void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader) +void LLEnvironment::updateSettingsUniforms()  { -    updateGLVariablesForSettings(shader, mCurrentEnvironment->getWater()); -    updateGLVariablesForSettings(shader, mCurrentEnvironment->getSky()); +    updateGLVariablesForSettings(mWaterUniforms, mCurrentEnvironment->getWater()); +    updateGLVariablesForSettings(mSkyUniforms, mCurrentEnvironment->getSky());  }  void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo, LLSettingsBase::Seconds transition) @@ -2618,6 +2642,7 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::DayInstance::clone() const  bool LLEnvironment::DayInstance::applyTimeDelta(const LLSettingsBase::Seconds& delta)  { +    LL_PROFILE_ZONE_SCOPED;      ptr_t keeper(shared_from_this());   // makes sure that this does not go away while it is being worked on.      bool changed(false); diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h index 7cbf2d25bb..3568fbcfd1 100644 --- a/indra/newview/llenvironment.h +++ b/indra/newview/llenvironment.h @@ -38,11 +38,12 @@  #include "llatmosphere.h" +#include "llglslshader.h" +  #include <boost/signals2.hpp>  //-------------------------------------------------------------------------  class LLViewerCamera; -class LLGLSLShader;  class LLParcel;  //------------------------------------------------------------------------- @@ -50,8 +51,8 @@ class LLEnvironment : public LLSingleton<LLEnvironment>  {      LLSINGLETON_C11(LLEnvironment);      LOG_CLASS(LLEnvironment); -  public: +      static const F64Seconds     TRANSITION_INSTANT;      static const F64Seconds     TRANSITION_FAST;      static const F64Seconds     TRANSITION_DEFAULT; @@ -131,9 +132,14 @@ public:      void                        update(const LLViewerCamera * cam); -    static void                 updateGLVariablesForSettings(LLGLSLShader *shader, const LLSettingsBase::ptr_t &psetting); +    static void                 updateGLVariablesForSettings(LLShaderUniforms* uniforms, const LLSettingsBase::ptr_t &psetting); +     +    // apply current sky settings to given shader      void                        updateShaderUniforms(LLGLSLShader *shader); +    // prepare settings to be applied to shaders (call whenever settings are updated) +    void                        updateSettingsUniforms(); +      void                        setSelectedEnvironment(EnvSelection_t env, LLSettingsBase::Seconds transition = TRANSITION_DEFAULT, bool forced = false);      EnvSelection_t              getSelectedEnvironment() const                  { return mSelectedEnvironment; } @@ -234,6 +240,11 @@ public:      void                        handleEnvironmentPush(LLSD &message); +    //cached uniform values from LLSD values +    LLShaderUniforms mWaterUniforms[LLGLSLShader::SG_COUNT]; +    LLShaderUniforms mSkyUniforms[LLGLSLShader::SG_COUNT]; +    // ======================================================================================= +      class DayInstance: public std::enable_shared_from_this<DayInstance>      {      public: @@ -288,6 +299,7 @@ public:          LLSettingsDay::ptr_t        mDayCycle;          LLSettingsSky::ptr_t        mSky;          LLSettingsWater::ptr_t      mWater; +          S32                         mSkyTrack;          bool                        mInitialized; diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 1e5b893cbc..6a88a8ef2c 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -637,6 +637,7 @@ LLSD LLSettingsVOSky::convertToLegacy(const LLSettingsSky::ptr_t &psky, bool isA  //-------------------------------------------------------------------------  void LLSettingsVOSky::updateSettings()  { +    LL_PROFILE_ZONE_SCOPED;      LLSettingsSky::updateSettings();      LLVector3 sun_direction  = getSunDirection();      LLVector3 moon_direction = getMoonDirection(); @@ -665,55 +666,55 @@ void LLSettingsVOSky::updateSettings()  void LLSettingsVOSky::applySpecial(void *ptarget, bool force)  { -    LLGLSLShader *shader = (LLGLSLShader *)ptarget; -      LLVector4 light_direction = LLEnvironment::instance().getClampedLightNorm(); -    if (shader->mShaderGroup == LLGLSLShader::SG_DEFAULT) +    LLShaderUniforms* shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_DEFAULT];  	{         -    shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV); -	shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); +        shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, light_direction); +        shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, LLViewerCamera::getInstance()->getOrigin());  	}  -	else if (shader->mShaderGroup == LLGLSLShader::SG_SKY) +     +    shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_SKY];  	{ -    shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV);         +        shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, light_direction); -    // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate") -    LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]); -    LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() ); +        // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate") +        LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]); +        LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() ); -    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll -    // Keep in Sync! -    // * indra\newview\llsettingsvo.cpp -    // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl -    // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl -    cloud_scroll[0] = -cloud_scroll[0]; -    vect_c_p_d1 += cloud_scroll; -    shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, 1, vect_c_p_d1.mV); +        // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll +        // Keep in Sync! +        // * indra\newview\llsettingsvo.cpp +        // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl +        // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl +        cloud_scroll[0] = -cloud_scroll[0]; +        vect_c_p_d1 += cloud_scroll; +        shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, vect_c_p_d1); -    LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); +        LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -    LLColor4 sunDiffuse = psky->getSunlightColor(); -    LLColor4 moonDiffuse = psky->getMoonlightColor(); +        LLVector4 sunDiffuse = LLVector4(psky->getSunlightColor().mV); +        LLVector4 moonDiffuse = LLVector4(psky->getMoonlightColor().mV); -    shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, sunDiffuse.mV); -    shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, moonDiffuse.mV); +        shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, sunDiffuse); +        shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, moonDiffuse); -    LLColor4 cloud_color(psky->getCloudColor(), 1.0); -    shader->uniform4fv(LLShaderMgr::CLOUD_COLOR, 1, cloud_color.mV); +        LLVector4 cloud_color(LLVector3(psky->getCloudColor().mV), 1.0); +        shader->uniform4fv(LLShaderMgr::CLOUD_COLOR, cloud_color);  	} +    shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_ANY];      shader->uniform1f(LLShaderMgr::SCENE_LIGHT_STRENGTH, mSceneLightStrength);      LLColor4 ambient(getTotalAmbient()); -    shader->uniform4fv(LLShaderMgr::AMBIENT, 1, ambient.mV); +    shader->uniform4fv(LLShaderMgr::AMBIENT, LLVector4(ambient.mV));      shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, getIsSunUp() ? 1 : 0);      shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());      shader->uniform1f(LLShaderMgr::DENSITY_MULTIPLIER, getDensityMultiplier());      shader->uniform1f(LLShaderMgr::DISTANCE_MULTIPLIER, getDistanceMultiplier()); -    F32 g             = getGamma();     +    F32 g             = getGamma();      F32 display_gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");      shader->uniform1f(LLShaderMgr::GAMMA, g); @@ -907,11 +908,11 @@ LLSD LLSettingsVOWater::convertToLegacy(const LLSettingsWater::ptr_t &pwater)  //-------------------------------------------------------------------------  void LLSettingsVOWater::applySpecial(void *ptarget, bool force)  { -    LLGLSLShader *shader = (LLGLSLShader *)ptarget; -      LLEnvironment& env = LLEnvironment::instance(); -    if (force || (shader->mShaderGroup == LLGLSLShader::SG_WATER)) +    auto group = LLGLSLShader::SG_WATER; +    LLShaderUniforms* shader = &((LLShaderUniforms*)ptarget)[group]; +      	{          F32 water_height = env.getWaterHeight(); @@ -935,7 +936,7 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)          LLVector4 waterPlane(enorm.v[0], enorm.v[1], enorm.v[2], -ep.dot(enorm)); -        shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, waterPlane.mV); +        shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, waterPlane.mV);          LLVector4 light_direction = env.getClampedLightNorm(); @@ -950,18 +951,19 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)          shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, waterFogDensity);          LLColor4 fog_color(env.getCurrentWater()->getWaterFogColor(), 0.0f); -        shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, fog_color.mV); +        shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, fog_color.mV);          F32 blend_factor = env.getCurrentWater()->getBlendFactor();          shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);          // update to normal lightnorm, water shader itself will use rotated lightnorm as necessary -        shader->uniform4fv(LLShaderMgr::LIGHTNORM, 1, light_direction.mV); +        shader->uniform4fv(LLShaderMgr::LIGHTNORM, light_direction.mV);      }  }  void LLSettingsVOWater::updateSettings()  { +    LL_PROFILE_ZONE_SCOPED;      // base class clears dirty flag so as to not trigger recursive update      LLSettingsBase::updateSettings(); diff --git a/indra/newview/llsettingsvo.h b/indra/newview/llsettingsvo.h index 65136ad2f5..caa3ac18d3 100644 --- a/indra/newview/llsettingsvo.h +++ b/indra/newview/llsettingsvo.h @@ -102,8 +102,6 @@ public:      bool isAdvanced() const { return  m_isAdvanced; } -    virtual void updateShader(LLGLSLShader* shader) { applySpecial(shader, true); } -  protected:      LLSettingsVOSky(); @@ -136,8 +134,6 @@ public:      static LLSD     convertToLegacy(const ptr_t &); -    virtual void    updateShader(LLGLSLShader* shader) { applySpecial(shader, true); } -  protected:      LLSettingsVOWater(); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 5ef3819de4..c4976c4bbc 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8427,8 +8427,6 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      LLEnvironment& environment = LLEnvironment::instance();      LLSettingsSky::ptr_t sky = environment.getCurrentSky(); - -    static_cast<LLSettingsVOSky*>(sky.get())->updateShader(&shader);  }  LLColor3 pow3f(LLColor3 v, F32 f) | 
