diff options
Diffstat (limited to 'indra/newview')
56 files changed, 1003 insertions, 207 deletions
| diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml index 9f4e89691f..ae72dee900 100644 --- a/indra/newview/app_settings/logcontrol.xml +++ b/indra/newview/app_settings/logcontrol.xml @@ -44,7 +44,6 @@  						<array>  							<!-- sample entry for debugging a specific item	-->  <!--						<string>Voice</string>							--> -              <string>Capabilities</string>  						</array>  				</map>  			</array> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index cb83740098..7330c76b01 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3848,7 +3848,7 @@        <key>Type</key>        <string>String</string>        <key>Value</key> -      <string>https://www.xstreetsl.com/modules.php?name=Marketplace&CategoryID=233</string> +      <string>https://marketplace.secondlife.com/products/search?search[category_id]=200&search[maturity][]=General&search[page]=1&search[per_page]=12</string>      </map>      <key>GridCrossSections</key>      <map> diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl new file mode 100644 index 0000000000..3827c72f4c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/customalphaF.glsl @@ -0,0 +1,17 @@ +/**  + * @file customalphaF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +uniform sampler2D diffuseMap; + +uniform float custom_alpha; + +void main()  +{ +	vec4 color = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy); +	color.a *= custom_alpha; +	gl_FragColor = color; +} diff --git a/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl new file mode 100644 index 0000000000..04bfff22c1 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/customalphaV.glsl @@ -0,0 +1,16 @@ +/**  + * @file customalphaV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_FrontColor = gl_Color; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl new file mode 100644 index 0000000000..a60fb1eaa7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineF.glsl @@ -0,0 +1,17 @@ +/**  + * @file glowcombineF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +uniform sampler2D glowMap; +uniform sampler2DRect screenMap; + +void main()  +{ +	gl_FragColor = texture2D(glowMap, gl_TexCoord[0].xy) + +					texture2DRect(screenMap, gl_TexCoord[1].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl new file mode 100644 index 0000000000..ce183ec154 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/glowcombineV.glsl @@ -0,0 +1,15 @@ +/**  + * @file glowcombineV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_MultiTexCoord1; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl new file mode 100644 index 0000000000..b140712f18 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/occlusionF.glsl @@ -0,0 +1,11 @@ +/**  + * @file occlusionF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +void main()  +{ +	gl_FragColor = vec4(1,1,1,1); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl new file mode 100644 index 0000000000..5a5d0ec506 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/occlusionV.glsl @@ -0,0 +1,12 @@ +/**  + * @file uiV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl new file mode 100644 index 0000000000..ae943cc438 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl @@ -0,0 +1,15 @@ +/**  + * @file twotextureaddF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +uniform sampler2D tex0; + +void main()  +{ +	float alpha = texture2D(tex0, gl_TexCoord[0].xy).a; + +	gl_FragColor = vec4(gl_Color.rgb, alpha); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl new file mode 100644 index 0000000000..8401208e28 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl @@ -0,0 +1,16 @@ +/**  + * @file solidcolorV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_FrontColor = gl_Color; +	gl_TexCoord[0] = gl_MultiTexCoord0; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl new file mode 100644 index 0000000000..d81b56fdb9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddF.glsl @@ -0,0 +1,14 @@ +/**  + * @file twotextureaddF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +uniform sampler2D tex0; +uniform sampler2D tex1; + +void main()  +{ +	gl_FragColor = texture2D(tex0, gl_TexCoord[0].xy)+texture2D(tex1, gl_TexCoord[1].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl new file mode 100644 index 0000000000..f685b112b4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/twotextureaddV.glsl @@ -0,0 +1,16 @@ +/**  + * @file twotextureaddV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_MultiTexCoord1; +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/uiF.glsl b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl new file mode 100644 index 0000000000..9dec7a56ba --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/uiF.glsl @@ -0,0 +1,13 @@ +/**  + * @file uiF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +uniform sampler2D diffuseMap; + +void main()  +{ +	gl_FragColor = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/uiV.glsl b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl new file mode 100644 index 0000000000..9ca6cae5c5 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/uiV.glsl @@ -0,0 +1,16 @@ +/**  + * @file uiV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + + +void main() +{ +	gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +	gl_TexCoord[0] = gl_MultiTexCoord0; +	gl_FrontColor = gl_Color; +} + diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl new file mode 100644 index 0000000000..587ab93a80 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/bumpF.glsl @@ -0,0 +1,17 @@ +/**  + * @file bumpF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  +uniform sampler2D texture0; +uniform sampler2D texture1; + +void main()  +{ +	float tex0 = texture2D(texture0, gl_TexCoord[0].xy).a; +	float tex1 = texture2D(texture1, gl_TexCoord[1].xy).a; + +	gl_FragColor = vec4(tex0+(1.0-tex1)-0.5); +} diff --git a/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl new file mode 100644 index 0000000000..056d1a9582 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/objects/bumpV.glsl @@ -0,0 +1,16 @@ +/**  + * @file bumpV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * $/LicenseInfo$ + */ +  + +void main() +{ +	//transform vertex +	gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; +	gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; +	gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1; +	gl_FrontColor = gl_Color; +} diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 22c79a4cbd..1f9dc6e4e5 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,6 +1,6 @@ -version 30 +version 32 -// NOTE: This is mostly identical to featuretable_mac.txt with a few differences +// NOTE: This is mostly identical to featuretable_mac.txt with a few differences   // Should be combined into one table  // @@ -244,10 +244,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1  // diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 649f5ebd18..6e962f3c56 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 25 +version 27  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -242,10 +242,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index ee08e78af5..fa67ee547c 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 26 +version 29  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -47,8 +47,8 @@ RenderTerrainLODFactor			1	2.0  RenderTransparentWater			1	1  RenderTreeLODFactor				1	1.0  RenderUseImpostors				1	1 -RenderVBOEnable					1	1 -RenderVBOMappingDisable		1	1 +RenderVBOEnable					1	0 +RenderVBOMappingDisable		1	0  RenderVolumeLODFactor			1	2.0  UseStartScreen				1	1  UseOcclusion					1	1 @@ -63,7 +63,7 @@ RenderDeferred				1	1  RenderDeferredSSAO			1	1  RenderShadowDetail			1	2  WatchdogDisabled				1	1 -RenderUseStreamVBO			1	1 +RenderUseStreamVBO			1	0  RenderFSAASamples			1	16  // @@ -244,13 +244,6 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range -// -list NoMapBufferRange -RenderVBOMappingDisable		1	0 - - -//  // "Default" setups for safe, low, medium, high  //  list safe diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index ba74f9a6c2..a0245f5369 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -1,4 +1,4 @@ -version 30 +version 31  // NOTE: This is mostly identical to featuretable_mac.txt with a few differences  // Should be combined into one table @@ -244,10 +244,10 @@ RenderDeferredSSAO			0	0  RenderShadowDetail			0	0  // -// No GL_ARB_map_buffer_range +// GL_ARB_map_buffer_range exists  // -list NoMapBufferRange -RenderVBOMappingDisable		1	0 +list MapBufferRange +RenderVBOMappingDisable		1	1  // diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 862fc49c0e..b65933f8a1 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4003,6 +4003,8 @@ public:  static LLFastTimer::DeclareTimer FTM_AUDIO_UPDATE("Update Audio");  static LLFastTimer::DeclareTimer FTM_CLEANUP("Cleanup"); +static LLFastTimer::DeclareTimer FTM_CLEANUP_DRAWABLES("Drawables"); +static LLFastTimer::DeclareTimer FTM_CLEANUP_OBJECTS("Objects");  static LLFastTimer::DeclareTimer FTM_IDLE_CB("Idle Callbacks");  static LLFastTimer::DeclareTimer FTM_LOD_UPDATE("Update LOD");  static LLFastTimer::DeclareTimer FTM_OBJECTLIST_UPDATE("Update Objectlist"); @@ -4279,8 +4281,14 @@ void LLAppViewer::idle()  	{  		LLFastTimer t(FTM_CLEANUP); -		gObjectList.cleanDeadObjects(); -		LLDrawable::cleanupDeadDrawables(); +		{ +			LLFastTimer t(FTM_CLEANUP_OBJECTS); +			gObjectList.cleanDeadObjects(); +		} +		{ +			LLFastTimer t(FTM_CLEANUP_DRAWABLES); +			LLDrawable::cleanupDeadDrawables(); +		}  	}  	// diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index 18ae6107e7..c7fc45f61e 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -27,10 +27,16 @@  #include "lldateutil.h" +#include <boost/date_time/gregorian/gregorian.hpp> +#include <boost/date_time/posix_time/ptime.hpp> +  // Linden libraries  #include "lltrans.h"  #include "llui.h" +using namespace boost::gregorian; +using namespace boost::posix_time; +  static S32 DAYS_PER_MONTH_NOLEAP[] =  	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };  static S32 DAYS_PER_MONTH_LEAP[] = @@ -186,3 +192,24 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string)  //{  //	return ageFromDateISO(date_string, LLDate::now());  //} + +S32 LLDateUtil::secondsSinceEpochFromString(const std::string& format, const std::string& str) +{ +	date_input_facet *facet = new date_input_facet(format); + +	std::stringstream ss; +	ss << str; +	ss.imbue(std::locale(ss.getloc(), facet)); + +	date d; +	ss >> d; + +	ptime time_t_date(d); +	ptime time_t_epoch(date(1970,1,1)); + +	// We assume that the date defined by str is in UTC, so the difference +	// is calculated with no time zone corrections. +	time_duration diff = time_t_date - time_t_epoch; + +	return diff.total_seconds(); +} diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index 2843a357c9..f027d360f7 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -69,6 +69,20 @@ namespace LLDateUtil  	//std::string ageFromDateISO(const std::string& date_string);  	//std::string ageFromDate(S32 born_year, S32 born_month, S32 born_day, const LLDate& now); + +	/** +	 * Convert a string of a specified date format into seconds since the Epoch. +	 * +	 * Many of the format flags are those used by strftime(...), but not all. +	 * For the full list of supported time format specifiers +	 * see http://www.boost.org/doc/libs/1_47_0/doc/html/date_time/date_time_io.html#date_time.format_flags +	 * +	 * @param format Format characters string. Example: "%A %b %d, %Y" +	 * @param str    Date string containing the time in specified format. +	 * +	 * @return Number of seconds since 01/01/1970 UTC. +	 */ +	S32 secondsSinceEpochFromString(const std::string& format, const std::string& str);  }  #endif diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index fa7d6e2a40..286284f828 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -190,15 +190,16 @@ void LLDrawPool::renderPostDeferred(S32 pass)  //virtual  void LLDrawPool::endRenderPass( S32 pass )  { -	for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) +	/*for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)  	{ //dummy cleanup of any currently bound textures  		if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE)  		{  			gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType());  			gGL.getTexUnit(i)->disable();  		} -	} +	}*/ +	//make sure channel 0 is active channel  	gGL.getTexUnit(0)->activate();  } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index ad7e3ad593..ddcf42e523 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -138,6 +138,7 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass)  		gPipeline.mDeferredDepth.bindTarget();  		simple_shader = NULL;  		fullbright_shader = NULL; +		gObjectFullbrightProgram.bind();  	}  	deferred_render = TRUE; @@ -156,6 +157,7 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass)  	{  		gPipeline.mDeferredDepth.flush();  		gPipeline.mScreen.bindTarget(); +		gObjectFullbrightProgram.unbind();  	}  	deferred_render = FALSE; @@ -238,7 +240,7 @@ void LLDrawPoolAlpha::render(S32 pass)  				fullbright_shader->bind();  			}  			pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); -			LLGLSLShader::bindNoShader(); +			//LLGLSLShader::bindNoShader();  		}  		else  		{ diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 813b3820ee..d801f6df18 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -464,11 +464,15 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32&  			}  		}  	} -	gGL.getTexUnit(diffuse_channel)->disable(); -	gGL.getTexUnit(cube_channel)->disable(); -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	if (!LLGLSLShader::sNoFixedFunction) +	{ +		gGL.getTexUnit(diffuse_channel)->disable(); +		gGL.getTexUnit(cube_channel)->disable(); + +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  }  void LLDrawPoolBump::endShiny(bool invisible) @@ -583,19 +587,19 @@ void LLDrawPoolBump::endFullbrightShiny()  		cube_map->disable();  		cube_map->restoreMatrix(); -		if (diffuse_channel != 0) +		/*if (diffuse_channel != 0)  		{  			shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);  		}  		gGL.getTexUnit(0)->activate(); -		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);*/  		shader->unbind(); -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	} -	gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	//gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +	//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	diffuse_channel = -1;  	cube_channel = 0; @@ -706,36 +710,44 @@ void LLDrawPoolBump::beginBump(U32 pass)  	// Optional second pass: emboss bump map  	stop_glerror(); -	// TEXTURE UNIT 0 -	// Output.rgb = texture at texture coord 0 -	gGL.getTexUnit(0)->activate(); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gObjectBumpProgram.bind(); +	} +	else +	{ +		// TEXTURE UNIT 0 +		// Output.rgb = texture at texture coord 0 +		gGL.getTexUnit(0)->activate(); -	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	// TEXTURE UNIT 1 -	gGL.getTexUnit(1)->activate(); +		// TEXTURE UNIT 1 +		gGL.getTexUnit(1)->activate(); -	gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); +		gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE); + +		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); +		gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); -	gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD_SIGNED, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_ONE_MINUS_TEX_ALPHA); -	gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA); +		// src	= tex0 + (1 - tex1) - 0.5 +		//		= (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5 +		//		= (1 + bump0 - bump1) / 2 -	// src	= tex0 + (1 - tex1) - 0.5 -	//		= (bump0/2 + 0.5) + (1 - (bump1/2 + 0.5)) - 0.5 -	//		= (1 + bump0 - bump1) / 2 +		// Blend: src * dst + dst * src +		//		= 2 * src * dst +		//		= 2 * ((1 + bump0 - bump1) / 2) * dst   [0 - 2 * dst] +		//		= (1 + bump0 - bump1) * dst.rgb +		//		= dst.rgb + dst.rgb * (bump0 - bump1) + +		gGL.getTexUnit(0)->activate(); +		gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE); +	} -	// Blend: src * dst + dst * src -	//		= 2 * src * dst -	//		= 2 * ((1 + bump0 - bump1) / 2) * dst   [0 - 2 * dst] -	//		= (1 + bump0 - bump1) * dst.rgb -	//		= dst.rgb + dst.rgb * (bump0 - bump1)  	gGL.setSceneBlendType(LLRender::BT_MULT_X2); -	gGL.getTexUnit(0)->activate();  	stop_glerror(); - -	gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);  }  //static @@ -765,14 +777,21 @@ void LLDrawPoolBump::endBump(U32 pass)  		return;  	} -	// Disable texture unit 1 -	gGL.getTexUnit(1)->activate(); -	gGL.getTexUnit(1)->disable(); -	gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gObjectBumpProgram.unbind(); +	} +	else +	{ +		// Disable texture blending on unit 1 +		gGL.getTexUnit(1)->activate(); +		//gGL.getTexUnit(1)->disable(); +		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); -	// Disable texture unit 0 -	gGL.getTexUnit(0)->activate(); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		// Disable texture blending on unit 0 +		gGL.getTexUnit(0)->activate(); +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  	gGL.setSceneBlendType(LLRender::BT_ALPHA);  } @@ -1407,6 +1426,11 @@ void LLDrawPoolInvisible::render(S32 pass)  { //render invisiprims  	LLFastTimer t(FTM_RENDER_INVISIBLE); +	if (gPipeline.canUseVertexShaders()) +	{ +		gOcclusionProgram.bind(); +	} +  	U32 invisi_mask = LLVertexBuffer::MAP_VERTEX;  	glStencilMask(0);  	gGL.setColorMask(false, false); @@ -1414,6 +1438,11 @@ void LLDrawPoolInvisible::render(S32 pass)  	gGL.setColorMask(true, false);  	glStencilMask(0xFFFFFFFF); +	if (gPipeline.canUseVertexShaders()) +	{ +		gOcclusionProgram.unbind(); +	} +  	if (gPipeline.hasRenderBatches(LLRenderPass::PASS_INVISI_SHINY))  	{  		beginShiny(true); diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 5dbb27cabb..224f149c6b 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -49,6 +49,8 @@ void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)  	gDeferredFullbrightProgram.bind();  } +static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push"); +  void LLDrawPoolGlow::renderPostDeferred(S32 pass)  {  	LLFastTimer t(FTM_RENDER_GLOW); @@ -62,7 +64,11 @@ void LLDrawPoolGlow::renderPostDeferred(S32 pass)  	LLGLDepthTest depth(GL_TRUE, GL_FALSE);  	gGL.setColorMask(false, true); -	pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); + +	{ +		LLFastTimer t(FTM_RENDER_GLOW_PUSH); +		pushBatches(LLRenderPass::PASS_GLOW, getVertexDataMask() | LLVertexBuffer::MAP_TEXTURE_INDEX, TRUE, TRUE); +	}  	gGL.setColorMask(true, false);  	gGL.setSceneBlendType(LLRender::BT_ALPHA);	 @@ -374,10 +380,14 @@ void LLDrawPoolFullbright::endRenderPass(S32 pass)  	LLFastTimer t(FTM_RENDER_FULLBRIGHT);  	LLRenderPass::endRenderPass(pass); +	stop_glerror(); +  	if (mVertexShaderLevel > 0)  	{  		fullbright_shader->unbind();  	} + +	stop_glerror();  }  void LLDrawPoolFullbright::render(S32 pass) @@ -385,6 +395,8 @@ void LLDrawPoolFullbright::render(S32 pass)  	LLFastTimer t(FTM_RENDER_FULLBRIGHT);  	gGL.setSceneBlendType(LLRender::BT_ALPHA); +	stop_glerror(); +  	if (mVertexShaderLevel > 0)  	{  		fullbright_shader->bind(); @@ -398,6 +410,8 @@ void LLDrawPoolFullbright::render(S32 pass)  		U32 fullbright_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR;  		renderTexture(LLRenderPass::PASS_FULLBRIGHT, fullbright_mask);  	} + +	stop_glerror();  }  S32 LLDrawPoolFullbright::getNumPasses() diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index 030d6e1110..efffb2df9e 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -82,6 +82,10 @@ void LLDrawPoolSky::render(S32 pass)  		mShader = &gObjectFullbrightWaterProgram;  		mShader->bind();  	} +	else if (LLGLSLShader::sNoFixedFunction) +	{ //just use the UI shader (generic single texture no lighting) +		gUIProgram.bind(); +	}  	else  	{  		// don't use shaders! @@ -139,6 +143,7 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side)  	if (LLSkyTex::doInterpolate())  	{ +		  		LLGLEnable blend(GL_BLEND);  		mSkyTex[side].bindTexture(FALSE);  		glColor4f(1, 1, 1, LLSkyTex::getInterpVal()); // lighting is disabled diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 81c796b146..429e06b227 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -73,7 +73,7 @@ void LLDrawPoolTree::beginRenderPass(S32 pass)  		shader = &gObjectSimpleNonIndexedProgram;  	} -	if (gPipeline.canUseWindLightShadersOnObjects()) +	if (gPipeline.canUseVertexShaders())  	{  		shader->bind();  	} diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index bf79c2100c..f9fd501072 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -189,16 +189,31 @@ void LLDrawPoolWLSky::renderStars(void) const  	glRotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);  	// gl_FragColor.rgb = gl_Color.rgb;  	// gl_FragColor.a = gl_Color.a * star_alpha.a; -	gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); -	gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA); -	glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gCustomAlphaProgram.bind(); +		gCustomAlphaProgram.uniform1f("custom_alpha", star_alpha.mV[3]); +	} +	else +	{ +		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR); +		gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT_X2, LLTexUnit::TBS_CONST_ALPHA, LLTexUnit::TBS_TEX_ALPHA); +		glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, star_alpha.mV); +	}  	gSky.mVOWLSkyp->drawStars();  	gGL.popMatrix(); -	 -	// and disable the combiner states -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); + +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gCustomAlphaProgram.unbind(); +	} +	else +	{ +		// and disable the combiner states +		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	}  }  void LLDrawPoolWLSky::renderSkyClouds(F32 camHeightLocal) const @@ -242,6 +257,10 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()  	if (gSky.mVOSkyp->getMoon().getDraw() && face->getGeomCount())  	{ +		if (gPipeline.canUseVertexShaders()) +		{ +			gUIProgram.bind(); +		}  		// *NOTE: even though we already bound this texture above for the  		// stars register combiners, we bind again here for defensive reasons,  		// since LLImageGL::bind detects that it's a noop, and optimizes it out. @@ -257,6 +276,11 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()  		LLFacePool::LLOverrideFaceColor color_override(this, color);  		face->renderIndexed(); + +		if (gPipeline.canUseVertexShaders()) +		{ +			gUIProgram.unbind(); +		}  	}  } diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index b6566fcbd0..432e61f6d8 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1051,6 +1051,13 @@ bool LLFace::canRenderAsMask()  static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index");  BOOL LLFace::getGeometryVolume(const LLVolume& volume,  							   const S32 &f, @@ -1064,6 +1071,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	S32 num_vertices = (S32)vf.mNumVertices;  	S32 num_indices = (S32) vf.mNumIndices; +	bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange; +  	if (mVertexBuffer.notNull())  	{  		if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices()) @@ -1182,7 +1191,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	// INDICES  	if (full_rebuild)  	{ -		mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true); +		LLFastTimer t(FTM_FACE_GEOM_INDEX); +		mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range);  		__m128i* dst = (__m128i*) indicesp.get();  		__m128i* src = (__m128i*) vf.mIndices; @@ -1201,7 +1211,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			indicesp[i] = vf.mIndices[i]+index_offset;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	LLMatrix4a mat_normal; @@ -1215,6 +1228,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  	if (rebuild_tcoord)  	{ +		LLFastTimer t(FTM_FACE_GEOM_TEXTURE);  		bool do_xform;  		if (tep) @@ -1422,11 +1436,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				}  			} -			mVertexBuffer->setBuffer(0); +			if (map_range) +			{ +				mVertexBuffer->setBuffer(0); +			}  		}  		else  		{ //either bump mapped or in atlas, just do the whole expensive loop -			mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true); +			mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range);  			std::vector<LLVector2> bump_tc; @@ -1566,12 +1583,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  				}  			} -			mVertexBuffer->setBuffer(0); - +			if (map_range) +			{ +				mVertexBuffer->setBuffer(0); +			}  			if (do_bump)  			{ -				mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true); +				mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range);  				for (S32 i = 0; i < num_vertices; i++)  				{ @@ -1601,14 +1620,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  					*tex_coords2++ = tc;  				} -				mVertexBuffer->setBuffer(0); +				if (map_range) +				{ +					mVertexBuffer->setBuffer(0); +				}  			}  		}  	}  	if (rebuild_pos)  	{ -		mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_POSITION); +		llassert(num_vertices > 0); +		 +		mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range);  		vertices = (LLVector4a*) vert.get();  		LLMatrix4a mat_vert; @@ -1636,13 +1661,25 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			index_dst += 4;  		}  		while (index_dst < index_end); - -		mVertexBuffer->setBuffer(0); +		 +		S32 aligned_pad_vertices = mGeomCount - num_vertices; +		LLVector4a* last_vec = end - 1; +		while (aligned_pad_vertices > 0) +		{ +			--aligned_pad_vertices; +			*dst++ = *last_vec; +		} +		 +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_normal)  	{ -		mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_NORMAL); +		mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range);  		normals = (LLVector4a*) norm.get();  		for (S32 i = 0; i < num_vertices; i++) @@ -1653,12 +1690,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			normals[i] = normal;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_binormal)  	{ -		mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_BINORMAL); +		mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);  		binormals = (LLVector4a*) binorm.get();  		for (S32 i = 0; i < num_vertices; i++) @@ -1669,20 +1710,28 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			binormals[i] = binormal;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_weights && vf.mWeights)  	{ -		mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_WEIGHTS); +		mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range);  		weights = (LLVector4a*) wght.get();  		LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_color)  	{ -		mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true); +		LLFastTimer t(FTM_FACE_GEOM_COLOR); +		mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range);  		LLVector4a src; @@ -1703,7 +1752,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			dst[i] = src;  		} -		mVertexBuffer->setBuffer(0); +		if (map_range) +		{ +			mVertexBuffer->setBuffer(0); +		}  	}  	if (rebuild_tcoord) diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 83844048d1..0ea0e41dfa 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -769,6 +769,10 @@ void LLFeatureManager::applyBaseMasks()  	{  		maskFeatures("TexUnit8orLess");  	} +	if (gGLManager.mHasMapBufferRange) +	{ +		maskFeatures("MapBufferRange"); +	}  	// now mask by gpu string  	// Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index eb3c7ee469..d5f0648f3b 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -70,7 +70,7 @@  #include "llappviewer.h"  #include "llmapimagetype.h"  #include "llweb.h" -#include "llslider.h" +#include "llsliderctrl.h"  #include "message.h"  #include "llwindow.h"			// copyTextToClipboard()  #include <algorithm> @@ -1029,7 +1029,7 @@ void LLFloaterWorldMap::adjustZoomSliderBounds()  	F32 min_power = log(pixels_per_region/256.f)/log(2.f); -	getChild<LLSlider>("zoom slider")->setMinValue(min_power); +	getChild<LLSliderCtrl>("zoom slider")->setMinValue(min_power);  } diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 82e1f2dfb5..482294c8a6 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -477,7 +477,7 @@ void LLHUDNameTag::renderText(BOOL for_select)  	// Render label  	{ -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  		for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin();  			segment_iter != mLabelSegments.end(); ++segment_iter ) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 75d4c4e80d..9f093b8a34 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2514,6 +2514,11 @@ void LLFolderBridge::folderOptionsMenu()  		}  	} +	if (!isItemRemovable()) +	{ +		disabled_items.push_back(std::string("Delete")); +	} +  #ifndef LL_RELEASE_FOR_DOWNLOAD  	if (LLFolderType::lookupIsProtectedType(type))  	{ diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 8d8d9bc1c4..eddd6e554d 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -35,6 +35,7 @@  #include "llqueryflags.h"  #include "llagent.h" +#include "lldateutil.h"  #include "lliconctrl.h"  #include "llfloaterreg.h"  #include "lllineeditor.h" @@ -1056,6 +1057,14 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  	msg->getS32Fast(_PREHASH_MoneyData, _PREHASH_CurrentInterval, current_interval );  	msg->getStringFast(_PREHASH_MoneyData, _PREHASH_StartDate, start_date); +	std::string time_str = LLTrans::getString("GroupMoneyDate"); +	LLSD substitution; + +	// We don't do time zone corrections of the calculated number of seconds +	// because we don't have a full time stamp, only a date. +	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date); +	LLStringUtil::format (time_str, substitution); +  	if ( interval_days != mImplementationp->mIntervalLength ||   		 current_interval != mImplementationp->mCurrentInterval )  	{ @@ -1064,7 +1073,7 @@ void LLGroupMoneyDetailsTabEventHandler::processReply(LLMessageSystem* msg,  		return;  	} -	std::string text = start_date; +	std::string text = time_str;  	text.append("\n\n");  	S32 total_amount = 0; @@ -1203,7 +1212,15 @@ void LLGroupMoneySalesTabEventHandler::processReply(LLMessageSystem* msg,  	// Start with the date.  	if (text == mImplementationp->mLoadingText)  	{ -		text = start_date + "\n\n"; +		std::string time_str = LLTrans::getString("GroupMoneyDate"); +		LLSD substitution; + +		// We don't do time zone corrections of the calculated number of seconds +		// because we don't have a full time stamp, only a date. +		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%A %b %d, %Y", start_date); +		LLStringUtil::format (time_str, substitution); + +		text = time_str + "\n\n";  	}  	S32 transactions = msg->getNumberOfBlocksFast(_PREHASH_HistoryData); @@ -1408,12 +1425,26 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,  	}  	text.append(LLTrans::getString("SummaryForTheWeek")); -	text.append(start_date); + +	std::string date_format_str = LLTrans::getString("GroupPlanningDate"); +	std::string time_str = date_format_str; +	LLSD substitution; +	// We don't do time zone corrections of the calculated number of seconds +	// because we don't have a full time stamp, only a date. +	substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", start_date); +	LLStringUtil::format (time_str, substitution); + +	text.append(time_str);  	if (current_interval == 0)  	{  		text.append(LLTrans::getString("NextStipendDay")); -		text.append(next_stipend_date); + +		time_str = date_format_str; +		substitution["datetime"] = LLDateUtil::secondsSinceEpochFromString("%m/%d/%Y", next_stipend_date); +		LLStringUtil::format (time_str, substitution); + +		text.append(time_str);  		text.append("\n\n");  		text.append(llformat("%-24sL$%6d\n", LLTrans::getString("GroupMoneyBalance").c_str(), balance ));  		text.append(1, '\n'); diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index f99afa923b..e23b431457 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -47,6 +47,7 @@  #include "llvoavatar.h"  #include "llvolumemgr.h"  #include "lltextureatlas.h" +#include "llglslshader.h"  static LLFastTimer::DeclareTimer FTM_FRUSTUM_CULL("Frustum Culling");  static LLFastTimer::DeclareTimer FTM_CULL_REBOUND("Cull Rebound"); @@ -3176,6 +3177,8 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  				glColor4fv(line_color.mV);  				LLVertexBuffer::unbind(); +				llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0); +  				glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);  				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); @@ -3257,7 +3260,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  		if (phys_volume->mHullPoints && phys_volume->mHullIndices)  		{  			glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -			 +			llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0);  			LLVertexBuffer::unbind();  			glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);  			glColor4fv(line_color.mV); diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index bd41aa64f0..e8abee2fb7 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -45,6 +45,7 @@  #include "llagentwearables.h"  #include "llwearable.h"  #include "llviewercontrol.h" +#include "llviewershadermgr.h"  #include "llviewervisualparam.h"  //#include "../tools/imdebug/imdebug.h" @@ -294,11 +295,17 @@ BOOL LLTexLayerSetBuffer::render()  	BOOL success = TRUE; +	//hack to use fixed function when updating tex layer sets +	bool no_ff = LLGLSLShader::sNoFixedFunction; +	LLGLSLShader::sNoFixedFunction = false; +	  	// Composite the color data  	LLGLSUIDefault gls_ui;  	success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );  	gGL.flush(); +	LLGLSLShader::sNoFixedFunction = no_ff; +	  	if(upload_now)  	{  		if (!success) diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 911fc8e1ed..39053fe9e4 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -616,6 +616,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")   				&& gSavedSettings.getBOOL("UseOcclusion")   				&& gGLManager.mHasOcclusionQuery) ? 2 : 0; +		LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();  		/*if (LLPipeline::sUseOcclusion && LLPipeline::sRenderDeferred)  		{ //force occlusion on for all render types if doing deferred render (tighter shadow frustum) @@ -709,6 +710,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		//if (!for_snapshot)  		{  			LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION); @@ -717,6 +721,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			gPipeline.generateHighlight(*LLViewerCamera::getInstance());  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		//////////////////////////////////////  		//  		// Update images, using the image stats generated during object update/culling @@ -743,6 +750,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			LLImageGL::deleteDeadTextures();  			stop_glerror();  		} + +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		///////////////////////////////////  		//  		// StateSort @@ -770,6 +781,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			}  		} +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		LLPipeline::sUseOcclusion = occlusion;  		{ @@ -828,6 +842,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;  		LLPipeline::refreshRenderDeferred(); +		LLGLState::checkStates(); +		LLGLState::checkClientArrays(); +  		stop_glerror();  		if (to_texture) @@ -878,6 +895,14 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  			stop_glerror();  		} +		for (U32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) +		{ //dummy cleanup of any currently bound textures +			if (gGL.getTexUnit(i)->getCurrType() != LLTexUnit::TT_NONE) +			{ +				gGL.getTexUnit(i)->unbind(gGL.getTexUnit(i)->getCurrType()); +				gGL.getTexUnit(i)->disable(); +			} +		}  		LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");		  		if (to_texture) @@ -1339,7 +1364,7 @@ void render_ui_2d()  	}  	stop_glerror(); -	gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +	//gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);  	// render outline for HUD  	if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f38dd12f68..f6499e12de 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -44,6 +44,7 @@  #include "llbottomtray.h"  #include "llcompilequeue.h"  #include "llconsole.h" +#include "lldaycyclemanager.h"  #include "lldebugview.h"  #include "llenvmanager.h"  #include "llfilepicker.h" @@ -101,6 +102,7 @@  #include "llworldmap.h"  #include "pipeline.h"  #include "llviewerjoystick.h" +#include "llwaterparammanager.h"  #include "llwlanimator.h"  #include "llwlparammanager.h"  #include "llfloatercamera.h" @@ -7670,6 +7672,40 @@ class LLWorldEnvPreset : public view_listener_t  	}  }; +class LLWorldEnableEnvPreset : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string item = userdata.asString(); + +		if (item == "delete_water") +		{ +			LLWaterParamManager::preset_name_list_t user_waters; +			LLWaterParamManager::instance().getUserPresetNames(user_waters); +			return !user_waters.empty(); +		} +		else if (item == "delete_sky") +		{ +			LLWLParamManager::preset_name_list_t user_skies; +			LLWLParamManager::instance().getUserPresetNames(user_skies); +			return !user_skies.empty(); +		} +		else if (item == "delete_day_cycle") +		{ +			LLDayCycleManager::preset_name_list_t user_days; +			LLDayCycleManager::instance().getUserPresetNames(user_days); +			return !user_days.empty(); +		} +		else +		{ +			llwarns << "Unknown item" << llendl; +		} + +		return false; +	} +}; + +  /// Post-Process callbacks  class LLWorldPostProcess : public view_listener_t  { @@ -7909,6 +7945,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");  	view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset"); +	view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");  	view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");  	view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls"); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 9d38954d8b..db5684665b 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1343,18 +1343,29 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  	S32 num_removed = 0;  	LLViewerObject *objectp; -	for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ) +	 +	vobj_list_t::reverse_iterator target = mObjects.rbegin(); + +	vobj_list_t::iterator iter = mObjects.begin(); +	for ( ; iter != mObjects.end(); )  	{ -		// Scan for all of the dead objects and remove any "global" references to them. +		// Scan for all of the dead objects and put them all on the end of the list with no ref count ops  		objectp = *iter; +		if (objectp == NULL) +		{ //we caught up to the dead tail +			break; +		} +  		if (objectp->isDead())  		{ -			iter = mObjects.erase(iter); +			LLPointer<LLViewerObject>::swap(*iter, *target); +			*target = NULL; +			++target;  			num_removed++; -			if (num_removed == mNumDeadObjects) +			if (num_removed == mNumDeadObjects || iter->isNull())  			{ -				// We've cleaned up all of the dead objects. +				// We've cleaned up all of the dead objects or caught up to the dead tail  				break;  			}  		} @@ -1364,6 +1375,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  		}  	} +	llassert(num_removed == mNumDeadObjects); + +	//erase as a block +	mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end()); +  	// We've cleaned the global object list, now let's do some paranoia testing on objects  	// before blowing away the dead list.  	mDeadObjects.clear(); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e473901609..62d83b516f 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -61,6 +61,12 @@ BOOL				LLViewerShaderMgr::sInitialized = FALSE;  LLVector4			gShinyOrigin; +//utility shaders +LLGLSLShader	gOcclusionProgram; +LLGLSLShader	gCustomAlphaProgram; +LLGLSLShader	gGlowCombineProgram; +LLGLSLShader	gTwoTextureAddProgram; +  //object shaders  LLGLSLShader		gObjectSimpleProgram;  LLGLSLShader		gObjectSimpleWaterProgram; @@ -70,6 +76,7 @@ LLGLSLShader		gObjectFullbrightShinyProgram;  LLGLSLShader		gObjectFullbrightShinyWaterProgram;  LLGLSLShader		gObjectShinyProgram;  LLGLSLShader		gObjectShinyWaterProgram; +LLGLSLShader		gObjectBumpProgram;  LLGLSLShader		gObjectSimpleNonIndexedProgram;  LLGLSLShader		gObjectSimpleNonIndexedWaterProgram; @@ -166,14 +173,24 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gWLCloudProgram);  	mShaderList.push_back(&gAvatarProgram);  	mShaderList.push_back(&gObjectShinyProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedProgram);  	mShaderList.push_back(&gWaterProgram);  	mShaderList.push_back(&gAvatarEyeballProgram);   	mShaderList.push_back(&gObjectSimpleProgram); +	mShaderList.push_back(&gObjectBumpProgram); +	mShaderList.push_back(&gUIProgram); +	mShaderList.push_back(&gCustomAlphaProgram); +	mShaderList.push_back(&gGlowCombineProgram); +	mShaderList.push_back(&gTwoTextureAddProgram); +	mShaderList.push_back(&gSolidColorProgram); +	mShaderList.push_back(&gOcclusionProgram);  	mShaderList.push_back(&gObjectFullbrightProgram);  	mShaderList.push_back(&gObjectFullbrightShinyProgram);  	mShaderList.push_back(&gObjectFullbrightShinyWaterProgram);  	mShaderList.push_back(&gObjectSimpleNonIndexedProgram); +	mShaderList.push_back(&gObjectSimpleNonIndexedWaterProgram);  	mShaderList.push_back(&gObjectFullbrightNonIndexedProgram); +	mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);  	mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);  	mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);  	mShaderList.push_back(&gSkinnedObjectSimpleProgram); @@ -190,6 +207,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gObjectFullbrightWaterProgram);  	mShaderList.push_back(&gAvatarWaterProgram);  	mShaderList.push_back(&gObjectShinyWaterProgram); +	mShaderList.push_back(&gObjectShinyNonIndexedWaterProgram);  	mShaderList.push_back(&gUnderWaterProgram);  	mShaderList.push_back(&gDeferredSunProgram);  	mShaderList.push_back(&gDeferredBlurLightProgram); @@ -410,9 +428,13 @@ void LLViewerShaderMgr::setShaders()  	}  	mMaxAvatarShaderLevel = 0; +	LLGLSLShader::sNoFixedFunction = false;  	if (LLFeatureManager::getInstance()->isFeatureAvailable("VertexShaderEnable")   		&& gSavedSettings.getBOOL("VertexShaderEnable"))  	{ +		//using shaders, disable fixed function +		LLGLSLShader::sNoFixedFunction = true; +  		S32 light_class = 2;  		S32 env_class = 2;  		S32 obj_class = 2; @@ -554,6 +576,7 @@ void LLViewerShaderMgr::setShaders()  		}  		else  		{ +			LLGLSLShader::sNoFixedFunction = false;  			gPipeline.mVertexShadersEnabled = FALSE;  			gPipeline.mVertexShadersLoaded = 0;  			mVertexShaderLevel[SHADER_LIGHTING] = 0; @@ -568,6 +591,7 @@ void LLViewerShaderMgr::setShaders()  	}  	else  	{ +		LLGLSLShader::sNoFixedFunction = false;  		gPipeline.mVertexShadersEnabled = FALSE;  		gPipeline.mVertexShadersLoaded = 0;  		mVertexShaderLevel[SHADER_LIGHTING] = 0; @@ -591,7 +615,15 @@ void LLViewerShaderMgr::setShaders()  void LLViewerShaderMgr::unloadShaders()  { +	gOcclusionProgram.unload(); +	gUIProgram.unload(); +	gCustomAlphaProgram.unload(); +	gGlowCombineProgram.unload(); +	gTwoTextureAddProgram.unload(); +	gSolidColorProgram.unload(); +  	gObjectSimpleProgram.unload(); +	gObjectBumpProgram.unload();  	gObjectSimpleWaterProgram.unload();  	gObjectFullbrightProgram.unload();  	gObjectFullbrightWaterProgram.unload(); @@ -1581,6 +1613,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()  		gObjectFullbrightShinyWaterProgram.unload();  		gObjectShinyWaterProgram.unload();  		gObjectSimpleProgram.unload(); +		gObjectBumpProgram.unload();  		gObjectSimpleWaterProgram.unload();  		gObjectFullbrightProgram.unload();  		gObjectFullbrightWaterProgram.unload(); @@ -1753,6 +1786,22 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ +		gObjectBumpProgram.mName = "Bump Shader"; +		/*gObjectBumpProgram.mFeatures.calculatesLighting = true; +		gObjectBumpProgram.mFeatures.calculatesAtmospherics = true; +		gObjectBumpProgram.mFeatures.hasGamma = true; +		gObjectBumpProgram.mFeatures.hasAtmospherics = true; +		gObjectBumpProgram.mFeatures.hasLighting = true; +		gObjectBumpProgram.mFeatures.mIndexedTextureChannels = 0;*/ +		gObjectBumpProgram.mShaderFiles.clear(); +		gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpV.glsl", GL_VERTEX_SHADER_ARB)); +		gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; +		success = gObjectBumpProgram.createShader(NULL, NULL); +	} +	 +	if (success) +	{  		gObjectSimpleWaterProgram.mName = "Simple Water Shader";  		gObjectSimpleWaterProgram.mFeatures.calculatesLighting = true;  		gObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true; @@ -2135,6 +2184,85 @@ BOOL LLViewerShaderMgr::loadShadersInterface()  		success = gHighlightProgram.createShader(NULL, NULL);  	} +	if (success) +	{ +		gUIProgram.mName = "UI Shader"; +		gUIProgram.mShaderFiles.clear(); +		gUIProgram.mShaderFiles.push_back(make_pair("interface/uiV.glsl", GL_VERTEX_SHADER_ARB)); +		gUIProgram.mShaderFiles.push_back(make_pair("interface/uiF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gUIProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gUIProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gCustomAlphaProgram.mName = "Custom Alpha Shader"; +		gCustomAlphaProgram.mShaderFiles.clear(); +		gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaV.glsl", GL_VERTEX_SHADER_ARB)); +		gCustomAlphaProgram.mShaderFiles.push_back(make_pair("interface/customalphaF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gCustomAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gCustomAlphaProgram.createShader(NULL, NULL); +	} + +	if (success) +	{ +		gGlowCombineProgram.mName = "Glow Combine Shader"; +		gGlowCombineProgram.mShaderFiles.clear(); +		gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineV.glsl", GL_VERTEX_SHADER_ARB)); +		gGlowCombineProgram.mShaderFiles.push_back(make_pair("interface/glowcombineF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gGlowCombineProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gGlowCombineProgram.createShader(NULL, NULL); +		if (success) +		{ +			gGlowCombineProgram.bind(); +			gGlowCombineProgram.uniform1i("glowMap", 0); +			gGlowCombineProgram.uniform1i("screenMap", 1); +			gGlowCombineProgram.unbind(); +		} +	} + +	if (success) +	{ +		gTwoTextureAddProgram.mName = "Two Texture Add Shader"; +		gTwoTextureAddProgram.mShaderFiles.clear(); +		gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddV.glsl", GL_VERTEX_SHADER_ARB)); +		gTwoTextureAddProgram.mShaderFiles.push_back(make_pair("interface/twotextureaddF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gTwoTextureAddProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gTwoTextureAddProgram.createShader(NULL, NULL); +		if (success) +		{ +			gTwoTextureAddProgram.bind(); +			gTwoTextureAddProgram.uniform1i("tex0", 0); +			gTwoTextureAddProgram.uniform1i("tex1", 1); +		} +	} + +	if (success) +	{ +		gSolidColorProgram.mName = "Solid Color Shader"; +		gSolidColorProgram.mShaderFiles.clear(); +		gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorV.glsl", GL_VERTEX_SHADER_ARB)); +		gSolidColorProgram.mShaderFiles.push_back(make_pair("interface/solidcolorF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gSolidColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gSolidColorProgram.createShader(NULL, NULL); +		if (success) +		{ +			gSolidColorProgram.bind(); +			gSolidColorProgram.uniform1i("tex0", 0); +			gSolidColorProgram.unbind(); +		} +	} + +	if (success) +	{ +		gOcclusionProgram.mName = "Occlusion Shader"; +		gOcclusionProgram.mShaderFiles.clear(); +		gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionV.glsl", GL_VERTEX_SHADER_ARB)); +		gOcclusionProgram.mShaderFiles.push_back(make_pair("interface/occlusionF.glsl", GL_FRAGMENT_SHADER_ARB)); +		gOcclusionProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; +		success = gOcclusionProgram.createShader(NULL, NULL); +	} +  	if( !success )  	{  		mVertexShaderLevel[SHADER_INTERFACE] = 0; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index efef9ec5b2..93a0ecc4f0 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -287,6 +287,14 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade  extern LLVector4			gShinyOrigin; +//utility shaders +extern LLGLSLShader			gOcclusionProgram; +extern LLGLSLShader			gCustomAlphaProgram; +extern LLGLSLShader			gGlowCombineProgram; + +//output tex0[tc0] + tex1[tc1] +extern LLGLSLShader			gTwoTextureAddProgram; +								  //object shaders  extern LLGLSLShader			gObjectSimpleProgram;  extern LLGLSLShader			gObjectSimpleWaterProgram; @@ -296,6 +304,7 @@ extern LLGLSLShader			gObjectFullbrightProgram;  extern LLGLSLShader			gObjectFullbrightWaterProgram;  extern LLGLSLShader			gObjectFullbrightNonIndexedProgram;  extern LLGLSLShader			gObjectFullbrightNonIndexedWaterProgram; +extern LLGLSLShader			gObjectBumpProgram;  extern LLGLSLShader			gObjectSimpleLODProgram;  extern LLGLSLShader			gObjectFullbrightLODProgram; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 4da0f80a00..5fcc57bc91 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -599,7 +599,7 @@ bool LLViewerTexture::bindDefaultImage(S32 stage)  	}  	if (!res && LLViewerTexture::sNullImagep.notNull() && (this != LLViewerTexture::sNullImagep))  	{ -		res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep) ; +		res = gGL.getTexUnit(stage)->bind(LLViewerTexture::sNullImagep);  	}  	if (!res)  	{ diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index d24174adea..30ef8b8a29 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -115,7 +115,7 @@ void LLViewerTextureList::doPreloadImages()  	// Set the "white" image  	LLViewerFetchedTexture::sWhiteImagep = LLViewerTextureManager::getFetchedTextureFromFile("white.tga", MIPMAP_NO, LLViewerFetchedTexture::BOOST_UI); -	 +	LLTexUnit::sWhiteTexture = LLViewerFetchedTexture::sWhiteImagep->getTexName();  	LLUIImageList* image_list = LLUIImageList::getInstance();  	image_list->initFromFile(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 0e158693b9..d7509b4e41 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2287,6 +2287,11 @@ void LLViewerWindow::draw()  	// Draw all nested UI views.  	// No translation needed, this view is glued to 0,0 +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.bind(); +	} +  	gGL.pushMatrix();  	LLUI::pushMatrix();  	{ @@ -2361,6 +2366,11 @@ void LLViewerWindow::draw()  	LLUI::popMatrix();  	gGL.popMatrix(); +	if (LLGLSLShader::sNoFixedFunction) +	{ +		gUIProgram.unbind(); +	} +  //#if LL_DEBUG  	LLView::sIsDrawing = FALSE;  //#endif diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index cd2bbad620..0db0010688 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -7049,6 +7049,8 @@ LLVivoxProtocolParser::~LLVivoxProtocolParser()  		XML_ParserFree(parser);  } +static LLFastTimer::DeclareTimer FTM_VIVOX_PROCESS("Vivox Process"); +  // virtual  LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(  													  const LLChannelDescriptors& channels, @@ -7057,6 +7059,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(  													  LLSD& context,  													  LLPumpIO* pump)  { +	LLFastTimer t(FTM_VIVOX_PROCESS);  	LLBufferStream istr(channels, buffer.get());  	std::ostringstream ostr;  	while (istr.good()) diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index 3c7fe708e6..890861df71 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -51,6 +51,7 @@  #include "llspatialpartition.h"  #include "llnotificationsutil.h"  #include "raytrace.h" +#include "llglslshader.h"  extern LLPipeline gPipeline; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 367a3f5732..30216f02db 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3746,6 +3746,11 @@ bool can_batch_texture(LLFace* facep)  		return false;  	} +	if (facep->getTexture() && facep->getTexture()->getPrimaryFormat() == GL_ALPHA) +	{ //can't batch invisiprims +		return false; +	} +  	if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)  	{ //texture animation breaks batches  		return false; @@ -4364,6 +4369,8 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  		group->mBuilt = 1.f; +		std::set<LLVertexBuffer*> mapped_buffers; +  		for (LLSpatialGroup::element_iter drawable_iter = group->getData().begin(); drawable_iter != group->getData().end(); ++drawable_iter)  		{  			LLFastTimer t(FTM_VOLUME_GEOM_PARTIAL); @@ -4378,35 +4385,31 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  				for (S32 i = 0; i < drawablep->getNumFaces(); ++i)  				{  					LLFace* face = drawablep->getFace(i); -					if (face && face->getVertexBuffer()) +					if (face)  					{ -						face->getGeometryVolume(*volume, face->getTEOffset(),  -							vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); +						LLVertexBuffer* buff = face->getVertexBuffer(); +						if (buff) +						{ +							face->getGeometryVolume(*volume, face->getTEOffset(),  +								vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()); + +							if (buff->isLocked()) +							{ +								mapped_buffers.insert(buff); +							} +						}  					}  				} - +				  				drawablep->clearState(LLDrawable::REBUILD_ALL);  			}  		} -		//unmap all the buffers -		for (LLSpatialGroup::buffer_map_t::iterator i = group->mBufferMap.begin(); i != group->mBufferMap.end(); ++i) +		for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter)  		{ -			LLSpatialGroup::buffer_texture_map_t& map = i->second; -			for (LLSpatialGroup::buffer_texture_map_t::iterator j = map.begin(); j != map.end(); ++j) -			{ -				LLSpatialGroup::buffer_list_t& list = j->second; -				for (LLSpatialGroup::buffer_list_t::iterator k = list.begin(); k != list.end(); ++k) -				{ -					LLVertexBuffer* buffer = *k; -					if (buffer->isLocked()) -					{ -						buffer->setBuffer(0); -					} -				} -			} +			(*iter)->setBuffer(0);  		} -		 +  		// don't forget alpha  		if(group != NULL &&   		   !group->mVertexBuffer.isNull() &&  @@ -4716,6 +4719,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::  			}  			const LLTextureEntry* te = facep->getTextureEntry(); +			tex = facep->getTexture();  			BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) ? TRUE : FALSE; diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 69ebad61ac..e70ac0a2e7 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -282,6 +282,11 @@ void LLVOWater::updateSpatialExtents(LLVector4a &newMin, LLVector4a& newMax)  U32 LLVOWater::getPartitionType() const  {  +	if (mIsEdgePatch) +	{ +		return LLViewerRegion::PARTITION_VOIDWATER; +	} +  	return LLViewerRegion::PARTITION_WATER;   } @@ -300,6 +305,7 @@ LLWaterPartition::LLWaterPartition()  LLVoidWaterPartition::LLVoidWaterPartition()  { +	mOcclusionEnabled = FALSE;  	mDrawableType = LLPipeline::RENDER_TYPE_VOIDWATER;  	mPartitionType = LLViewerRegion::PARTITION_VOIDWATER;  } diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 257884d921..bd1d2ed7a7 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -394,16 +394,18 @@ bool LLXMLRPCTransaction::Impl::process()  		}  	} -	const F32 MAX_PROCESSING_TIME = 0.05f; -	LLTimer timer; +	//const F32 MAX_PROCESSING_TIME = 0.05f; +	//LLTimer timer; -	while (mCurlRequest->perform() > 0) +	mCurlRequest->perform(); + +	/*while (mCurlRequest->perform() > 0)  	{  		if (timer.getElapsedTimeF32() >= MAX_PROCESSING_TIME)  		{  			return false;  		} -	} +	}*/  	while(1)  	{ diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 2d61a049f7..9b72d6b5ac 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -336,10 +336,10 @@ static const U32 gl_cube_face[] =  void validate_framebuffer_object(); -void addDeferredAttachments(LLRenderTarget& target) +bool addDeferredAttachments(LLRenderTarget& target)  { -	target.addColorAttachment(GL_RGBA); //specular -	target.addColorAttachment(GL_RGBA); //normal+z	 +	return target.addColorAttachment(GL_RGBA) && //specular +			target.addColorAttachment(GL_RGBA); //normal+z	  }  LLPipeline::LLPipeline() : @@ -586,18 +586,61 @@ void LLPipeline::allocatePhysicsBuffer()  void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  { -	// remember these dimensions -	mScreenWidth = resX; -	mScreenHeight = resY; -	 -	//cap samples at 4 for render targets to avoid out of memory errors  	U32 samples = gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"));  	if (gGLManager.mIsATI) -	{ //disable multisampling of render targets where ATI is involved +	{ //ATI doesn't like the way we use multisample texture  		samples = 0;  	} +	//try to allocate screen buffers at requested resolution and samples +	// - on failure, shrink number of samples and try again +	// - if not multisampled, shrink resolution and try again (favor X resolution over Y) +	// Make sure to call "releaseScreenBuffers" after each failure to cleanup the partially loaded state + +	if (!allocateScreenBuffer(resX, resY, samples)) +	{ +		releaseScreenBuffers(); +		//reduce number of samples  +		while (samples > 0) +		{ +			samples /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ //success +				return; +			} +			releaseScreenBuffers(); +		} + +		//reduce resolution +		while (resY > 0 && resX > 0) +		{ +			resY /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ +				return; +			} +			releaseScreenBuffers(); + +			resX /= 2; +			if (allocateScreenBuffer(resX, resY, samples)) +			{ +				return; +			} +			releaseScreenBuffers(); +		} + +		llwarns << "Unable to allocate screen buffer at any resolution!" << llendl; +	} +} + + +bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) +{ +	// remember these dimensions +	mScreenWidth = resX; +	mScreenHeight = resY; +	  	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");  	if (res_mod > 1 && res_mod < resX && res_mod < resY) @@ -608,7 +651,10 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  	if (gSavedSettings.getBOOL("RenderUIBuffer"))  	{ -		mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) +		{ +			return false; +		}  	}	  	if (LLPipeline::sRenderDeferred) @@ -618,22 +664,22 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED);  		//allocate deferred rendering color buffers -		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); -		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples); -		addDeferredAttachments(mDeferredScreen); +		if (!mDeferredScreen.allocate(resX, resY, GL_RGBA, 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; -		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples);		 +		if (!mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;  #if LL_DARWIN  		// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO -		mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  #else -		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +		if (!mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  #endif  		if (shadow_detail > 0 || ssao)  		{ //only need mDeferredLight[0] for shadows OR ssao -			mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); +			if (!mDeferredLight[0].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;  		}  		else  		{ @@ -642,7 +688,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		if (ssao)  		{ //only need mDeferredLight[1] for ssao -			mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); +			if (!mDeferredLight[1].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;  		}  		else  		{ @@ -651,14 +697,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		if (gi)  		{ //only need mDeferredLight[2] and mGIMapPost for gi -			mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false); +			if (!mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, false)) return false;  			for (U32 i = 0; i < 2; i++)  			{  #if LL_DARWIN  				// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO -				mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  #else -				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  #endif  			}  		} @@ -685,7 +731,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		{ //allocate 4 sun shadow maps  			for (U32 i = 0; i < 4; i++)  			{ -				mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE); +				if (!mShadow[i].allocate(U32(resX*scale),U32(resY*scale), shadow_fmt, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE)) return false;  			}  		}  		else @@ -703,7 +749,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		{ //allocate two spot shadow maps  			for (U32 i = 4; i < 6; i++)  			{ -				mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE); +				if (!mShadow[i].allocate(width, height, shadow_fmt, TRUE, FALSE)) return false;  			}  		}  		else @@ -716,7 +762,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		width = nhpo2(resX)/2;  		height = nhpo2(resY)/2; -		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE); +		if (!mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE)) return false;  	}  	else  	{ @@ -738,7 +784,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  		mEdgeMap.release();  		mLuminanceMap.release(); -		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		 +		if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;		  	}  	if (LLPipeline::sRenderDeferred) @@ -750,6 +796,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)  	stop_glerror(); +	return true;  }  //static @@ -800,9 +847,23 @@ void LLPipeline::releaseGLBuffers()  	mWaterRef.release();  	mWaterDis.release(); +	 +	for (U32 i = 0; i < 3; i++) +	{ +		mGlow[i].release(); +	} + +	releaseScreenBuffers(); + +	gBumpImageList.destroyGL(); +	LLVOAvatar::resetImpostors(); +} + +void LLPipeline::releaseScreenBuffers() +{ +	mUIScreen.release();  	mScreen.release();  	mPhysicsDisplay.release(); -	mUIScreen.release();  	mDeferredScreen.release();  	mDeferredDepth.release();  	for (U32 i = 0; i < 3; i++) @@ -821,16 +882,9 @@ void LLPipeline::releaseGLBuffers()  	{  		mShadow[i].release();  	} - -	for (U32 i = 0; i < 3; i++) -	{ -		mGlow[i].release(); -	} - -	gBumpImageList.destroyGL(); -	LLVOAvatar::resetImpostors();  } +  void LLPipeline::createGLBuffers()  {  	LLMemType mt_cb(LLMemType::MTYPE_PIPELINE_CREATE_BUFFERS); @@ -1983,6 +2037,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  	LLGLDepthTest depth(GL_TRUE, GL_FALSE); +	bool bound_shader = false; +	if (gPipeline.canUseVertexShaders() && LLGLSLShader::sCurBoundShader == 0) +	{ //if no shader is currently bound, use the occlusion shader instead of fixed function if we can +		// (shadow render uses a special shader that clamps to clip planes) +		bound_shader = true; +		gOcclusionProgram.bind(); +	} +	  	for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();   			iter != LLWorld::getInstance()->getRegionList().end(); ++iter)  	{ @@ -2010,6 +2072,11 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl  		}  	} +	if (bound_shader) +	{ +		gOcclusionProgram.unbind(); +	} +  	camera.disableUserClipPlane();  	if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) &&  @@ -2133,7 +2200,21 @@ void LLPipeline::doOcclusion(LLCamera& camera)  		LLGLDepthTest depth(GL_TRUE, GL_FALSE);  		LLGLDisable cull(GL_CULL_FACE); + +		bool bind_shader = LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShader == 0; +		if (bind_shader) +		{ +			if (LLPipeline::sShadowRender) +			{ +				gDeferredShadowProgram.bind(); +			} +			else +			{ +				gOcclusionProgram.bind(); +			} +		} +  		for (LLCullResult::sg_list_t::iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)  		{  			LLSpatialGroup* group = *iter; @@ -2141,6 +2222,18 @@ void LLPipeline::doOcclusion(LLCamera& camera)  			group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);  		} +		if (bind_shader) +		{ +			if (LLPipeline::sShadowRender) +			{ +				gDeferredShadowProgram.unbind(); +			} +			else +			{ +				gOcclusionProgram.unbind(); +			} +		} +  		gGL.setColorMask(true, false);  	}  } @@ -3249,6 +3342,11 @@ void render_hud_elements()  	gGL.color4f(1,1,1,1);  	if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))  	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.bind(); +		} +  		LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);  		gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d() @@ -3262,6 +3360,10 @@ void render_hud_elements()  		// Render name tags.  		LLHUDObject::renderAll(); +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.unbind(); +		}  	}  	else if (gForceRenderLandFence)  	{ @@ -3599,8 +3701,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  						check_stack_depth(stack_depth);  						std::string msg = llformat("pass %d", i);  						LLGLState::checkStates(msg); -						LLGLState::checkTextureChannels(msg); -						LLGLState::checkClientArrays(msg); +						//LLGLState::checkTextureChannels(msg); +						//LLGLState::checkClientArrays(msg);  					}  				}  			} @@ -3638,16 +3740,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  	LLVertexBuffer::unbind();  	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); - -	 - -	stop_glerror(); -		 -	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays();  	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderHighlights"); @@ -3701,8 +3793,8 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)  	LLVertexBuffer::unbind();  	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); +//	LLGLState::checkTextureChannels(); +//	LLGLState::checkClientArrays();  }  void LLPipeline::renderGeomDeferred(LLCamera& camera) @@ -3785,8 +3877,6 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  						llerrs << "GL matrix stack corrupted!" << llendl;  					}  					LLGLState::checkStates(); -					LLGLState::checkTextureChannels(); -					LLGLState::checkClientArrays();  				}  			}  		} @@ -3879,8 +3969,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  						llerrs << "GL matrix stack corrupted!" << llendl;  					}  					LLGLState::checkStates(); -					LLGLState::checkTextureChannels(); -					LLGLState::checkClientArrays();  				}  			}  		} @@ -3955,8 +4043,6 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)  				LLVertexBuffer::unbind();  				LLGLState::checkStates(); -				LLGLState::checkTextureChannels(); -				LLGLState::checkClientArrays();  			}  		}  		else @@ -6392,30 +6478,39 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  		LLGLDisable blend(GL_BLEND); -		//tex unit 0 -		gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); -	 -		gGL.getTexUnit(0)->bind(&mGlow[1]); -		gGL.getTexUnit(1)->activate(); -		gGL.getTexUnit(1)->enable(LLTexUnit::TT_RECT_TEXTURE); - - -		//tex unit 1 -		gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gGlowCombineProgram.bind(); +		} +		else +		{ +			//tex unit 0 +			gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR); +			//tex unit 1 +			gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_ADD, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR); +		} +		gGL.getTexUnit(0)->bind(&mGlow[1]);  		gGL.getTexUnit(1)->bind(&mScreen); -		gGL.getTexUnit(1)->activate();  		LLGLEnable multisample(gSavedSettings.getU32("RenderFSAASamples") > 0 ? GL_MULTISAMPLE_ARB : 0);  		buff->setBuffer(mask);  		buff->drawArrays(LLRender::TRIANGLE_STRIP, 0, 3); -		gGL.getTexUnit(1)->disable(); -		gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gGlowCombineProgram.unbind(); +		} +		else +		{ +			gGL.getTexUnit(1)->disable(); +			gGL.getTexUnit(1)->setTextureBlendType(LLTexUnit::TB_MULT); -		gGL.getTexUnit(0)->activate(); -		gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +			gGL.getTexUnit(0)->activate(); +			gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +		} +		  	}  	if (LLRenderTarget::sUseFBO) @@ -6428,6 +6523,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  	if (hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PHYSICS_SHAPES))  	{ +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.bind(); +		} +  		gGL.setColorMask(true, false);  		LLVector2 tc1(0,0); @@ -6451,6 +6551,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)  		gGL.end();  		gGL.flush(); + +		if (LLGLSLShader::sNoFixedFunction) +		{ +			gUIProgram.unbind(); +		} +  	}  	glMatrixMode(GL_PROJECTION); @@ -7866,7 +7972,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  			static LLCullResult ref_result; -			if (LLDrawPoolWater::sNeedsDistortionUpdate) +			if (LLDrawPoolWater::sNeedsReflectionUpdate)  			{  				//initial sky pass (no user clip plane)  				{ //mask out everything but the sky @@ -8006,8 +8112,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)  		LLViewerCamera::getInstance()->setUserClipPlane(npnorm);  		LLGLState::checkStates(); -		LLGLState::checkTextureChannels(); -		LLGLState::checkClientArrays();  		if (!skip_avatar_update)  		{ @@ -8140,6 +8244,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  	LLVertexBuffer::unbind();  	{ +		if (!use_shader) +		{ //occlusion program is general purpose depth-only no-textures +			gOcclusionProgram.bind(); +		}  		LLFastTimer ftm(FTM_SHADOW_SIMPLE);  		LLGLDisable test(GL_ALPHA_TEST);  		gGL.getTexUnit(0)->disable(); @@ -8148,6 +8256,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera  			renderObjects(types[i], LLVertexBuffer::MAP_VERTEX, FALSE);  		}  		gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); +		if (!use_shader) +		{ +			gOcclusionProgram.unbind(); +		}  	}  	if (use_shader) diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index e9da25e544..28e6526acd 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -113,9 +113,11 @@ public:  	void resetVertexBuffers();  	void resizeScreenTexture();  	void releaseGLBuffers(); +	void releaseScreenBuffers();  	void createGLBuffers();  	void allocateScreenBuffer(U32 resX, U32 resY); +	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);  	void allocatePhysicsBuffer();  	void resetVertexBuffers(LLDrawable* drawable); diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 8770ede7e9..c7b26c59c7 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -38,6 +38,7 @@           user_resize="false"           width="630">              <web_browser +             tab_stop="true"                trusted_content="true"                follows="left|right|top|bottom"               layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index e6ad0ea091..01699955a6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -557,6 +557,9 @@  	     	 	 	<menu_item_call.on_click  	     	 	 	function="World.EnvPreset"  	     	 	 	parameter="delete_water"/> +	     	 	 	<menu_item_call.on_enable +	     	 	 	function="World.EnableEnvPreset" +	     	 	 	parameter="delete_water"/>  	     	 	</menu_item_call>  	     	</menu> @@ -583,6 +586,9 @@  	     	 	 	<menu_item_call.on_click  	     	 	 	function="World.EnvPreset"  	     	 	 	parameter="delete_sky"/> +	     	 	 	<menu_item_call.on_enable +	     	 	 	function="World.EnableEnvPreset" +	     	 	 	parameter="delete_sky"/>  	     	 	</menu_item_call>  	     	</menu> @@ -609,6 +615,9 @@  	     	 	 	<menu_item_call.on_click  	     	 	 	function="World.EnvPreset"  	     	 	 	parameter="delete_day_cycle"/> +	     	 	 	<menu_item_call.on_enable +	     	 	 	function="World.EnableEnvPreset" +	     	 	 	parameter="delete_day_cycle"/>  	     	 	</menu_item_call>  	     	</menu>  	    </menu> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f4acb08255..47e02378fe 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2240,6 +2240,7 @@ Returns a string with the requested data about the region  	<string name="Unknown">(Unknown)</string>  	<string name="SummaryForTheWeek"    value="Summary for this week, beginning on " />  	<string name="NextStipendDay"       value="The next stipend day is " /> +	<string name="GroupPlanningDate">[mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc]</string>  	<string name="GroupIndividualShare" value="                      Group       Individual Share" />  	<string name="GroupColumn"          value="                      Group" />  	<string name="Balance">Balance</string> @@ -2396,6 +2397,7 @@ Returns a string with the requested data about the region  	<string name="GroupMoneyBalance">Balance</string>  	<string name="GroupMoneyCredits">Credits</string>  	<string name="GroupMoneyDebits">Debits</string> +	<string name="GroupMoneyDate">[weekday,datetime,utc] [mth,datetime,utc] [day,datetime,utc], [year,datetime,utc]</string>  	<!-- viewer object -->  	<string name="ViewerObjectContents">Contents</string> | 
