diff options
21 files changed, 725 insertions, 156 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 58cac57e7f..b90830ddd8 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -94,6 +94,16 @@ const S32 SCULPT_MIN_AREA_DETAIL = 1;  extern BOOL gDebugGL; +void calc_tangent_from_triangle( +	LLVector4a&			normal, +	LLVector4a&			tangent_out, +	const LLVector4a& v1, +	const LLVector2&  w1, +	const LLVector4a& v2, +	const LLVector2&  w2, +	const LLVector4a& v3, +	const LLVector2&  w3); +  BOOL check_same_clock_dir( const LLVector3& pt1, const LLVector3& pt2, const LLVector3& pt3, const LLVector3& norm)  {      	LLVector3 test = (pt2-pt1)%(pt3-pt2); @@ -1594,7 +1604,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split,  			S32 sides = (S32)llfloor(llfloor((MIN_DETAIL_FACES * detail + twist_mag * 3.5f * (detail-0.5f))) * params.getRevolutions());  			if (is_sculpted) -				sides = llmax(sculpt_size, 1); +				sides = llmax(sculpt_size,1);  			genNGon(params, sides);  		} @@ -2062,7 +2072,7 @@ LLVolume::LLVolume(const LLVolumeParams ¶ms, const F32 detail, const BOOL ge  	generate(); -	if (mParams.getSculptID().isNull() && mParams.getSculptType() == LL_SCULPT_TYPE_NONE || mParams.getSculptType() == LL_SCULPT_TYPE_MESH) +	if (mParams.getSculptID().isNull() && ((mParams.getSculptType() == LL_SCULPT_TYPE_NONE) || (mParams.getSculptType() == LL_SCULPT_TYPE_MESH)))  	{  		createVolumeFaces();  	} @@ -4472,9 +4482,6 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,  					continue; //skip degenerate face  				} -				LLVector4a default_norm; -				default_norm.set(0,1,0,1); -  				//for each edge  				for (S32 k = 0; k < 3; k++) {  					S32 index = face.mEdge[j*3+k]; @@ -4496,14 +4503,14 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,  						norm_mat.rotate(n[v1], t); -						t.normalize3fast_checked(&default_norm); +						t.normalize3fast();  						normals.push_back(LLVector3(t[0], t[1], t[2]));  						mat.affineTransform(v[v2], t);  						vertices.push_back(LLVector3(t[0], t[1], t[2]));  						norm_mat.rotate(n[v2], t); -						t.normalize3fast_checked(&default_norm); +						t.normalize3fast();  						normals.push_back(LLVector3(t[0], t[1], t[2]));  					}  				}		 @@ -5282,6 +5289,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		if (src.mTangents)  		{  			allocateTangents(src.mNumVertices); +			llassert(mTangents);  			LLVector4a::memcpyNonAliased16((F32*) mTangents, (F32*) src.mTangents, vert_size);  		}  		else @@ -5293,6 +5301,7 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		if (src.mWeights)  		{  			allocateWeights(src.mNumVertices); +			llassert(mWeights);  			LLVector4a::memcpyNonAliased16((F32*) mWeights, (F32*) src.mWeights, vert_size);  		}  		else @@ -5308,14 +5317,14 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  		LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size);  	} -	 +  	//delete   	return *this;  }  LLVolumeFace::~LLVolumeFace()  { -	ll_aligned_free_16(mExtents); +		ll_aligned_free_16(mExtents);  	mExtents = NULL;  	freeData(); @@ -5325,7 +5334,7 @@ void LLVolumeFace::freeData()  {  	ll_aligned_free_16(mPositions);  	mPositions = NULL; -	ll_aligned_free_16( mNormals); +	ll_aligned_free_16(mNormals);  	mNormals = NULL;  	ll_aligned_free_16(mTexCoords);  	mTexCoords = NULL; @@ -5911,10 +5920,10 @@ void LLVolumeFace::cacheOptimize()  		wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  	} -	LLVector4a* binorm = NULL; +	LLVector4a* tangent = NULL;  	if (mTangents)  	{ -		binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); +		tangent = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  	}  	//allocate mapping of old indices to new indices @@ -5939,7 +5948,7 @@ void LLVolumeFace::cacheOptimize()  			}  			if (mTangents)  			{ -				binorm[cur_idx] = mTangents[idx]; +				tangent[cur_idx] = mTangents[idx];  			}  			cur_idx++; @@ -5961,7 +5970,7 @@ void LLVolumeFace::cacheOptimize()  	mNormals = norm;  	mTexCoords = tc;  	mWeights = wght; -	mTangents = binorm; +	mTangents = tangent;  	//std::string result = llformat("ACMR pre/post: %.3f/%.3f  --  %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks);  	//llinfos << result << llendl; @@ -6099,9 +6108,6 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)  	{  		VertexData	corners[4];  		VertexData baseVert; -		LLVector4a default_norm; -		default_norm.set(0,1,0,1); -  		for(S32 t = 0; t < 4; t++)  		{  			corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV); @@ -6115,7 +6121,7 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)  			LLVector4a rhs;  			rhs.setSub(corners[2].getPosition(), corners[1].getPosition());  			baseVert.getNormal().setCross3(lhs, rhs); -			baseVert.getNormal().normalize3fast_checked(&default_norm); +			baseVert.getNormal().normalize3fast();  		}  		if(!(mTypeMask & TOP_MASK)) @@ -6312,6 +6318,43 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  	cuv = (min_uv + max_uv)*0.5f; + +	LLVector4a tangent; +	calc_tangent_from_triangle( +			*norm, +			tangent, +			*mCenter, cuv, +			pos[0], tc[0], +			pos[1], tc[1]); + +	if (tangent.getLength3() < 0.01) +	{ +		tangent.set(1,0,0,1); +	} +	else +	{ +		LLVector4a default_tangent; +		default_tangent.set(1,0,0,1); +		tangent.normalize3fast_checked(&default_tangent); +	} + +	LLVector4a normal; +	LLVector4a d0, d1; + +	d0.setSub(*mCenter, pos[0]); +	d1.setSub(*mCenter, pos[1]); +	 +	if (mTypeMask & TOP_MASK) +	{ +		normal.setCross3(d0, d1); +	} +	else +	{ +		normal.setCross3(d1, d0); +	} + +	normal.normalize3fast_checked(); +  	VertexData vd;  	vd.setPosition(*mCenter);  	vd.mTexCoord = cuv; @@ -6323,7 +6366,15 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  		num_vertices++;  	} -		 + +	allocateTangents(num_vertices);		 + +	for (S32 i = 0; i < num_vertices; i++) +	{ +		mTangents[i].load4a(tangent.getF32ptr()); +		norm[i].load4a(normal.getF32ptr()); +	}	 +  	if (partial_build)  	{  		return TRUE; @@ -6559,31 +6610,6 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)  	} -	LLVector4a d0,d1; - -	d0.setSub(mPositions[mIndices[1]], mPositions[mIndices[0]]); -	d1.setSub(mPositions[mIndices[2]], mPositions[mIndices[0]]); - -	LLVector4a normal; -	LLVector4a default_norm; -	default_norm.set(0,1,0,1); - -	normal.setCross3(d0,d1); -	normal.normalize3fast_checked(&default_norm); -	 -	llassert(llfinite(normal.getF32ptr()[0])); -	llassert(llfinite(normal.getF32ptr()[1])); -	llassert(llfinite(normal.getF32ptr()[2])); - -	llassert(!llisnan(normal.getF32ptr()[0])); -	llassert(!llisnan(normal.getF32ptr()[1])); -	llassert(!llisnan(normal.getF32ptr()[2])); -	 -	for (S32 i = 0; i < num_vertices; i++) -	{ -		norm[i].load4a(normal.getF32ptr()); -	} -  	return TRUE;  } @@ -6616,9 +6642,9 @@ void LLVolumeFace::createTangents()  		default_norm.set(0,1,0,1);  		for (U32 i = 0; i < mNumVertices; i++)   		{ -			//binorm[i].normalize3fast(); +			//tangent[i].normalize3fast();  			//bump map/planar projection code requires normals to be normalized -			mNormals[i].normalize3fast_checked(&default_norm); +			mNormals[i].normalize3fast_checked();  		}  	}  } @@ -6693,7 +6719,7 @@ void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, con  void LLVolumeFace::allocateTangents(S32 num_verts)  { -	ll_aligned_free_16(mTangents); +		ll_aligned_free_16(mTangents);  	mTangents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts);  } @@ -6796,9 +6822,6 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat  	mat.loadu(mat_in);  	norm_mat.loadu(norm_mat_in); -	LLVector4a default_norm; -	default_norm.set(0,1,0,1); -  	for (U32 i = 0; i < face.mNumVertices; ++i)  	{  		//transform appended face position and store @@ -6806,7 +6829,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat  		//transform appended face normal and store  		norm_mat.rotate(src_norm[i], dst_norm[i]); -		dst_norm[i].normalize3fast_checked(&default_norm); +		dst_norm[i].normalize3fast_checked();  		//copy appended face texture coordinate  		dst_tc[i] = src_tc[i]; @@ -7215,6 +7238,134 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)  	return TRUE;  } +// Finds binormal based on three vertices with texture coordinates. +// Fills in dummy values if the triangle has degenerate texture coordinates. +void calc_binormal_from_triangle(LLVector4a& binormal, + +	const LLVector4a& pos0, +	const LLVector2& tex0, +	const LLVector4a& pos1, +	const LLVector2& tex1, +	const LLVector4a& pos2, +	const LLVector2& tex2) +{ +	LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] ); +	LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] ); +	LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] ); +	 +	LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] ); +	LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] ); +	LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] ); + +	LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] ); +	LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] ); +	LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] ); +	 +	LLVector4a lhs, rhs; + +	LLVector4a r0;  +	lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2); +	r0.setCross3(lhs, rhs); +		 +	LLVector4a r1; +	lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2); +	r1.setCross3(lhs, rhs); + +	LLVector4a r2; +	lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2); +	r2.setCross3(lhs, rhs); + +	if( r0[VX] && r1[VX] && r2[VX] ) +	{ +		binormal.set( +				-r0[VZ] / r0[VX], +				-r1[VZ] / r1[VX], +				-r2[VZ] / r2[VX]); +		// binormal.normVec(); +	} +	else +	{ +		binormal.set( 0, 1 , 0 ); +	} +} + +// Finds binormal based on three vertices with texture coordinates. +// Fills in dummy values if the triangle has degenerate texture coordinates. +void calc_tangent_from_triangle( +	LLVector4a&			normal, +	LLVector4a&			tangent_out, +	const LLVector4a& v1, +	const LLVector2&  w1, +	const LLVector4a& v2, +	const LLVector2&  w2, +	const LLVector4a& v3, +	const LLVector2&  w3) +{ +	const F32* v1ptr = v1.getF32ptr(); +	const F32* v2ptr = v2.getF32ptr(); +	const F32* v3ptr = v3.getF32ptr(); + +	float x1 = v2ptr[0] - v1ptr[0]; +	float x2 = v3ptr[0] - v1ptr[0]; +	float y1 = v2ptr[1] - v1ptr[1]; +	float y2 = v3ptr[1] - v1ptr[1]; +	float z1 = v2ptr[2] - v1ptr[2]; +	float z2 = v3ptr[2] - v1ptr[2]; + +	float s1 = w2.mV[0] - w1.mV[0]; +	float s2 = w3.mV[0] - w1.mV[0]; +	float t1 = w2.mV[1] - w1.mV[1]; +	float t2 = w3.mV[1] - w1.mV[1]; + +	F32 rd = s1*t2-s2*t1; + +	float r = ((rd*rd) > FLT_EPSILON) ? 1.0F / rd : 1024.f; //some made up large ratio for division by zero + +	llassert(llfinite(r)); +	llassert(!llisnan(r)); + +	LLVector4a sdir( +		(t2 * x1 - t1 * x2) * r, +		(t2 * y1 - t1 * y2) * r, +		(t2 * z1 - t1 * z2) * r); + +	LLVector4a tdir( +		(s1 * x2 - s2 * x1) * r, +		(s1 * y2 - s2 * y1) * r, +		(s1 * z2 - s2 * z1) * r); + +	LLVector4a	n = normal; +	LLVector4a	t = sdir; + +	LLVector4a ncrosst; +	ncrosst.setCross3(n,t); + +	// Gram-Schmidt orthogonalize +	n.mul(n.dot3(t).getF32()); + +	LLVector4a tsubn; +	tsubn.setSub(t,n); + +	if (tsubn.dot3(tsubn).getF32() > F_APPROXIMATELY_ZERO) +	{ +		tsubn.normalize3fast_checked(); + +		// Calculate handedness +		F32 handedness = ncrosst.dot3(tdir).getF32() < 0.f ? -1.f : 1.f; + +		tsubn.getF32ptr()[3] = handedness; + +		tangent_out = tsubn; +	} +	else +	{ +		// degenerate, make up a value +		// +		tangent_out.set(0,0,1,1); +	} + +} +  //adapted from Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html  void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal,          const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index b854218e3d..40aff36dac 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -87,7 +87,6 @@ LLShaderFeatures::LLShaderFeatures()  	, mIndexedTextureChannels(0)  	, disableTextureIndex(false)  	, hasAlphaMask(false) -	, hasSRGB(false)  {  } @@ -375,6 +374,11 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes,  	// Create program  	mProgramObject = glCreateProgramObjectARB(); + +#if LL_DARWIN +    // work-around missing mix(vec3,vec3,bvec3) +    mDefines["OLD_SELECT"] = "1"; +#endif  	//compile new source  	vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin(); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index dadffeb6c4..eabdb9fc92 100755 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -50,7 +50,6 @@ public:  	S32 mIndexedTextureChannels;  	bool disableTextureIndex;  	bool hasAlphaMask; -	bool hasSRGB;  	// char numLights; diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index c3e76f5e0e..63404abeff 100755 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -175,14 +175,6 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)  	// Attach Fragment Shader Features Next  	/////////////////////////////////////// -	if (features->hasSRGB) -	{ -		if (!shader->attachObject("deferred/srgb.glsl")) -		{ -			return FALSE; -		} -	} -  	if(features->calculatesAtmospherics)  	{  		if (features->hasWaterFog) diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index b1ef6e0576..f1249a842a 100755 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -753,10 +753,10 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi  	U16* idx = ((U16*) getIndicesPointer())+indices_offset;  	stop_glerror(); -	LLGLSLShader::startProfile(); -	glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,  +		LLGLSLShader::startProfile(); +		glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT,   		idx); -	LLGLSLShader::stopProfile(count, mode); +		LLGLSLShader::stopProfile(count, mode);  	stop_glerror(); @@ -2209,11 +2209,32 @@ void LLVertexBuffer::bindForFeedback(U32 channel, U32 type, U32 index, U32 count  #endif  } +void DumpComponents(U32 mask) +{ +	llinfos << +	((mask & LLVertexBuffer::MAP_VERTEX)		? "vertex:"		: " ") << +	((mask & LLVertexBuffer::MAP_NORMAL)		? "norms:"		: " ") << +	((mask & LLVertexBuffer::MAP_TEXCOORD0)	? "TC0:"		: " ") << +	((mask & LLVertexBuffer::MAP_TEXCOORD1)	? "TC1:"		: " ") << +	((mask & LLVertexBuffer::MAP_TEXCOORD2)	? "TC2:"		: " ") << +	((mask & LLVertexBuffer::MAP_TEXCOORD3)	? "TC3:"		: " ") << +	((mask & LLVertexBuffer::MAP_COLOR)		? "color:"		: " ") << +	((mask & LLVertexBuffer::MAP_EMISSIVE)	? "emissive:"	: " ") << +	((mask & LLVertexBuffer::MAP_TANGENT)	? "tangents"	: " ") << llendl; +} +  // Set for rendering  void LLVertexBuffer::setBuffer(U32 data_mask)  {  	flush(); +	if((getTypeMask() & data_mask) != data_mask) +	{ +		llinfos << "Missing VB stream components." << llendl; +		DumpComponents(data_mask & ~getTypeMask()); +		data_mask &= getTypeMask(); +	} +	  	//set up pointers if the data mask is different ...  	bool setup = (sLastMask != data_mask); @@ -2237,15 +2258,36 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  				}  			} +            static bool done_done_it = false; +             +            if (!done_done_it) +            { +                done_done_it = true; +             +            llinfos << +             "MAP_VERTEX: " << MAP_VERTEX << +             "MAP_VERTEX: " << MAP_NORMAL << +             "MAP_VERTEX: " << MAP_TEXCOORD0 << +             "MAP_VERTEX: " << MAP_TEXCOORD1 << +             "MAP_VERTEX: " << MAP_TEXCOORD2 << +             "MAP_VERTEX: " << MAP_TEXCOORD3 << +             "MAP_VERTEX: " << MAP_COLOR << +             "MAP_VERTEX: " << MAP_EMISSIVE << +             "MAP_VERTEX: " << MAP_TANGENT << llendl; +             +             +            } +                  			if ((data_mask & required_mask) != required_mask)  			{  				U32 unsatisfied_mask = (required_mask & ~data_mask);  				U32 i = 0; -				while (i < 15) +				while (i < TYPE_MAX)  				{ -					switch ((unsatisfied_mask & (1 << i))) +                    U32 unsatisfied_flag = unsatisfied_mask & (1 << i); +					switch (unsatisfied_flag)  					{  						case MAP_VERTEX: llinfos << "Missing vert pos" << llendl; break;  						case MAP_NORMAL: llinfos << "Missing normals" << llendl; break; @@ -2264,6 +2306,11 @@ void LLVertexBuffer::setBuffer(U32 data_mask)  					}					  				} +                if (unsatisfied_mask & (1 << TYPE_INDEX)) +                { +                    llinfos << "Missing indices" << llendl; +                } +  				llerrs << "Shader consumption mismatches data provision." << llendl;  			}  		} diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 52858f45f4..d11f67ee58 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -96,8 +96,42 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec3 calcDirectionalLight(vec3 n, vec3 l)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 00548ea826..f22b16965c 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -39,8 +39,43 @@ VARYING vec3 vary_position;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); + +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec3 fullbrightAtmosTransportDeferred(vec3 light)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index d3bd55da7a..b3ae81d494 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -114,8 +114,42 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  #ifdef WATER_FOG  uniform vec4 waterPlane; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 0b62c4ec09..ed68e38891 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -83,9 +83,43 @@ vec3 decode_normal (vec2 enc)      n.z = 1-f/2;      return n;  } +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +} -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl);  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 39d613e02b..0febbcd6e0 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -78,8 +78,43 @@ vec3 vary_AtmosAttenuation;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +} +  vec3 decode_normal (vec2 enc)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 251abfd119..48c9cd363c 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -82,8 +82,42 @@ vec3 decode_normal (vec2 enc)      return n;  } -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec4 correctWithGamma(vec4 col)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl index d532835bf1..587f3d5a94 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl @@ -23,51 +23,24 @@   * $/LicenseInfo$   */ -// OLD_SELECT work-around missing mix(vec3,vec,bvec3) in older GLSL versions (*cough* MAC *cough*) -  vec3 srgb_to_linear(vec3 cs)  { -	 -/*       {  cs / 12.92,                 cs <= 0.04045 -    cl = { -         {  ((cs + 0.055)/1.055)^2.4,   cs >  0.04045*/ -  	vec3 low_range = cs / vec3(12.92);  	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4));  	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); -#ifdef OLD_SELECT -	vec3 result; -	result.r = lte.r ? low_range.r : high_range.r; -	result.g = lte.g ? low_range.g : high_range.g; -	result.b = lte.b ? low_range.b : high_range.b; -    return result; -#else -	return mix(high_range, low_range, lessThanEqual(cs,vec3(0.04045))); -#endif +	return mix(high_range, low_range, lte); +  }  vec3 linear_to_srgb(vec3 cl)  { -	    /*  {  0.0,                          0         <= cl -            {  12.92 * c,                    0         <  cl < 0.0031308 -    cs =    {  1.055 * cl^0.41666 - 0.055,   0.0031308 <= cl < 1 -            {  1.0,                                       cl >= 1*/ -  	cl = clamp(cl, vec3(0), vec3(1));  	vec3 low_range  = cl * 12.92;  	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055;  	bvec3 lt = lessThan(cl,vec3(0.0031308)); +	return mix(high_range, low_range, lt); -#ifdef OLD_SELECT -	vec3 result; -	result.r = lt.r ? low_range.r : high_range.r; -	result.g = lt.g ? low_range.g : high_range.g; -	result.b = lt.b ? low_range.b : high_range.b; -    return result; -#else -	return mix(high_range, low_range, lessThan(cl,vec3(0.0031308))); -#endif  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl new file mode 100644 index 0000000000..6cc1e6e798 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/srgb_mac.glsl @@ -0,0 +1,54 @@ +/**  + * @file srgb.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$ + */ + +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); + +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; + +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +	return result; +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl index 858c3a1fe9..78f841c733 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -56,8 +56,42 @@ VARYING vec4 refCoord;  VARYING vec4 littleWave;  VARYING vec4 view; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec2 encode_normal(vec3 n)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 5538c41d1c..d49ff72cf0 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -67,8 +67,42 @@ VARYING vec4 littleWave;  VARYING vec4 view;  VARYING vec4 vary_position; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec2 encode_normal(vec3 n)  { diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 6d1cedee39..df750d3cec 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -68,8 +68,42 @@ uniform vec2 screen_res;  uniform mat4 inv_proj; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec2 encode_normal(vec3 n)  { diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index db2faa65d7..cc34285d65 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -78,8 +78,42 @@ vec3 vary_AtmosAttenuation;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec2 encode_normal(vec3 n)  { diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index cfb483ab54..bb6afbbf62 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -85,8 +85,42 @@ vec3 decode_normal (vec2 enc)      return n;  } -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); +vec3 srgb_to_linear(vec3 cs) +{ +	vec3 low_range = cs / vec3(12.92); +	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); +	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lte.r ? low_range.r : high_range.r; +	result.g = lte.g ? low_range.g : high_range.g; +	result.b = lte.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lte); +#endif + +} + +vec3 linear_to_srgb(vec3 cl) +{ +	cl = clamp(cl, vec3(0), vec3(1)); +	vec3 low_range  = cl * 12.92; +	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; +	bvec3 lt = lessThan(cl,vec3(0.0031308)); + +#ifdef OLD_SELECT +	vec3 result; +	result.r = lt.r ? low_range.r : high_range.r; +	result.g = lt.g ? low_range.g : high_range.g; +	result.b = lt.b ? low_range.b : high_range.b; +    return result; +#else +	return mix(high_range, low_range, lt); +#endif + +}  vec4 correctWithGamma(vec4 col)  { diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 6302cf6b00..f4f63e1042 100755 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -529,7 +529,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)  					}  				} -				params.mVertexBuffer->setBuffer(mask); +				params.mVertexBuffer->setBuffer(mask & ~(params.mFullbright ? (LLVertexBuffer::MAP_TEXTURE_INDEX | LLVertexBuffer::MAP_TANGENT | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2) : 0)); +                  				params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);  				gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 6e2139ea9e..264655029a 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -936,14 +936,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightShinyWaterF.glsl",			mVertexShaderLevel[SHADER_LIGHTING] ) );  	index_channels.push_back(ch);	 shaders.push_back( make_pair( "lighting/lightFullbrightShinyWaterF.glsl", mVertexShaderLevel[SHADER_LIGHTING] ) ); -	index_channels.push_back(-1);	 shaders.push_back( make_pair( "deferred/srgb.glsl",				mVertexShaderLevel[SHADER_DEFERRED] ) ); - -// work-around for missing mix(vec3,vec3,bvec3) on decrepit GLSLs -// -#if LL_DARWIN -    attribs["OLD_SELECT"] = "1"; -#endif -  	for (U32 i = 0; i < shaders.size(); i++)  	{  		// Note usage of GL_FRAGMENT_SHADER_ARB @@ -1269,7 +1261,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredSkinnedAlphaProgram.mName = "Deferred Skinned Alpha Shader"; -		gDeferredSkinnedAlphaProgram.mFeatures.hasSRGB = true;  		gDeferredSkinnedAlphaProgram.mFeatures.hasObjectSkinning = true;  		gDeferredSkinnedAlphaProgram.mFeatures.calculatesLighting = false;  		gDeferredSkinnedAlphaProgram.mFeatures.hasLighting = false; @@ -1327,7 +1318,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  			U32 alpha_mode = i & 0x3;  			gDeferredMaterialProgram[i].mShaderFiles.clear(); -			gDeferredMaterialProgram[i].mFeatures.hasSRGB = true;  			gDeferredMaterialProgram[i].mShaderFiles.push_back(make_pair("deferred/materialV.glsl", GL_VERTEX_SHADER_ARB));  			gDeferredMaterialProgram[i].mShaderFiles.push_back(make_pair("deferred/materialF.glsl", GL_FRAGMENT_SHADER_ARB));  			gDeferredMaterialProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1353,7 +1343,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  			U32 alpha_mode = i & 0x3;  			gDeferredMaterialWaterProgram[i].mShaderFiles.clear(); -			gDeferredMaterialWaterProgram[i].mFeatures.hasSRGB = true;  			gDeferredMaterialWaterProgram[i].mShaderFiles.push_back(make_pair("deferred/materialV.glsl", GL_VERTEX_SHADER_ARB));  			gDeferredMaterialWaterProgram[i].mShaderFiles.push_back(make_pair("deferred/materialF.glsl", GL_FRAGMENT_SHADER_ARB));  			gDeferredMaterialWaterProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1442,7 +1431,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		{  			gDeferredMultiLightProgram[i].mName = llformat("Deferred MultiLight Shader %d", i);  			gDeferredMultiLightProgram[i].mShaderFiles.clear(); -			gDeferredMultiLightProgram[i].mFeatures.hasSRGB = true;  			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));  			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));  			gDeferredMultiLightProgram[i].mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1455,7 +1443,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredSpotLightProgram.mName = "Deferred SpotLight Shader";  		gDeferredSpotLightProgram.mShaderFiles.clear(); -		gDeferredSpotLightProgram.mFeatures.hasSRGB = true;  		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1467,7 +1454,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredMultiSpotLightProgram.mName = "Deferred MultiSpotLight Shader";  		gDeferredMultiSpotLightProgram.mShaderFiles.clear(); -		gDeferredMultiSpotLightProgram.mFeatures.hasSRGB = true;  		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; @@ -1517,7 +1503,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredAlphaProgram.mName = "Deferred Alpha Shader"; -		gDeferredAlphaProgram.mFeatures.hasSRGB = true;  		gDeferredAlphaProgram.mFeatures.calculatesLighting = false;  		gDeferredAlphaProgram.mFeatures.hasLighting = false;  		gDeferredAlphaProgram.mFeatures.isAlphaLighting = true; @@ -1549,7 +1534,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredAlphaWaterProgram.mName = "Deferred Alpha Underwater Shader"; -		gDeferredAlphaWaterProgram.mFeatures.hasSRGB = true;  		gDeferredAlphaWaterProgram.mFeatures.calculatesLighting = false;  		gDeferredAlphaWaterProgram.mFeatures.hasLighting = false;  		gDeferredAlphaWaterProgram.mFeatures.isAlphaLighting = true; @@ -1596,7 +1580,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredFullbrightProgram.mName = "Deferred Fullbright Shader"; -		gDeferredFullbrightProgram.mFeatures.hasSRGB = true;  		gDeferredFullbrightProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightProgram.mFeatures.hasGamma = true;  		gDeferredFullbrightProgram.mFeatures.hasTransport = true; @@ -1611,7 +1594,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredFullbrightAlphaMaskProgram.mName = "Deferred Fullbright Alpha Masking Shader"; -		gDeferredFullbrightAlphaMaskProgram.mFeatures.hasSRGB = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.hasGamma = true;  		gDeferredFullbrightAlphaMaskProgram.mFeatures.hasTransport = true; @@ -1627,7 +1609,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredFullbrightWaterProgram.mName = "Deferred Fullbright Underwater Shader"; -		gDeferredFullbrightWaterProgram.mFeatures.hasSRGB = true;  		gDeferredFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightWaterProgram.mFeatures.hasGamma = true;  		gDeferredFullbrightWaterProgram.mFeatures.hasTransport = true; @@ -1644,7 +1625,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredFullbrightAlphaMaskWaterProgram.mName = "Deferred Fullbright Underwater Alpha Masking Shader"; -		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasSRGB = true;  		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasGamma = true;  		gDeferredFullbrightAlphaMaskWaterProgram.mFeatures.hasTransport = true; @@ -1676,7 +1656,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredSkinnedFullbrightProgram.mName = "Skinned Fullbright Shader"; -		gDeferredSkinnedFullbrightProgram.mFeatures.hasSRGB = true;  		gDeferredSkinnedFullbrightProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredSkinnedFullbrightProgram.mFeatures.hasGamma = true;  		gDeferredSkinnedFullbrightProgram.mFeatures.hasTransport = true; @@ -1722,7 +1701,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		// load water shader  		gDeferredWaterProgram.mName = "Deferred Water Shader"; -		gDeferredWaterProgram.mFeatures.hasSRGB = true;  		gDeferredWaterProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredWaterProgram.mFeatures.hasGamma = true;  		gDeferredWaterProgram.mFeatures.hasTransport = true; @@ -1737,7 +1715,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		// load water shader  		gDeferredUnderWaterProgram.mName = "Deferred Under Water Shader"; -		gDeferredUnderWaterProgram.mFeatures.hasSRGB = true;  		gDeferredUnderWaterProgram.mFeatures.calculatesAtmospherics = true;  		gDeferredUnderWaterProgram.mFeatures.hasGamma = true;  		gDeferredUnderWaterProgram.mFeatures.hasTransport = true; @@ -1752,7 +1729,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredSoftenProgram.mName = "Deferred Soften Shader";  		gDeferredSoftenProgram.mShaderFiles.clear(); -		gDeferredSoftenProgram.mFeatures.hasSRGB = true;  		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1770,7 +1746,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredSoftenWaterProgram.mName = "Deferred Soften Underwater Shader";  		gDeferredSoftenWaterProgram.mShaderFiles.clear(); -		gDeferredSoftenWaterProgram.mFeatures.hasSRGB = true;  		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1868,7 +1843,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	if (success)  	{  		gDeferredAvatarAlphaProgram.mName = "Avatar Alpha Shader"; -		gDeferredAvatarAlphaProgram.mFeatures.hasSRGB = true;  		gDeferredAvatarAlphaProgram.mFeatures.hasSkinning = true;  		gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = false;  		gDeferredAvatarAlphaProgram.mFeatures.hasLighting = false; @@ -1892,7 +1866,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  	{  		gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correction Post Process";  		gDeferredPostGammaCorrectProgram.mShaderFiles.clear(); -		gDeferredPostGammaCorrectProgram.mFeatures.hasSRGB = true;  		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredGammaCorrect.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredPostGammaCorrectProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 165b28beb5..05390f64f0 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8695,12 +8695,6 @@ void LLPipeline::renderDeferredLighting()  				unbindDeferredShader(gDeferredSpotLightProgram);  			} -			//reset mDeferredVB to fullscreen triangle -			mDeferredVB->getVertexStrider(vert); -			vert[0].set(-1,1,0); -			vert[1].set(-1,-3,0); -			vert[2].set(3,1,0); -  			{  				LLGLDepthTest depth(GL_FALSE); @@ -8719,6 +8713,10 @@ void LLPipeline::renderDeferredLighting()  				F32 far_z = 0.f; +				bindDeferredShader(gDeferredMultiLightProgram[0]); + +				mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +				  				while (!fullscreen_lights.empty())  				{  					LLFastTimer ftm(FTM_FULLSCREEN_LIGHTS); @@ -8743,14 +8741,15 @@ void LLPipeline::renderDeferredLighting()  						gDeferredMultiLightProgram[idx].uniform4fv(LLShaderMgr::MULTI_LIGHT_COL, count, (GLfloat*) col);  						gDeferredMultiLightProgram[idx].uniform1f(LLShaderMgr::MULTI_LIGHT_FAR_Z, far_z);  						far_z = 0.f; -						count = 0;  -						mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); +						count = 0; +                        mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);  						mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); +						unbindDeferredShader(gDeferredMultiLightProgram[idx]);  					}  				} -				 -				unbindDeferredShader(gDeferredMultiLightProgram[0]); +				unbindDeferredShader(gDeferredMultiLightProgram[0]); +				  				bindDeferredShader(gDeferredMultiSpotLightProgram);  				gDeferredMultiSpotLightProgram.enableTexture(LLShaderMgr::DEFERRED_PROJECTION); | 
