diff options
45 files changed, 631 insertions, 2069 deletions
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 185c1450c8..3a0745106f 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -61,6 +61,21 @@ U32 LLGLSLShader::sTotalDrawCalls = 0;  LLGLSLShader    gUIProgram;  LLGLSLShader    gSolidColorProgram; +// NOTE: Keep gShaderConsts* and LLGLSLShader::ShaderConsts_e in sync! +const std::string gShaderConstsKey[ LLGLSLShader::NUM_SHADER_CONSTS ] = +{ +	  "LL_SHADER_CONST_CLOUD_MOON_DEPTH" +	, "LL_SHADER_CONST_STAR_DEPTH" +}; + +// NOTE: Keep gShaderConsts* and LLGLSLShader::ShaderConsts_e in sync! +const std::string gShaderConstsVal[ LLGLSLShader::NUM_SHADER_CONSTS ] = +{ +	  "0.99998" // SHADER_CONST_CLOUD_MOON_DEPTH // SL-14113 +	, "0.99999" // SHADER_CONST_STAR_DEPTH       // SL-14113 +}; + +  BOOL shouldChange(const LLVector4& v1, const LLVector4& v2)  {      return v1 != v2; @@ -770,6 +785,11 @@ void LLGLSLShader::addPermutation(std::string name, std::string value)      mDefines[name] = value;  } +void LLGLSLShader::addConstant( const LLGLSLShader::eShaderConsts shader_const ) +{ +    addPermutation( gShaderConstsKey[ shader_const ], gShaderConstsVal[ shader_const ] ); +} +  void LLGLSLShader::removePermutation(std::string name)  {      mDefines[name].erase(); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 85e83dbcb9..83f11c050b 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -128,6 +128,13 @@ public:  class LLGLSLShader  {  public: +    // NOTE: Keep gShaderConsts and LLGLSLShader::ShaderConsts_e in sync! +    enum eShaderConsts +    { +          SHADER_CONST_CLOUD_MOON_DEPTH +        , SHADER_CONST_STAR_DEPTH +        , NUM_SHADER_CONSTS +    };      // enum primarily used to control application sky settings uniforms  	typedef enum  @@ -212,7 +219,9 @@ public:      void clearPermutations();  	void addPermutation(std::string name, std::string value);  	void removePermutation(std::string name); -	 + +    void addConstant( const LLGLSLShader::eShaderConsts shader_const ); +  	//enable/disable texture channel for specified uniform  	//if given texture uniform is active in the shader,   	//the corresponding channel will be active upon return diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index be3e6ddff0..16e4b7e5f6 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -74,10 +74,12 @@ U32 vbo_block_size(U32 size)  U32 vbo_block_index(U32 size)  { -	return vbo_block_size(size)/LL_VBO_BLOCK_SIZE; +    U32 blocks = vbo_block_size(size)/LL_VBO_BLOCK_SIZE;   // block count reqd +    llassert(blocks > 0); +    return blocks - 1;  // Adj index, i.e. single-block allocations are at index 0, etc  } -const U32 LL_VBO_POOL_SEED_COUNT = vbo_block_index(LL_VBO_POOL_MAX_SEED_SIZE); +const U32 LL_VBO_POOL_SEED_COUNT = vbo_block_index(LL_VBO_POOL_MAX_SEED_SIZE) + 1;  //============================================================================ @@ -120,7 +122,6 @@ bool LLVertexBuffer::sUseStreamDraw = true;  bool LLVertexBuffer::sUseVAO = false;  bool LLVertexBuffer::sPreferStreamDraw = false; -  U32 LLVBOPool::genBuffer()  {  	LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX @@ -130,7 +131,7 @@ U32 LLVBOPool::genBuffer()  		glGenBuffersARB(1024, sNamePool);  		sNameIdx = 1024;  	} - +	  	return sNamePool[--sNameIdx];  } @@ -151,8 +152,9 @@ void LLVBOPool::deleteBuffer(U32 name)  LLVBOPool::LLVBOPool(U32 vboUsage, U32 vboType) -: mUsage(vboUsage), mType(vboType) +: mUsage(vboUsage), mType(vboType), mMissCountDirty(true)  { +    mFreeList.resize(LL_VBO_POOL_SEED_COUNT);  	mMissCount.resize(LL_VBO_POOL_SEED_COUNT);  	std::fill(mMissCount.begin(), mMissCount.end(), 0);  } @@ -181,6 +183,7 @@ U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)  		if (!for_seed && i < LL_VBO_POOL_SEED_COUNT)  		{ //record this miss  			mMissCount[i]++;	 +            mMissCountDirty = true;  // signal to ::seedPool()  		}  		if (mType == GL_ARRAY_BUFFER_ARB) @@ -200,13 +203,13 @@ U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)  				ret = (U8*) ll_aligned_malloc<64>(size);  				if (!ret)  				{ -					LL_ERRS() << "Failed to allocate "<< size << " bytes for LLVBOPool buffer " << name <<"." << LL_NEWLINE -							  << "Free list size: " << mFreeList.size() // this happens if we are out of memory so a solution might be to clear some from freelist +                    LL_ERRS() +                        << "Failed to allocate " << size << " bytes for LLVBOPool buffer " << name << "." << LL_NEWLINE +                        << "Free list size: " +                        << mFreeList.size()  // this happens if we are out of memory so a solution might be to clear some from freelist  							  << " Allocated Bytes: " << LLVertexBuffer::sAllocatedBytes -							  << " Allocated Index Bytes: " << LLVertexBuffer::sAllocatedIndexBytes -							  << " Pooled Bytes: " << sBytesPooled -							  << " Pooled Index Bytes: " << sIndexBytesPooled -							  << LL_ENDL; +                        << " Allocated Index Bytes: " << LLVertexBuffer::sAllocatedIndexBytes << " Pooled Bytes: " << sBytesPooled +                        << " Pooled Index Bytes: " << sIndexBytesPooled << LL_ENDL;  				}  			}  		} @@ -234,6 +237,7 @@ U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)  				sIndexBytesPooled += size;  			}  			mFreeList[i].push_back(rec); +            mMissCountDirty = true;  // signal to ::seedPool()  		}  	}  	else @@ -251,6 +255,7 @@ U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed)  		}  		mFreeList[i].pop_front(); +        mMissCountDirty = true;  // signal to ::seedPool()  	}  	return ret; @@ -276,31 +281,27 @@ void LLVBOPool::release(U32 name, U8* buffer, U32 size)  void LLVBOPool::seedPool()  {  	LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX +    if (mMissCountDirty) +    {  	U32 dummy_name = 0; - -	if (mFreeList.size() < LL_VBO_POOL_SEED_COUNT) -	{ -		LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("VBOPool Resize"); -		mFreeList.resize(LL_VBO_POOL_SEED_COUNT); -	} +        U32 size       = LL_VBO_BLOCK_SIZE;  	for (U32 i = 0; i < LL_VBO_POOL_SEED_COUNT; i++)  	{  		if (mMissCount[i] > mFreeList[i].size())  		{  -			U32 size = i*LL_VBO_BLOCK_SIZE; -		  			S32 count = mMissCount[i] - mFreeList[i].size();  			for (U32 j = 0; j < count; ++j)  			{  				allocate(dummy_name, size, true);  			}  		} +            size += LL_VBO_BLOCK_SIZE; +        } +        mMissCountDirty = false;  	}  } - -  void LLVBOPool::cleanup()  {  	U32 size = LL_VBO_BLOCK_SIZE; @@ -441,27 +442,27 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)  			data_mask = data_mask & ~MAP_TEXTURE_INDEX;  		} -		for (U32 i = 0; i < TYPE_MAX; ++i) -		{ -			S32 loc = i; +			for (U32 i = 0; i < TYPE_MAX; ++i) +			{ +				S32 loc = i; -			U32 mask = 1 << i; +				U32 mask = 1 << i; -			if (sLastMask & (1 << i)) -			{ //was enabled -				if (!(data_mask & mask)) -				{ //needs to be disabled -					glDisableVertexAttribArrayARB(loc); +				if (sLastMask & (1 << i)) +				{ //was enabled +					if (!(data_mask & mask)) +					{ //needs to be disabled +						glDisableVertexAttribArrayARB(loc); +					}  				} -			} -			else  -			{	//was disabled -				if (data_mask & mask) -				{ //needs to be enabled -					glEnableVertexAttribArrayARB(loc); +				else  +				{	//was disabled +					if (data_mask & mask) +					{ //needs to be enabled +						glEnableVertexAttribArrayARB(loc); +					}  				}  			} -		}  		sLastMask = data_mask;  	} @@ -473,12 +474,12 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos)      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;      gGL.begin(mode);      for (auto& v : pos) -    { +	{          gGL.vertex3fv(v.mV); -    } +	}      gGL.end();      gGL.flush(); -} +		}  //static  void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp) @@ -499,22 +500,22 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto      gGL.begin(mode);      if (tc != nullptr) -    { +	{          for (int i = 0; i < num_indices; ++i) -        { +		{              U16 idx = indicesp[i];              gGL.texCoord2fv(tc[idx].mV);              gGL.vertex3fv(pos[idx].getF32ptr()); -        } -    } -    else -    { +		} +	} +	else +	{          for (int i = 0; i < num_indices; ++i)          {              U16 idx = indicesp[i];              gGL.vertex3fv(pos[idx].getF32ptr()); -        } -    } +	} +}      gGL.end();      gGL.flush();  } @@ -701,48 +702,48 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;      llassert(LLGLSLShader::sCurBoundShaderPtr != NULL); -    mMappable = false; -    gGL.syncMatrices(); - +	mMappable = false; +	gGL.syncMatrices(); +	  #ifndef LL_RELEASE_FOR_DOWNLOAD -    llassert(mNumVerts >= 0); -    if (first >= (U32)mNumVerts || -        first + count > (U32)mNumVerts) -    { -        LL_ERRS() << "Bad vertex buffer draw range: [" << first << ", " << first + count << "]" << LL_ENDL; -    } +	llassert(mNumVerts >= 0); +	if (first >= (U32) mNumVerts || +	    first + count > (U32) mNumVerts) +	{ +		LL_ERRS() << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << LL_ENDL; +	} -    if (mGLArray) -    { -        if (mGLArray != sGLRenderArray) -        { -            LL_ERRS() << "Wrong vertex array bound." << LL_ENDL; -        } -    } -    else -    { -        if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive) -        { -            LL_ERRS() << "Wrong vertex buffer bound." << LL_ENDL; -        } -    } +	if (mGLArray) +	{ +		if (mGLArray != sGLRenderArray) +		{ +			LL_ERRS() << "Wrong vertex array bound." << LL_ENDL; +		} +	} +	else +	{ +		if (mGLBuffer != sGLRenderBuffer || useVBOs() != sVBOActive) +		{ +			LL_ERRS() << "Wrong vertex buffer bound." << LL_ENDL; +		} +	} -    if (mode >= LLRender::NUM_MODES) -    { -        LL_ERRS() << "Invalid draw mode: " << mode << LL_ENDL; -        return; -    } +	if (mode >= LLRender::NUM_MODES) +	{ +		LL_ERRS() << "Invalid draw mode: " << mode << LL_ENDL; +		return; +	}  #endif      LLGLSLShader::startProfile(); -    { +	{          LL_PROFILER_GPU_ZONEC("gl.DrawArrays", 0xFF4040) -            glDrawArrays(sGLMode[mode], first, count); +		glDrawArrays(sGLMode[mode], first, count);      } -    LLGLSLShader::stopProfile(count, mode); +		LLGLSLShader::stopProfile(count, mode); -    stop_glerror(); -    placeFence(); +	stop_glerror(); +	placeFence();  }  //static @@ -792,6 +793,11 @@ void LLVertexBuffer::cleanupClass()  	sStreamVBOPool.cleanup();  	sDynamicVBOPool.cleanup();  	sDynamicCopyVBOPool.cleanup(); + +    llassert(0 == LLVBOPool::sBytesPooled); +    llassert(0 == LLVBOPool::sIndexBytesPooled); +    llassert(0 == sAllocatedBytes); +    llassert(0 == sAllocatedIndexBytes);  }  //---------------------------------------------------------------------------- @@ -1841,7 +1847,7 @@ void LLVertexBuffer::unmapBuffer()  #endif  						}  						else if (gGLManager.mHasFlushBufferRange) -                        { +						{  #ifndef LL_MESA_HEADLESS  							glFlushMappedBufferRangeAPPLE(GL_ARRAY_BUFFER_ARB, offset, length);  #endif @@ -1935,7 +1941,7 @@ void LLVertexBuffer::unmapBuffer()  				}  			} -            glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); +			glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);  			mMappedIndexData = NULL;  		} @@ -2392,145 +2398,145 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)  		LL_ERRS() << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << LL_ENDL;  	} -	if (data_mask & MAP_NORMAL) -	{ -		S32 loc = TYPE_NORMAL; -		void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]); -		glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr); -	} -	if (data_mask & MAP_TEXCOORD3) -	{ -		S32 loc = TYPE_TEXCOORD3; -		void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); -		glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); -	} -	if (data_mask & MAP_TEXCOORD2) -	{ -		S32 loc = TYPE_TEXCOORD2; -		void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); -		glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); -	} -	if (data_mask & MAP_TEXCOORD1) -	{ -		S32 loc = TYPE_TEXCOORD1; -		void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]); -		glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr); -	} -	if (data_mask & MAP_TANGENT) -	{ -		S32 loc = TYPE_TANGENT; -		void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]); -		glVertexAttribPointerARB(loc, 4,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); -	} -	if (data_mask & MAP_TEXCOORD0) -	{ -		S32 loc = TYPE_TEXCOORD0; -		void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); -		glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); -	} -	if (data_mask & MAP_COLOR) -	{ -		S32 loc = TYPE_COLOR; -		//bind emissive instead of color pointer if emissive is present -		void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]); -		glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); -	} -	if (data_mask & MAP_EMISSIVE) -	{ -		S32 loc = TYPE_EMISSIVE; -		void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]); -		glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); - -		if (!(data_mask & MAP_COLOR)) -		{ //map emissive to color channel when color is not also being bound to avoid unnecessary shader swaps -			loc = TYPE_COLOR; +		if (data_mask & MAP_NORMAL) +		{ +			S32 loc = TYPE_NORMAL; +			void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]); +			glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr); +		} +		if (data_mask & MAP_TEXCOORD3) +		{ +			S32 loc = TYPE_TEXCOORD3; +			void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); +		} +		if (data_mask & MAP_TEXCOORD2) +		{ +			S32 loc = TYPE_TEXCOORD2; +			void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); +		} +		if (data_mask & MAP_TEXCOORD1) +		{ +			S32 loc = TYPE_TEXCOORD1; +			void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]); +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr); +		} +		if (data_mask & MAP_TANGENT) +		{ +			S32 loc = TYPE_TANGENT; +			void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]); +			glVertexAttribPointerARB(loc, 4,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); +		} +		if (data_mask & MAP_TEXCOORD0) +		{ +			S32 loc = TYPE_TEXCOORD0; +			void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); +			glVertexAttribPointerARB(loc,2,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); +		} +		if (data_mask & MAP_COLOR) +		{ +			S32 loc = TYPE_COLOR; +			//bind emissive instead of color pointer if emissive is present +			void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]); +			glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); +		} +		if (data_mask & MAP_EMISSIVE) +		{ +			S32 loc = TYPE_EMISSIVE; +			void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);  			glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); + +			if (!(data_mask & MAP_COLOR)) +			{ //map emissive to color channel when color is not also being bound to avoid unnecessary shader swaps +				loc = TYPE_COLOR; +				glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); +			}  		} -	} -	if (data_mask & MAP_WEIGHT) -	{ -		S32 loc = TYPE_WEIGHT; -		void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]); -		glVertexAttribPointerARB(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr); -	} -	if (data_mask & MAP_WEIGHT4) -	{ -		S32 loc = TYPE_WEIGHT4; -		void* ptr = (void*)(base+mOffsets[TYPE_WEIGHT4]); -		glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr); -	} -	if (data_mask & MAP_CLOTHWEIGHT) -	{ -		S32 loc = TYPE_CLOTHWEIGHT; -		void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]); -		glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_TRUE,  LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr); -	} -	if (data_mask & MAP_TEXTURE_INDEX &&  -			(gGLManager.mGLSLVersionMajor >= 2 || gGLManager.mGLSLVersionMinor >= 30)) //indexed texture rendering requires GLSL 1.30 or later -	{ +		if (data_mask & MAP_WEIGHT) +		{ +			S32 loc = TYPE_WEIGHT; +			void* ptr = (void*)(base + mOffsets[TYPE_WEIGHT]); +			glVertexAttribPointerARB(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr); +		} +		if (data_mask & MAP_WEIGHT4) +		{ +			S32 loc = TYPE_WEIGHT4; +			void* ptr = (void*)(base+mOffsets[TYPE_WEIGHT4]); +			glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr); +		} +		if (data_mask & MAP_CLOTHWEIGHT) +		{ +			S32 loc = TYPE_CLOTHWEIGHT; +			void* ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]); +			glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_TRUE,  LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr); +		} +		if (data_mask & MAP_TEXTURE_INDEX &&  +				(gGLManager.mGLSLVersionMajor >= 2 || gGLManager.mGLSLVersionMinor >= 30)) //indexed texture rendering requires GLSL 1.30 or later +		{  #if !LL_DARWIN -		S32 loc = TYPE_TEXTURE_INDEX; -		void *ptr = (void*) (base + mOffsets[TYPE_VERTEX] + 12); -		glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); +			S32 loc = TYPE_TEXTURE_INDEX; +			void *ptr = (void*) (base + mOffsets[TYPE_VERTEX] + 12); +			glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);  #endif -	} -	if (data_mask & MAP_VERTEX) -	{ -		S32 loc = TYPE_VERTEX; -		void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]); -		glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); -	}	 +		} +		if (data_mask & MAP_VERTEX) +		{ +			S32 loc = TYPE_VERTEX; +			void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]); +			glVertexAttribPointerARB(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); +		}	  	llglassertok(); -} +	}	  void LLVertexBuffer::setupVertexBufferFast(U32 data_mask) -{ +	{      U8* base = (U8*)mAlignedOffset; -    if (data_mask & MAP_NORMAL) -    { +		if (data_mask & MAP_NORMAL) +		{          S32 loc = TYPE_NORMAL;          void* ptr = (void*)(base + mOffsets[TYPE_NORMAL]);          glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr); -    } -    if (data_mask & MAP_TEXCOORD3) -    { +		} +		if (data_mask & MAP_TEXCOORD3) +		{          S32 loc = TYPE_TEXCOORD3;          void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]);          glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); -    } -    if (data_mask & MAP_TEXCOORD2) -    { +		} +		if (data_mask & MAP_TEXCOORD2) +		{          S32 loc = TYPE_TEXCOORD2;          void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]);          glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); -    } -    if (data_mask & MAP_TEXCOORD1) -    { +		} +		if (data_mask & MAP_TEXCOORD1) +		{          S32 loc = TYPE_TEXCOORD1;          void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);          glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr); -    } -    if (data_mask & MAP_TANGENT) -    { +		} +		if (data_mask & MAP_TANGENT) +		{          S32 loc = TYPE_TANGENT;          void* ptr = (void*)(base + mOffsets[TYPE_TANGENT]);          glVertexAttribPointerARB(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); -    } -    if (data_mask & MAP_TEXCOORD0) -    { +		} +		if (data_mask & MAP_TEXCOORD0) +		{          S32 loc = TYPE_TEXCOORD0;          void* ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]);          glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); -    } -    if (data_mask & MAP_COLOR) -    { +		} +		if (data_mask & MAP_COLOR) +		{          S32 loc = TYPE_COLOR;          //bind emissive instead of color pointer if emissive is present          void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]);          glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); -    } +		}      if (data_mask & MAP_EMISSIVE)      {          S32 loc = TYPE_EMISSIVE; @@ -2569,13 +2575,13 @@ void LLVertexBuffer::setupVertexBufferFast(U32 data_mask)          glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);  #endif      } -    if (data_mask & MAP_VERTEX) -    { +		if (data_mask & MAP_VERTEX) +		{          S32 loc = TYPE_VERTEX;          void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);          glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); -    } -} +		}	 +	}  LLVertexBuffer::MappedRegion::MappedRegion(S32 type, S32 index, S32 count)  : mType(type), mIndex(index), mCount(count) diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 3b3fe44984..3833f7c0e6 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -88,6 +88,7 @@ public:  	typedef std::list<Record> record_list_t;  	std::vector<record_list_t> mFreeList;  	std::vector<U32> mMissCount; +    bool mMissCountDirty;   // flag any changes to mFreeList or mMissCount  	//used to avoid calling glGenBuffers for every VBO creation  	static U32 sNamePool[1024]; diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl deleted file mode 100644 index bbdc8fdd1c..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaNoColorV.glsl +++ /dev/null @@ -1,112 +0,0 @@ -/**  - * @file avatarAlphaNoColorV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 projection_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec3 normal; -ATTRIBUTE vec2 texcoord0; - -mat4 getSkinnedTransform(); -void calcAtmospherics(vec3 inPositionEye); - -float calcDirectionalLight(vec3 n, vec3 l); - -vec3 atmosAmbient(); -vec3 atmosAffectDirectionalLight(float lightIntensity); - -VARYING vec3 vary_position; -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; -VARYING vec3 vary_norm; - - -uniform float near_clip; - -uniform vec4 color; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8];  -uniform vec3 light_diffuse[8]; - -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight); - -void main() -{ -	vary_texcoord0 = texcoord0; -				 -	vec4 pos; -	vec3 norm; -	 -	mat4 trans = getSkinnedTransform(); -	vec4 pos_in = vec4(position.xyz, 1.0); -	pos.x = dot(trans[0], pos_in); -	pos.y = dot(trans[1], pos_in); -	pos.z = dot(trans[2], pos_in); -	pos.w = 1.0; -	 -	norm.x = dot(trans[0].xyz, normal); -	norm.y = dot(trans[1].xyz, normal); -	norm.z = dot(trans[2].xyz, normal); -	norm = normalize(norm); -	vary_norm = norm; -		 -	vec4 frag_pos = projection_matrix * pos; -	gl_Position = frag_pos; -	 -	vary_position = pos.xyz; -	 -	calcAtmospherics(pos.xyz); - -	vec4 col = vec4(0.0, 0.0, 0.0, 1.0); - -	// Collect normal lights -	col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); -	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); -	col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); -	col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); -	col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); -	col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); -	 -	vary_pointlight_col = col.rgb*color.rgb; - -	col.rgb = vec3(0,0,0); - -	// Add windlight lights -	col.rgb = atmosAmbient(); -	 -	vary_ambient = col.rgb*color.rgb; -	vary_directional = color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0)); -	 -	col.rgb = col.rgb * color.rgb; -	 -	vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -} - - diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl deleted file mode 100644 index 0157d166e0..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl +++ /dev/null @@ -1,127 +0,0 @@ -/**  - * @file class3/deferred/cloudsF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2D diffuseMap; - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; - -uniform sampler2D cloud_noise_texture; -uniform sampler2D cloud_noise_texture_next; -uniform float blend_factor; -uniform vec4 cloud_pos_density1; -uniform vec4 cloud_pos_density2; -uniform vec4 sunlight_color; -uniform vec4 cloud_color; -uniform float cloud_shadow; -uniform float cloud_scale; -uniform float cloud_variance; -uniform vec3 camPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; -uniform float far_z; - -#if !defined(DEPTH_CLAMP) -VARYING vec4 post_pos; -#endif - -vec4 cloudNoise(vec2 uv) -{ -   vec4 a = texture2D(cloud_noise_texture, uv); -   vec4 b = texture2D(cloud_noise_texture_next, uv); -   vec4 cloud_noise_sample = mix(a, b, blend_factor); -   return normalize(cloud_noise_sample); -} - -void main() -{ -    // Set variables -    vec2 uv1 = vary_texcoord0.xy; -    vec2 uv2 = vary_texcoord1.xy; -    vec2 uv3 = vary_texcoord2.xy; -    float cloudDensity = 2.0 * (cloud_shadow - 0.25); - -    if (cloud_scale >= 0.0001) -    { -        vec2 uv4 = vary_texcoord3.xy; -     -        vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -        vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -     -        // Offset texture coords -        uv1 += cloud_pos_density1.xy + (disturbance * 0.2);    //large texture, visible density -        uv2 += cloud_pos_density1.xy;   //large texture, self shadow -        uv3 += cloud_pos_density2.xy;   //small texture, visible density -        uv4 += cloud_pos_density2.xy;   //small texture, self shadow -     -        float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y) * 4.0); -     -        cloudDensity *= 1.0 - (density_variance * density_variance); -     -        // Compute alpha1, the main cloud opacity -        float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -        alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha1 = 1. - alpha1 * alpha1; -        alpha1 = 1. - alpha1 * alpha1;   -     -        if (alpha1 < 0.001f) -        { -            discard; -        } -     -        // Compute alpha2, for self shadowing effect -        // (1 - alpha2) will later be used as percentage of incoming sunlight -        float alpha2 = (cloudNoise(uv2).x - 0.5); -        alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha2 = 1. - alpha2; -        alpha2 = 1. - alpha2 * alpha2;   -     -        frag_color = vec4(alpha1, alpha1, alpha1, 1); -    } -    else -    { -        frag_color = vec4(1); -    } - -#if !defined(DEPTH_CLAMP) -    gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); -#endif - -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl deleted file mode 100644 index effb070f93..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl +++ /dev/null @@ -1,63 +0,0 @@ -/**  - * @file cloudShadowV.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 texture_matrix0; -uniform mat4 modelview_projection_matrix; -uniform float shadow_target_width; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING vec2 vary_texcoord0; -VARYING vec4 vertex_color; - -void passTextureIndex(); - -void main() -{ -	//transform vertex -	vec4 pre_pos = vec4(position.xyz, 1.0); -	pos = modelview_projection_matrix * pre_pos; -	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; - -#if !defined(DEPTH_CLAMP) -	pos_zd2 = pos.z * 0.5; -	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -#else -	gl_Position = pos; -#endif -	 -	passTextureIndex(); - -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	vertex_color = diffuse_color; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index ae1ac5de7f..f1187fef9a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -126,6 +126,6 @@ void main()      frag_data[1] = vec4(0.0,0.0,0.0,0.0);      frag_data[2] = vec4(0,0,0,1); -    gl_FragDepth = 0.99995f; +    gl_FragDepth = LL_SHADER_CONST_CLOUD_MOON_DEPTH; // SL-14113 Stars and Clouds need same depth  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl deleted file mode 100644 index be1003a7e0..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceF.glsl +++ /dev/null @@ -1,40 +0,0 @@ -/**  - * @file luminanceF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -/*[EXTRA_CODE_HERE]*/ - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DRect diffuseMap; -VARYING vec2 vary_fragcoord; - -void main()  -{ -	frag_color = texture2DRect(diffuseMap, vary_fragcoord.xy); -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl b/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl deleted file mode 100644 index f2dc60aa5d..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/luminanceV.glsl +++ /dev/null @@ -1,45 +0,0 @@ -/**  - * @file giV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 modelview_projection_matrix; -  -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; - -VARYING vec2 vary_fragcoord; -VARYING vec4 vertex_color; - -uniform vec2 screen_res; - -void main() -{ -	//transform vertex -	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); -	gl_Position = pos; -	 -	vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;	 - -	vertex_color = diffuse_color; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl index 35068899ee..e709d73bfa 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl @@ -55,6 +55,12 @@ void main()          fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );      vec4 c      = texture2D(diffuseMap, vary_texcoord0.xy); + +    // SL-14113 Don't write to depth; prevent moon's quad from hiding stars which should be visible +    // Moon texture has transparent pixels <0x55,0x55,0x55,0x00> +    if (c.a <= 2./255.) // 0.00784 +        discard; +  //       c.rgb  = srgb_to_linear(c.rgb);           c.rgb *= moonlight_color.rgb;           c.rgb *= moon_brightness; @@ -68,6 +74,6 @@ void main()      frag_data[1] = vec4(0.0);      frag_data[2] = vec4(0.0f); -    gl_FragDepth = 0.999985f; +    gl_FragDepth = LL_SHADER_CONST_CLOUD_MOON_DEPTH; // SL-14113  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl deleted file mode 100644 index cf994d3547..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl +++ /dev/null @@ -1,99 +0,0 @@ -/**  - * @file postgiF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -/*[EXTRA_CODE_HERE]*/ - - #ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif -  -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform sampler2DRect giLightMap; -uniform sampler2D	noiseMap; - -uniform vec2 kern[32]; -uniform float dist_factor; -uniform float blur_size; -uniform vec2 delta; -uniform int kern_length; -uniform float kern_scale; -uniform vec3 blur_quad; - -VARYING vec2 vary_fragcoord; - -uniform mat4 inv_proj; -uniform vec2 screen_res; - -vec4 getPosition(vec2 pos_screen); - -void main()  -{ -	vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz; -	norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm -	vec3 pos = getPosition(vary_fragcoord.xy).xyz; -	 -	vec3 ccol = texture2DRect(giLightMap, vary_fragcoord.xy).rgb; -	vec2 dlt = kern_scale * delta/(1.0+norm.xy*norm.xy); -	dlt /= max(-pos.z*dist_factor, 1.0); -	float defined_weight = kern[0].x; -	vec3 col = vec3(0.0); -	 -	for (int i = 0; i < kern_length; i++) -	{ -		vec2 tc = vary_fragcoord.xy + kern[i].y*dlt; -		vec3 sampNorm = texture2DRect(normalMap, tc.xy).xyz; -		sampNorm = vec3((sampNorm.xy-0.5)*2.0,sampNorm.z); // unpack norm -	     -		float d = dot(norm.xyz, sampNorm); -		 -		if (d > 0.8) -		{ -			vec3 samppos = getPosition(tc.xy).xyz; -			samppos -= pos; -			if (dot(samppos,samppos) < -0.05*pos.z) -			{ -	    		col += texture2DRect(giLightMap, tc).rgb*kern[i].x; -				defined_weight += kern[i].x; -			} -		} -	} - -	col /= defined_weight; -	 -	//col = ccol; -	 -	col = col*col*blur_quad.x + col*blur_quad.y + blur_quad.z; -	 -	frag_color.rgb = col; - -#ifdef IS_AMD_CARD -	// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts. -	vec2 dummy1 = kern[0]; -	vec2 dummy2 = kern[31]; -#endif -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaBlendV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaBlendV.glsl deleted file mode 100644 index f45c343066..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaBlendV.glsl +++ /dev/null @@ -1,67 +0,0 @@ -/**  - * @file shadowAlphaMaskV.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 texture_matrix0; -uniform mat4 modelview_projection_matrix; -uniform float shadow_target_width; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING float pos_w; - -VARYING float target_pos_x; -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - -void passTextureIndex(); - -void main() -{ -	//transform vertex -	vec4 pre_pos = vec4(position.xyz, 1.0); -	vec4 pos = modelview_projection_matrix * pre_pos; -	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; - -	pos_w = pos.w; - -#if !defined(DEPTH_CLAMP) -	pos_zd2 = pos.z * 0.5; -	 -	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -#else -	gl_Position = pos; -#endif -	 -	passTextureIndex(); - -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	vertex_color = diffuse_color; -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl index bac79a9fdc..8d9c7e3507 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl @@ -46,8 +46,13 @@ float twinkle(){      return abs(d);  } +// See: +// ALM off: class1/environment/starsF.glsl +// ALM on : class1/deferred/starsF.glsl  void main()   { +	// camera above water: class1\deferred\starsF.glsl +	// camera below water: class1\environment\starsF.glsl      vec4 col_a = texture2D(diffuseMap, vary_texcoord0.xy);      vec4 col_b = texture2D(diffuseMap, vary_texcoord0.xy);      vec4 col = mix(col_b, col_a, blend_factor); @@ -62,6 +67,6 @@ void main()      frag_data[1] = vec4(0.0f);      frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0); -    gl_FragDepth = 0.99995f; +    gl_FragDepth = LL_SHADER_CONST_STAR_DEPTH; // SL-14113 Moon Haze -- Stars need to depth test behind the moon  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl index 8863869e44..38276859a0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterV.glsl @@ -70,7 +70,7 @@ void main()  	d *= d;  	oPosition = vec4(position, 1.0); -	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); +//	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); // SL-11589 remove "U" shaped horizon  	vary_position = modelview_matrix * oPosition;  	oPosition = modelViewProj * oPosition; diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/environment/moonF.glsl index 345c07a354..a220971f06 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/moonF.glsl @@ -1,9 +1,9 @@  /**  - * @file shadowAlphaMaskF.glsl + * @file class1/environment/moonF.glsl   * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2021&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * Copyright (C) 2021, Linden Research, Inc.   *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -23,36 +23,29 @@   * $/LicenseInfo$   */ -/*[EXTRA_CODE_HERE]*/ -  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color;  #else  #define frag_color gl_FragColor  #endif -uniform sampler2D diffuseMap; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING float pos_w; +uniform sampler2D tex0; -VARYING float target_pos_x; -VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; -VARYING vec3 pos; - -vec4 computeMoments(float depth, float a); +// See: +// AS  off: class1/environment/moonF.glsl +// ALM off: class1/windlight/moonF.glsl +// ALM on : class1/deferred/moonF.glsl  void main()   { -	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a; +    vec4 color = texture2D(tex0, vary_texcoord0.xy); -    frag_color = computeMoments(length(pos), float a); +    // SL-14113 Don't write to depth; prevent moon's quad from hiding stars which should be visible +    // Moon texture has transparent pixels <0x55,0x55,0x55,0x00> +    if (color.a <= 2./255.) // 0.00784 +        discard; -#if !defined(DEPTH_CLAMP) -	gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0); -#endif +    frag_color = color; +    gl_FragDepth = LL_SHADER_CONST_CLOUD_MOON_DEPTH; // SL-14113 Moon is infront of stars  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl b/indra/newview/app_settings/shaders/class1/environment/moonV.glsl index b466883dc7..1fc421a295 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/moonV.glsl @@ -1,9 +1,9 @@  /**  - * @file genSkyShV.glsl + * @file class1\environment\moonV.glsl   * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $LicenseInfo:firstyear=2021&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. + * Copyright (C) 2021, Linden Research, Inc.   *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -23,15 +23,16 @@   * $/LicenseInfo$   */ +uniform mat4 modelview_projection_matrix; +  ATTRIBUTE vec3 position;  ATTRIBUTE vec2 texcoord0; -VARYING vec2 vary_frag; +VARYING vec2 vary_texcoord0;  void main()  { -    // pass through untransformed fullscreen pos -	gl_Position = vec4(position.xyz, 1.0); -    vary_frag = texcoord0; +	gl_Position = modelview_projection_matrix * vec4(position, 1); +	vary_texcoord0 = texcoord0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/environment/starsF.glsl index 44f2a73e1f..e1a9cc6387 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaBlendF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/starsF.glsl @@ -1,9 +1,9 @@  /**  - * @file shadowAlphaMaskF.glsl + * @file class1/environment/starsF.glsl   * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * $LicenseInfo:firstyear=2021&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. + * Copyright (C) 2021, Linden Research, Inc.   *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -23,8 +23,6 @@   * $/LicenseInfo$   */ -/*[EXTRA_CODE_HERE]*/ -  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color;  #else @@ -33,23 +31,21 @@ out vec4 frag_color;  uniform sampler2D diffuseMap; -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING float pos_w; +uniform float custom_alpha; -VARYING float target_pos_x;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; +// See: +// ALM off: class1/environment/starsF.glsl +// ALM on : class1/deferred/starsF.glsl  void main()   { -	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a; +    vec4 color = texture2D(diffuseMap, vary_texcoord0.xy); +    color.rgb = pow(color.rgb, vec3(0.45)); +    color.rgb *= vertex_color.rgb; +    color.a *= max(custom_alpha, vertex_color.a); -	frag_color = vec4(alpha, alpha, alpha, 1); -	 -#if !defined(DEPTH_CLAMP) -	gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0); -#endif +    frag_color = color; +    gl_FragDepth = LL_SHADER_CONST_STAR_DEPTH; // SL-14113 Moon Haze -- Stars need to depth test behind the moon  } diff --git a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl b/indra/newview/app_settings/shaders/class1/environment/starsV.glsl index 65bb00b1f6..6fcfec6b6a 100644 --- a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/starsV.glsl @@ -1,9 +1,9 @@  /**  - * @file class3\wl\advancedAtmoV.glsl + * @file class1/environment/starsV.glsl   * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * $LicenseInfo:firstyear=2021&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. + * Copyright (C) 2021, Linden Research, Inc.   *    * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -22,22 +22,20 @@   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -  +  uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; -// Inputs -uniform vec3 camPosLocal; - -out vec3 view_dir; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0;  void main()  { -	// World / view / projection  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); - -	// this will be normalized in the frag shader... -	view_dir = position.xyz - camPosLocal.xyz;  +	vary_texcoord0 = texcoord0; +	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl index cc41e3f740..35770d3341 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterV.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterV.glsl @@ -68,7 +68,7 @@ void main()  	d *= d;  	oPosition = vec4(position, 1.0); -	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); +//	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); // SL-11589 remove "U" shaped horizon  	oPosition = modelViewProj * oPosition;  	refCoord.xyz = oPosition.xyz + vec3(0,0,0.2); diff --git a/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl b/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl deleted file mode 100644 index 254c1d4fc2..0000000000 --- a/indra/newview/app_settings/shaders/class1/objects/indexedTextureF.glsl +++ /dev/null @@ -1,33 +0,0 @@ -/**  - * @file fullbrightF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -  - - -void main()  -{ -	fullbright_lighting(); -} - diff --git a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl deleted file mode 100644 index 82fad4db5a..0000000000 --- a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl +++ /dev/null @@ -1,127 +0,0 @@ -/**  - * @file class1/windlight/cloudShadowF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2D diffuseMap; - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; - -uniform sampler2D cloud_noise_texture; -uniform sampler2D cloud_noise_texture_next; -uniform float blend_factor; -uniform vec4 cloud_pos_density1; -uniform vec4 cloud_pos_density2; -uniform vec4 sunlight_color; -uniform vec4 cloud_color; -uniform float cloud_shadow; -uniform float cloud_scale; -uniform float cloud_variance; -uniform vec3 camPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; -uniform float far_z; - -#if !defined(DEPTH_CLAMP) -VARYING vec4 post_pos; -#endif - -vec4 cloudNoise(vec2 uv) -{ -   vec4 a = texture2D(cloud_noise_texture, uv); -   vec4 b = texture2D(cloud_noise_texture_next, uv); -   vec4 cloud_noise_sample = mix(a, b, blend_factor); -   return normalize(cloud_noise_sample); -} - -void main() -{ -    if (cloud_scale >= 0.0001) -    { -        // Set variables -        vec2 uv1 = vary_texcoord0.xy; -        vec2 uv2 = vary_texcoord1.xy; -        vec2 uv3 = vary_texcoord2.xy; -        float cloudDensity = 2.0 * (cloud_shadow - 0.25); -     -        vec2 uv4 = vary_texcoord3.xy; -     -        vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -        vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -     -        // Offset texture coords -        uv1 += cloud_pos_density1.xy + (disturbance * 0.2);    //large texture, visible density -        uv2 += cloud_pos_density1.xy;   //large texture, self shadow -        uv3 += cloud_pos_density2.xy;   //small texture, visible density -        uv4 += cloud_pos_density2.xy;   //small texture, self shadow -     -        float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y) * 4.0); -     -        cloudDensity *= 1.0 - (density_variance * density_variance); -     -        // Compute alpha1, the main cloud opacity -        float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -        alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha1 = 1. - alpha1 * alpha1; -        alpha1 = 1. - alpha1 * alpha1;   -     -        if (alpha1 < 0.001f) -        { -            discard; -        } -     -        // Compute alpha2, for self shadowing effect -        // (1 - alpha2) will later be used as percentage of incoming sunlight -        float alpha2 = (cloudNoise(uv2).x - 0.5); -        alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha2 = 1. - alpha2; -        alpha2 = 1. - alpha2 * alpha2;   -     -        frag_color = vec4(alpha1, alpha1, alpha1, 1); -    } -    else -    { -        frag_color = vec4(1); -    } - -#if !defined(DEPTH_CLAMP) -    gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); -#endif - -} diff --git a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl deleted file mode 100644 index 09b6004481..0000000000 --- a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl +++ /dev/null @@ -1,61 +0,0 @@ -/**  - * @file class1\windlight\cloudShadowV.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 texture_matrix0; -uniform mat4 modelview_projection_matrix; -uniform float shadow_target_width; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING vec2 vary_texcoord0; - -void passTextureIndex(); - -void main() -{ -	//transform vertex -	vec4 pre_pos = vec4(position.xyz, 1.0); -	pos = modelview_projection_matrix * pre_pos; -	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; - -#if !defined(DEPTH_CLAMP) -	pos_zd2 = pos.z * 0.5; -	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -#else -	gl_Position = pos; -#endif -	 -	passTextureIndex(); - -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -} diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl index 2425a2ad04..2e0932343b 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl @@ -52,6 +52,12 @@ void main()          fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );      vec4 c     = texture2D(diffuseMap, vary_texcoord0.xy); + +    // SL-14113 Don't write to depth; prevent moon's quad from hiding stars which should be visible +    // Moon texture has transparent pixels <0x55,0x55,0x55,0x00> +    if (c.a <= 2./255.) // 0.00784 +        discard; +  //       c.rgb = pow(c.rgb, vec3(0.7f)); // can't use "srgb_to_linear(color.rgb)" as that is a deferred only function           c.rgb *= moonlight_color.rgb;           c.rgb *= moon_brightness; @@ -62,5 +68,6 @@ void main()           c.rgb  = scaleSoftClip(c.rgb);      frag_color = vec4(c.rgb, c.a); +    gl_FragDepth = LL_SHADER_CONST_CLOUD_MOON_DEPTH; // SL-14113  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl index fa928d993e..490fde7cf6 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsF.glsl @@ -127,5 +127,11 @@ void main()      /// Gamma correct for WL (soft clip effect).      frag_color = vec4(color.rgb, alpha1); + +    // SL-14113 Moon Haze -- When the camera is underwater fix clouds clipping into moon +    // camera above water: class1\deferred\cloudsF.glsl +    // camera below water: class2\windlight\coudsV.glsl +    // See: starsV.glsl, cloudsV.glsl, moonF.glsl +    gl_FragDepth = LL_SHADER_CONST_CLOUD_MOON_DEPTH;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl deleted file mode 100644 index 32210f60dc..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl +++ /dev/null @@ -1,119 +0,0 @@ -/**  - * @file class3/deferred/cloudsF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2D diffuseMap; - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; - -uniform sampler2D cloud_noise_texture; -uniform sampler2D cloud_noise_texture_next; -uniform float blend_factor; -uniform vec4 cloud_pos_density1; -uniform vec4 cloud_pos_density2; -uniform vec4 cloud_color; -uniform float cloud_shadow; -uniform float cloud_scale; -uniform float cloud_variance; -uniform vec3 camPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; -uniform float far_z; - -vec4 cloudNoise(vec2 uv) -{ -   vec4 a = texture2D(cloud_noise_texture, uv); -   vec4 b = texture2D(cloud_noise_texture_next, uv); -   vec4 cloud_noise_sample = mix(a, b, blend_factor); -   return normalize(cloud_noise_sample); -} - -vec4 computeMoments(float depth, float alpha); - -void main() -{ -    if (cloud_scale >= 0.001) -    { -        // Set variables -        vec2 uv1 = vary_texcoord0.xy; -        vec2 uv2 = vary_texcoord1.xy; -        vec2 uv3 = vary_texcoord2.xy; -        float cloudDensity = 2.0 * (cloud_shadow - 0.25); -     -        vec2 uv4 = vary_texcoord3.xy; -     -        vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -        vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); -     -        // Offset texture coords -        uv1 += cloud_pos_density1.xy + (disturbance * 0.2);    //large texture, visible density -        uv2 += cloud_pos_density1.xy;   //large texture, self shadow -        uv3 += cloud_pos_density2.xy;   //small texture, visible density -        uv4 += cloud_pos_density2.xy;   //small texture, self shadow -     -        float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y) * 4.0); -     -        cloudDensity *= 1.0 - (density_variance * density_variance); -     -        // Compute alpha1, the main cloud opacity -        float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; -        alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha1 = 1. - alpha1 * alpha1; -        alpha1 = 1. - alpha1 * alpha1;   -     -        if (alpha1 < 0.001f) -        { -            discard; -        } -     -        // Compute alpha2, for self shadowing effect -        // (1 - alpha2) will later be used as percentage of incoming sunlight -        float alpha2 = (cloudNoise(uv2).x - 0.5); -        alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); -     -        // And smooth -        alpha2 = 1. - alpha2; -        alpha2 = 1. - alpha2 * alpha2;   -     -        frag_color = computeMoments(length(pos), alpha1); -    } -    else -    { -        frag_color = vec4(0); -    } -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl deleted file mode 100644 index effb070f93..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl +++ /dev/null @@ -1,63 +0,0 @@ -/**  - * @file cloudShadowV.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 texture_matrix0; -uniform mat4 modelview_projection_matrix; -uniform float shadow_target_width; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING vec4 pos; -VARYING float target_pos_x; -VARYING vec2 vary_texcoord0; -VARYING vec4 vertex_color; - -void passTextureIndex(); - -void main() -{ -	//transform vertex -	vec4 pre_pos = vec4(position.xyz, 1.0); -	pos = modelview_projection_matrix * pre_pos; -	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; - -#if !defined(DEPTH_CLAMP) -	pos_zd2 = pos.z * 0.5; -	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -#else -	gl_Position = pos; -#endif -	 -	passTextureIndex(); - -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	vertex_color = diffuse_color; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl b/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl deleted file mode 100644 index cdaff4b09f..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl +++ /dev/null @@ -1,202 +0,0 @@ -/**  - * @file depthToShadowVolumeG.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -#extension GL_ARB_geometry_shader4  : enable -#extension GL_ARB_texture_rectangle : enable - -/*[EXTRA_CODE_HERE]*/ - -layout (triangles) in; -layout (triangle_strip, max_vertices = 128) out; - -uniform sampler2DRect depthMap; -uniform mat4 shadowMatrix[6];  -uniform vec4 lightpos; - -VARYING vec2 vary_texcoord0; - -out vec3 to_vec; - -void cross_products(out vec4 ns[3], int a, int b, int c) -{ -   ns[0] = cross(gl_PositionIn[b].xyz - gl_PositionIn[a].xyz, gl_PositionIn[c].xyz - gl_PositionIn[a].xyz); -   ns[1] = cross(gl_PositionIn[c].xyz - gl_PositionIn[b].xyz, gl_PositionIn[a].xyz - gl_PositionIn[b].xyz); -   ns[2] = cross(gl_PositionIn[a].xyz - gl_PositionIn[c].xyz, gl_PositionIn[b].xyz - gl_PositionIn[c].xyz); -} - -vec3 getLightDirection(vec4 lightpos, vec3 pos) -{ - -    vec3 lightdir = lightpos.xyz - lightpos.w * pos; -    return lightdir; -} - -void emitTri(vec4 v[3]) -{ -    gl_Position = proj_matrix * v[0]; -    EmitVertex(); - -    gl_Position = proj_matrix * v[1]; -    EmitVertex(); - -    gl_Position = proj_matrix * v[2]; -    EmitVertex(); - -    EndPrimitive(); -} - -void emitQuad(vec4 v[4] -{ -    // Emit a quad as a triangle strip. -    gl_Position = proj_matrix*v[0]; -    EmitVertex(); - -    gl_Position = proj_matrix*v[1]; -    EmitVertex(); - -    gl_Position = proj_matrix*v[2]; -    EmitVertex(); - -    gl_Position = proj_matrix*v[3]; -    EmitVertex();  - -    EndPrimitive(); -} - -void emitPrimitives(int layer) -{ -    int i = layer; -    gl_Layer = i; - -    vec4 depth1 = vec4(texture2DRect(depthMap, tc0).rg, texture2DRect(depthMap, tc1).rg)); -    vec3 depth2 = vec4(texture2DRect(depthMap, tc2).rg, texture2DRect(depthMap, tc3).rg)); -    vec3 depth3 = vec4(texture2DRect(depthMap, tc4).rg, texture2DRect(depthMap, tc5).rg)); -    vec3 depth4 = vec4(texture2DRect(depthMap, tc6).rg, texture2DRect(depthMap, tc7).rg)); - -    depth1 = min(depth1, depth2); -    depth1 = min(depth1, depth3); -    depth1 = min(depth1, depth4); - -    vec2 depth = min(depth1.xy, depth1.zw); - -    int side = sqrt(gl_VerticesIn); - -    for (int j = 0; j < side; j++) -    { -        for (int k = 0; k < side; ++k) -        { -            vec3 pos = gl_PositionIn[(j * side) + k].xyz; -            vec4 v = shadowMatrix[i] * vec4(pos, 1.0); -            gl_Position = v; -            to_vec = pos - light_position.xyz * depth; -            EmitVertex(); -        } - -        EndPrimitive(); -    } - -    vec3 norms[3]; // Normals -    vec3 lightdir3]; // Directions toward light - -    vec4 v[4]; // Temporary vertices - -    vec4 or_pos[3] = -    {  // Triangle oriented toward light source -        gl_PositionIn[0], -        gl_PositionIn[2], -        gl_PositionIn[4] -    }; - -    // Compute normal at each vertex. -    cross_products(n, 0, 2, 4); - -    // Compute direction from vertices to light. -    lightdir[0] = getLightDirection(lightpos, gl_PositionIn[0].xyz); -    lightdir[1] = getLightDirection(lightpos, gl_PositionIn[2].xyz); -    lightdir[2] = getLightDirection(lightpos, gl_PositionIn[4].xyz); - -    // Check if the main triangle faces the light. -    bool faces_light = true; -    if (!(dot(ns[0],d[0]) > 0 -         |dot(ns[1],d[1]) > 0 -         |dot(ns[2],d[2]) > 0)) -    { -        // Flip vertex winding order in or_pos. -        or_pos[1] = gl_PositionIn[4]; -        or_pos[2] = gl_PositionIn[2]; -        faces_light = false; -    } - -    // Near cap: simply render triangle. -    emitTri(or_pos); - -    // Far cap: extrude positions to infinity. -    v[0] =vec4(lightpos.w * or_pos[0].xyz - lightpos.xyz,0); -    v[1] =vec4(lightpos.w * or_pos[2].xyz - lightpos.xyz,0); -    v[2] =vec4(lightpos.w * or_pos[1].xyz - lightpos.xyz,0); - -    emitTri(v); - -    // Loop over all edges and extrude if needed. -    for ( int i=0; i<3; i++ )  -    { -       // Compute indices of neighbor triangle. -       int v0 = i*2; -       int nb = (i*2+1); -       int v1 = (i*2+2) % 6; -       cross_products(n, v0, nb, v1); - -       // Compute direction to light, again as above. -       d[0] =lightpos.xyz-lightpos.w*gl_PositionIn[v0].xyz; -       d[1] =lightpos.xyz-lightpos.w*gl_PositionIn[nb].xyz; -       d[2] =lightpos.xyz-lightpos.w*gl_PositionIn[v1].xyz; - -       bool is_parallel = gl_PositionIn[nb].w < 1e-5; - -       // Extrude the edge if it does not have a -       // neighbor, or if it's a possible silhouette. -       if (is_parallel || -          ( faces_light != (dot(ns[0],d[0])>0 || -                            dot(ns[1],d[1])>0 || -                            dot(ns[2],d[2])>0) )) -       { -           // Make sure sides are oriented correctly. -           int i0 = faces_light ? v0 : v1; -           int i1 = faces_light ? v1 : v0; - -           v[0] = gl_PositionIn[i0]; -           v[1] = vec4(lightpos.w*gl_PositionIn[i0].xyz - lightpos.xyz, 0); -           v[2] = gl_PositionIn[i1]; -           v[3] = vec4(lightpos.w*gl_PositionIn[i1].xyz - lightpos.xyz, 0); - -           emitQuad(v); -       } -    } -} - -void main() -{ -    // Output -    emitPrimitives(0); -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl deleted file mode 100644 index 34d26cddea..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl +++ /dev/null @@ -1,70 +0,0 @@ -/**  - * @file class3/deferred/gatherSkyShF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_data[3]; -#else -#define frag_data gl_FragData -#endif - -VARYING vec2 vary_frag; - -uniform vec2 screen_res; -uniform sampler2D sh_input_r; -uniform sampler2D sh_input_g; -uniform sampler2D sh_input_b; - -void main() -{ -    vec2 offset	  = vec2(2.0) / screen_res; - -    vec4 r = vec4(0); -    vec4 g = vec4(0); -    vec4 b = vec4(0); - -    vec2 tc = vary_frag * 2.0; - -	r += texture2D(sh_input_r, tc + vec2(0,        0)); -	r += texture2D(sh_input_r, tc + vec2(offset.x, 0)); -	r += texture2D(sh_input_r, tc + vec2(0,        offset.y)); -	r += texture2D(sh_input_r, tc + vec2(offset.x, offset.y)); -    r /= 4.0f; - -	g += texture2D(sh_input_g, tc + vec2(0,        0)); -	g += texture2D(sh_input_g, tc + vec2(offset.x, 0)); -	g += texture2D(sh_input_g, tc + vec2(0,        offset.y)); -	g += texture2D(sh_input_g, tc + vec2(offset.x, offset.y)); -    g /= 4.0f; - -	b += texture2D(sh_input_b, tc + vec2(0,        0)); -	b += texture2D(sh_input_b, tc + vec2(offset.x, 0)); -	b += texture2D(sh_input_b, tc + vec2(0,        offset.y)); -	b += texture2D(sh_input_b, tc + vec2(offset.x, offset.y)); -    b /= 4.0f; - -    frag_data[0] = r; -    frag_data[1] = g; -    frag_data[2] = b; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl deleted file mode 100644 index 337c8a50fe..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl +++ /dev/null @@ -1,40 +0,0 @@ -/**  - * @file gatherSkyShV.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -ATTRIBUTE vec3 position; -ATTRIBUTE vec2 texcoord0; - -VARYING vec2 vary_frag; -uniform vec2 screen_res; - -void main() -{ -    // pass through untransformed fullscreen pos -    float oo_divisor = screen_res.x / 64.0; -    vec3 pos = (position.xyz * oo_divisor) + vec3(oo_divisor - 1, oo_divisor - 1, 0); -	gl_Position = vec4(pos.xyz, 1.0); -    vary_frag = texcoord0 * oo_divisor; -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl deleted file mode 100644 index d5d91c88f0..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl +++ /dev/null @@ -1,111 +0,0 @@ -/**  - * @file class3/deferred/genSkyShF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_data[3]; -#else -#define frag_data gl_FragData -#endif - -VARYING vec2 vary_frag; - -uniform vec3 sun_dir; - -uniform sampler2D transmittance_texture; -uniform sampler3D scattering_texture; -uniform sampler3D single_mie_scattering_texture; -uniform sampler2D irradiance_texture; - -vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance); - -vec3 calcDirection(vec2 tc) -{ -     float phi = tc.y * 2.0 * 3.14159265; -     float cosTheta = sqrt(1.0 - tc.x); -     float sinTheta = sqrt(1.0 - cosTheta * cosTheta); -     return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); -} - -// reverse mapping above to convert a hemisphere direction into phi/theta values -void getPhiAndThetaFromDirection(vec3 dir, out float phi, out float theta) -{ -     float sin_theta; -     float cos_theta; -     cos_theta = dir.z; -     theta     = acos(cos_theta); -     sin_theta = sin(theta); -     phi       = abs(sin_theta) > 0.0001 ? acos(dir.x / sin_theta) : 1.0; -} - -// reverse mapping above to convert a hemisphere direction into an SH texture sample pos -vec2 calcShUvFromDirection(vec3 dir) -{ -    vec2 uv; -    float phi; -    float theta; -    getPhiAndThetaFromDirection(dir, phi, theta); -    uv.y = phi   / 2.0 * 3.14159265; -    uv.x = theta / 2.0 * 3.14159265; -    return uv; -} - -void projectToL1(vec3 n, vec3 c, vec4 basis, out vec4 coeffs[3]) -{ -    coeffs[0] = vec4(basis.x, n * basis.yzw * c.r); -    coeffs[1] = vec4(basis.x, n * basis.yzw * c.g); -    coeffs[2] = vec4(basis.x, n * basis.yzw * c.b); -} - -void main() -{ -    float Y00 = sqrt(1.0 / 3.14159265) * 0.5; -    float Y1x = sqrt(3.0 / 3.14159265) * 0.5; -    float Y1y = Y1x; -    float Y1z = Y1x; - -    vec4 L1 = vec4(Y00, Y1x, Y1y, Y1z); - -    vec3 view_direction = calcDirection(vary_frag); -    vec3 sun_direction  = normalize(sun_dir); -    vec3 cam_pos        = vec3(0, 0, 6360); - -    vec3 transmittance; -    vec3 radiance = GetSkyLuminance(cam_pos, view_direction, 0.0f, sun_direction, transmittance); - -    vec3 color = vec3(1.0) - exp(-radiance * 0.0001); - -    color = pow(color, vec3(1.0/2.2)); - -    vec4 coeffs[3]; -    coeffs[0] = vec4(0); -    coeffs[1] = vec4(0); -    coeffs[2] = vec4(0); - -    projectToL1(view_direction, color.rgb, L1, coeffs); - -    frag_data[0] = coeffs[0]; -    frag_data[1] = coeffs[1]; -    frag_data[2] = coeffs[2]; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl deleted file mode 100644 index ca9ce3a2e1..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl +++ /dev/null @@ -1,37 +0,0 @@ -/**  - * @file pointShadowBlur.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform samplerCube cube_map;  - -in vec3 to_vec; - -out vec4 fragColor; - -void main()  -{ -	vec4 vcol = texture(cube_map, to_vec); -	fragColor = vec4(vcol.rgb, 1.0); -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl deleted file mode 100644 index c8991f7a18..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl +++ /dev/null @@ -1,73 +0,0 @@ -/**  - * @file class3/deferred/shVisF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifdef DEFINE_GL_FRAGCOLOR -    out vec4 frag_color; -#else -    #define frag_color gl_FragColor -#endif - -///////////////////////////////////////////////////////////////////////// -// Fragment shader for L1 SH debug rendering -///////////////////////////////////////////////////////////////////////// - -uniform sampler2D sh_input_r; -uniform sampler2D sh_input_g; -uniform sampler2D sh_input_b; - -uniform mat3 inv_modelviewprojection; - -VARYING vec4 vary_pos; - -void main(void)  -{ -    vec2 coord = vary_pos.xy + vec2(0.5,0.5); - -    coord.x *= (1.6/0.9); - -    if (dot(coord, coord) > 0.25) -    { -        discard; -    } - -    vec4 n = vec4(coord*2.0, 0.0, 1); -    //n.y = -n.y; -    n.z = sqrt(max(1.0-n.x*n.x-n.y*n.y, 0.0)); -    //n.xyz = inv_modelviewprojection * n.xyz; - -    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265)); -    vec4 l1r = texture2D(sh_input_r, vec2(0,0)); -    vec4 l1g = texture2D(sh_input_g, vec2(0,0)); -    vec4 l1b = texture2D(sh_input_b, vec2(0,0)); -    vec3 indirect = vec3( -                      dot(l1r, l1tap * n), -                      dot(l1g, l1tap * n), -                      dot(l1b, l1tap * n)); - -    //indirect = pow(indirect, vec3(0.45)); -    indirect *= 3.0; - -	frag_color = vec4(indirect, 1.0); -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl deleted file mode 100644 index 8f32dfde79..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl +++ /dev/null @@ -1,33 +0,0 @@ -/**  - * @file class3/deferred/shVisV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -ATTRIBUTE vec3 position; -VARYING vec4 vary_pos; - -void main() -{ -    // Output -    vary_pos = vec4(position, 1); -    gl_Position = vary_pos; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl deleted file mode 100644 index af1461c297..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl +++ /dev/null @@ -1,66 +0,0 @@ -/**  - * @file shadowAlphaMaskV.glsl - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 texture_matrix0; -uniform mat4 modelview_projection_matrix; -uniform float shadow_target_width; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -#if !defined(DEPTH_CLAMP) -VARYING float pos_zd2; -#endif - -VARYING float target_pos_x; -VARYING vec4 pos; -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - -void passTextureIndex(); - -void main() -{ -	//transform vertex -	vec4 pre_pos = vec4(position.xyz, 1.0); -	vec4 pos = modelview_projection_matrix * pre_pos; -	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; - -	pos_w = pos.w; - -#if !defined(DEPTH_CLAMP) -	pos_zd2 = pos.z * 0.5; -	 -	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); -#else -	gl_Position = pos; -#endif -	 -	passTextureIndex(); - -	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	vertex_color = diffuse_color; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl index 02000d90ca..b9089d69b7 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl @@ -68,7 +68,7 @@ void main()  	d *= d;  	oPosition = vec4(position, 1.0); -	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); +//	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); // SL-11589 remove "U" shaped horizon  	vary_position = modelview_matrix * oPosition;  	oPosition = modelViewProj * oPosition; diff --git a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl b/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl deleted file mode 100644 index c6ea3ec9d4..0000000000 --- a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl +++ /dev/null @@ -1,73 +0,0 @@ -/**  - * @file class3\wl\advancedAtmoF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -in vec3 view_dir; - -uniform vec3 cameraPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; - -uniform sampler2D transmittance_texture; -uniform sampler3D scattering_texture; -uniform sampler3D mie_scattering_texture; -uniform sampler2D irradiance_texture; - -vec3 GetSolarLuminance(); -vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 sun_dir, out vec3 transmittance); -vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 sun_dir, out vec3 transmittance); -vec3 GetSunAndSkyIlluminance(vec3 pos, vec3 norm, vec3 sun_dir, out vec3 sky_irradiance); - -void main() -{ -    vec3 view_direction = normalize(view_dir); - -    vec3 camPos = cameraPosLocal; -    vec3 transmittance; -    vec3 sky_illum; -    vec3 radiance = GetSkyLuminance(camPos, view_direction, 0.0f, sun_dir, transmittance); -    vec3 radiance2 = GetSunAndSkyIlluminance(camPos, view_direction, sun_dir, sky_illum); - -    //radiance *= transmittance; - -    // If the view ray intersects the Sun, add the Sun radiance. -    if (dot(view_direction, sun_dir) >= sun_size) -    { -        radiance = radiance + transmittance * GetSolarLuminance(); -    } - -    //vec3 color = vec3(1.0) - exp(-radiance); -    //color = pow(color, vec3(1.0 / 2.2)); - -    frag_color.rgb = radiance; -  -    frag_color.a = 1.0; -} - diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 8d2e3905d1..a371a501da 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2037,6 +2037,13 @@ LLVector3d LLAgentCamera::getFocusOffsetInitial()  F32 LLAgentCamera::getCameraMaxZoomDistance()  { +    // SL-14706 / SL-14885 TPV have relaxed camera constraints allowing you to mousewheeel zoom WAY out. +    static LLCachedControl<bool> s_disable_camera_constraints(gSavedSettings, "DisableCameraConstraints", false); +    if (s_disable_camera_constraints) +    { +        return (F32)INT_MAX; +    } +      // Ignore "DisableCameraConstraints", we don't want to be out of draw range when we focus onto objects or avatars      return llmin(MAX_CAMERA_DISTANCE_FROM_OBJECT,                   mDrawDistance - 1, // convenience, don't hit draw limit when focusing on something diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4f3e0b08e4..e98e18a96e 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -566,13 +566,13 @@ static void settings_to_globals()  static void settings_modify()  { -    LLPipeline::sRenderTransparentWater = gSavedSettings.getBOOL("RenderTransparentWater"); -    LLPipeline::sRenderBump             = gSavedSettings.getBOOL("RenderObjectBump"); +    LLPipeline::sRenderTransparentWater	= gSavedSettings.getBOOL("RenderTransparentWater"); +    LLPipeline::sRenderBump				= gSavedSettings.getBOOL("RenderObjectBump");      LLPipeline::sRenderDeferred         = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");      LLRenderTarget::sUseFBO             = LLPipeline::sRenderDeferred; -    LLVOSurfacePatch::sLODFactor        = gSavedSettings.getF32("RenderTerrainLODFactor"); -    LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor;  // square lod factor to get exponential range of [1,4] -    gDebugGL       = gDebugGLSession || gDebugSession; +    LLVOSurfacePatch::sLODFactor		= gSavedSettings.getF32("RenderTerrainLODFactor"); +    LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] +    gDebugGL = gDebugGLSession || gDebugSession;      gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");  } @@ -958,8 +958,8 @@ bool LLAppViewer::init()  	if (!gGLManager.mHasRequirements)  	{          // already handled with a MBVideoDrvErr -		return 0; -	} +        return 0; +    }  	// Without SSE2 support we will crash almost immediately, warn here.  	if (!gSysCPU.hasSSE2()) @@ -1306,12 +1306,12 @@ void LLAppViewer::initMaxHeapSize()  	//currently SL is built under 32-bit setting, we set its max heap size no more than 1.6 GB.   #ifndef LL_X86_64 -    F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize") ; +	F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize") ;  #else      F32Gigabytes max_heap_size_gb = (F32Gigabytes)gSavedSettings.getF32("MaxHeapSize64");  #endif -    LLMemory::initMaxHeapSizeGB(max_heap_size_gb); +	LLMemory::initMaxHeapSizeGB(max_heap_size_gb);  }  static LLTrace::BlockTimerStatHandle FTM_MESSAGES("System Messages"); @@ -1479,18 +1479,18 @@ bool LLAppViewer::doFrame()  			{  				{  					LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df pauseMainloopTimeout" ) -					pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds! +				pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds!  				}  				{  					LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df idle"); //LL_RECORD_BLOCK_TIME(FTM_IDLE); -					idle(); +				idle();  				}  				{  					LL_PROFILE_ZONE_NAMED_CATEGORY_APP( "df resumeMainloopTimeout" ) -					resumeMainloopTimeout(); -				} +				resumeMainloopTimeout(); +			}  			}  			if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) @@ -2694,7 +2694,7 @@ bool LLAppViewer::initConfiguration()                  const std::string& name = *itr;                  const std::string& value = *(++itr);                  if (!tempSetControl(name,value)) -                { +				{  					LL_WARNS() << "Failed --set " << name << ": setting name unknown." << LL_ENDL;                  }              } @@ -4393,12 +4393,12 @@ bool LLAppViewer::initCache()          if (mPurgeCache)  		{ -		LLSplashScreen::update(LLTrans::getString("StartupClearingCache")); -		purgeCache(); +			LLSplashScreen::update(LLTrans::getString("StartupClearingCache")); +			purgeCache();  			// clear the new C++ file system based cache  			LLDiskCache::getInstance()->clearCache(); -	} +		}  		else  		{  			// purge excessive files from the new file system based cache @@ -5054,7 +5054,7 @@ void LLAppViewer::idle()  	{  		LL_PROFILE_ZONE_NAMED_CATEGORY_APP("world update"); //LL_RECORD_BLOCK_TIME(FTM_WORLD_UPDATE); -		gPipeline.updateMove(); +	gPipeline.updateMove();  	}  	LLWorld::getInstance()->updateParticles(); diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 3a1efec91b..024448bd70 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -102,27 +102,46 @@ void LLDrawPoolSky::render(S32 pass)  void LLDrawPoolSky::renderSkyFace(U8 index)  { -	LLFace* face = mDrawFace[index]; +    LLFace* face = mDrawFace[index]; -	if (!face || !face->getGeomCount()) -	{ -		return; -	} +    if (!face || !face->getGeomCount()) +    { +        return; +    } -    if (index < 6) // sky tex...interp +    if (index < LLVOSky::FACE_SUN) // sky tex...interp      {          llassert(mSkyTex); -	    mSkyTex[index].bindTexture(true); // bind the current tex +        mSkyTex[index].bindTexture(true); // bind the current tex          face->renderIndexed();      } +    else // Moon +    if (index == LLVOSky::FACE_MOON) +    { +        LLGLSPipelineDepthTestSkyBox gls_skybox(true, true); // SL-14113 Write depth for moon so stars can test if behind it + +        LLGLEnable blend(GL_BLEND); + +        // if (LLGLSLShader::sNoFixedFunction) // TODO: Necessary? is this always true? We already bailed on gPipeline.canUseWindLightShaders ... above +        LLViewerTexture* tex = face->getTexture(LLRender::DIFFUSE_MAP); +        if (tex) +        { +            gMoonProgram.bind(); // SL-14113 was gOneTextureNoColorProgram +            gGL.getTexUnit(0)->bind(tex, true); +            face->renderIndexed(); +        } +    }      else // heavenly body faces, no interp...      { +        LLGLSPipelineDepthTestSkyBox gls_skybox(true, false); // reset to previous +          LLGLEnable blend(GL_BLEND);          LLViewerTexture* tex = face->getTexture(LLRender::DIFFUSE_MAP);          if (tex)          { +            gOneTextureNoColorProgram.bind();              gGL.getTexUnit(0)->bind(tex, true);              face->renderIndexed();          } diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index a84f62036e..8706a5349b 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -335,7 +335,7 @@ void LLDrawPoolWater::render(S32 pass)  void LLDrawPoolWater::renderOpaqueLegacyWater()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; -    LLVOSky *voskyp = gSky.mVOSkyp; +	LLVOSky *voskyp = gSky.mVOSkyp;      if (voskyp == NULL)      { @@ -343,16 +343,16 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()      }  	LLGLSLShader* shader = NULL; -	if (LLPipeline::sUnderWaterRender) -	{ -		shader = &gObjectSimpleNonIndexedTexGenWaterProgram; -	} -	else -	{ -		shader = &gObjectSimpleNonIndexedTexGenProgram; -	} +		if (LLPipeline::sUnderWaterRender) +		{ +			shader = &gObjectSimpleNonIndexedTexGenWaterProgram; +		} +		else +		{ +			shader = &gObjectSimpleNonIndexedTexGenProgram; +		} -	shader->bind(); +		shader->bind();  	stop_glerror(); @@ -483,9 +483,9 @@ void LLDrawPoolWater::renderWater()      LLColor3 light_diffuse(0, 0, 0);      F32      light_exp = 0.0f; -    LLEnvironment &        environment     = LLEnvironment::instance(); -    LLSettingsWater::ptr_t pwater          = environment.getCurrentWater(); -    LLSettingsSky::ptr_t   psky            = environment.getCurrentSky(); +    LLEnvironment& environment = LLEnvironment::instance(); +    LLSettingsWater::ptr_t pwater = environment.getCurrentWater(); +    LLSettingsSky::ptr_t   psky   = environment.getCurrentSky();      LLVector3              light_dir       = environment.getLightDirection();      bool                   sun_up          = environment.getIsSunUp();      bool                   moon_up         = environment.getIsMoonUp(); @@ -508,15 +508,15 @@ void LLDrawPoolWater::renderWater()      F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1];      light_exp          = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f));      if (0.f < light_diffuse.normalize())  // Normalizing a color? Puzzling... -    { +	{          light_diffuse *= (1.5f + (6.f * ground_proj_sq));      }      // set up normal maps filtering      for (auto norm_map : mWaterNormp) -    { +	    {          if (norm_map) norm_map->setFilteringOption(has_normal_mips ? LLTexUnit::TFO_ANISOTROPIC : LLTexUnit::TFO_POINT); -    } +	    }      LLColor4      specular(sun_up ? psky->getSunlightColor() : psky->getMoonlightColor());      F32           phase_time = (F32) LLFrameTimer::getElapsedSeconds() * 0.5f; @@ -542,49 +542,49 @@ void LLDrawPoolWater::renderWater()              }          }          shader->bind(); - +	          // bind textures for water rendering -        S32 reftex = shader->enableTexture(LLShaderMgr::WATER_REFTEX); -        if (reftex > -1) -        { -            gGL.getTexUnit(reftex)->activate(); -            gGL.getTexUnit(reftex)->bind(&gPipeline.mWaterRef); -            gGL.getTexUnit(0)->activate(); -        } +	S32 reftex = shader->enableTexture(LLShaderMgr::WATER_REFTEX); +	if (reftex > -1) +	{ +		gGL.getTexUnit(reftex)->activate(); +		gGL.getTexUnit(reftex)->bind(&gPipeline.mWaterRef); +		gGL.getTexUnit(0)->activate(); +	}	 -        // bind normal map -        S32 bumpTex  = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP); -        S32 bumpTex2 = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP2); +	//bind normal map +	S32 bumpTex  = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP); +    S32 bumpTex2 = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP2); -        LLViewerTexture *tex_a = mWaterNormp[0]; -        LLViewerTexture *tex_b = mWaterNormp[1]; +    LLViewerTexture* tex_a = mWaterNormp[0]; +    LLViewerTexture* tex_b = mWaterNormp[1];          F32 blend_factor = pwater->getBlendFactor(); +	 +    gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE); +    gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE); -        gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE); -        gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE); - -        if (tex_a && (!tex_b || (tex_a == tex_b))) -        { -            gGL.getTexUnit(bumpTex)->bind(tex_a); -            blend_factor = 0;  // only one tex provided, no blending -        } -        else if (tex_b && !tex_a) -        { -            gGL.getTexUnit(bumpTex)->bind(tex_b); -            blend_factor = 0;  // only one tex provided, no blending -        } -        else if (tex_b != tex_a) -        { -            gGL.getTexUnit(bumpTex)->bind(tex_a); -            gGL.getTexUnit(bumpTex2)->bind(tex_b); -        } - -        // bind reflection texture from RenderTarget -        S32 screentex   = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX); +    if (tex_a && (!tex_b || (tex_a == tex_b))) +    { +		gGL.getTexUnit(bumpTex)->bind(tex_a); +        blend_factor = 0; // only one tex provided, no blending +    } +    else if (tex_b && !tex_a) +    { +        gGL.getTexUnit(bumpTex)->bind(tex_b); +        blend_factor = 0; // only one tex provided, no blending +    } +    else if (tex_b != tex_a) +    { +        gGL.getTexUnit(bumpTex)->bind(tex_a); +        gGL.getTexUnit(bumpTex2)->bind(tex_b); +    } +	 +    // bind reflection texture from RenderTarget +	S32 screentex = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX);          F32 screenRes[] = {1.f / gGLViewport[2], 1.f / gGLViewport[3]}; - -        S32 diffTex = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP); +		 +	S32 diffTex = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP);          // set uniforms for shader          if (deferred_render) @@ -596,22 +596,22 @@ void LLDrawPoolWater::renderWater()              }          } -        shader->uniform2fv(LLShaderMgr::DEFERRED_SCREEN_RES, 1, screenRes); -        shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor); +    shader->uniform2fv(LLShaderMgr::DEFERRED_SCREEN_RES, 1, screenRes); +    shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor); -        LLColor4 fog_color(pwater->getWaterFogColor(), 0.0f); -        F32      fog_density = pwater->getModifiedWaterFogDensity(underwater); +    LLColor4 fog_color(pwater->getWaterFogColor(), 0.0f); +    F32      fog_density = pwater->getModifiedWaterFogDensity(underwater); -        if (screentex > -1) -        { -            shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, fog_density); -            gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis); -        } - -        if (mShaderLevel == 1) -        { -            fog_color.mV[VW] = log(fog_density) / log(2); -        } +    if (screentex > -1) +	{ +		shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, fog_density); +		gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis); +	} +     +    if (mShaderLevel == 1) +    { +        fog_color.mV[VW] = log(fog_density) / log(2); +	}          F32 water_height  = environment.getWaterHeight();          F32 camera_height = LLViewerCamera::getInstance()->getOrigin().mV[2]; @@ -620,44 +620,47 @@ void LLDrawPoolWater::renderWater()          shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV);          shader->uniform4fv(LLShaderMgr::SPECULAR_COLOR, 1, specular.mV); -        shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, fog_color.mV); +    shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, fog_color.mV); -        shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV); -        shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp); +	shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV); +	shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp); -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV); -        shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV); +    shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, pwater->getWave1Dir().mV); +    shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, pwater->getWave2Dir().mV); -        shader->uniform3fv(LLShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV); +	shader->uniform3fv(LLShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV); -        shader->uniform3fv(LLShaderMgr::WATER_NORM_SCALE, 1, pwater->getNormalScale().mV); -        shader->uniform1f(LLShaderMgr::WATER_FRESNEL_SCALE, pwater->getFresnelScale()); -        shader->uniform1f(LLShaderMgr::WATER_FRESNEL_OFFSET, pwater->getFresnelOffset()); -        shader->uniform1f(LLShaderMgr::WATER_BLUR_MULTIPLIER, pwater->getBlurMultiplier()); +	shader->uniform3fv(LLShaderMgr::WATER_NORM_SCALE, 1, pwater->getNormalScale().mV); +	shader->uniform1f(LLShaderMgr::WATER_FRESNEL_SCALE, pwater->getFresnelScale()); +	shader->uniform1f(LLShaderMgr::WATER_FRESNEL_OFFSET, pwater->getFresnelOffset()); +    shader->uniform1f(LLShaderMgr::WATER_BLUR_MULTIPLIER, pwater->getBlurMultiplier()); -        F32 sunAngle    = llmax(0.f, light_dir.mV[1]); -        F32 scaledAngle = 1.f - sunAngle; +	F32 sunAngle = llmax(0.f, light_dir.mV[1]); +	F32 scaledAngle = 1.f - sunAngle;          shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up ? 1 : 0); -        shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE, sunAngle); -        shader->uniform1f(LLShaderMgr::WATER_SCALED_ANGLE, scaledAngle); -        shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE2, 0.1f + 0.2f * sunAngle); -        shader->uniform1i(LLShaderMgr::WATER_EDGE_FACTOR, edge ? 1 : 0); +	shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE, sunAngle); +	shader->uniform1f(LLShaderMgr::WATER_SCALED_ANGLE, scaledAngle); +	shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE2, 0.1f + 0.2f*sunAngle); +    shader->uniform1i(LLShaderMgr::WATER_EDGE_FACTOR, edge ? 1 : 0); -        LLVector4 rotated_light_direction = LLEnvironment::instance().getRotatedLightNorm(); -        shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, rotated_light_direction.mV); -        shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); +    // SL-15861 This was changed from getRotatedLightNorm() as it was causing +    // lightnorm in shaders\class1\windlight\atmosphericsFuncs.glsl in have inconsistent additive lighting for 180 degrees of the FOV. +    LLVector4 rotated_light_direction = LLEnvironment::instance().getClampedLightNorm(); -        if (LLViewerCamera::getInstance()->cameraUnderWater()) -        { -            shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleBelow()); -        } -        else -        { -            shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleAbove()); -        } +    shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, rotated_light_direction.mV); +    shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); -        LLGLDisable cullface(GL_CULL_FACE); +	if (LLViewerCamera::getInstance()->cameraUnderWater()) +	{ +		shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleBelow()); +	} +	else +	{ +		shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleAbove()); +	} + +		LLGLDisable cullface(GL_CULL_FACE);          LLVOWater *water = nullptr;          for (LLFace *const &face : mDrawFace) @@ -666,40 +669,40 @@ void LLDrawPoolWater::renderWater()              water = static_cast<LLVOWater *>(face->getViewerObject());              if (!water) continue; -            gGL.getTexUnit(diffTex)->bind(face->getTexture()); +			        gGL.getTexUnit(diffTex)->bind(face->getTexture());              if ((bool)edge == (bool) water->getIsEdgePatch()) -            { -                face->renderIndexed(); +                        { +                            face->renderIndexed();                  // Note non-void water being drawn, updates required                  if (!edge)  // SL-16461 remove !LLPipeline::sUseOcclusion check -                { -                    sNeedsReflectionUpdate = TRUE; -                    sNeedsDistortionUpdate = TRUE; +                    { +                            sNeedsReflectionUpdate = TRUE; +                            sNeedsDistortionUpdate = TRUE;                  } -            } +		    }          } -        shader->disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); -        shader->disableTexture(LLShaderMgr::WATER_SCREENTEX); -        shader->disableTexture(LLShaderMgr::BUMP_MAP); -        shader->disableTexture(LLShaderMgr::DIFFUSE_MAP); -        shader->disableTexture(LLShaderMgr::WATER_REFTEX); -        shader->disableTexture(LLShaderMgr::WATER_SCREENDEPTH); +	shader->disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); +	shader->disableTexture(LLShaderMgr::WATER_SCREENTEX);	 +	shader->disableTexture(LLShaderMgr::BUMP_MAP); +	shader->disableTexture(LLShaderMgr::DIFFUSE_MAP); +	shader->disableTexture(LLShaderMgr::WATER_REFTEX); +	shader->disableTexture(LLShaderMgr::WATER_SCREENDEPTH);          // clean up -        shader->unbind(); +	shader->unbind();          gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE);          gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE); -    } +        } -    gGL.getTexUnit(0)->activate(); -    gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); -    if (!deferred_render) -    { -        gGL.setColorMask(true, false); -    } +	gGL.getTexUnit(0)->activate(); +	gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); +	if (!deferred_render) +	{ +		gGL.setColorMask(true, false); +	}  }  LLViewerTexture *LLDrawPoolWater::getDebugTexture() diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 9873846669..9237b98b7e 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -266,15 +266,15 @@ void LLDrawPoolWLSky::renderStars(const LLVector3& camPosLocal) const  	gGL.pushMatrix();  	gGL.translatef(camPosLocal.mV[0], camPosLocal.mV[1], camPosLocal.mV[2]);  	gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f); -	gCustomAlphaProgram.bind(); -	gCustomAlphaProgram.uniform1f(sCustomAlpha, star_alpha.mV[3]); +	gStarsProgram.bind(); +	gStarsProgram.uniform1f(sCustomAlpha, star_alpha.mV[3]);  	gSky.mVOWLSkyp->drawStars();      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);  	gGL.popMatrix(); -	gCustomAlphaProgram.unbind(); -} +		gStarsProgram.unbind(); // SL-14113 was gCustomAlphaProgram +	}  void LLDrawPoolWLSky::renderStarsDeferred(const LLVector3& camPosLocal) const  { @@ -319,6 +319,7 @@ void LLDrawPoolWLSky::renderStarsDeferred(const LLVector3& camPosLocal) const  	gGL.pushMatrix();  	gGL.translatef(camPosLocal.mV[0], camPosLocal.mV[1], camPosLocal.mV[2]); +	gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);      gDeferredStarProgram.uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);      if (LLPipeline::sReflectionRender) @@ -451,7 +452,8 @@ void LLDrawPoolWLSky::renderSkyClouds(const LLVector3& camPosLocal, F32 camHeigh  void LLDrawPoolWLSky::renderHeavenlyBodies()  { -	LLGLSPipelineBlendSkyBox gls_skybox(true, false); +	//LLGLSPipelineBlendSkyBox gls_skybox(true, false); +    LLGLSPipelineBlendSkyBox gls_skybox(true, true); // SL-14113 we need moon to write to depth to clip stars behind      LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();  	gGL.pushMatrix(); @@ -581,8 +583,8 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)      if (gPipeline.canUseWindLightShaders())      {          renderSkyHazeDeferred(origin, camHeightLocal); -        renderStarsDeferred(origin);          renderHeavenlyBodies(); +        renderStarsDeferred(origin);          renderSkyCloudsDeferred(origin, camHeightLocal, cloud_shader);      }      gGL.setColorMask(true, true); @@ -600,8 +602,8 @@ void LLDrawPoolWLSky::render(S32 pass)      LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin();  	renderSkyHaze(origin, camHeightLocal);     +    renderHeavenlyBodies();      renderStars(origin); -    renderHeavenlyBodies();	  	renderSkyClouds(origin, camHeightLocal, cloud_shader);  	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 1c9360a843..5475d66216 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -79,7 +79,7 @@ LLGLSLShader			gTransformTangentProgram;  LLGLSLShader	gOcclusionProgram;  LLGLSLShader    gSkinnedOcclusionProgram;  LLGLSLShader	gOcclusionCubeProgram; -LLGLSLShader	gCustomAlphaProgram; +LLGLSLShader	gCustomAlphaProgram; // SL-14113 This used to be used for the stars with Atmospheric Shaders: OFF  LLGLSLShader	gGlowCombineProgram;  LLGLSLShader	gSplatTextureRectProgram;  LLGLSLShader	gGlowCombineFXAAProgram; @@ -144,6 +144,8 @@ LLGLSLShader		gObjectAlphaMaskNoColorProgram;  LLGLSLShader		gObjectAlphaMaskNoColorWaterProgram;  //environment shaders +LLGLSLShader		gMoonProgram; +LLGLSLShader		gStarsProgram;  LLGLSLShader		gTerrainProgram;  LLGLSLShader		gTerrainWaterProgram;  LLGLSLShader		gWaterProgram; @@ -809,6 +811,9 @@ void LLViewerShaderMgr::unloadShaders()  	gWaterProgram.unload();      gWaterEdgeProgram.unload();  	gUnderWaterProgram.unload(); + +	gMoonProgram.unload(); +	gStarsProgram.unload();  	gTerrainProgram.unload();  	gTerrainWaterProgram.unload();  	gGlowProgram.unload(); @@ -1042,6 +1047,34 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment()  		llassert(success);  	} +	if (success) +	{ +		gStarsProgram.mName = "Environment Stars Shader"; +		gStarsProgram.mShaderFiles.clear(); +		gStarsProgram.mShaderFiles.push_back(make_pair("environment/starsV.glsl", GL_VERTEX_SHADER_ARB)); +		gStarsProgram.mShaderFiles.push_back(make_pair("environment/starsF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gStarsProgram.mShaderLevel = mShaderLevel[SHADER_ENVIRONMENT]; +        gStarsProgram.addConstant( LLGLSLShader::SHADER_CONST_STAR_DEPTH ); // SL-14113 +		success = gStarsProgram.createShader(NULL, NULL); +		llassert(success); +	} + +	if (success) +	{ +		gMoonProgram.mName = "Environment Moon Shader"; +		gMoonProgram.mShaderFiles.clear(); +		gMoonProgram.mShaderFiles.push_back(make_pair("environment/moonV.glsl", GL_VERTEX_SHADER_ARB)); +		gMoonProgram.mShaderFiles.push_back(make_pair("environment/moonF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gMoonProgram.mShaderLevel = mShaderLevel[SHADER_ENVIRONMENT]; +        gMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_MOON_DEPTH ); // SL-14113 +		success = gMoonProgram.createShader(NULL, NULL); +		if (success) +		{ +			gMoonProgram.bind(); +			gMoonProgram.uniform1i(sTex0, 0); +		} +	} +  	if (!success)  	{  		mShaderLevel[SHADER_ENVIRONMENT] = 0; @@ -2771,6 +2804,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY; +        gDeferredWLCloudProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_MOON_DEPTH ); // SL-14113  		success = gDeferredWLCloudProgram.createShader(NULL, NULL);  		llassert(success);  	} @@ -2810,6 +2844,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gDeferredWLMoonProgram.mShaderFiles.push_back(make_pair("deferred/moonF.glsl", GL_FRAGMENT_SHADER_ARB));          gDeferredWLMoonProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];          gDeferredWLMoonProgram.mShaderGroup = LLGLSLShader::SG_SKY; +        gDeferredWLMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_MOON_DEPTH ); // SL-14113   	 	success = gDeferredWLMoonProgram.createShader(NULL, NULL);          llassert(success);   	} @@ -2822,6 +2857,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredStarProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY; +        gDeferredStarProgram.addConstant( LLGLSLShader::SHADER_CONST_STAR_DEPTH ); // SL-14113  		success = gDeferredStarProgram.createShader(NULL, NULL);          llassert(success);  	} @@ -3810,6 +3846,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()          gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));          gWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];          gWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY; +        gWLCloudProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_MOON_DEPTH ); // SL-14113          success = gWLCloudProgram.createShader(NULL, NULL);      } @@ -3846,6 +3883,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()          gWLMoonProgram.mShaderFiles.push_back(make_pair("windlight/moonF.glsl", GL_FRAGMENT_SHADER_ARB));          gWLMoonProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];          gWLMoonProgram.mShaderGroup = LLGLSLShader::SG_SKY; +        gWLMoonProgram.addConstant( LLGLSLShader::SHADER_CONST_CLOUD_MOON_DEPTH ); // SL-14113          success = gWLMoonProgram.createShader(NULL, NULL);      } diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index f8a261805b..59ba384bf7 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -219,6 +219,8 @@ extern LLGLSLShader			gObjectShinyProgram;  extern LLGLSLShader			gObjectShinyWaterProgram;  //environment shaders +extern LLGLSLShader			gMoonProgram; +extern LLGLSLShader			gStarsProgram;  extern LLGLSLShader			gTerrainProgram;  extern LLGLSLShader			gTerrainWaterProgram;  extern LLGLSLShader			gWaterProgram; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index a4fbbb3e78..327f121caf 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -65,6 +65,53 @@  #include "llinventorymodel.h"  #include "lluiusage.h" +// "Minimal Vulkan" to get max API Version + +// Calls +    #if defined(_WIN32) +        #define VKAPI_ATTR +        #define VKAPI_CALL __stdcall +        #define VKAPI_PTR  VKAPI_CALL +    #else +        #define VKAPI_ATTR +        #define VKAPI_CALL +        #define VKAPI_PTR +    #endif // _WIN32 + +// Macros +    // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +    // |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| +    // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ +    // <variant> <-------major-------><-----------minor-----------> <--------------patch--------------> +    //      0x7          0x7F                     0x3FF                           0xFFF +    #define VK_API_VERSION_MAJOR(  version) (((uint32_t)(version) >> 22) & 0x07FU)  //  7 bits +    #define VK_API_VERSION_MINOR(  version) (((uint32_t)(version) >> 12) & 0x3FFU)  // 10 bits +    #define VK_API_VERSION_PATCH(  version) (((uint32_t)(version)      ) & 0xFFFU)  // 12 bits +    #define VK_API_VERSION_VARIANT(version) (((uint32_t)(version) >> 29) & 0x007U)  //  3 bits + +    // NOTE: variant is first parameter!  This is to match vulkan/vulkan_core.h +    #define VK_MAKE_API_VERSION(variant, major, minor, patch) (0\ +        | (((uint32_t)(major   & 0x07FU)) << 22) \ +        | (((uint32_t)(minor   & 0x3FFU)) << 12) \ +        | (((uint32_t)(patch   & 0xFFFU))      ) \ +        | (((uint32_t)(variant & 0x007U)) << 29) ) + +    #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; + +// Types +    VK_DEFINE_HANDLE(VkInstance); + +    typedef enum VkResult +    { +        VK_SUCCESS = 0, +        VK_RESULT_MAX_ENUM = 0x7FFFFFFF +    } VkResult; + +// Prototypes +    typedef void               (VKAPI_PTR *PFN_vkVoidFunction            )(void); +    typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddr     )(VkInstance instance, const char* pName); +    typedef VkResult           (VKAPI_PTR *PFN_vkEnumerateInstanceVersion)(uint32_t* pApiVersion); +  namespace LLStatViewer  { @@ -615,19 +662,76 @@ void send_viewer_stats(bool include_preferences)      // detailed information on versions and extensions can come later.      static bool vulkan_oneshot = false;      static bool vulkan_detected = false; +    static std::string vulkan_max_api_version( "0.0" ); // Unknown/None      if (!vulkan_oneshot)      { -        HMODULE vulkan_loader = LoadLibraryExA("vulkan-1.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); +        // The 32-bit and 64-bit versions normally exist in: +        //     C:\Windows\System32 +        //     C:\Windows\SysWOW64 +        HMODULE vulkan_loader = LoadLibraryA("vulkan-1.dll");          if (NULL != vulkan_loader)          {              vulkan_detected = true; +            vulkan_max_api_version = "1.0"; // We have at least 1.0.  See the note about vkEnumerateInstanceVersion() below. + +            // We use Run-Time Dynamic Linking (via GetProcAddress()) instead of Load-Time Dynamic Linking (via directly calling vkGetInstanceProcAddr()). +            // This allows us to: +            //   a) not need the header: #include <vulkan/vulkan.h> +            //      (and not need to set the corresponding "Additional Include Directories" as long as we provide the equivalent Vulkan types/prototypes/etc.) +            //   b) not need to link to: vulkan-1.lib +            //      (and not need to set the corresponding "Additional Library Directories") +            // The former will allow Second Life to start and run even if the vulkan.dll is missing. +            // The latter will require us to: +            //   a) link with vulkan-1.lib +            //   b) cause a System Error at startup if the .dll is not found: +            //      "The code execution cannot proceed because vulkan-1.dll was not found." +            // +            // See: +            //   https://docs.microsoft.com/en-us/windows/win32/dlls/using-run-time-dynamic-linking +            //   https://docs.microsoft.com/en-us/windows/win32/dlls/run-time-dynamic-linking + +            // NOTE: Technically we can use GetProcAddress() as a replacement for vkGetInstanceProcAddr() +            //       but the canonical recommendation (mandate?) is to use vkGetInstanceProcAddr(). +            PFN_vkGetInstanceProcAddr pGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) GetProcAddress(vulkan_loader, "vkGetInstanceProcAddr"); +            if(pGetInstanceProcAddr) +            { +                // Check for vkEnumerateInstanceVersion.  If it exists then we have at least 1.1 and can query the max API version. +                // NOTE: Each VkPhysicalDevice that supports Vulkan has its own VkPhysicalDeviceProperties.apiVersion which is separate from the max API version! +                // See: https://www.lunarg.com/wp-content/uploads/2019/02/Vulkan-1.1-Compatibility-Statement_01_19.pdf +                PFN_vkEnumerateInstanceVersion pEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion) pGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion"); +                if(pEnumerateInstanceVersion) +                { +                    uint32_t version = VK_MAKE_API_VERSION(0,1,1,0);   // e.g. 4202631 = 1.2.135.0 +                    VkResult status  = pEnumerateInstanceVersion( &version ); +                    if (status != VK_SUCCESS) +                    { +                        LL_INFOS("Vulkan") << "Failed to get Vulkan version.  Assuming 1.0" << LL_ENDL; +                    } +                    else +                    { +                        // https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#extendingvulkan-coreversions-versionnumbers +                        int major   = VK_API_VERSION_MAJOR  ( version ); +                        int minor   = VK_API_VERSION_MINOR  ( version ); +                        int patch   = VK_API_VERSION_PATCH  ( version ); +                        int variant = VK_API_VERSION_VARIANT( version ); + +                        vulkan_max_api_version = llformat( "%d.%d.%d.%d", major, minor, patch, variant ); +                        LL_INFOS("Vulkan") << "Vulkan API version: " << vulkan_max_api_version << ", Raw version: " << version << LL_ENDL; +                    } +                } +            } +            else +            { +                LL_WARNS("Vulkan") << "FAILED to get Vulkan vkGetInstanceProcAddr()!" << LL_ENDL; +            }              FreeLibrary(vulkan_loader);          }          vulkan_oneshot = true;      }      misc["string_1"] = vulkan_detected ? llformat("Vulkan driver is detected") : llformat("No Vulkan driver detected"); +    misc["VulkanMaxApiVersion"] = vulkan_max_api_version;  #else      misc["string_1"] = llformat("Unused");  | 
