diff options
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl | 4 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl | 13 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl | 2 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl | 4 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 50 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 72 | 
7 files changed, 45 insertions, 109 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index d175d2b518..17ac5a276d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -105,7 +105,7 @@ void main()  	vec4 pos = vec4(vary_position, 1.0);  #if INDEX_MODE == INDEXED -	vec4 diff = diffuseLookup(vary_texcoord0.xy); +	vec4 diff= diffuseLookup(vary_texcoord0.xy);  #else  	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif @@ -117,7 +117,7 @@ void main()  #endif  	vec3 normal = vary_norm;  -	 +  	vec3 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l);  	dlight = dlight * vary_directional.rgb * vary_pointlight_col; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 4c26621a88..a4b4cd51e3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -80,13 +80,13 @@ uniform vec3 light_direction[8];  uniform vec3 light_attenuation[8];   uniform vec3 light_diffuse[8]; -float calcDirectionalLight(vec3 n, vec3 l) +vec3 calcDirectionalLight(vec3 n, vec3 l)  {          float a = max(dot(n,l),0.0); -        return a; +        return vec3(a,a,a);  } -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) +vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  {  	//get light vector  	vec3 lv = lp.xyz-v; @@ -113,7 +113,7 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa  		da *= max(dot(n, lv), 0.0);		  	} -	return da;	 +	return vec3(da,da,da);	  }  void main() @@ -177,10 +177,11 @@ void main()  	col.rgb = vec3(0,0,0);  	// Add windlight lights -	col.rgb = atmosAmbient(vec3(0.)); +	col.rgb = atmosAmbient(col.rgb);  	vary_ambient = col.rgb*diffuse_color.rgb; -	vary_directional.rgb = atmosAffectDirectionalLight(1); + +	vary_directional.rgb = atmosAffectDirectionalLight(1.0f);  	col.rgb = col.rgb*diffuse_color.rgb;  #if INDEX_MODE != NON_INDEXED_NO_COLOR diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index db58c19057..59950a88ef 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -211,7 +211,7 @@ void main()  #endif  	vec3 normal = vary_norm; -	 +  	vec3 l = light_position[0].xyz;  	vec3 dlight = calcDirectionalLight(normal, l);  	     dlight = dlight * vary_directional.rgb * vary_pointlight_col; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl index 46fd8da4f8..dc4dd5d5e9 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaV.glsl @@ -176,14 +176,14 @@ void main()  	//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));  	vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); -	vec3 dff = pow(diffuse_color.rgb, vec3(2.2)); +	vec3 dff = pow(diffuse_color.rgb, vec3(2.2f,2.2f,2.2f));  	vary_pointlight_col = dff;  	col.rgb = vec3(0,0,0);  	// Add windlight lights -	col.rgb = atmosAmbient(vec3(0.)); +	col.rgb = atmosAmbient(col.rgb);  	vary_directional.rgb = atmosAffectDirectionalLight(1);  	vary_ambient = col.rgb*dff; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index edd1546263..062808fe53 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -275,16 +275,11 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gUnderWaterProgram);  	mShaderList.push_back(&gDeferredSunProgram);  	mShaderList.push_back(&gDeferredSoftenProgram); -	mShaderList.push_back(&gDeferredMaterialProgram[1]); -	mShaderList.push_back(&gDeferredMaterialProgram[5]); -	mShaderList.push_back(&gDeferredMaterialProgram[9]); -	mShaderList.push_back(&gDeferredMaterialProgram[13]); -	mShaderList.push_back(&gDeferredMaterialProgram[1+LLMaterial::SHADER_COUNT]); -	mShaderList.push_back(&gDeferredMaterialProgram[5+LLMaterial::SHADER_COUNT]); -	mShaderList.push_back(&gDeferredMaterialProgram[9+LLMaterial::SHADER_COUNT]); -	mShaderList.push_back(&gDeferredMaterialProgram[13+LLMaterial::SHADER_COUNT]);	  	mShaderList.push_back(&gDeferredAlphaProgram);  	mShaderList.push_back(&gDeferredSkinnedAlphaProgram); +#if LL_DARWIN +	mShaderList.push_back(&gDeferredSkinnedAlphaProgramMac); +#endif  	mShaderList.push_back(&gDeferredFullbrightProgram);  	mShaderList.push_back(&gDeferredEmissiveProgram);  	mShaderList.push_back(&gDeferredAvatarEyesProgram); @@ -792,9 +787,6 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	// Load basic dependency shaders first  	// All of these have to load for any shaders to function -#if LL_DARWIN // Mac can't currently handle all 8 lights,  -	S32 sum_lights_class = 2; -#else   	S32 sum_lights_class = 3;  	// class one cards will get the lower sum lights @@ -805,14 +797,21 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	{  		sum_lights_class = 2;  	} -#endif  	// If we have sun and moon only checked, then only sum those lights.  	if (gPipeline.getLightingDetail() == 0)  	{  		sum_lights_class = 1;  	} - +	 +#if LL_DARWIN +	// Work around driver crashes on older Macs when using deferred rendering +	// NORSPEC-59 +	// +	if (gGLManager.mIsMobileGF) +		sum_lights_class = 3; +#endif +	  	// Use the feature table to mask out the max light level to use.  Also make sure it's at least 1.  	S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");  	sum_lights_class = llclamp(sum_lights_class, 1, max_light_class); @@ -1087,6 +1086,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSkinnedDiffuseProgram.unload();  		gDeferredSkinnedBumpProgram.unload();  		gDeferredSkinnedAlphaProgram.unload(); +#if LL_DARWIN +		gDeferredSkinnedAlphaProgramMac.unload(); +#endif  		gDeferredBumpProgram.unload();  		gDeferredImpostorProgram.unload();  		gDeferredTerrainProgram.unload(); @@ -1111,7 +1113,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredPostProgram.unload();		  		gDeferredCoFProgram.unload();		  		gDeferredDoFCombineProgram.unload(); -		gDeferredPostGammaCorrectProgram.unload();  		gFXAAProgram.unload();  		gDeferredWaterProgram.unload();  		gDeferredWLSkyProgram.unload(); @@ -1414,10 +1415,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAlphaProgram.mShaderFiles.clear();  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); -		gDeferredAlphaProgram.addPermutation("INDEX_MODE", "1"); -		gDeferredAlphaProgram.addPermutation("HAS_SKIN", "0"); -		gDeferredAlphaProgram.addPermutation("IS_AVATAR_SKIN", "0");  		gDeferredAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; +  		success = gDeferredAlphaProgram.createShader(NULL, NULL);  		// Hack @@ -1590,11 +1589,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.mFeatures.isAlphaLighting = true;  		gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;  		gDeferredAvatarAlphaProgram.mShaderFiles.clear(); -		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER_ARB)); -		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaF.glsl", GL_FRAGMENT_SHADER_ARB)); -		gDeferredAvatarAlphaProgram.addPermutation("INDEX_MODE", "3"); -		gDeferredAvatarAlphaProgram.addPermutation("HAS_SKIN", "0"); -		gDeferredAvatarAlphaProgram.addPermutation("IS_AVATAR_SKIN", "1"); +		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaNoColorV.glsl", GL_VERTEX_SHADER_ARB)); +		gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];  		success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms); @@ -1602,16 +1598,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true;  		gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true;  	} -	 -	if (success) -	{ -		gDeferredPostGammaCorrectProgram.mName = "Deferred Gamma Correction Post Process"; -		gDeferredPostGammaCorrectProgram.mShaderFiles.clear(); -		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]; -		success = gDeferredPostGammaCorrectProgram.createShader(NULL, NULL); -	}  	if (success)  	{ diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f861f49296..f5b8244509 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4336,6 +4336,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  		gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	} +#if LL_DARWIN +    // blatant hack to avoid driver crash on rendering mMeshLODs for eyelashes and baked hair below +    // NORSPEC-59 +    if (gGLManager.mIsMobileGF) +    { +        return num_indices; +    } +#endif +  	if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)  	{  		if (LLPipeline::sImpostorRender) diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ca5adc6180..4071e80ca1 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -908,17 +908,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)  		BOOL ssao = RenderDeferredSSAO;  		//allocate deferred rendering color buffers -		if (!mDeferredScreen.allocate(resX, resY, GL_SRGB8_ALPHA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!mDeferredScreen.allocate(resX, resY, GL_RGBA8, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (!addDeferredAttachments(mDeferredScreen)) return false; -		GLuint screenFormat = GL_RGBA16; -		if (gGLManager.mIsATI) -		{ -			screenFormat = GL_RGBA12; -		} -		 -		if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; +		if (!mScreen.allocate(resX, resY, GL_RGBA12, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  		if (samples > 0)  		{  			if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE, samples)) return false; @@ -1332,6 +1326,8 @@ void LLPipeline::createLUTBuffers()  					// Note: This is the full equation that applies the full normalization curve, not an approximation.  					// This is fine, given we only need to create our LUT once per buffer initialization.  					spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n))); +					 +					spec = powf(spec, 0.6f);  					// Since we use R16F, we no longer have a dynamic range issue we need to work around here.  					// Though some older drivers may not like this, newer drivers shouldn't have this problem. @@ -7107,51 +7103,10 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	gGL.loadIdentity();  	LLGLDisable test(GL_ALPHA_TEST); -	 +  	gGL.setColorMask(true, true);  	glClearColor(0,0,0,0); -	 -	if (sRenderDeferred) -	{ -		mScreen.bindTarget(); -		// Apply gamma correction to the frame here. -		gDeferredPostGammaCorrectProgram.bind(); -		//mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); -		S32 channel = 0; -		channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); -		if (channel > -1) -		{ -			mScreen.bindTexture(0,channel); -			gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); -		} -		 -		gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); -		 -		F32 gamma = 1.0; -		if (!LLViewerCamera::getInstance()->cameraUnderWater()) -		{ -			gamma = 1.0/2.2; -		} -		gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, gamma); -		 -		gGL.begin(LLRender::TRIANGLE_STRIP); -		gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); -		gGL.vertex2f(-1,-1); -		 -		gGL.texCoord2f(tc1.mV[0], tc2.mV[1]); -		gGL.vertex2f(-1,3); -		 -		gGL.texCoord2f(tc2.mV[0], tc1.mV[1]); -		gGL.vertex2f(3,-1); -		 -		gGL.end(); -		 -		gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); -		gDeferredPostGammaCorrectProgram.unbind(); -		mScreen.flush(); -	} -	  	{  		{  			LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); @@ -8312,10 +8267,6 @@ void LLPipeline::renderDeferredLighting()  								continue;  							} -							col.mV[0] = powf(col.mV[0], 2.2f); -							col.mV[1] = powf(col.mV[1], 2.2f); -							col.mV[2] = powf(col.mV[2], 2.2f); -							  							LLFastTimer ftm(FTM_LOCAL_LIGHTS);  							gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);  							gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); @@ -8372,9 +8323,6 @@ void LLPipeline::renderDeferredLighting()  					setupSpotLight(gDeferredSpotLightProgram, drawablep);  					LLColor3 col = volume->getLightColor(); -					col.mV[0] = powf(col.mV[0], 2.2f); -					col.mV[1] = powf(col.mV[1], 2.2f); -					col.mV[2] = powf(col.mV[2], 2.2f);  					gDeferredSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);  					gDeferredSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s); @@ -8423,11 +8371,7 @@ void LLPipeline::renderDeferredLighting()  					fullscreen_lights.pop_front();  					col[count] = light_colors.front();  					light_colors.pop_front(); -					 -					col[count].mV[0] = powf(col[count].mV[0], 2.2f); -					col[count].mV[1] = powf(col[count].mV[1], 2.2f); -					col[count].mV[2] = powf(col[count].mV[2], 2.2f); -					 +  					far_z = llmin(light[count].mV[2]-sqrtf(light[count].mV[3]), far_z);  					//col[count] = pow4fsrgb(col[count], 2.2f);  					count++; @@ -8471,10 +8415,6 @@ void LLPipeline::renderDeferredLighting()  					LLColor3 col = volume->getLightColor(); -					col.mV[0] = powf(col.mV[0], 2.2f); -					col.mV[1] = powf(col.mV[1], 2.2f); -					col.mV[2] = powf(col.mV[2], 2.2f); -					  					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v);  					gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s*s);  					gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV); | 
