summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authormobserveur <mobserveur@gmail.com>2025-08-30 01:59:43 +0200
committermobserveur <mobserveur@gmail.com>2025-08-30 01:59:43 +0200
commit7f0c81918575d3f05e4eadc160b600eaa8b383d1 (patch)
tree4c6bb40e93e38bb8a32964380f97ac2a06490b11 /indra/newview
parent03140ed619c5d49eb3851284ae53bbea73a8b831 (diff)
Performance Optimisations, Bloom effect, Visuals Panel
This commit contains performance optimisations in the the pipeline, framebuffer, vertexbuffer, reflection probes, shadows. It also fixes many opengl errors, modifies the opengl debugging, and adds a visuals effects panel.
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/app_settings/settings.xml223
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl9
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl37
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl23
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl81
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl8
-rw-r--r--indra/newview/featuretable_mac.txt23
-rw-r--r--indra/newview/llappviewer.cpp48
-rw-r--r--indra/newview/lldrawpoolbump.cpp3
-rw-r--r--indra/newview/lldrawpoolwater.cpp3
-rw-r--r--indra/newview/llface.cpp2
-rw-r--r--indra/newview/llfasttimerview.cpp11
-rw-r--r--indra/newview/llfloaterperformance.h1
-rw-r--r--indra/newview/llfloaterpreference.cpp160
-rw-r--r--indra/newview/llfloaterpreference.h20
-rw-r--r--indra/newview/llfloaterpreferencesgraphicsadvanced.cpp12
-rw-r--r--indra/newview/llglsandbox.cpp21
-rw-r--r--indra/newview/llgltfmaterialpreviewmgr.cpp40
-rw-r--r--indra/newview/llmodelpreview.cpp20
-rw-r--r--indra/newview/llreflectionmap.h6
-rw-r--r--indra/newview/llreflectionmapmanager.cpp535
-rw-r--r--indra/newview/llreflectionmapmanager.h11
-rw-r--r--indra/newview/llselectmgr.cpp4
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp4
-rw-r--r--indra/newview/llspatialpartition.cpp17
-rw-r--r--indra/newview/llstatusbar.cpp14
-rw-r--r--indra/newview/llterrainpaintmap.cpp7
-rw-r--r--indra/newview/llviewerdisplay.cpp69
-rwxr-xr-xindra/newview/llviewerparceloverlay.cpp2
-rw-r--r--indra/newview/llviewershadermgr.cpp67
-rw-r--r--indra/newview/llviewershadermgr.h601
-rw-r--r--indra/newview/llviewertexturelist.cpp4
-rw-r--r--indra/newview/llviewerwindow.cpp12
-rw-r--r--indra/newview/llvoavatar.cpp2
-rw-r--r--indra/newview/mpfloatertuning.cpp42
-rw-r--r--indra/newview/mpfloatertuning.h16
-rw-r--r--indra/newview/pipeline.cpp1513
-rw-r--r--indra/newview/pipeline.h36
-rw-r--r--indra/newview/skins/default/textures/megapahit/fps_button.pngbin0 -> 195 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_blue_bullet.pngbin0 -> 654 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_green_bullet.pngbin0 -> 626 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_help_bullet.pngbin0 -> 704 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_info_bullet.pngbin0 -> 490 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_red_bullet.pngbin0 -> 629 bytes
-rw-r--r--indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.pngbin0 -> 648 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_mp_performance.xml115
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml368
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml80
-rw-r--r--indra/newview/skins/default/xui/en/panel_performance_preferences.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml1814
-rw-r--r--indra/newview/skins/default/xui/en/panel_snapshot_local.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml406
67 files changed, 4815 insertions, 1787 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4a45456cfc..a614884cea 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8558,7 +8558,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.4</real>
+ <real>1.0</real>
</map>
<key>RenderShadowBlurSamples</key>
<map>
@@ -9337,9 +9337,9 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>U32</string>
+ <string>F32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>1.0</integer>
</map>
<key>RenderShaderLightingMaxLevel</key>
<map>
@@ -11565,17 +11565,6 @@
<key>Value</key>
<integer>75</integer>
</map>
- <key>SnapshotTimestamp</key>
- <map>
- <key>Comment</key>
- <string>Add timestamp to snapshot file names</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>AbuseReportScreenshotDelay</key>
<map>
<key>Comment</key>
@@ -14363,7 +14352,77 @@
<!-- megapahit settings -->
- <key>MPVBufferOptiMode</key>
+ <key>MPLowColorPrecision</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable lower precision buffers encoding</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPNoGLDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable GL Debug</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPGamma</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Gamma</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPTone</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Tonemap</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPGlow</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable / Disable Glow</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MPLuminanceMipmap</key>
+ <map>
+ <key>Comment</key>
+ <string>
+ Luminance Map Mipmaps:
+ (set to 0 to fix post-processing slowdowns)
+ 0:no
+ 1:yes
+ </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<map>
<key>Comment</key>
<string>
@@ -14379,6 +14438,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MPDumbCopy</key>
+ <map>
+ <key>Comment</key>
+ <string>Add a useless copy in pipeline::renderFinalize()</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
<key>MPRenderShadowOpti</key>
<map>
<key>Comment</key>
@@ -14386,10 +14456,131 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>U32</string>
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MPRenderShadowMaxDist</key>
+ <map>
+ <key>Comment</key>
+ <string>Shadows Max Draw distance</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>64</integer>
+ </map>
+ <key>MPRenderBloom</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatic bloom (n blur iterations, 0: Disable)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MPBloomExtractBrightness</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Min extracted brightness</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.20</real>
+ </map>
+ <key>MPBloomExtractMetal</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Metal roughness limit filter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.40</real>
+ </map>
+ <key>MPBloomExtractNonMetal</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Non Metal roughness limit filter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.0</real>
+ </map>
+ <key>MPBloomStrength</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom Strength (0.1 to 1.5)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>MPBloomBlurRadius</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Radius</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.5</real>
+ </map>
+ <key>MPBloomBlurRadiusAdd</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto bloom: Radius add</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.9</real>
+ </map>
+ <key>MPRenderProbeUpdatePeriod</key>
+ <map>
+ <key>Comment</key>
+ <string>Delay between probes updates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>15.0</real>
+ </map>
+ <key>MPRenderProbeSlowDown</key>
+ <map>
+ <key>Comment</key>
+ <string>Slow down probes updates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.05</real>
+ </map>
+ <key>MPRenderProbeProgressive</key>
+ <map>
+ <key>Comment</key>
+ <string>Calculate Radiance progressively</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
<key>MPVCameraCollapsed</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
index fdb77cce6e..60a8300352 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl
@@ -1351,6 +1351,10 @@ float4 SMAABlendingWeightCalculationPS(float2 texcoord,
//-----------------------------------------------------------------------------
// Neighborhood Blending Pixel Shader (Third Pass)
+vec3 srgb_to_linear(vec3 cs);
+vec4 srgb_to_linear4(vec4 cs);
+vec3 linear_to_srgb(vec3 cl);
+
float4 SMAANeighborhoodBlendingPS(float2 texcoord,
float4 offset,
SMAATexture2D(colorTex),
@@ -1369,6 +1373,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
SMAA_BRANCH
if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {
float4 color = SMAASampleLevelZero(colorTex, texcoord);
+ color.rgb = srgb_to_linear(color.rgb);
#if SMAA_REPROJECTION
float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord));
@@ -1377,6 +1382,8 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ color.rgb = linear_to_srgb(color.rgb);
+
return color;
} else {
bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical)
@@ -1393,8 +1400,15 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
// We exploit bilinear filtering to mix current pixel with the chosen
// neighbor:
- float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);
- color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ //float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy);
+ //color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ float4 color = SMAASampleLevelZero(colorTex, blendingCoord.xy);
+ color.rgb = srgb_to_linear(color.rgb);
+ color = blendingWeight.x * color;
+
+ float4 color2 = SMAASampleLevelZero(colorTex, blendingCoord.zw);
+ color2.rgb = srgb_to_linear(color2.rgb);
+ color += blendingWeight.y * color2;
#if SMAA_REPROJECTION
// Antialias velocity for proper reprojection in a later stage:
@@ -1405,6 +1419,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,
color.a = sqrt(5.0 * length(velocity));
#endif
+ color.rgb = linear_to_srgb(color.rgb);
return color;
}
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
index f1e0295859..084a334346 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
uniform sampler2D diffuseMap;
@@ -49,5 +49,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
index 18ce998cb6..5986e8e462 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
@@ -51,5 +51,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
index 37dcbbd328..4396ae89a4 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl
@@ -25,10 +25,10 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
void main()
{
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
index dbaab9bbda..90d81ab6b2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform sampler2D diffuseMap;
@@ -52,5 +52,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
index 07a2218db2..2b314db51a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl
@@ -23,7 +23,7 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform sampler2D diffuseMap;
@@ -42,5 +42,5 @@ void main()
discard;
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
index f208ac746b..a37e970feb 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl
@@ -25,7 +25,7 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
in vec4 post_pos;
in float target_pos_x;
@@ -59,5 +59,5 @@ void main()
}
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
index b55d769fd6..c4e4c4d051 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl
@@ -23,9 +23,9 @@
* $/LicenseInfo$
*/
-out vec4 frag_color;
+//out vec4 frag_color;
void main()
{
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
index 6f7bd2bf3c..033c2f924a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl
@@ -113,8 +113,8 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
if (spos.z > -shadow_clip.w)
{
vec4 lpos;
- vec4 near_split = shadow_clip*-0.75;
- vec4 far_split = shadow_clip*-1.25;
+ vec4 near_split = shadow_clip*-0.9;
+ vec4 far_split = shadow_clip*-1.1;
vec4 transition_domain = near_split-far_split;
float weight = 0.0;
@@ -131,7 +131,10 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)
shadow += contrib;
weight += w;
}
- shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
+
+ //shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 2.0 - 1.0, 0.0);
+ shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 1.0, 0.0);
+ //shadow -= max( (shadow_clip.z + pos.z) / (shadow_clip.z - shadow_clip.w) , 0.0);
}
if (spos.z < near_split.y && spos.z > far_split.z)
diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
index 33a5efa45d..4579d4fbe0 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl
@@ -26,7 +26,7 @@
/*[EXTRA_CODE_HERE]*/
-out vec4 frag_color;
+//out vec4 frag_color;
uniform float minimum_alpha;
@@ -43,5 +43,5 @@ void main()
discard;
}
- frag_color = vec4(1,1,1,1);
+ //frag_color = vec4(1,1,1,1);
}
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl
new file mode 100644
index 0000000000..0efbbdce96
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl
@@ -0,0 +1,37 @@
+out vec4 frag_color;
+
+in vec2 vary_texcoord0;
+
+uniform sampler2D bloomEMap;
+
+uniform bool bloomHorizontal;
+uniform float bloomBlurRadius = 1.5;
+
+uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216);
+
+void main()
+{
+ vec2 size = vec2(bloomBlurRadius, bloomBlurRadius);
+
+ vec2 tex_offset = size / textureSize(bloomEMap, 0); // gets size of single texel
+ vec3 result = texture(bloomEMap, vary_texcoord0).rgb * weight[0]; // current fragment's contribution
+
+ if(bloomHorizontal)
+ {
+ for(int i = 1; i < 5; i++)
+ {
+ result += texture(bloomEMap, vary_texcoord0 + vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
+ result += texture(bloomEMap, vary_texcoord0 - vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
+ }
+ }
+ else
+ {
+ for(int i = 1; i < 5; i++)
+ {
+ result += texture(bloomEMap, vary_texcoord0 + vec2(0.0, tex_offset.y * i)).rgb * weight[i];
+ result += texture(bloomEMap, vary_texcoord0 - vec2(0.0, tex_offset.y * i)).rgb * weight[i];
+ }
+ }
+
+ frag_color = vec4(result, 1.0);
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl
new file mode 100644
index 0000000000..31a6e10fa4
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl
@@ -0,0 +1,23 @@
+out vec4 frag_color;
+
+in vec2 vary_texcoord0;
+
+uniform sampler2D diffuseMap;
+uniform sampler2D bloomBlurredMap;
+
+uniform float bloomStrength;
+
+void main()
+{
+ vec4 hdrColor = texture(diffuseMap, vary_texcoord0);
+ vec3 bloomColor = texture(bloomBlurredMap, vary_texcoord0).rgb;
+ vec4 result = vec4(0.0);
+
+ result.r = min(hdrColor.r + bloomStrength * bloomColor.r, 1.0);
+ result.g = min(hdrColor.g + bloomStrength * bloomColor.g, 1.0);
+ result.b = min(hdrColor.b + bloomStrength * bloomColor.b, 1.0);
+ result.a = hdrColor.a;
+
+ //bloomColor += hdrColor.rgb;
+ frag_color = result;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl
new file mode 100644
index 0000000000..8fb10d8698
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl
@@ -0,0 +1,81 @@
+out vec4 frag_color;
+
+uniform sampler2D diffuseMap;
+uniform sampler2D bloomExtractORM; // orm
+uniform sampler2D bloomExtractEmissive; // emissive
+uniform sampler2D bloomExtractEmissive2; // emissive 2
+
+uniform float bloomExtractBrightness = 0.9;
+uniform float bloomExtractMetal = 0.20;
+uniform float bloomExtractNonMetal = 0.20;
+
+in vec2 vary_texcoord0;
+
+void main()
+{
+ vec4 col = texture(diffuseMap, vary_texcoord0.xy);
+
+ //int valid = 0;
+ //float brightness = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722));
+ float brightness = dot(col.rgb, vec3(0.3, 0.5, 0.2));
+
+ if(brightness < bloomExtractBrightness)
+ {
+ discard;
+ return;
+ }
+
+ vec3 emi = texture(bloomExtractEmissive, vary_texcoord0.xy).rgb;
+ if(emi.r + emi.g + emi.b > 0.01)
+ {
+ discard;
+ return;
+ }
+
+ emi = texture(bloomExtractEmissive2, vary_texcoord0.xy).rgb;
+ if(emi.r + emi.g + emi.b > 0.01)
+ {
+ discard;
+ return;
+ }
+
+ vec4 orm = texture(bloomExtractORM, vary_texcoord0.xy);
+
+ if(orm.r < 0.7)
+ {
+ discard;
+ return;
+ }
+
+ if(bloomExtractMetal == 1.0 && bloomExtractNonMetal == 1.0)
+ {
+ frag_color = vec4(col.rgb, 0.0);
+ return;
+ }
+
+ if(orm.b < 0.15)
+ {
+ // non metal
+ if(orm.g > bloomExtractNonMetal)
+ {
+ discard;
+ return;
+ }
+ }
+ else if(orm.b > 0.8)
+ {
+ // metal
+ if(orm.g > bloomExtractMetal)
+ {
+ discard;
+ return;
+ }
+ }
+ else
+ {
+ discard;
+ return;
+ }
+
+ frag_color = vec4(col.rgb, 0.0);
+} \ No newline at end of file
diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl
new file mode 100644
index 0000000000..e40b60ed3c
--- /dev/null
+++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl
@@ -0,0 +1,8 @@
+in vec3 position;
+out vec2 vary_texcoord0;
+
+void main()
+{
+ gl_Position = vec4(position, 1.0);
+ vary_texcoord0.xy = position.xy * 0.5 + 0.5;
+} \ No newline at end of file
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 3233afc28d..396ece9dc1 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -69,7 +69,7 @@ RenderMaxTextureIndex 1 16
RenderGLContextCoreProfile 1 1
RenderGLMultiThreadedTextures 1 1
RenderGLMultiThreadedMedia 1 1
-RenderAppleUseMultGL 1 1
+RenderAppleUseMultGL 1 0
RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 2
RenderScreenSpaceReflections 1 1
@@ -129,7 +129,8 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderDisableVintageMode 1 0
RenderMaxTextureResolution 1 512
-RenderReflectionProbeCount 1 8
+RenderReflectionProbeCount 1 4
+RenderReflectionProbeDrawDistance 1 16.0
//
@@ -152,7 +153,7 @@ RenderTerrainPBRDetail 1 -1
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.125
+RenderVolumeLODFactor 1 2.0
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -173,7 +174,8 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderDisableVintageMode 1 0
RenderMaxTextureResolution 1 1024
-RenderReflectionProbeCount 1 32
+RenderReflectionProbeCount 1 16
+RenderReflectionProbeDrawDistance 1 24.0
//
// Medium Graphics Settings (standard)
@@ -195,7 +197,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.25
+RenderVolumeLODFactor 1 2.5
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -216,6 +218,7 @@ RenderTonemapType 1 1
RenderTonemapMix 1 0.7
RenderMaxTextureResolution 1 2048
RenderReflectionProbeCount 1 64
+RenderReflectionProbeDrawDistance 1 32.0
//
// Medium High Graphics Settings
@@ -237,7 +240,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 1
RenderTransparentWater 1 0
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.375
+RenderVolumeLODFactor 1 3.5
RenderDeferredSSAO 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
@@ -279,7 +282,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.5
+RenderVolumeLODFactor 1 3.8
RenderDeferredSSAO 1 1
RenderShadowDetail 1 1
WLSkyDetail 1 96
@@ -321,7 +324,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 0.5
-RenderVolumeLODFactor 1 1.75
+RenderVolumeLODFactor 1 4.0
RenderDeferredSSAO 1 1
RenderShadowDetail 1 2
WLSkyDetail 1 96
@@ -362,7 +365,7 @@ RenderTerrainPBRDetail 1 0
RenderTerrainPBRPlanarSampleCount 1 3
RenderTransparentWater 1 1
RenderTreeLODFactor 1 1.0
-RenderVolumeLODFactor 1 2.0
+RenderVolumeLODFactor 1 4.0
WindLightUseAtmosShaders 1 1
WLSkyDetail 1 128
RenderDeferredSSAO 1 1
@@ -406,7 +409,7 @@ RenderCompressTextures 1 0
//
list safe
RenderAnisotropic 1 0
-RenderAvatarMaxNonImpostors 1 16
+RenderAvatarMaxNonImpostors 1 3
RenderAvatarMaxComplexity 1 80000
RenderLocalLightCount 1 0
RenderMaxPartCount 1 1024
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 44276d8767..5d107e69db 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -592,6 +592,8 @@ static void settings_modify()
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
gDebugGL = gDebugGLSession || gDebugSession;
+ bool noGLDebug = gSavedSettings.getBOOL("MPNoGLDebug");
+ if(noGLDebug) gDebugGL = false;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
}
@@ -1351,12 +1353,11 @@ bool LLAppViewer::frame()
bool LLAppViewer::doFrame()
{
U32 fpsLimitMaxFps = (U32)gSavedSettings.getU32("MaxFPS");
- if(fpsLimitMaxFps>120) fpsLimitMaxFps=0;
+ if(fpsLimitMaxFps > 120) fpsLimitMaxFps = 0;
using TimePoint = std::chrono::steady_clock::time_point;
-
- U64 fpsLimitSleepFor = 0;
- TimePoint fpsLimitFrameStartTime = std::chrono::steady_clock::now();
+ U64 additionalSleepTime = 0;
+ TimePoint frameStartTime = std::chrono::steady_clock::now();
#ifdef LL_DISCORD
{
@@ -1535,18 +1536,6 @@ bool LLAppViewer::doFrame()
}
}
- if(fpsLimitMaxFps > 0)
- {
- auto elapsed = std::chrono::steady_clock::now() - fpsLimitFrameStartTime;
-
- long long fpsLimitFrameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
- U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps);
- if((fpsLimitFrameTime+1000) < desired_time_us)
- {
- fpsLimitSleepFor = (desired_time_us - fpsLimitFrameTime - 1000) * 1.0;
- }
- }
-
{
LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout");
pingMainloopTimeout("Main:Sleep");
@@ -1559,13 +1548,25 @@ bool LLAppViewer::doFrame()
//LL_RECORD_BLOCK_TIME(SLEEP2);
LL_PROFILE_ZONE_WARN("Sleep2");
- if(fpsLimitSleepFor)
+ auto elapsed = std::chrono::steady_clock::now() - frameStartTime;
+ long long frameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
+
+ if(fpsLimitMaxFps > 0)
{
-#if LL_WINDOWS
- std::this_thread::sleep_for(std::chrono::microseconds(fpsLimitSleepFor));
-#else
- usleep(fpsLimitSleepFor);
-#endif
+ U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps);
+ if((frameTime+1000) < desired_time_us)
+ {
+ additionalSleepTime = 0.92 * (F64)(desired_time_us - frameTime);
+ if(additionalSleepTime < 200)
+ {
+ additionalSleepTime = 0;
+ }
+ }
+ }
+
+ if(additionalSleepTime > 0)
+ {
+ std::this_thread::sleep_for(std::chrono::microseconds(additionalSleepTime));
}
// yield some time to the os based on command line option
@@ -1661,6 +1662,9 @@ bool LLAppViewer::doFrame()
LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout");
resumeMainloopTimeout();
}
+
+ //swap();
+
pingMainloopTimeout("Main:End");
}
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index bf593bff07..c9470fe977 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -911,7 +911,8 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod
// generate normal map in empty texture
{
- sRenderTarget.bindTarget();
+ sRenderTarget.bindTarget("", 1);
+ //sRenderTarget.clear();
LLGLDepthTest depth(GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 7d58511d41..424bb02ae7 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -119,7 +119,8 @@ void LLDrawPoolWater::beginPostDeferredPass(S32 pass)
LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;
LLRenderTarget& dst = gPipeline.mWaterDis;
- dst.bindTarget();
+ dst.bindTarget("", 1);
+ //dst.clear();
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index fb4db9a216..e4b81ba00a 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -648,7 +648,7 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
#endif
glPolygonOffset(3.f, 3.f);
- glLineWidth(5.f);
+ //glLineWidth(5.f);
#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index aa2578fec6..1618d91b98 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -403,7 +403,7 @@ void LLFastTimerView::draw()
legend_panel->localRectToOtherView(legend_panel->getLocalRect(), &mLegendRect, this);
// Draw the window background
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gl_rect_2d(getLocalRect(), LLColor4(0.f, 0.f, 0.f, 0.25f));
drawHelp(getRect().getHeight() - MARGIN);
@@ -518,7 +518,8 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t
//render charts
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- buffer.bindTarget();
+ buffer.bindTarget("", 1);
+ buffer.clear();
for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter)
{
@@ -1057,8 +1058,7 @@ void LLFastTimerView::drawLineGraph()
//fatten highlighted timer
if (mHoverID == idp)
{
- gGL.flush();
- glLineWidth(3);
+ LLRender2D::setLineWidth(3.0);
}
llassert(idp->getIndex() < sTimerColors.size());
@@ -1118,8 +1118,7 @@ void LLFastTimerView::drawLineGraph()
if (mHoverID == idp)
{
- gGL.flush();
- glLineWidth(1);
+ LLRender2D::setLineWidth(1.f);
}
if (idp->getTreeNode().mCollapsed)
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 6cca85a009..48e7f4913f 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -33,6 +33,7 @@ class LLCharacter;
class LLCheckBoxCtrl;
class LLNameListCtrl;
class LLTextBox;
+class LLSliderCtrl;
class LLFloaterPerformance : public LLFloater
{
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 585032870e..334f9cb692 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -2359,6 +2359,7 @@ private:
};
static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics");
+static LLPanelInjector<LLPanelPreferenceGraphics3> t_pref_graph3("panel_preference_graphics3");
static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");
bool LLPanelPreferenceGraphics::postBuild()
@@ -2528,6 +2529,165 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()
resetDirtyChilds();
}
+// LLPanelPreferenceGraphics3 (Visuals Effects)
+
+bool LLPanelPreferenceGraphics3::postBuild()
+{
+ getChild<LLButton>("MPBalancedButton")->setCommitCallback(boost::bind(&LLPanelPreferenceGraphics3::onMPRecommanded, this));
+ return LLPanelPreference::postBuild();
+}
+
+void LLPanelPreferenceGraphics3::draw()
+{
+ LLPanelPreference::draw();
+}
+
+bool LLPanelPreferenceGraphics3::hasDirtyChilds()
+{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ if (ctrl->isDirty())
+ {
+ LLControlVariable* control = ctrl->getControlVariable();
+ if (control)
+ {
+ std::string control_name = control->getName();
+ if (!control_name.empty())
+ {
+ return true;
+ }
+ }
+ }
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+
+ return false;
+}
+
+void LLPanelPreferenceGraphics3::resetDirtyChilds()
+{
+ LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced");
+ std::list<LLView*> view_stack;
+ view_stack.push_back(this);
+ if (advanced)
+ {
+ view_stack.push_back(advanced);
+ }
+ while(!view_stack.empty())
+ {
+ // Process view on top of the stack
+ LLView* curview = view_stack.front();
+ view_stack.pop_front();
+
+ LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview);
+ if (ctrl)
+ {
+ ctrl->resetDirty();
+ }
+ // Push children onto the end of the work stack
+ for (child_list_t::const_iterator iter = curview->getChildList()->begin();
+ iter != curview->getChildList()->end(); ++iter)
+ {
+ view_stack.push_back(*iter);
+ }
+ }
+}
+
+void LLPanelPreferenceGraphics3::cancel(const std::vector<std::string> settings_to_skip)
+{
+ LLPanelPreference::cancel(settings_to_skip);
+}
+void LLPanelPreferenceGraphics3::saveSettings()
+{
+ resetDirtyChilds();
+ std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+ if (preset_graphic_active.empty())
+ {
+ LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+ if (instance)
+ {
+ //don't restore previous preset after closing Preferences
+ instance->saveGraphicsPreset(preset_graphic_active);
+ }
+ }
+ LLPanelPreference::saveSettings();
+}
+
+void LLPanelPreferenceGraphics3::onMPRecommanded()
+{
+ //LL_WARNS() << "onClickMPRecommanded()" << LL_ENDL;
+
+ // LOD
+
+ gSavedSettings.setF32("RenderVolumeLODFactor", 3.5);
+ gSavedSettings.setF32("RenderAvatarPhysicsLODFactor", 1.0);
+
+ // AA
+
+ gSavedSettings.setU32("RenderFSAAType", 2);
+ gSavedSettings.setU32("RenderFSAASamples", 2);
+
+ // Shadows
+
+ gSavedSettings.setS32("RenderShadowDetail", 0);
+ gSavedSettings.setF32("MPRenderShadowMaxDist", 40.0);
+ gSavedSettings.setF32("RenderShadowResolutionScale", 2.0);
+ gSavedSettings.setF32("RenderShadowBlurSize", 0.2);
+ gSavedSettings.setBOOL("RenderDeferredSSAO", 0);
+
+ // Bloom
+
+ gSavedSettings.setU32("MPRenderBloom", 0);
+ gSavedSettings.setF32("MPBloomBlurRadius", 1.0);
+ gSavedSettings.setF32("MPBloomBlurRadiusAdd", 0.6);
+ gSavedSettings.setF32("MPBloomExtractBrightness", 0.1);
+ gSavedSettings.setF32("MPBloomStrength", 1.0);
+
+ gSavedSettings.setF32("MPBloomExtractMetal", 0.4);
+ gSavedSettings.setF32("MPBloomExtractNonMetal", 0.0);
+
+ // Probes
+
+ gSavedSettings.setS32("RenderReflectionProbeDetail", 0);
+ gSavedSettings.setS32("RenderReflectionProbeLevel", 1);
+ gSavedSettings.setU32("RenderReflectionProbeCount", 32);
+ gSavedSettings.setU32("RenderReflectionProbeResolution", 128);
+ gSavedSettings.setF32("RenderReflectionProbeDrawDistance", 24.0);
+ gSavedSettings.setF32("RenderDefaultProbeUpdatePeriod", 20.0);
+ gSavedSettings.setF32("MPRenderProbeUpdatePeriod", 30.0);
+ gSavedSettings.setF32("MPRenderProbeSlowDown", 0.02);
+
+ // Misc
+
+ gSavedSettings.setBOOL("RenderDisableVintageMode", true);
+ gSavedSettings.setBOOL("RenderTransparentWater", true);
+ gSavedSettings.setBOOL("MPLowColorPrecision", true);
+
+ gSavedSettings.setBOOL("RenderGLMultiThreadedTextures", false);
+ gSavedSettings.setBOOL("RenderAppleUseMultGL", false);
+ gSavedSettings.setBOOL("MPNoGLDebug", true);
+}
+
//------------------------LLPanelPreferenceControls--------------------------------
static LLPanelInjector<LLPanelPreferenceControls> t_pref_contrls("panel_preference_controls");
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index fa9c421a8f..2c357f0551 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -313,6 +313,26 @@ private:
LOG_CLASS(LLPanelPreferenceGraphics);
};
+class LLPanelPreferenceGraphics3 : public LLPanelPreference
+{
+public:
+ bool postBuild();
+ void draw();
+ void cancel(const std::vector<std::string> settings_to_skip = {});
+ void saveSettings();
+ void resetDirtyChilds();
+ void onMPRecommanded();
+
+protected:
+ bool hasDirtyChilds();
+
+
+private:
+
+
+ LOG_CLASS(LLPanelPreferenceGraphics3);
+};
+
class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface
{
LOG_CLASS(LLPanelPreferenceControls);
diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
index 94b95b21c2..a8a1e507a8 100644
--- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
+++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp
@@ -274,9 +274,7 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe
void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail");
- LLComboBox* ctrl_shadows_quality = getChild<LLComboBox>("MPShadowQuality");
LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText");
- LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
@@ -292,9 +290,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
//deferred needs windlight, disable deferred
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
ctrl_ssao->setEnabled(false);
ctrl_ssao->setValue(false);
@@ -308,9 +304,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
ctrl_ssao->setEnabled(false);
ctrl_ssao->setValue(false);
@@ -331,9 +325,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()
{
ctrl_shadows->setEnabled(false);
ctrl_shadows->setValue(0);
- ctrl_shadows_quality->setEnabled(false);
shadows_text->setEnabled(false);
- shadows_quality_text->setEnabled(false);
}
// Vintage mode
@@ -363,9 +355,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");
LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");
LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail");
- LLComboBox* ctrl_shadow_quality = getChild<LLComboBox>("MPShadowQuality");
LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText");
- LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");
// note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO");// && ctrl_deferred->get();
@@ -378,9 +368,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");
ctrl_shadow->setEnabled(enabled);
- ctrl_shadow_quality->setEnabled(enabled);
shadow_text->setEnabled(enabled);
- shadows_quality_text->setEnabled(enabled);
// Hardware settings
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 112008172e..fffc520d9c 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -728,8 +728,7 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- gGL.flush();
- glLineWidth( (F32)line_width );
+ LLRender2D::setLineWidth(line_width);
last_line_width = line_width;
}
@@ -758,8 +757,7 @@ void LLViewerObjectList::renderObjectBeacons()
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- gGL.flush();
- glLineWidth( (F32)line_width );
+ LLRender2D::setLineWidth(line_width);
last_line_width = line_width;
}
@@ -772,8 +770,7 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.end();
}
- gGL.flush();
- glLineWidth(1.f);
+ LLRender2D::setLineWidth(1.f);
for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
@@ -808,7 +805,9 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di
{
pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]);
}
- glLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth);
+
+ LLRender2D::setLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth);
+
gGL.begin(LLRender::LINES);
color.mV[3] *= 0.5f;
gGL.color4fv(color.mV);
@@ -818,9 +817,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di
gGL.vertex3fv(pos_end.mV);
gGL.end();
- gGL.flush();
- glLineWidth(1.f);
-
+ LLRender2D::setLineWidth(1.f);
}
//-----------------------------------------------------------------------------
@@ -977,7 +974,7 @@ F32 gpu_benchmark()
delete[] pixels;
return -1.f;
}
- dest[i].bindTarget();
+ dest[i].bindTarget("", 1);
dest[i].clear();
dest[i].flush();
@@ -1039,7 +1036,7 @@ F32 gpu_benchmark()
// run GPU timer benchmark
{
ShaderProfileHelper initProfile;
- dest[0].bindTarget();
+ dest[0].bindTarget("benchmark", 1);
gBenchmarkProgram.bind();
for (S32 c = 0; c < samples; ++c)
{
diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp
index da1f1a466f..daa3d62efe 100644
--- a/indra/newview/llgltfmaterialpreviewmgr.cpp
+++ b/indra/newview/llgltfmaterialpreviewmgr.cpp
@@ -425,6 +425,8 @@ bool LLGLTFPreviewTexture::render()
if (!mShouldRender) { return false; }
+ LL_WARNS() << "LLGLTFPreviewTexture:render()" << LL_ENDL;
+
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -520,19 +522,41 @@ bool LLGLTFPreviewTexture::render()
// *HACK: Hide mExposureMap from generateExposure
gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure);
- gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap);
- gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap);
- gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false);
- gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap);
+ //bool hdr = gPipeline.has_hdr();
+ bool hdr = true;
+
+ if (hdr)
+ {
+ gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap);
+ gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap);
+ gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false);
+ }
+
+ U16 activeRT = 0;
+ gPipeline.gammaCorrect(&screen, &gPipeline.mPostMaps[activeRT]);
+
LLVertexBuffer::unbind();
- gPipeline.generateGlow(&gPipeline.mPostMap);
- gPipeline.combineGlow(&gPipeline.mPostMap, &screen);
- gPipeline.renderDoF(&screen, &gPipeline.mPostMap);
- gPipeline.applyFXAA(&gPipeline.mPostMap, &screen);
+
+ gPipeline.generateGlow(&gPipeline.mPostMaps[activeRT]);
+ gPipeline.combineGlow(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]);
+ activeRT = 1-activeRT;
+
+ if(gPipeline.renderDoF(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]))
+ {
+ activeRT = 1-activeRT;
+ }
+
+ if(gPipeline.applyFXAA(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]))
+ {
+ activeRT = 1-activeRT;
+ }
// *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame)
gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure);
+ gPipeline.copyRenderTarget(&gPipeline.mPostMaps[activeRT], &screen);
+
+
// Final render
gDeferredPostNoDoFProgram.bind();
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 044d08faf1..4d27e3d92e 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -3717,16 +3717,10 @@ bool LLModelPreview::render()
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
gGL.diffuseColor4fv(PREVIEW_PSYH_EDGE_COL.mV);
- glLineWidth(PREVIEW_PSYH_EDGE_WIDTH);
-#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-#endif
buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);
-#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-#endif
- glLineWidth(1.f);
buffer->unmapBuffer();
}
@@ -3738,10 +3732,7 @@ bool LLModelPreview::render()
// only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]
if (mHasDegenerate)
{
- glLineWidth(PREVIEW_DEG_EDGE_WIDTH);
-#if GL_VERSION_1_1
glPointSize(PREVIEW_DEG_POINT_SIZE);
-#endif
gPipeline.enableLightsFullbright();
//show degenerate triangles
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
@@ -3810,10 +3801,8 @@ bool LLModelPreview::render()
gGL.popMatrix();
}
- glLineWidth(1.f);
-#if GL_VERSION_1_1
+ //glLineWidth(1.f);
glPointSize(1.f);
-#endif
gPipeline.enableLightsPreview();
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
@@ -3934,15 +3923,10 @@ bool LLModelPreview::render()
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV);
- glLineWidth(PREVIEW_EDGE_WIDTH);
-#if GL_VERSION_1_1
+ //glLineWidth(PREVIEW_EDGE_WIDTH);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
-#endif
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
-#if GL_VERSION_1_1
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-#endif
- glLineWidth(1.f);
}
}
}
diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h
index a818793550..9d960f5f9c 100644
--- a/indra/newview/llreflectionmap.h
+++ b/indra/newview/llreflectionmap.h
@@ -103,6 +103,9 @@ public:
// last time this probe was bound for rendering
F32 mLastBindTime = 0.f;
+ // Next update time
+ F32 mNextUpdateTime = 0.f;
+
// cube map used to sample this environment map
LLPointer<LLCubeMapArray> mCubeArray;
S32 mCubeIndex = -1; // index into cube map array or -1 if not currently stored in cube map array
@@ -110,6 +113,9 @@ public:
// probe has had at least one full update and is ready to render
bool mComplete = false;
+ // number of tiees the probe has been completed
+ U32 mCompletedCount = 0;
+
// fade in parameter for this probe
F32 mFadeIn = 0.f;
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index c1815ad57e..9f8a21694f 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -54,6 +54,7 @@
#endif
LLPointer<LLImageGL> gEXRImage;
+//LLTrace::BlockTimerStatHandle FTM_RENDER_RADIANCE("Render Radiance");
void load_exr(const std::string& filename)
{
@@ -226,6 +227,25 @@ void LLReflectionMapManager::update()
static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);
static LLCachedControl<U32> sReflectionProbeCount(gSavedSettings, "RenderReflectionProbeCount", 256U);
static LLCachedControl<S32> sProbeDynamicAllocation(gSavedSettings, "RenderReflectionProbeDynamicAllocation", -1);
+
+ static LLCachedControl<F32> sProbeUpdateSlowDown(gSavedSettings, "MPRenderProbeSlowDown", 0.f);
+
+ bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
+
+ if(sProbeUpdateSlowDown > 0.0)
+ {
+ if ( mLastUpdate > 0.f )
+ {
+ F32 elapsed = gFrameTimeSeconds - mLastUpdate;
+ if (elapsed > 0.0 && elapsed < sProbeUpdateSlowDown)
+ {
+ return;
+ }
+ }
+ }
+
+ mLastUpdate = gFrameTimeSeconds;
+
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
{
@@ -275,9 +295,16 @@ void LLReflectionMapManager::update()
static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
+ U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8;
+
+ static LLCachedControl<bool> MPLowColorPrecision(gSavedSettings, "MPLowColorPrecision", 0);
+ if(MPLowColorPrecision)
+ {
+ color_fmt = GL_RGB8;
+ }
+
if (!mRenderTarget.isComplete())
{
- U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8;
U32 targetRes = mProbeResolution * 4; // super sample
mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);
}
@@ -290,7 +317,7 @@ void LLReflectionMapManager::update()
mMipChain.resize(count);
for (U32 i = 0; i < count; ++i)
{
- mMipChain[i].allocate(res, res, render_hdr ? GL_R11F_G11F_B10F : GL_RGB8);
+ mMipChain[i].allocate(res, res, color_fmt);
res /= 2;
}
}
@@ -328,8 +355,6 @@ void LLReflectionMapManager::update()
bool did_update = false;
- bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;
-
LLReflectionMap* closestDynamic = nullptr;
LLReflectionMap* oldestProbe = nullptr;
@@ -362,6 +387,9 @@ void LLReflectionMapManager::update()
probe->mCubeArray = nullptr;
probe->mCubeIndex = -1;
probe->mComplete = false;
+ probe->mCompletedCount = 0;
+ probe->mLastUpdateTime = 0.0;
+ probe->mNextUpdateTime = 0.0;
probe->mFadeIn = 0;
}
}
@@ -385,6 +413,9 @@ void LLReflectionMapManager::update()
mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);
+ static LLCachedControl<F32> sDefaultUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f);
+ static LLCachedControl<F32> sMPUpdatePeriod(gSavedSettings, "MPRenderProbeUpdatePeriod", 2.f);
+
for (unsigned int i = 0; i < mProbes.size(); ++i)
{
LLReflectionMap* probe = mProbes[i];
@@ -401,6 +432,8 @@ void LLReflectionMapManager::update()
continue;
}
+ // Calculating distance
+
LLVector4a d;
if (probe != mDefaultProbe)
@@ -412,14 +445,18 @@ void LLReflectionMapManager::update()
d.setSub(camera_pos, probe->mOrigin);
probe->mDistance = d.getLength3().getF32() - probe->mRadius;
}
- else if (probe->mComplete)
- {
- // make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once)
- probe->mDistance = 64.f;
- }
else
{
- probe->mDistance = -4096.f; //boost priority of default probe when it's not complete
+ if (mDefaultProbe->mComplete)
+ {
+ // make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once)
+ probe->mDistance = 64.f;
+ }
+ else
+ {
+ probe->mNextUpdateTime = 0.f;
+ probe->mDistance = -4096.f; //boost priority of default probe when it's not complete
+ }
}
if (probe->mComplete)
@@ -427,8 +464,13 @@ void LLReflectionMapManager::update()
probe->autoAdjustOrigin();
probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);
}
+
+ // Guess oldest probe
+
if (probe->mOccluded && probe->mComplete)
{
+ // occluded probe
+
if (oldestOccluded == nullptr)
{
oldestOccluded = probe;
@@ -445,7 +487,7 @@ void LLReflectionMapManager::update()
(oldestProbe == nullptr ||
check_priority(probe, oldestProbe)))
{
- oldestProbe = probe;
+ oldestProbe = probe;
}
}
@@ -465,6 +507,8 @@ void LLReflectionMapManager::update()
}
}
+ // realtime
+
if (realtime && closestDynamic != nullptr)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime");
@@ -480,23 +524,24 @@ void LLReflectionMapManager::update()
{
updateProbeFace(closestDynamic, i);
}
+ if(mRealtimeRadiancePass) updateProbeRadiance(closestDynamic);
+ else updateProbeIrradiance(closestDynamic);
mRealtimeRadiancePass = !mRealtimeRadiancePass;
// restore "isRadiancePass"
mRadiancePass = radiance_pass;
}
- static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f);
- if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod)
+ if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sDefaultUpdatePeriod)
{
- if (sLevel == 0)
+ if (sLevel == 0 && mDefaultProbe->mComplete)
{ // when probes are disabled don't update the default probe more often than the prescribed update period
oldestProbe = nullptr;
}
}
else if (sLevel > 0)
{ // when probes are enabled don't update the default probe less often than the prescribed update period
- oldestProbe = mDefaultProbe;
+ oldestProbe = mDefaultProbe;
}
// switch to updating the next oldest probe
@@ -505,11 +550,33 @@ void LLReflectionMapManager::update()
LLReflectionMap* probe = oldestProbe;
llassert(probe->mCubeIndex != -1);
- probe->autoAdjustOrigin();
+ bool shouldUpdate = true;
- sUpdateCount++;
- mUpdatingProbe = probe;
- doProbeUpdate();
+ if( probe->mNextUpdateTime > 0.f && gFrameTimeSeconds < probe->mNextUpdateTime)
+ {
+ shouldUpdate = false;
+ }
+
+ if(shouldUpdate)
+ {
+ probe->autoAdjustOrigin();
+
+ sUpdateCount++;
+ mUpdatingProbe = probe;
+
+ if(probe->mCompletedCount < 2)
+ {
+ LL_WARNS() << "we program a short delay for this probe" << LL_ENDL;
+ probe->mNextUpdateTime = gFrameTimeSeconds + fmax( ((F32)sMPUpdatePeriod / 2.0), 0.25);
+ }
+ else
+ {
+ LL_WARNS() << "we program a long delay for this probe" << LL_ENDL;
+ probe->mNextUpdateTime = gFrameTimeSeconds + fmax( (F32)sMPUpdatePeriod, 0.25);
+ }
+
+ doProbeUpdate();
+ }
}
if (oldestOccluded)
@@ -717,32 +784,63 @@ void LLReflectionMapManager::doProbeUpdate()
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
llassert(mUpdatingProbe != nullptr);
- updateProbeFace(mUpdatingProbe, mUpdatingFace);
+ static LLCachedControl<bool> mp_progressive(gSavedSettings, "MPRenderProbeProgressive", false);
+
+ if(mUpdatingFace < 6)
+ {
+ updateProbeFace(mUpdatingProbe, mUpdatingFace, mp_progressive);
+ }
+ else if(mp_progressive)
+ {
+ if(isRadiancePass())
+ {
+ //updateProbeRadiance(mUpdatingProbe);
+ }
+ else updateProbeIrradiance(mUpdatingProbe);
+ }
+ else
+ {
+ if(isRadiancePass())
+ {
+ updateProbeRadiance(mUpdatingProbe);
+ }
+ else updateProbeIrradiance(mUpdatingProbe);
+ }
bool debug_updates = gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PROBE_UPDATES) && mUpdatingProbe->mViewerObject;
- if (++mUpdatingFace == 6)
+ if (mUpdatingFace == 6)
{
if (debug_updates)
{
mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 1, 1));
}
+
updateNeighbors(mUpdatingProbe);
+
mUpdatingFace = 0;
+
if (isRadiancePass())
{
mUpdatingProbe->mComplete = true;
+ mUpdatingProbe->mCompletedCount++;
mUpdatingProbe = nullptr;
mRadiancePass = false;
+ LL_WARNS() << "probe updated !" << LL_ENDL;
}
else
{
mRadiancePass = true;
}
}
- else if (debug_updates)
+ else
{
- mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1));
+ ++mUpdatingFace;
+
+ if (debug_updates)
+ {
+ mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1));
+ }
}
}
@@ -754,7 +852,7 @@ void LLReflectionMapManager::doProbeUpdate()
// The next six passes render the scene with both radiance and irradiance into the same scratch space cube map and generate a simple mip chain.
// At the end of these passes, a radiance map is generated for this probe and placed into the radiance cube map array at the index for this probe.
// In effect this simulates single-bounce lighting.
-void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
+void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool progressive)
{
// hacky hot-swap of camera specific render targets
gPipeline.mRT = &gPipeline.mAuxillaryRT;
@@ -795,12 +893,13 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
sourceIdx += 1;
}
- gGL.setColorMask(true, true);
+ gGL.setColorMask(true, false);
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
// downsample to placeholder map
+
{
gGL.matrixMode(gGL.MM_MODELVIEW);
gGL.pushMatrix();
@@ -829,7 +928,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
// horizontal
gGaussianProgram.uniform2f(direction, 1.f, 0.f);
gGL.getTexUnit(diffuseChannel)->bind(screen_rt);
- mRenderTarget.bindTarget();
+ mRenderTarget.bindTarget("", 1);
+ mRenderTarget.clear(0);
gPipeline.mScreenTriangleVB->setBuffer();
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
mRenderTarget.flush();
@@ -837,22 +937,26 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
// vertical
gGaussianProgram.uniform2f(direction, 0.f, 1.f);
gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget);
- screen_rt->bindTarget();
+ screen_rt->bindTarget("", 1);
+ screen_rt->clear(0);
gPipeline.mScreenTriangleVB->setBuffer();
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
screen_rt->flush();
}
-
S32 mips = (S32)(log2((F32)mProbeResolution) + 0.5f);
gReflectionMipProgram.bind();
+
S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);
for (int i = 0; i < mMipChain.size(); ++i)
{
LL_PROFILE_GPU_ZONE("probe mip");
- mMipChain[i].bindTarget();
+
+ mMipChain[i].bindTarget("probe face ", 0);
+ mMipChain[i].clear(0);
+
if (i == 0)
{
gGL.getTexUnit(diffuseChannel)->bind(screen_rt);
@@ -862,7 +966,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
gGL.getTexUnit(diffuseChannel)->bind(&(mMipChain[i - 1]));
}
-
gReflectionMipProgram.uniform1f(resScale, 1.f/(mProbeResolution*2));
gPipeline.mScreenTriangleVB->setBuffer();
@@ -897,116 +1000,297 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)
gReflectionMipProgram.unbind();
}
- if (face == 5)
+ if(progressive)
{
- mMipChain[0].bindTarget();
- static LLStaticHashedString sSourceIdx("sourceIdx");
+ if(isRadiancePass()) updateProbeRadianceOnFace(probe, face, sourceIdx);
+ }
- if (isRadiancePass())
+ // if(isRadiancePass()) updateProbeRadianceOnFace(probe, face, sourceIdx);
+ //else updateProbeIrradianceOnFace(probe, face, sourceIdx);
+}
+
+// ===================== IRRADIANCE ================================
+
+void LLReflectionMapManager::updateProbeIrradiance(LLReflectionMap* probe)
+{
+ LL_PROFILE_GPU_ZONE("probe irradiance gen");
+
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
+
+ S32 sourceIdx = mReflectionProbeCount;
+
+ if (probe != mUpdatingProbe)
+ { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel
+ sourceIdx += 1;
+ }
+
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ static LLStaticHashedString sSourceIdx("sourceIdx");
+
+ LL_WARNS() << "IRRADIANCE 1" << LL_ENDL;
+
+ mMipChain[0].bindTarget("irradiance", 0);
+ mMipChain[0].clear(0);
+
+ gIrradianceGenProgram.bind();
+
+ S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
+ mTexture->bind(channel);
+
+ gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
+ gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+
+ mVertexBuffer->setBuffer();
+
+ int start_mip = 0;
+ // find the mip target to start with based on irradiance map resolution
+ for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip)
+ {
+ if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)
{
- //generate radiance map (even if this is not the irradiance map, we need the mip chain for the irradiance map)
- gRadianceGenProgram.bind();
- mVertexBuffer->setBuffer();
+ break;
+ }
+ }
-#if GL_VERSION_4_0
- S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
- mTexture->bind(channel);
-#endif
- gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
- gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
- gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f);
+ int i = start_mip;
- U32 res = mMipChain[0].getWidth();
+ //LL_PROFILE_GPU_ZONE("probe irradiance gen");
- for (int i = 0; i < mMipChain.size(); ++i)
- {
- LL_PROFILE_GPU_ZONE("probe radiance gen");
- static LLStaticHashedString sMipLevel("mipLevel");
- static LLStaticHashedString sRoughness("roughness");
- static LLStaticHashedString sWidth("u_width");
+ glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight());
- gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
- gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
- gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
+ for (int cf = 0; cf < 6; ++cf)
+ {
+ LLCoordFrame frame;
+ frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
- for (int cf = 0; cf < 6; ++cf)
- { // for each cube face
- LLCoordFrame frame;
- frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+ F32 mat[16];
+ frame.getOpenGLRotation(mat);
+ gGL.loadMatrix(mat);
- F32 mat[16];
- frame.getOpenGLRotation(mat);
- gGL.loadMatrix(mat);
+ mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
- mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+ S32 res = mMipChain[i].getWidth();
-#if GL_VERSION_4_0
- glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
-#endif
- }
+ mIrradianceMaps->bind(channel);
+ glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
+ mTexture->bind(channel);
+ //mMipChain[0].clear(0);
+ }
- if (i != mMipChain.size() - 1)
- {
- res /= 2;
- glViewport(0, 0, res, res);
- }
- }
+ mMipChain[0].flush();
+ gIrradianceGenProgram.unbind();
+}
+
+// ==================== RADIANCE ===========================
+
+void LLReflectionMapManager::updateProbeRadiance(LLReflectionMap* probe)
+{
+ LL_PROFILE_GPU_ZONE("probe radiance gen");
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
+
+ S32 sourceIdx = mReflectionProbeCount;
+
+ if (probe != mUpdatingProbe)
+ { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel
+ sourceIdx += 1;
+ }
+
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ static LLStaticHashedString sSourceIdx("sourceIdx");
- gRadianceGenProgram.unbind();
+ LL_WARNS() << "RADIANCE" << LL_ENDL;
+ //LL_RECORD_BLOCK_TIME(FTM_RENDER_RADIANCE);
+
+ mMipChain[0].bindTarget("radiance", 0);
+ mMipChain[0].clear();
+
+ gRadianceGenProgram.bind();
+ mVertexBuffer->setBuffer();
+
+ S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
+ mTexture->bind(channel);
+
+ gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
+ gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+ gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f);
+ gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
+
+ U32 res = mMipChain[0].getWidth();
+
+ for (int i = 0; i < mMipChain.size(); ++i)
+ {
+ glViewport(0, 0, res, res);
+
+
+ gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
+ gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
+
+ for (int cf = 0; cf < 6; ++cf)
+ {
+ LLCoordFrame frame;
+ frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+
+ F32 mat[16];
+ frame.getOpenGLRotation(mat);
+ gGL.loadMatrix(mat);
+
+ mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+
+ glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
+ LOG_GLERROR("glCopyTexSubImage3D");
}
- else
+
+ if (i != mMipChain.size() - 1)
{
- //generate irradiance map
- gIrradianceGenProgram.bind();
-#if GL_VERSION_4_0
- S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
- mTexture->bind(channel);
-#endif
+ res /= 2;
+ }
+ }
- gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
- gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+ gRadianceGenProgram.unbind();
+ mMipChain[0].flush();
+ //mTexture->unbind();
+}
- mVertexBuffer->setBuffer();
- int start_mip = 0;
- // find the mip target to start with based on irradiance map resolution
- for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip)
- {
- if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)
- {
- break;
- }
- }
+// ================== PER FACE =======================
- //for (int i = start_mip; i < mMipChain.size(); ++i)
- {
- int i = start_mip;
- LL_PROFILE_GPU_ZONE("probe irradiance gen");
- glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight());
- for (int cf = 0; cf < 6; ++cf)
- { // for each cube face
- LLCoordFrame frame;
- frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+void LLReflectionMapManager::updateProbeIrradianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx)
+{
+ LL_PROFILE_GPU_ZONE("probe irradiance gen");
- F32 mat[16];
- frame.getOpenGLRotation(mat);
- gGL.loadMatrix(mat);
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
- mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
- S32 res = mMipChain[i].getWidth();
-#if GL_VERSION_4_0
- mIrradianceMaps->bind(channel);
- glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
- mTexture->bind(channel);
-#endif
- }
- }
+ static LLStaticHashedString sSourceIdx("sourceIdx");
+
+ //LL_WARNS() << "IRRADIANCE" << LL_ENDL;
+
+ mMipChain[0].bindTarget("irradiance", 0);
+ //mMipChain[0].clear();
+
+ gIrradianceGenProgram.bind();
+
+ S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
+ mTexture->bind(channel);
+
+ gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
+ gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+
+ mVertexBuffer->setBuffer();
+
+ int start_mip = 0;
+ // find the mip target to start with based on irradiance map resolution
+ for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip)
+ {
+ if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)
+ {
+ break;
}
+ }
+
+ int i = start_mip;
+ glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight());
- mMipChain[0].flush();
+ int cf = face;
+ {
+ LLCoordFrame frame;
+ frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+
+ F32 mat[16];
+ frame.getOpenGLRotation(mat);
+ gGL.loadMatrix(mat);
- gIrradianceGenProgram.unbind();
+ mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+
+ S32 res = mMipChain[i].getWidth();
+ mIrradianceMaps->bind(channel);
+ glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
}
+
+ mMipChain[0].flush();
+ gIrradianceGenProgram.unbind();
+ mTexture->unbind();
+}
+
+void LLReflectionMapManager::updateProbeRadianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx)
+{
+ LL_PROFILE_GPU_ZONE("probe radiance gen");
+ static LLStaticHashedString sMipLevel("mipLevel");
+ static LLStaticHashedString sRoughness("roughness");
+ static LLStaticHashedString sWidth("u_width");
+
+ gGL.setColorMask(true, false);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable cull(GL_CULL_FACE);
+ LLGLDisable blend(GL_BLEND);
+
+ static LLStaticHashedString sSourceIdx("sourceIdx");
+
+ mMipChain[0].bindTarget("radiance", 0);
+ mMipChain[0].clear(0);
+
+ gRadianceGenProgram.bind();
+ mVertexBuffer->setBuffer();
+
+ S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
+ mTexture->bind(channel);
+
+ gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
+ gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
+ gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f);
+ gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
+
+ U32 res = mMipChain[0].getWidth();
+
+ for (int i = 0; i < mMipChain.size(); ++i)
+ {
+ glViewport(0, 0, res, res);
+
+ gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i);
+ gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
+
+ int cf = face;
+ {
+ LLCoordFrame frame;
+ frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]);
+
+ F32 mat[16];
+ frame.getOpenGLRotation(mat);
+ gGL.loadMatrix(mat);
+
+ mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4);
+
+ glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);
+ LOG_GLERROR("glCopyTexSubImage3D");
+ //mMipChain[0].clear(0);
+ }
+
+ if (i != mMipChain.size() - 1)
+ {
+ res /= 2;
+ }
+ }
+
+ gRadianceGenProgram.unbind();
+ mMipChain[0].flush();
+ mTexture->unbind();
}
void LLReflectionMapManager::reset()
@@ -1109,6 +1393,7 @@ void LLReflectionMapManager::updateUniforms()
LLSettingsSky::ptr_t psky = environment.getCurrentSky();
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false);
+
F32 minimum_ambiance = psky->getReflectionProbeAmbiance(should_auto_adjust);
bool is_ambiance_pass = gCubeSnapshot && !isRadiancePass();
@@ -1426,8 +1711,13 @@ void LLReflectionMapManager::initReflectionMaps()
{
static LLCachedControl<U32> ref_probe_res(gSavedSettings, "RenderReflectionProbeResolution", 128U);
U32 probe_resolution = nhpo2(llclamp(ref_probe_res(), (U32)64, (U32)512));
- if (mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset)
+
+ bool shouldInit = mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset;
+
+ if (shouldInit)
{
+ //LL_WARNS() << "====== initReflectionMaps() =======" << LL_ENDL;
+
if(mProbeResolution != probe_resolution)
{
mRenderTarget.release();
@@ -1444,6 +1734,8 @@ void LLReflectionMapManager::initReflectionMaps()
mTexture->getWidth() != mProbeResolution ||
mReflectionProbeCount + 2 != mTexture->getCount())
{
+ static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
+
if (mTexture)
{
mTexture = new LLCubeMapArray(*mTexture, mProbeResolution, mReflectionProbeCount + 2);
@@ -1453,13 +1745,9 @@ void LLReflectionMapManager::initReflectionMaps()
else
{
mTexture = new LLCubeMapArray();
-
- static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true);
-
// store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation
// source)
mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr);
-
mIrradianceMaps = new LLCubeMapArray();
mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr);
}
@@ -1477,7 +1765,9 @@ void LLReflectionMapManager::initReflectionMaps()
for (auto& probe : mProbes)
{
probe->mLastUpdateTime = 0.f;
+ probe->mNextUpdateTime = 0.f;
probe->mComplete = false;
+ probe->mCompletedCount = 0;
probe->mProbeIndex = -1;
probe->mCubeArray = nullptr;
probe->mCubeIndex = -1;
@@ -1503,8 +1793,13 @@ void LLReflectionMapManager::initReflectionMaps()
mDefaultProbe->mRadius = 4096.f;
mDefaultProbe->mProbeIndex = 0;
mDefaultProbe->mComplete = default_complete;
+ mDefaultProbe->mCompletedCount = 0;
+ mDefaultProbe->mLastUpdateTime = 0.f;
+ mDefaultProbe->mNextUpdateTime = 0.f;
touch_default_probe(mDefaultProbe);
+
+ LL_WARNS() << "====== END initReflectionMaps() =======" << LL_ENDL;
}
if (mVertexBuffer.isNull())
diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h
index 0719c28134..b874bb1c17 100644
--- a/indra/newview/llreflectionmapmanager.h
+++ b/indra/newview/llreflectionmapmanager.h
@@ -210,7 +210,14 @@ private:
void doProbeUpdate();
// update the specified face of the specified probe
- void updateProbeFace(LLReflectionMap* probe, U32 face);
+ void updateProbeFace(LLReflectionMap* probe, U32 face, bool progressive = false);
+
+ void updateProbeIrradiance(LLReflectionMap* probe);
+ void updateProbeRadiance(LLReflectionMap* probe);
+
+ void updateProbeIrradianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx);
+ void updateProbeRadianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx);
+
// list of active reflection maps
std::vector<LLPointer<LLReflectionMap> > mProbes;
@@ -267,6 +274,8 @@ private:
bool mPaused = false;
F32 mResumeTime = 0.f;
+ F32 mLastUpdate = 0.f;
+
ReflectionProbeData mProbeData;
};
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 8286054787..183a9a9924 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6531,10 +6531,8 @@ void LLSelectMgr::renderSilhouettes(bool for_hud)
gGL.popMatrix();
gGL.popMatrix();
- glLineWidth(1.f);
-#if GL_VERSION_1_1
+ //glLineWidth(1.f);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
-#endif
if (shader)
{
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 68b4ab381a..445132632b 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -238,11 +238,11 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y, LLColor4
{
F32 line_width ;
glGetFloatv(GL_LINE_WIDTH, &line_width) ;
- glLineWidth(2.0f * line_width) ;
+ //glLineWidth(2.0f * line_width) ;
LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ;
gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y,
mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, false ) ;
- glLineWidth(line_width) ;
+ //glLineWidth(line_width) ;
//draw four alpha rectangles to cover areas outside of the snapshot image
if(!mKeepAspectRatio)
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index a90ff73578..a147cb4657 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -1661,12 +1661,12 @@ void renderOctree(LLSpatialGroup* group)
gGL.diffuseColor4f(1,0,0,group->mBuilt);
gGL.flush();
- glLineWidth(5.f);
+ //glLineWidth(5.f);
const LLVector4a* bounds = group->getObjectBounds();
drawBoxOutline(bounds[0], bounds[1]);
- gGL.flush();
- glLineWidth(1.f);
+ //gGL.flush();
+ //glLineWidth(1.f);
gGL.flush();
const LLVOAvatar* lastAvatar = nullptr;
@@ -1978,12 +1978,11 @@ void renderBoundingBox(LLDrawable* drawable, bool set_color = true)
if (vobj && vobj->onActiveList())
{
gGL.flush();
- glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f));
- //glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f));
- stop_glerror();
+ //glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f));
+ stop_glerror();
drawBoxOutline(pos,size);
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
else
{
@@ -2897,7 +2896,7 @@ public:
if (i == 1)
{
gGL.flush();
- glLineWidth(3.f);
+ //glLineWidth(3.f);
}
gGL.begin(LLRender::TRIANGLES);
@@ -2916,7 +2915,7 @@ public:
if (i == 1)
{
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
}
}
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index bda75c16e7..7d397cddcc 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -307,9 +307,21 @@ void LLStatusBar::refresh()
mFpsUpdateTimer->reset();
S32 fps = (S32) llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, 50));
+ if(fps < 1) fps = 1;
+
+ S32 minFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMinPerSec(LLStatViewer::FPS, 50));
+ S32 maxFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMaxPerSec(LLStatViewer::FPS, 50));
+
+ F32 fpsQuality = (F32)minFps / (F32)fps;
+
std::string fpsStr = std::to_string(fps);
- //mTextFps->setText(fpsStr);
+
mTextFps->setLabel(fpsStr);
+
+ if(fpsQuality < 0.5) mTextFps->setColor(LLColor4(0.6,0.0,0.0));
+ else if(fpsQuality < 0.7) mTextFps->setColor(LLColor4(0.7,0.5,0.0));
+ else if(fpsQuality < 0.9) mTextFps->setColor(LLColor4(0.5,0.7,0.0));
+ else mTextFps->setColor(LLColor4(0.0, 0.7, 0.15));
}
// update clock every 10 seconds
diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp
index c7a82013e4..8cb926a110 100644
--- a/indra/newview/llterrainpaintmap.cpp
+++ b/indra/newview/llterrainpaintmap.cpp
@@ -86,9 +86,10 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&
return false;
}
gGL.getTexUnit(0)->disable();
- stop_glerror();
- scratch_target.bindTarget();
+ LOG_GLERROR("");
+
+ scratch_target.bindTarget("", 1);
glClearColor(0, 0, 0, 0);
scratch_target.clear();
@@ -276,7 +277,7 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&
LL_WARNS() << "Failed to copy framebuffer to paintmap" << LL_ENDL;
}
glGenerateMipmap(GL_TEXTURE_2D);
- stop_glerror();
+ LOG_GLERROR("LLTerrainPainMap::bakeHeightNoiseIntoPBRPaintMapRGB() - glGenerateMipmap");
scratch_target.flush();
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index 6e790e4fca..fb060307cd 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -709,6 +709,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
if (!gDisconnected && !LLApp::isExiting())
{
+ // =========== MIRRORS =============
+
// Render mirrors and associated hero probes before we render the rest of the scene.
// This ensures the scene state in the hero probes are exactly the same as the rest of the scene before we render it.
if (gPipeline.RenderMirrors && !gSnapshot)
@@ -734,12 +736,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
display_update_camera();
stop_glerror();
+ // =========== ENV: SKY, WATER =============
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Env Update");
// update all the sky/atmospheric/water settings
LLEnvironment::instance().update(LLViewerCamera::getInstance());
}
+ // =========== EFFECTS (?) =============
// *TODO: merge these two methods
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("HUD Update");
@@ -748,6 +752,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
stop_glerror();
}
+ // =========== GEOMETRY =============
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update Geom");
const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds.value(); // 50 ms/second update time
@@ -778,6 +783,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLGLState::checkStates();
+ // =========== OCCLUSION =============
+
static LLCullResult result;
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();
@@ -803,12 +810,18 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
if (!for_snapshot)
{
- if (gFrameCount > 1 && !for_snapshot)
- { //for some reason, ATI 4800 series will error out if you
- //try to generate a shadow before the first frame is through
+
+ // =========== SHADOWS =============
+
+ S32 RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
+
+ if(RenderShadowDetail > 0 && gFrameCount > 1)
+ {
gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
}
+ // =========== IMPOSTORS =============
+
LLVertexBuffer::unbind();
LLGLState::checkStates();
@@ -832,6 +845,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT);
}
+
+ // =========== IMAGES =============
+
//////////////////////////////////////
//
// Update images, using the image stats generated during object update/culling
@@ -870,6 +886,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLGLState::checkStates();
+
+ // =========== SORTING OBJECTS =============
+
///////////////////////////////////
//
// StateSort
@@ -903,6 +922,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLPipeline::sUseOcclusion = occlusion;
+
+ // =========== SKY =============
+
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");
LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT("update sky"); //LL_RECORD_BLOCK_TIME(FTM_UPDATE_SKY);
@@ -954,6 +976,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
// gGL.popMatrix();
//}
+
+ // =========== DEFERRED =============
+
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();
LLGLState::checkStates();
@@ -962,7 +987,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gGL.setColorMask(true, true);
- gPipeline.mRT->deferredScreen.bindTarget();
+ gPipeline.mRT->deferredScreen.bindTarget("", 1);
if (gUseWireframe)
{
constexpr F32 g = 0.5f;
@@ -974,6 +999,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
}
gPipeline.mRT->deferredScreen.clear();
+
+ // =========== RENDER GEOMETRY =============
+
gGL.setColorMask(true, false);
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom");
@@ -984,7 +1012,11 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 5")
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
+
+ // =========== RENDER DEPTH PREPASS (UNUSED) =============
+
static LLCachedControl<bool> render_depth_pre_pass(gSavedSettings, "RenderDepthPrePass", false);
+
if (render_depth_pre_pass)
{
gGL.setColorMask(false, false);
@@ -1010,6 +1042,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
gPipeline.renderGeomDeferred(*LLViewerCamera::getInstance(), true);
}
+ // =========== UNBIND TEXTURES =============
+
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Texture Unbind");
for (S32 i = 0; i < gGLManager.mNumTextureImageUnits; i++)
@@ -1022,11 +1056,15 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
}
}
+ // =========== FLUSH =============
+
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");
LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mRT->deferredScreen : gPipeline.mRT->screen);
rt.flush();
+ // =========== RENDER DEFERRED =============
+
if (LLPipeline::sRenderDeferred)
{
gPipeline.renderDeferredLighting();
@@ -1039,10 +1077,16 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLSceneMonitor::getInstance()->capture();
}
+
+
+ // =========== RENDER UI =============
+
LLAppViewer::instance()->pingMainloopTimeout("Display:RenderUI");
if (!for_snapshot)
{
+ gGL.flush();
render_ui();
+ gGL.flush();
swap();
}
@@ -1053,8 +1097,6 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats");
- stop_glerror();
-
display_stats();
LLAppViewer::instance()->pingMainloopTimeout("Display:Done");
@@ -1203,8 +1245,8 @@ void display_cube_face()
gGL.setColorMask(true, true);
- glClearColor(0.f, 0.f, 0.f, 0.f);
- gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
+ glClearColor(0, 0, 0, 0);
+ //gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
glClear(GL_DEPTH_BUFFER_BIT); // | GL_STENCIL_BUFFER_BIT);
@@ -1232,7 +1274,7 @@ void display_cube_face()
gGL.setColorMask(true, true);
- gPipeline.mRT->deferredScreen.bindTarget();
+ gPipeline.mRT->deferredScreen.bindTarget("", 1);
if (gUseWireframe)
{
glClearColor(0.5f, 0.5f, 0.5f, 1.f);
@@ -1497,6 +1539,7 @@ void render_ui(F32 zoom_factor, int subfield)
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("HUD");
render_hud_elements();
LLGLState::checkStates();
+
render_hud_attachments();
LLGLState::checkStates();
@@ -1669,7 +1712,7 @@ void render_ui_3d()
LLHUDObject::renderAllForTimer();
}
- stop_glerror();
+ LOG_GLERROR("render_ui_3d()");
}
void render_ui_2d()
@@ -1719,7 +1762,7 @@ void render_ui_2d()
gl_rect_2d(-half_width, half_height, half_width, -half_height, false);
gGL.popMatrix();
gUIProgram.unbind();
- stop_glerror();
+ LOG_GLERROR("");
}
@@ -1730,7 +1773,7 @@ void render_ui_2d()
LLView::sIsRectDirty = false;
LLRect t_rect;
- gPipeline.mUIScreen.bindTarget();
+ gPipeline.mUIScreen.bindTarget("", 1);
gGL.setColorMask(true, true);
{
constexpr S32 pad = 8;
@@ -1788,6 +1831,8 @@ void render_ui_2d()
// reset current origin for font rendering, in case of tiling render
LLFontGL::sCurOrigin.set(0, 0);
+
+ LOG_GLERROR("render_ui_2d()");
}
void render_disconnected_background()
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index e36ad0e722..0bb03cdd60 100755
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -809,7 +809,7 @@ void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_me
const S32 GRIDS_PER_EDGE = mParcelGridsPerEdge;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
gGL.color4fv(parcel_outline_color);
for (S32 i = 0; i <= GRIDS_PER_EDGE; i++)
{
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index 7ef13c3a35..4d62adf3e2 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -137,6 +137,10 @@ LLGLSLShader gGlowProgram;
LLGLSLShader gGlowExtractProgram;
LLGLSLShader gPostScreenSpaceReflectionProgram;
+LLGLSLShader gBloomExtractProgram;
+LLGLSLShader gBloomBlurProgram;
+LLGLSLShader gBloomCombineProgram;
+
// Deferred rendering shaders
LLGLSLShader gDeferredImpostorProgram;
LLGLSLShader gDeferredDiffuseProgram;
@@ -802,7 +806,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()
if (shadow_detail >= 1)
{
- attribs["SUN_SHADOW"] = "1";
+ attribs["SUN_SHADOW"] = "1";
if (shadow_detail >= 2)
{
@@ -902,8 +906,9 @@ bool LLViewerShaderMgr::loadShadersWater()
bool success = true;
bool terrainWaterSuccess = true;
+ S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 &&
- gSavedSettings.getS32("RenderShadowDetail") > 0;
+ shadow_detail > 0;
if (mShaderLevel[SHADER_WATER] == 0)
{
@@ -1003,6 +1008,52 @@ bool LLViewerShaderMgr::loadShadersEffects()
if (success)
{
+ gBloomExtractProgram.mName = "Bloom Extract Shader";
+ gBloomExtractProgram.mShaderFiles.clear();
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractV.glsl", GL_VERTEX_SHADER));
+ gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractF.glsl", GL_FRAGMENT_SHADER));
+ gBloomExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomExtractProgram.createShader();
+ if (!success)
+ {
+ LL_WARNS() << "gBloomExtractProgram creation ERROR" << LL_ENDL;
+ //LLPipeline::sRenderGlow = false;
+ }
+ }
+
+ if (success)
+ {
+ gBloomBlurProgram.mName = "Bloom Blur Shader";
+ gBloomBlurProgram.mShaderFiles.clear();
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurV.glsl", GL_VERTEX_SHADER));
+ gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurF.glsl", GL_FRAGMENT_SHADER));
+ gBloomBlurProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomBlurProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomBlurProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
+ gBloomCombineProgram.mName = "Bloom Combine Shader";
+ gBloomCombineProgram.mShaderFiles.clear();
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineV.glsl", GL_VERTEX_SHADER));
+ gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineF.glsl", GL_FRAGMENT_SHADER));
+ gBloomCombineProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ success = gBloomCombineProgram.createShader();
+ if(!success)
+ {
+ LL_WARNS() << "gBloomCombineProgram creation ERROR" << LL_ENDL;
+ }
+ }
+
+ if (success)
+ {
gGlowProgram.mName = "Glow Shader (Post)";
gGlowProgram.mShaderFiles.clear();
gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER));
@@ -2482,9 +2533,9 @@ bool LLViewerShaderMgr::loadShadersDeferred()
if (success && gGLManager.mGLVersion > 3.9f)
{
std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"},
- {"23", "Medium"},
- {"28", "High"},
- {"39", "Ultra"} };
+ {"23", "Medium"},
+ {"28", "High"},
+ {"39", "Ultra"} };
int i = 0;
bool failed = false;
for (const auto& quality_pair : quality_levels)
@@ -2535,9 +2586,9 @@ bool LLViewerShaderMgr::loadShadersDeferred()
if (gGLManager.mGLVersion > 3.15f && success)
{
std::vector<std::pair<std::string, std::string>> quality_levels = { {"SMAA_PRESET_LOW", "Low"},
- {"SMAA_PRESET_MEDIUM", "Medium"},
- {"SMAA_PRESET_HIGH", "High"},
- {"SMAA_PRESET_ULTRA", "Ultra"} };
+ {"SMAA_PRESET_MEDIUM", "Medium"},
+ {"SMAA_PRESET_HIGH", "High"},
+ {"SMAA_PRESET_ULTRA", "Ultra"} };
int i = 0;
bool failed = false;
for (const auto& smaa_pair : quality_levels)
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index 7ad2da9464..89c4bb5605 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -24,301 +24,306 @@
* $/LicenseInfo$
*/
-#ifndef LL_VIEWER_SHADER_MGR_H
-#define LL_VIEWER_SHADER_MGR_H
-
-#include "llshadermgr.h"
-#include "llmaterial.h"
-
-#define LL_DEFERRED_MULTI_LIGHT_COUNT 16
-
-class LLViewerShaderMgr: public LLShaderMgr
-{
-public:
- static bool sInitialized;
- static bool sSkipReload;
-
- LLViewerShaderMgr();
- /* virtual */ ~LLViewerShaderMgr();
-
- // Add shaders to mShaderList for later uniform propagation
- // Will assert on redundant shader entries in debug builds
- void finalizeShaderList();
-
- // singleton pattern implementation
- static LLViewerShaderMgr * instance();
- static void releaseInstance();
-
- void initAttribsAndUniforms(void);
- void setShaders();
- void unloadShaders();
- S32 getShaderLevel(S32 type);
-
- // loadBasicShaders in case of a failure returns
- // name of a file error happened at, otherwise
- // returns an empty string
- std::string loadBasicShaders();
- bool loadShadersEffects();
- bool loadShadersDeferred();
- bool loadShadersObject();
- bool loadShadersAvatar();
- bool loadShadersWater();
- bool loadShadersInterface();
-
- std::vector<S32> mShaderLevel;
- S32 mMaxAvatarShaderLevel;
-
- enum EShaderClass
- {
- SHADER_LIGHTING,
- SHADER_OBJECT,
- SHADER_AVATAR,
- SHADER_ENVIRONMENT,
- SHADER_INTERFACE,
- SHADER_EFFECT,
- SHADER_WINDLIGHT,
- SHADER_WATER,
- SHADER_DEFERRED,
- SHADER_COUNT
- };
-
- // simple model of forward iterator
- // http://www.sgi.com/tech/stl/ForwardIterator.html
- class shader_iter
- {
- private:
- friend bool operator == (shader_iter const & a, shader_iter const & b);
- friend bool operator != (shader_iter const & a, shader_iter const & b);
-
- typedef std::vector<LLGLSLShader *>::const_iterator base_iter_t;
- public:
- shader_iter()
- {
- }
-
- shader_iter(base_iter_t iter) : mIter(iter)
- {
- }
-
- LLGLSLShader & operator * () const
- {
- return **mIter;
- }
-
- LLGLSLShader * operator -> () const
- {
- return *mIter;
- }
-
- shader_iter & operator++ ()
- {
- ++mIter;
- return *this;
- }
-
- shader_iter operator++ (int)
- {
- return mIter++;
- }
-
- private:
- base_iter_t mIter;
- };
-
- shader_iter beginShaders() const;
- shader_iter endShaders() const;
-
- /* virtual */ std::string getShaderDirPrefix(void);
-
- /* virtual */ void updateShaderUniforms(LLGLSLShader * shader);
-
-private:
- // the list of shaders we need to propagate parameters to.
- std::vector<LLGLSLShader *> mShaderList;
-
-}; //LLViewerShaderMgr
-
-inline bool operator == (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b)
-{
- return a.mIter == b.mIter;
-}
-
-inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b)
-{
- return a.mIter != b.mIter;
-}
-
-extern LLVector4 gShinyOrigin;
-
-//utility shaders
-extern LLGLSLShader gOcclusionProgram;
-extern LLGLSLShader gOcclusionCubeProgram;
-extern LLGLSLShader gGlowCombineProgram;
-extern LLGLSLShader gReflectionMipProgram;
-extern LLGLSLShader gGaussianProgram;
-extern LLGLSLShader gRadianceGenProgram;
-extern LLGLSLShader gHeroRadianceGenProgram;
-extern LLGLSLShader gIrradianceGenProgram;
-extern LLGLSLShader gGlowCombineFXAAProgram;
-extern LLGLSLShader gDebugProgram;
-enum NormalDebugShaderVariant : S32
-{
- NORMAL_DEBUG_SHADER_DEFAULT,
- NORMAL_DEBUG_SHADER_WITH_TANGENTS,
- NORMAL_DEBUG_SHADER_COUNT
-};
-extern LLGLSLShader gNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT];
-extern LLGLSLShader gSkinnedNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT];
-extern LLGLSLShader gClipProgram;
-extern LLGLSLShader gBenchmarkProgram;
-extern LLGLSLShader gReflectionProbeDisplayProgram;
-extern LLGLSLShader gCopyProgram;
-extern LLGLSLShader gCopyDepthProgram;
-extern LLGLSLShader gPBRTerrainBakeProgram;
-extern LLGLSLShader gDrawColorProgram;
-
-//output tex0[tc0] - tex1[tc1]
-extern LLGLSLShader gTwoTextureCompareProgram;
-//discard some fragments based on user-set color tolerance
-extern LLGLSLShader gOneTextureFilterProgram;
-
-
-//object shaders
-extern LLGLSLShader gObjectPreviewProgram;
-extern LLGLSLShader gPhysicsPreviewProgram;
-extern LLGLSLShader gObjectBumpProgram;
-extern LLGLSLShader gSkinnedObjectBumpProgram;
-extern LLGLSLShader gObjectAlphaMaskNoColorProgram;
-
-//environment shaders
-extern LLGLSLShader gWaterProgram;
-extern LLGLSLShader gUnderWaterProgram;
-extern LLGLSLShader gGlowProgram;
-extern LLGLSLShader gGlowExtractProgram;
-
-//interface shaders
-extern LLGLSLShader gHighlightProgram;
-extern LLGLSLShader gHighlightNormalProgram;
-extern LLGLSLShader gHighlightSpecularProgram;
-
-extern LLGLSLShader gDeferredHighlightProgram;
-
-extern LLGLSLShader gPathfindingProgram;
-extern LLGLSLShader gPathfindingNoNormalsProgram;
-
-// avatar shader handles
-extern LLGLSLShader gAvatarProgram;
-extern LLGLSLShader gAvatarEyeballProgram;
-extern LLGLSLShader gImpostorProgram;
-
-// Post Process Shaders
-extern LLGLSLShader gPostScreenSpaceReflectionProgram;
-
-// Deferred rendering shaders
-extern LLGLSLShader gDeferredImpostorProgram;
-extern LLGLSLShader gDeferredDiffuseProgram;
-extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
-extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
-extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
-extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
-extern LLGLSLShader gDeferredBumpProgram;
-extern LLGLSLShader gDeferredTerrainProgram;
-extern LLGLSLShader gDeferredTreeProgram;
-extern LLGLSLShader gDeferredTreeShadowProgram;
-extern LLGLSLShader gDeferredLightProgram;
-extern LLGLSLShader gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_COUNT];
-extern LLGLSLShader gDeferredSpotLightProgram;
-extern LLGLSLShader gDeferredMultiSpotLightProgram;
-extern LLGLSLShader gDeferredSunProgram;
-extern LLGLSLShader gDeferredSunProbeProgram;
-extern LLGLSLShader gHazeProgram;
-extern LLGLSLShader gHazeWaterProgram;
-extern LLGLSLShader gDeferredBlurLightProgram;
-extern LLGLSLShader gDeferredAvatarProgram;
-extern LLGLSLShader gDeferredSoftenProgram;
-extern LLGLSLShader gDeferredShadowProgram;
-extern LLGLSLShader gDeferredShadowCubeProgram;
-extern LLGLSLShader gDeferredShadowAlphaMaskProgram;
-extern LLGLSLShader gDeferredShadowGLTFAlphaMaskProgram;
-extern LLGLSLShader gDeferredShadowGLTFAlphaBlendProgram;
-extern LLGLSLShader gDeferredShadowFullbrightAlphaMaskProgram;
-extern LLGLSLShader gDeferredPostProgram;
-extern LLGLSLShader gDeferredCoFProgram;
-extern LLGLSLShader gDeferredDoFCombineProgram;
-extern LLGLSLShader gFXAAProgram[4];
-extern LLGLSLShader gSMAAEdgeDetectProgram[4];
-extern LLGLSLShader gSMAABlendWeightsProgram[4];
-extern LLGLSLShader gSMAANeighborhoodBlendProgram[4];
-extern LLGLSLShader gCASProgram;
-extern LLGLSLShader gDeferredPostNoDoFProgram;
-extern LLGLSLShader gDeferredPostNoDoFNoiseProgram;
-extern LLGLSLShader gDeferredPostGammaCorrectProgram;
-extern LLGLSLShader gLegacyPostGammaCorrectProgram;
-extern LLGLSLShader gDeferredPostTonemapProgram;
-extern LLGLSLShader gNoPostTonemapProgram;
-extern LLGLSLShader gExposureProgram;
-extern LLGLSLShader gExposureProgramNoFade;
-extern LLGLSLShader gLuminanceProgram;
-extern LLGLSLShader gDeferredAvatarShadowProgram;
-extern LLGLSLShader gDeferredAvatarAlphaShadowProgram;
-extern LLGLSLShader gDeferredAvatarAlphaMaskShadowProgram;
-extern LLGLSLShader gDeferredAlphaProgram;
-extern LLGLSLShader gHUDAlphaProgram;
-extern LLGLSLShader gDeferredAlphaImpostorProgram;
-extern LLGLSLShader gDeferredFullbrightProgram;
-extern LLGLSLShader gHUDFullbrightProgram;
-extern LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
-extern LLGLSLShader gHUDFullbrightAlphaMaskProgram;
-extern LLGLSLShader gDeferredFullbrightAlphaMaskAlphaProgram;
-extern LLGLSLShader gHUDFullbrightAlphaMaskAlphaProgram;
-extern LLGLSLShader gDeferredEmissiveProgram;
-extern LLGLSLShader gDeferredAvatarEyesProgram;
-extern LLGLSLShader gDeferredAvatarAlphaProgram;
-extern LLGLSLShader gEnvironmentMapProgram;
-extern LLGLSLShader gDeferredWLSkyProgram;
-extern LLGLSLShader gDeferredWLCloudProgram;
-extern LLGLSLShader gDeferredWLSunProgram;
-extern LLGLSLShader gDeferredWLMoonProgram;
-extern LLGLSLShader gDeferredStarProgram;
-extern LLGLSLShader gDeferredFullbrightShinyProgram;
-extern LLGLSLShader gHUDFullbrightShinyProgram;
-extern LLGLSLShader gNormalMapGenProgram;
-extern LLGLSLShader gDeferredGenBrdfLutProgram;
-extern LLGLSLShader gDeferredBufferVisualProgram;
-
-// Deferred materials shaders
-extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
-
-extern LLGLSLShader gHUDPBROpaqueProgram;
-extern LLGLSLShader gPBRGlowProgram;
-extern LLGLSLShader gDeferredPBROpaqueProgram;
-extern LLGLSLShader gDeferredPBRAlphaProgram;
-extern LLGLSLShader gHUDPBRAlphaProgram;
-
-// GLTF shaders
-extern LLGLSLShader gGLTFPBRMetallicRoughnessProgram;
-
-// Encodes detail level for dropping textures, in accordance with the GLTF spec where possible
-// 0 is highest detail, -1 drops emissive, etc
-// Dropping metallic roughness is off-spec - Reserve for potato machines as needed
-// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures
-enum TerrainPBRDetail : S32
-{
- TERRAIN_PBR_DETAIL_MAX = 0,
- TERRAIN_PBR_DETAIL_EMISSIVE = 0,
- TERRAIN_PBR_DETAIL_OCCLUSION = -1,
- TERRAIN_PBR_DETAIL_NORMAL = -2,
- TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS = -3,
- TERRAIN_PBR_DETAIL_BASE_COLOR = -4,
- TERRAIN_PBR_DETAIL_MIN = -4,
-};
-enum TerrainPaintType : U32
-{
- // Use LLVLComposition::mDatap (heightmap) generated by generateHeights, plus noise from TERRAIN_ALPHARAMP
- TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE = 0,
- // Use paint map if PBR terrain, otherwise fall back to TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
- TERRAIN_PAINT_TYPE_PBR_PAINTMAP = 1,
- TERRAIN_PAINT_TYPE_COUNT = 2,
-};
-extern LLGLSLShader gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT];
-#endif
+ #ifndef LL_VIEWER_SHADER_MGR_H
+ #define LL_VIEWER_SHADER_MGR_H
+
+ #include "llshadermgr.h"
+ #include "llmaterial.h"
+
+ #define LL_DEFERRED_MULTI_LIGHT_COUNT 16
+
+ class LLViewerShaderMgr: public LLShaderMgr
+ {
+ public:
+ static bool sInitialized;
+ static bool sSkipReload;
+
+ LLViewerShaderMgr();
+ /* virtual */ ~LLViewerShaderMgr();
+
+ // Add shaders to mShaderList for later uniform propagation
+ // Will assert on redundant shader entries in debug builds
+ void finalizeShaderList();
+
+ // singleton pattern implementation
+ static LLViewerShaderMgr * instance();
+ static void releaseInstance();
+
+ void initAttribsAndUniforms(void);
+ void setShaders();
+ void unloadShaders();
+ S32 getShaderLevel(S32 type);
+
+ // loadBasicShaders in case of a failure returns
+ // name of a file error happened at, otherwise
+ // returns an empty string
+ std::string loadBasicShaders();
+ bool loadShadersEffects();
+ bool loadShadersDeferred();
+ bool loadShadersObject();
+ bool loadShadersAvatar();
+ bool loadShadersWater();
+ bool loadShadersInterface();
+
+ std::vector<S32> mShaderLevel;
+ S32 mMaxAvatarShaderLevel;
+
+ enum EShaderClass
+ {
+ SHADER_LIGHTING,
+ SHADER_OBJECT,
+ SHADER_AVATAR,
+ SHADER_ENVIRONMENT,
+ SHADER_INTERFACE,
+ SHADER_EFFECT,
+ SHADER_WINDLIGHT,
+ SHADER_WATER,
+ SHADER_DEFERRED,
+ SHADER_COUNT
+ };
+
+ // simple model of forward iterator
+ // http://www.sgi.com/tech/stl/ForwardIterator.html
+ class shader_iter
+ {
+ private:
+ friend bool operator == (shader_iter const & a, shader_iter const & b);
+ friend bool operator != (shader_iter const & a, shader_iter const & b);
+
+ typedef std::vector<LLGLSLShader *>::const_iterator base_iter_t;
+ public:
+ shader_iter()
+ {
+ }
+
+ shader_iter(base_iter_t iter) : mIter(iter)
+ {
+ }
+
+ LLGLSLShader & operator * () const
+ {
+ return **mIter;
+ }
+
+ LLGLSLShader * operator -> () const
+ {
+ return *mIter;
+ }
+
+ shader_iter & operator++ ()
+ {
+ ++mIter;
+ return *this;
+ }
+
+ shader_iter operator++ (int)
+ {
+ return mIter++;
+ }
+
+ private:
+ base_iter_t mIter;
+ };
+
+ shader_iter beginShaders() const;
+ shader_iter endShaders() const;
+
+ /* virtual */ std::string getShaderDirPrefix(void);
+
+ /* virtual */ void updateShaderUniforms(LLGLSLShader * shader);
+
+ private:
+ // the list of shaders we need to propagate parameters to.
+ std::vector<LLGLSLShader *> mShaderList;
+
+ }; //LLViewerShaderMgr
+
+ inline bool operator == (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b)
+ {
+ return a.mIter == b.mIter;
+ }
+
+ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b)
+ {
+ return a.mIter != b.mIter;
+ }
+
+ extern LLVector4 gShinyOrigin;
+
+ //utility shaders
+ extern LLGLSLShader gOcclusionProgram;
+ extern LLGLSLShader gOcclusionCubeProgram;
+ extern LLGLSLShader gGlowCombineProgram;
+ extern LLGLSLShader gReflectionMipProgram;
+ extern LLGLSLShader gGaussianProgram;
+ extern LLGLSLShader gRadianceGenProgram;
+ extern LLGLSLShader gHeroRadianceGenProgram;
+ extern LLGLSLShader gIrradianceGenProgram;
+ extern LLGLSLShader gGlowCombineFXAAProgram;
+ extern LLGLSLShader gDebugProgram;
+ enum NormalDebugShaderVariant : S32
+ {
+ NORMAL_DEBUG_SHADER_DEFAULT,
+ NORMAL_DEBUG_SHADER_WITH_TANGENTS,
+ NORMAL_DEBUG_SHADER_COUNT
+ };
+ extern LLGLSLShader gNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT];
+ extern LLGLSLShader gSkinnedNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT];
+ extern LLGLSLShader gClipProgram;
+ extern LLGLSLShader gBenchmarkProgram;
+ extern LLGLSLShader gReflectionProbeDisplayProgram;
+ extern LLGLSLShader gCopyProgram;
+ extern LLGLSLShader gCopyDepthProgram;
+ extern LLGLSLShader gPBRTerrainBakeProgram;
+ extern LLGLSLShader gDrawColorProgram;
+
+ //output tex0[tc0] - tex1[tc1]
+ extern LLGLSLShader gTwoTextureCompareProgram;
+ //discard some fragments based on user-set color tolerance
+ extern LLGLSLShader gOneTextureFilterProgram;
+
+
+ //object shaders
+ extern LLGLSLShader gObjectPreviewProgram;
+ extern LLGLSLShader gPhysicsPreviewProgram;
+ extern LLGLSLShader gObjectBumpProgram;
+ extern LLGLSLShader gSkinnedObjectBumpProgram;
+ extern LLGLSLShader gObjectAlphaMaskNoColorProgram;
+
+ //environment shaders
+ extern LLGLSLShader gWaterProgram;
+ extern LLGLSLShader gUnderWaterProgram;
+ extern LLGLSLShader gGlowProgram;
+ extern LLGLSLShader gGlowExtractProgram;
+
+ //interface shaders
+ extern LLGLSLShader gHighlightProgram;
+ extern LLGLSLShader gHighlightNormalProgram;
+ extern LLGLSLShader gHighlightSpecularProgram;
+
+ extern LLGLSLShader gDeferredHighlightProgram;
+
+ extern LLGLSLShader gPathfindingProgram;
+ extern LLGLSLShader gPathfindingNoNormalsProgram;
+
+ // avatar shader handles
+ extern LLGLSLShader gAvatarProgram;
+ extern LLGLSLShader gAvatarEyeballProgram;
+ extern LLGLSLShader gImpostorProgram;
+
+ // Post Process Shaders
+ extern LLGLSLShader gPostScreenSpaceReflectionProgram;
+
+ // Deferred rendering shaders
+ extern LLGLSLShader gDeferredImpostorProgram;
+ extern LLGLSLShader gDeferredDiffuseProgram;
+ extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
+ extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
+ extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+ extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
+ extern LLGLSLShader gDeferredBumpProgram;
+ extern LLGLSLShader gDeferredTerrainProgram;
+ extern LLGLSLShader gDeferredTreeProgram;
+ extern LLGLSLShader gDeferredTreeShadowProgram;
+ extern LLGLSLShader gDeferredLightProgram;
+ extern LLGLSLShader gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_COUNT];
+ extern LLGLSLShader gDeferredSpotLightProgram;
+ extern LLGLSLShader gDeferredMultiSpotLightProgram;
+ extern LLGLSLShader gDeferredSunProgram;
+ extern LLGLSLShader gDeferredSunProbeProgram;
+ extern LLGLSLShader gHazeProgram;
+ extern LLGLSLShader gHazeWaterProgram;
+ extern LLGLSLShader gDeferredBlurLightProgram;
+ extern LLGLSLShader gDeferredAvatarProgram;
+ extern LLGLSLShader gDeferredSoftenProgram;
+ extern LLGLSLShader gDeferredShadowProgram;
+ extern LLGLSLShader gDeferredShadowCubeProgram;
+ extern LLGLSLShader gDeferredShadowAlphaMaskProgram;
+ extern LLGLSLShader gDeferredShadowGLTFAlphaMaskProgram;
+ extern LLGLSLShader gDeferredShadowGLTFAlphaBlendProgram;
+ extern LLGLSLShader gDeferredShadowFullbrightAlphaMaskProgram;
+ extern LLGLSLShader gDeferredPostProgram;
+ extern LLGLSLShader gDeferredCoFProgram;
+ extern LLGLSLShader gDeferredDoFCombineProgram;
+ extern LLGLSLShader gFXAAProgram[4];
+ extern LLGLSLShader gSMAAEdgeDetectProgram[4];
+ extern LLGLSLShader gSMAABlendWeightsProgram[4];
+ extern LLGLSLShader gSMAANeighborhoodBlendProgram[4];
+ extern LLGLSLShader gCASProgram;
+ extern LLGLSLShader gDeferredPostNoDoFProgram;
+ extern LLGLSLShader gDeferredPostNoDoFNoiseProgram;
+ extern LLGLSLShader gDeferredPostGammaCorrectProgram;
+ extern LLGLSLShader gLegacyPostGammaCorrectProgram;
+ extern LLGLSLShader gDeferredPostTonemapProgram;
+ extern LLGLSLShader gNoPostTonemapProgram;
+ extern LLGLSLShader gExposureProgram;
+ extern LLGLSLShader gExposureProgramNoFade;
+ extern LLGLSLShader gLuminanceProgram;
+ extern LLGLSLShader gDeferredAvatarShadowProgram;
+ extern LLGLSLShader gDeferredAvatarAlphaShadowProgram;
+ extern LLGLSLShader gDeferredAvatarAlphaMaskShadowProgram;
+ extern LLGLSLShader gDeferredAlphaProgram;
+ extern LLGLSLShader gHUDAlphaProgram;
+ extern LLGLSLShader gDeferredAlphaImpostorProgram;
+ extern LLGLSLShader gDeferredFullbrightProgram;
+ extern LLGLSLShader gHUDFullbrightProgram;
+ extern LLGLSLShader gDeferredFullbrightAlphaMaskProgram;
+ extern LLGLSLShader gHUDFullbrightAlphaMaskProgram;
+ extern LLGLSLShader gDeferredFullbrightAlphaMaskAlphaProgram;
+ extern LLGLSLShader gHUDFullbrightAlphaMaskAlphaProgram;
+ extern LLGLSLShader gDeferredEmissiveProgram;
+ extern LLGLSLShader gDeferredAvatarEyesProgram;
+ extern LLGLSLShader gDeferredAvatarAlphaProgram;
+ extern LLGLSLShader gEnvironmentMapProgram;
+ extern LLGLSLShader gDeferredWLSkyProgram;
+ extern LLGLSLShader gDeferredWLCloudProgram;
+ extern LLGLSLShader gDeferredWLSunProgram;
+ extern LLGLSLShader gDeferredWLMoonProgram;
+ extern LLGLSLShader gDeferredStarProgram;
+ extern LLGLSLShader gDeferredFullbrightShinyProgram;
+ extern LLGLSLShader gHUDFullbrightShinyProgram;
+ extern LLGLSLShader gNormalMapGenProgram;
+ extern LLGLSLShader gDeferredGenBrdfLutProgram;
+ extern LLGLSLShader gDeferredBufferVisualProgram;
+
+ // Deferred materials shaders
+ extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2];
+
+ extern LLGLSLShader gHUDPBROpaqueProgram;
+ extern LLGLSLShader gPBRGlowProgram;
+ extern LLGLSLShader gDeferredPBROpaqueProgram;
+ extern LLGLSLShader gDeferredPBRAlphaProgram;
+ extern LLGLSLShader gHUDPBRAlphaProgram;
+
+ // GLTF shaders
+ extern LLGLSLShader gGLTFPBRMetallicRoughnessProgram;
+
+ extern LLGLSLShader gBloomExtractProgram;
+ extern LLGLSLShader gBloomBlurProgram;
+ extern LLGLSLShader gBloomCombineProgram;
+
+
+ // Encodes detail level for dropping textures, in accordance with the GLTF spec where possible
+ // 0 is highest detail, -1 drops emissive, etc
+ // Dropping metallic roughness is off-spec - Reserve for potato machines as needed
+ // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures
+ enum TerrainPBRDetail : S32
+ {
+ TERRAIN_PBR_DETAIL_MAX = 0,
+ TERRAIN_PBR_DETAIL_EMISSIVE = 0,
+ TERRAIN_PBR_DETAIL_OCCLUSION = -1,
+ TERRAIN_PBR_DETAIL_NORMAL = -2,
+ TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS = -3,
+ TERRAIN_PBR_DETAIL_BASE_COLOR = -4,
+ TERRAIN_PBR_DETAIL_MIN = -4,
+ };
+ enum TerrainPaintType : U32
+ {
+ // Use LLVLComposition::mDatap (heightmap) generated by generateHeights, plus noise from TERRAIN_ALPHARAMP
+ TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE = 0,
+ // Use paint map if PBR terrain, otherwise fall back to TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE
+ TERRAIN_PAINT_TYPE_PBR_PAINTMAP = 1,
+ TERRAIN_PAINT_TYPE_COUNT = 2,
+ };
+ extern LLGLSLShader gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT];
+ #endif
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 7e14c621ad..5bbcd8f09f 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1146,6 +1146,8 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
// just in case we downres textures, bind downresmap and copy program
gPipeline.mDownResMap.bindTarget();
+ //gPipeline.mDownResMap.clear();
+
gCopyProgram.bind();
gPipeline.mScreenTriangleVB->setBuffer();
@@ -1155,7 +1157,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
// do at least 5 and make sure we don't get too far behind even if it violates
// the time limit. If we don't downscale quickly the viewer will hit swap and may
// freeze.
- S32 min_count = (S32)mCreateTextureList.size() / 20 + 5;
+ S32 min_count = (S32)mCreateTextureList.size() / 20 + 3;
create_timer.reset();
while (!mDownScaleQueue.empty())
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d3af22a9d9..9e52ed9a12 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4829,21 +4829,13 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
auto err = 0;
auto extension("." + image->getExtension());
auto now = LLDate::now();
- static LLCachedControl<bool> snapshot_timestamp(gSavedSettings, "SnapshotTimestamp", true) ;
do
{
filepath = sSnapshotDir;
filepath += gDirUtilp->getDirDelimiter();
filepath += sSnapshotBaseName;
- if (snapshot_timestamp)
- {
filepath += now.toLocalDateString("_%Y-%m-%d_%H%M%S");
filepath += llformat("%.2d", i);
- }
- else if (is_snapshot_name_loc_set)
- {
- filepath += llformat("_%.3d", i);
- }
filepath += extension;
llstat stat_info;
@@ -5045,7 +5037,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
mWorldViewRectRaw.set(0, image_height, image_width, 0);
LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
- scratch_space.bindTarget();
+ scratch_space.bindTarget("", 0);
}
else
{
@@ -5312,7 +5304,7 @@ bool LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_
{
mWorldViewRectRaw.set(0, image_height, image_width, 0);
- scratch_space.bindTarget();
+ scratch_space.bindTarget("", 0);
}
else
{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index c6f8160c0d..10b5b7514c 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5463,7 +5463,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)
gGL.begin(LLRender::LINES);
gGL.color4f(1.f,1.f,1.f,1.f);
F32 thickness = llmax(F32(5.0f-5.0f*(gFrameTimeSeconds-mLastImpostorUpdateFrameTime)),1.0f);
- glLineWidth(thickness);
+ //glLineWidth(thickness);
gGL.vertex3fv((pos+left-up).mV);
gGL.vertex3fv((pos-left-up).mV);
gGL.vertex3fv((pos-left-up).mV);
diff --git a/indra/newview/mpfloatertuning.cpp b/indra/newview/mpfloatertuning.cpp
index 1a3e4cf718..23f8c21e70 100644
--- a/indra/newview/mpfloatertuning.cpp
+++ b/indra/newview/mpfloatertuning.cpp
@@ -39,47 +39,37 @@ MPFloaterTuning::MPFloaterTuning(const LLSD& key) : LLFloater(key)
{
}
-void MPFloaterTuning::syncFromPreferenceSetting(void *user_data)
-{
- MPFloaterTuning *self = static_cast<MPFloaterTuning*>(user_data);
+bool MPFloaterTuning::postBuild()
+{
U32 fps = gSavedSettings.getU32("MaxFPS");
if(fps==0) fps=132;
- LLSliderCtrl* fpsSliderCtrl = self->getChild<LLSliderCtrl>("fpsSlider");
- fpsSliderCtrl->setValue(fps,FALSE);
+ mFpsSlider = getChild<LLSliderCtrl>("fpsSliderCtrl");
+ mFpsSlider->setCommitCallback(boost::bind(&MPFloaterTuning::onFpsSliderChanged, this));
- LLTextBox* fpsText = self->getChild<LLTextBox>("fpsText");
- if(fps>120) fpsText->setValue("no limit");
- else fpsText->setValue(std::to_string(fps)+" fps");
-}
-
-bool MPFloaterTuning::postBuild()
-{
- LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider");
- fpsSliderCtrl->setMinValue(12);
- fpsSliderCtrl->setMaxValue(132);
- fpsSliderCtrl->setSliderMouseUpCallback(boost::bind(&MPFloaterTuning::onFinalCommit,this));
+ mFpsSlider->setValue(fps, false);
- LLTextBox* fpsText = getChild<LLTextBox>("fpsText");
- fpsText->setValue("");
+ mFpsTextBox = getChild<LLTextBox>("fpsTextCtrl");
+ mFpsTextBox->setValue("");
- syncFromPreferenceSetting(this);
+ if(fps>120) mFpsTextBox->setValue("no limit");
+ else if(fps==0) mFpsTextBox->setValue("no limit");
+ else mFpsTextBox->setValue(std::to_string(fps)+" fps");
- return TRUE;
+ return true;
}
// Do send-to-the-server work when slider drag completes, or new
// value entered as text.
-void MPFloaterTuning::onFinalCommit()
+void MPFloaterTuning::onFpsSliderChanged()
{
- LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider");
- U32 fps = (U32)fpsSliderCtrl->getValueF32();
+ U32 fps = (U32)mFpsSlider->getValueF32();
gSavedSettings.setU32("MaxFPS",fps);
- LLTextBox* fpsText = getChild<LLTextBox>("fpsText");
- if(fps>120) fpsText->setValue("no limit");
- else fpsText->setValue(std::to_string(fps)+" fps");
+ if(fps>120) mFpsTextBox->setValue("no limit");
+ else if(fps==0) mFpsTextBox->setValue("no limit");
+ else mFpsTextBox->setValue(std::to_string(fps)+" fps");
}
void MPFloaterTuning::onClose(bool app_quitting)
diff --git a/indra/newview/mpfloatertuning.h b/indra/newview/mpfloatertuning.h
index 9e9c7f174f..bebdaa9952 100644
--- a/indra/newview/mpfloatertuning.h
+++ b/indra/newview/mpfloatertuning.h
@@ -29,20 +29,28 @@
#include "llfloater.h"
+class LLSliderCtrl;
+class LLTextBox;
+
class MPFloaterTuning: public LLFloater
{
-public:
+ public:
+
MPFloaterTuning(const LLSD& key);
bool postBuild();
void onFinalCommit();
- static void syncFromPreferenceSetting(void *user_data);
-
- //void updateEditEnabled();
/*virtual*/ void onClose(bool app_quitting);
+
+ private:
+
+ LLSliderCtrl* mFpsSlider = nullptr;
+ LLTextBox* mFpsTextBox = nullptr;
+
+ void onFpsSliderChanged();
};
#endif
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 6b3a5b1892..924efde89b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1,28 +1,28 @@
/**
- * @file pipeline.cpp
- * @brief Rendering pipeline.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
+* @file pipeline.cpp
+* @brief Rendering pipeline.
+*
+* $LicenseInfo:firstyear=2005&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2010, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
#include "llviewerprecompiledheaders.h"
@@ -141,7 +141,7 @@ bool LLPipeline::WindLightUseAtmosShaders;
bool LLPipeline::RenderDeferred;
F32 LLPipeline::RenderDeferredSunWash;
U32 LLPipeline::RenderFSAAType;
-U32 LLPipeline::RenderResolutionDivisor;
+F32 LLPipeline::RenderResolutionDivisor;
bool LLPipeline::RenderUIBuffer;
S32 LLPipeline::RenderShadowDetail;
S32 LLPipeline::MPRenderShadowOpti;
@@ -229,6 +229,9 @@ const F32 ALPHA_BLEND_CUTOFF = 0.598f;
const F32 DEFERRED_LIGHT_FALLOFF = 0.5f;
const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;
+const U32 SHADOWS_RESX = 1024;
+const U32 SHADOWS_RESY = 768;
+
extern S32 gBoxFrame;
extern bool gDisplaySwapBuffers;
extern bool gDebugGL;
@@ -268,6 +271,7 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State");
LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline");
LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy");
LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading");
+LLTrace::BlockTimerStatHandle FTM_RENDER_SHADOWS("Shadows");
LLTrace::BlockTimerStatHandle FTM_RENDER_UI_HUD("HUD");
LLTrace::BlockTimerStatHandle FTM_RENDER_UI_3D("3D");
@@ -346,18 +350,20 @@ void validate_framebuffer_object();
// target -- RenderTarget to add attachments to
bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)
{
- U32 orm = GL_RGBA;
+ U32 orm = GL_RGBA8;
U32 norm = GL_RGBA16F;
U32 emissive = GL_RGB16F;
+ static LLCachedControl<bool> MPLowColorPrecision(gSavedSettings, "MPLowColorPrecision", 0);
+
static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false);
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
bool hdr = has_hdr() && gGLManager.mGLVersion > 4.05f;
- if (!hdr)
+ if (!hdr || MPLowColorPrecision)
{
norm = GL_RGB10_A2;
- emissive = GL_RGB;
+ emissive = GL_RGB8;
}
bool valid = true;
@@ -429,7 +435,7 @@ void LLPipeline::init()
mInitialized = true;
- stop_glerror();
+ LOG_GLERROR("LLPipeline::init()");
//create render pass pools
getPool(LLDrawPool::POOL_WATEREXCLUSION);
@@ -701,7 +707,8 @@ void LLPipeline::cleanup()
void LLPipeline::destroyGL()
{
- stop_glerror();
+ LOG_GLERROR("LLPipeline::destroyGL()");
+
unloadShaders();
mHighlightFaces.clear();
@@ -730,9 +737,9 @@ void LLPipeline::resizeShadowTexture()
{
releaseSunShadowTargets();
releaseSpotShadowTargets();
- GLuint resX = gViewerWindow->getWorldViewWidthRaw();
- GLuint resY = gViewerWindow->getWorldViewHeightRaw();
- allocateShadowBuffer(resX, resY);
+ //GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+ //GLuint resY = gViewerWindow->getWorldViewHeightRaw();
+ allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);
gResizeShadowTexture = false;
}
@@ -762,6 +769,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
return ret == FBO_SUCCESS_FULLRES;
}
+void LLPipeline::renderTriangle()
+{
+ gPipeline.mScreenTriangleVB->setBuffer();
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+}
+
LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)
{
@@ -843,28 +856,31 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT->width = resX;
mRT->height = resY;
- U32 res_mod = RenderResolutionDivisor;
+ F32 res_mod = fmin(RenderResolutionDivisor, 4.0);
- if (res_mod > 1 && res_mod < resX && res_mod < resY)
+ LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL;
+
+ if (res_mod >= 0.5 && res_mod <= 4.0)
{
- resX /= res_mod;
- resY /= res_mod;
+ resX = (U32)(floor((F32)resX / res_mod));
+ resY = (U32)(floor((F32)resY / res_mod));
+ LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL;
}
S32 shadow_detail = RenderShadowDetail;
bool ssao = RenderDeferredSSAO;
//allocate deferred rendering color buffers
- if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA, true)) return false;
+ if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA8, true)) return false;
if (!addDeferredAttachments(mRT->deferredScreen)) return false;
- GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA;
+ GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA8;
- if (!mRT->screen.allocate(resX, resY, GL_RGBA16F)) return false;
+ if (!mRT->screen.allocate(resX, resY, screenFormat)) return false;
mRT->deferredScreen.shareDepthBuffer(mRT->screen);
- if (shadow_detail > 0 || ssao || RenderDepthOfField)
+ if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField)
{ //only need mRT->deferredLight for shadows OR ssao OR dof
if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false;
}
@@ -873,13 +889,14 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mRT->deferredLight.release();
}
- allocateShadowBuffer(resX, resY);
+ //allocateShadowBuffer(resX, resY);
+ allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);
if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots
{
if (RenderUIBuffer)
{
- if (!mUIScreen.allocate(resX, resY, GL_RGBA))
+ if (!mUIScreen.allocate(resX, resY, GL_RGBA8))
{
return false;
}
@@ -887,10 +904,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
if (RenderFSAAType > 0)
{
- if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false;
+ if (!mFXAAMap.allocate(resX, resY, GL_RGBA8)) return false;
if (RenderFSAAType == 2)
{
- if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA, false)) return false;
+ if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA8, false)) return false;
}
}
else
@@ -911,7 +928,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
mSceneMap.release();
}
- mPostMap.allocate(resX, resY, screenFormat);
+ //mPostMaps[0].allocate(resX, resY, screenFormat);
+ //mPostMaps[1].allocate(resX, resY, screenFormat);
+ mPostMaps[0].allocate(resX, resY, GL_RGBA);
+ mPostMaps[1].allocate(resX, resY, GL_RGBA);
// The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes.
// Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask.
@@ -924,9 +944,9 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
// used to scale down textures
// See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown
- mDownResMap.allocate(1024, 1024, GL_RGBA);
+ mDownResMap.allocate(1024, 1024, GL_RGBA8);
- mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA);
+ mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA8);
}
//HACK make screenbuffer allocations start failing after 30 seconds
if (gSavedSettings.getBOOL("SimulateFBOFailure"))
@@ -936,7 +956,7 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)
gGL.getTexUnit(0)->disable();
- stop_glerror();
+ LOG_GLERROR("LLPipeline::allocateScreenBufferInternal end");
return true;
}
@@ -950,15 +970,18 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY)
S32 shadow_detail = RenderShadowDetail;
F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps
- U32 sun_shadow_map_width = BlurHappySize(resX, scale);
- U32 sun_shadow_map_height = BlurHappySize(resY, scale);
+ //U32 sun_shadow_map_width = BlurHappySize(resX, scale);
+ //U32 sun_shadow_map_height = BlurHappySize(resY, scale);
+ U32 sun_shadow_map_width = resX * scale;
+ U32 sun_shadow_map_height = resY * scale;
if (shadow_detail > 0)
{ //allocate 4 sun shadow maps
for (U32 i = 0; i < 4; i++)
{
- if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true))
+ if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_NONE))
{
+ LL_WARNS() << "failed allocating shadow buffer " << i << " w:" << sun_shadow_map_width << " h:" << sun_shadow_map_height << LL_ENDL;
return false;
}
}
@@ -1058,10 +1081,9 @@ void LLPipeline::refreshCachedSettings()
RenderDeferred = true; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred");
RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");
RenderFSAAType = gSavedSettings.getU32("RenderFSAAType");
- RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor");
+ RenderResolutionDivisor = gSavedSettings.getF32("RenderResolutionDivisor");
RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");
RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail");
- MPRenderShadowOpti = gSavedSettings.getS32("MPRenderShadowOpti");
RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits");
RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale");
@@ -1152,6 +1174,13 @@ void LLPipeline::releaseGLBuffers()
{
assertInitialized();
+ mBloomMap.release();
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ mBloomBlur[i].release();
+ }
+
if (mNoiseMap)
{
LLImageGL::deleteTextures(1, &mNoiseMap);
@@ -1184,7 +1213,8 @@ void LLPipeline::releaseGLBuffers()
mWaterExclusionMask.release();
- mPostMap.release();
+ mPostMaps[0].release();
+ mPostMaps[1].release();
mFXAAMap.release();
@@ -1272,23 +1302,28 @@ void LLPipeline::releaseSpotShadowTargets()
void LLPipeline::createGLBuffers()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
- stop_glerror();
+ LOG_GLERROR("LLPipeline::createGLBuffers()");
assertInitialized();
- stop_glerror();
-
GLuint resX = gViewerWindow->getWorldViewWidthRaw();
GLuint resY = gViewerWindow->getWorldViewHeightRaw();
// allocate screen space glow buffers
const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR");
- const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA;
+ const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA8;
for (U32 i = 0; i < 3; i++)
{
mGlow[i].allocate(512, glow_res, glow_color_fmt);
}
+ mBloomMap.allocate(resX/2.0, resY/2.0, glow_color_fmt);
+
+ for (U32 i = 0; i < 2; i++)
+ {
+ mBloomBlur[i].allocate(resX/2.0, resY/2.0, glow_color_fmt);
+ }
+
allocateScreenBuffer(resX, resY);
// Do not zero out mRT dimensions here. allocateScreenBuffer() above
// already sets the correct dimensions. Zeroing them caused resizeShadowTexture()
@@ -1397,7 +1432,7 @@ void LLPipeline::createGLBuffers()
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB, raw_image->getWidth(),
raw_image->getHeight(), format, GL_UNSIGNED_BYTE, raw_image->getData(), false);
- stop_glerror();
+ LOG_GLERROR("LLPipeline::createGLBuffers after setManualImage");
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
@@ -1457,11 +1492,7 @@ void LLPipeline::createLUTBuffers()
}
U32 pix_format = GL_R16F;
-#if 0 && LL_DARWIN
- // Need to work around limited precision with 10.6.8 and older drivers
- //
- pix_format = GL_R32F;
-#endif
+
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false);
@@ -1474,7 +1505,7 @@ void LLPipeline::createLUTBuffers()
}
mPbrBrdfLut.allocate(512, 512, GL_RG16F);
- mPbrBrdfLut.bindTarget();
+ mPbrBrdfLut.bindTarget("mPbrBrdfLut", 1);
if (gDeferredGenBrdfLutProgram.isComplete())
{
@@ -1498,13 +1529,13 @@ void LLPipeline::createLUTBuffers()
mPbrBrdfLut.flush();
mExposureMap.allocate(1, 1, GL_R16F);
- mExposureMap.bindTarget();
+ mExposureMap.bindTarget("mExposureMap", 1);
glClearColor(1, 1, 1, 0);
mExposureMap.clear();
glClearColor(0, 0, 0, 0);
mExposureMap.flush();
- mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE);
+ mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO);
mLastExposure.allocate(1, 1, GL_R16F);
}
@@ -1526,7 +1557,7 @@ void LLPipeline::restoreGL()
if (part)
{
part->restoreGL();
- }
+ }
}
}
}
@@ -2062,7 +2093,7 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)
{
LL_PROFILE_ZONE_SCOPED;
for (LLDrawable::drawable_vector_t::iterator iter = moved_list.begin();
- iter != moved_list.end(); )
+ iter != moved_list.end(); )
{
LLDrawable::drawable_vector_t::iterator curiter = iter++;
LLDrawable *drawablep = *curiter;
@@ -2529,7 +2560,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)
gSky.mVOSkyp->mDrawable->setVisible(camera);
sCull->pushDrawable(gSky.mVOSkyp->mDrawable);
gSky.updateCull();
- stop_glerror();
+ LOG_GLERROR("LLPipeline::updateCull sky");
}
if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) &&
@@ -2539,6 +2570,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)
{
gSky.mVOWLSkyp->mDrawable->setVisible(camera);
sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable);
+ LOG_GLERROR("LLPipeline::updateCull pushDrawable");
}
}
@@ -2691,6 +2723,8 @@ void LLPipeline::doOcclusion(LLCamera& camera)
gGL.setColorMask(true, true);
}
+
+ LOG_GLERROR("LLPipeline::doOcclusion()");
}
bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep)
@@ -2725,7 +2759,7 @@ void LLPipeline::clearRebuildGroups()
mGroupQ1Locked = true;
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
- iter != mGroupQ1.end(); ++iter)
+ iter != mGroupQ1.end(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2753,7 +2787,7 @@ void LLPipeline::clearRebuildDrawables()
{
// Clear all drawables on the priority build queue,
for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin();
- iter != mBuildQ1.end(); ++iter)
+ iter != mBuildQ1.end(); ++iter)
{
LLDrawable* drawablep = *iter;
if (drawablep && !drawablep->isDead())
@@ -2765,7 +2799,7 @@ void LLPipeline::clearRebuildDrawables()
//clear all moving bridges
for (LLDrawable::drawable_vector_t::iterator iter = mMovedBridge.begin();
- iter != mMovedBridge.end(); ++iter)
+ iter != mMovedBridge.end(); ++iter)
{
LLDrawable *drawablep = *iter;
drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD);
@@ -2774,7 +2808,7 @@ void LLPipeline::clearRebuildDrawables()
//clear all moving drawables
for (LLDrawable::drawable_vector_t::iterator iter = mMovedList.begin();
- iter != mMovedList.end(); ++iter)
+ iter != mMovedList.end(); ++iter)
{
LLDrawable *drawablep = *iter;
drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD);
@@ -2803,7 +2837,7 @@ void LLPipeline::rebuildPriorityGroups()
mGroupQ1Locked = true;
// Iterate through all drawables on the priority build queue,
for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin();
- iter != mGroupQ1.end(); ++iter)
+ iter != mGroupQ1.end(); ++iter)
{
LLSpatialGroup* group = *iter;
group->rebuildGeom();
@@ -2835,7 +2869,7 @@ void LLPipeline::updateGeom(F32 max_dtime)
// Iterate through all drawables on the priority build queue,
for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin();
- iter != mBuildQ1.end();)
+ iter != mBuildQ1.end();)
{
LLDrawable::drawable_list_t::iterator curiter = iter++;
LLDrawable* drawablep = *curiter;
@@ -2860,6 +2894,7 @@ void LLPipeline::updateGeom(F32 max_dtime)
}
updateMovedList(mMovedBridge);
+ LOG_GLERROR("LLPipeline::updateGeom()");
}
void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
@@ -2884,8 +2919,8 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
LLVOAvatar* av = vobj->asAvatar();
if (av &&
((!sImpostorRender && av->isImpostor()) //ignore impostor flag during impostor pass
- || av->isInMuteList()
- || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) ))
+ || av->isInMuteList()
+ || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) ))
{
return;
}
@@ -3102,13 +3137,13 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
LL_PROFILE_GPU_ZONE("stateSort");
if (hasAnyRenderType(LLPipeline::RENDER_TYPE_AVATAR,
- LLPipeline::RENDER_TYPE_CONTROL_AV,
- LLPipeline::RENDER_TYPE_TERRAIN,
- LLPipeline::RENDER_TYPE_TREE,
- LLPipeline::RENDER_TYPE_SKY,
- LLPipeline::RENDER_TYPE_VOIDWATER,
- LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::END_RENDER_TYPES))
+ LLPipeline::RENDER_TYPE_CONTROL_AV,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_TREE,
+ LLPipeline::RENDER_TYPE_SKY,
+ LLPipeline::RENDER_TYPE_VOIDWATER,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::END_RENDER_TYPES))
{
//clear faces from face pools
gPipeline.resetDrawOrders();
@@ -3206,7 +3241,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWABLE("stateSort"); // LL_RECORD_BLOCK_TIME(FTM_STATESORT_DRAWABLE);
for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList();
- iter != sCull->endVisibleList(); ++iter)
+ iter != sCull->endVisibleList(); ++iter)
{
LLDrawable *drawablep = *iter;
if (!drawablep->isDead())
@@ -3341,8 +3376,8 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)
void forAllDrawables(LLCullResult::sg_iterator begin,
- LLCullResult::sg_iterator end,
- void (*func)(LLDrawable*))
+ LLCullResult::sg_iterator end,
+ void (*func)(LLDrawable*))
{
for (LLCullResult::sg_iterator i = begin; i != end; ++i)
{
@@ -3405,7 +3440,7 @@ void renderScriptedTouchBeacons(LLDrawable *drawablep)
if (gPipeline.sRenderBeacons)
{
gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f),
- LLPipeline::DebugBeaconLineWidth);
+ LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3435,7 +3470,7 @@ void renderPhysicalBeacons(LLDrawable *drawablep)
if (gPipeline.sRenderBeacons)
{
gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f),
- LLPipeline::DebugBeaconLineWidth);
+ LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3476,7 +3511,7 @@ void renderMOAPBeacons(LLDrawable *drawablep)
if (gPipeline.sRenderBeacons)
{
gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f),
- LLPipeline::DebugBeaconLineWidth);
+ LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3505,7 +3540,7 @@ void renderParticleBeacons(LLDrawable *drawablep)
{
LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f);
gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f),
- LLPipeline::DebugBeaconLineWidth);
+ LLPipeline::DebugBeaconLineWidth);
}
if (gPipeline.sRenderHighlight)
@@ -3590,7 +3625,7 @@ void LLPipeline::postSort(LLCamera &camera)
if ((sUseOcclusion && group->isOcclusionState(LLSpatialGroup::OCCLUDED)) ||
(RenderAutoHideSurfaceAreaLimit > 0.f &&
- group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f)))
+ group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f)))
{
continue;
}
@@ -3858,6 +3893,8 @@ void render_hud_elements()
}
gUIProgram.unbind();
+
+ LOG_GLERROR("LLPipeline::render_hud_elements()");
}
static inline void bindHighlightProgram(LLGLSLShader& program)
@@ -3962,6 +3999,8 @@ void LLPipeline::renderHighlights()
unbindHighlightProgram(gHighlightSpecularProgram);
}
}
+
+ LOG_GLERROR("LLPipeline::renderHighlights()");
}
//debug use
@@ -3971,6 +4010,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
{
LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);
LL_PROFILE_GPU_ZONE("renderGeomDeferred");
llassert(!sRenderingHUDs);
@@ -3999,6 +4039,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled;
setupHWLights();
+ LOG_GLERROR("LLPipeline::renderGeomDeferred() setupHWLights");
{
LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred pools");
@@ -4087,7 +4128,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("");
}
gGLLastMatrix = NULL;
@@ -4110,6 +4151,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
LL_PROFILE_GPU_ZONE("renderGeomPostDeferred");
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);
if (gUseWireframe)
{
@@ -4226,7 +4268,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("after pools");
}
gGLLastMatrix = NULL;
@@ -4246,6 +4288,8 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
+
+ LOG_GLERROR("LLPipeline::renderGeomPostDeferred()");
}
void LLPipeline::renderGeomShadow(LLCamera& camera)
@@ -4305,11 +4349,12 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
}
iter1 = iter2;
- stop_glerror();
+ LOG_GLERROR("");
}
gGLLastMatrix = NULL;
gGL.loadMatrix(gGLModelView);
+ LOG_GLERROR("LLPipeline::renderGeomShadow()");
}
@@ -4340,7 +4385,7 @@ void LLPipeline::renderPhysicsDisplay()
LLGLEnable(GL_POLYGON_OFFSET_LINE);
glPolygonOffset(3.f, 3.f);
- glLineWidth(3.f);
+ //glLineWidth(3.f);
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
@@ -4382,7 +4427,7 @@ void LLPipeline::renderPhysicsDisplay()
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
- glLineWidth(1.f);
+ //glLineWidth(1.f);
gDebugProgram.unbind();
}
@@ -4467,7 +4512,7 @@ void LLPipeline::renderDebug()
if ( pathfindingConsole->isRenderNavMesh() )
{
gGL.flush();
- glLineWidth(2.0f);
+ //glLineWidth(2.0f);
LLGLEnable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);
@@ -4491,7 +4536,7 @@ void LLPipeline::renderDebug()
gGL.flush();
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
gGL.flush();
}
//User designated path
@@ -4607,11 +4652,11 @@ void LLPipeline::renderDebug()
gPathfindingProgram.uniform1f(sTint, 1.f);
gPathfindingProgram.uniform1f(sAlphaScale, 1.f);
- glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
+ //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));
LLGLDisable blendOut(GL_BLEND);
llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );
gGL.flush();
- glLineWidth(1.f);
+ //glLineWidth(1.f);
}
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
@@ -4634,7 +4679,7 @@ void LLPipeline::renderDebug()
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
gGL.flush();
- glLineWidth(2.0f);
+ //glLineWidth(2.0f);
LLGLEnable cull(GL_CULL_FACE);
gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint"));
@@ -4661,7 +4706,7 @@ void LLPipeline::renderDebug()
gPathfindingProgram.bind();
gGL.flush();
- glLineWidth(1.0f);
+ //glLineWidth(1.0f);
}
glPolygonOffset(0.f, 0.f);
@@ -4798,12 +4843,11 @@ void LLPipeline::renderDebug()
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display");
bindDeferredShader(gReflectionProbeDisplayProgram, NULL);
- mScreenTriangleVB->setBuffer();
LLGLEnable blend(GL_BLEND);
LLGLDepthTest depth(GL_FALSE);
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(gReflectionProbeDisplayProgram);
}
@@ -5564,8 +5608,8 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
LLDrawable* drawable = light->drawable;
const LLViewerObject *vobj = light->drawable->getVObj();
if(vobj && vobj->getAvatar()
- && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow())
- )
+ && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow())
+ )
{
drawable->clearState(LLDrawable::NEARBY_LIGHT);
continue;
@@ -5626,7 +5670,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// FIND NEW LIGHTS THAT ARE IN RANGE
light_set_t new_nearby_lights;
for (LLDrawable::ordered_drawable_set_t::iterator iter = mLights.begin();
- iter != mLights.end(); ++iter)
+ iter != mLights.end(); ++iter)
{
LLDrawable* drawable = *iter;
LLVOVolume* light = drawable->getVOVolume();
@@ -5664,7 +5708,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// INSERT ANY NEW LIGHTS
for (light_set_t::iterator iter = new_nearby_lights.begin();
- iter != new_nearby_lights.end(); iter++)
+ iter != new_nearby_lights.end(); iter++)
{
const Light* light = &(*iter);
if (LLPipeline::sRenderDeferred || mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS)
@@ -5706,7 +5750,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
//mark nearby lights not-removable.
for (light_set_t::iterator iter = mNearbyLights.begin();
- iter != mNearbyLights.end(); iter++)
+ iter != mNearbyLights.end(); iter++)
{
const Light* light = &(*iter);
((LLViewerOctreeEntryData*) light->drawable)->setVisible();
@@ -5810,7 +5854,7 @@ void LLPipeline::setupHWLights()
if (local_light_count >= 1)
{
for (light_set_t::iterator iter = mNearbyLights.begin();
- iter != mNearbyLights.end(); ++iter)
+ iter != mNearbyLights.end(); ++iter)
{
LLDrawable* drawable = iter->drawable;
LLVOVolume* light = drawable->getVOVolume();
@@ -6654,7 +6698,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
!drawable->getVObj()->isAttachment() ||
delta.getLength3().getF32() > ATTACHMENT_OVERRIDE_DIST)
{ //avatar overrides if previously hit drawable is not an attachment or
- //attachment is far enough away from detected intersection
+ //attachment is far enough away from detected intersection
drawable = hit;
local_end = position;
}
@@ -6724,12 +6768,12 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
}
LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
- bool pick_transparent,
- S32* face_hit,
- LLVector4a* intersection, // return the intersection point
- LLVector2* tex_coord, // return the texture coordinates of the intersection point
- LLVector4a* normal, // return the surface normal at the intersection point
- LLVector4a* tangent // return the surface tangent at the intersection point
+ bool pick_transparent,
+ S32* face_hit,
+ LLVector4a* intersection, // return the intersection point
+ LLVector2* tex_coord, // return the texture coordinates of the intersection point
+ LLVector4a* normal, // return the surface normal at the intersection point
+ LLVector4a* tangent // return the surface tangent at the intersection point
)
{
LLDrawable* drawable = NULL;
@@ -6792,6 +6836,8 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
facep->clearVertexBuffer();
}
}
+
+ LOG_GLERROR("LLPipeline::resetVertexBuffers()");
}
void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged)
@@ -6811,6 +6857,7 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderObjects()");
}
void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)
@@ -6839,6 +6886,7 @@ void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)
{
LL::GLTFSceneManager::instance().render(true, true);
}
+ LOG_GLERROR("LLPipeline::renderGLTFObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6919,6 +6967,7 @@ void LLPipeline::renderAlphaObjects(bool rigged)
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderAlphaObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6937,6 +6986,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture,
}
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderMaskedObjects()");
}
// Currently only used for shadows -Cosmic,2023-04-19
@@ -6955,6 +7005,7 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc
}
gGL.loadMatrix(gGLModelView);
gGLLastMatrix = NULL;
+ LOG_GLERROR("LLPipeline::renderFullbrightMaskedObjects()");
}
void apply_cube_face_rotation(U32 face)
@@ -7017,11 +7068,12 @@ void LLPipeline::bindScreenToTexture()
}
-static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom");
+static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Post processing");
void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex)
{
- dst->bindTarget();
+ dst->bindTarget("visualizeBuffers", 1);
+ dst->clear();
gDeferredBufferVisualProgram.bind();
gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex);
@@ -7031,8 +7083,7 @@ void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32
else
gDeferredBufferVisualProgram.uniform1f(mipLevel, 8);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
gDeferredBufferVisualProgram.unbind();
dst->flush();
}
@@ -7043,7 +7094,8 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)
{
LL_PROFILE_GPU_ZONE("luminance sample");
- dst->bindTarget();
+ dst->bindTarget("generateLuminance", 0);
+ dst->clear();
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7074,14 +7126,15 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)
static LLStaticHashedString diffuse_luminance_scale_s("diffuse_luminance_scale");
gLuminanceProgram.uniform1f(diffuse_luminance_scale_s, diffuse_luminance_scale);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst->flush();
// note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance"
// also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader
gLuminanceProgram.unbind();
}
+
+ LOG_GLERROR("LLPipeline::generateLuminance()");
}
void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) {
@@ -7092,17 +7145,15 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
if (use_history)
{
// copy last frame's exposure into mLastExposure
- mLastExposure.bindTarget();
+ mLastExposure.bindTarget("mLastExposure", 1);
gCopyProgram.bind();
gGL.getTexUnit(0)->bind(dst);
-
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
+ renderTriangle();
mLastExposure.flush();
}
- dst->bindTarget();
+ dst->bindTarget("generateExposure", 1);
+ //dst->clear();
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
@@ -7185,23 +7236,24 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error);
shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
if (use_history)
{
- gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());
+ //gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());
}
shader->unbind();
dst->flush();
}
+
+ LOG_GLERROR("LLPipeline::generateExposure()");
}
extern LLPointer<LLImageGL> gEXRImage;
void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
{
- dst->bindTarget();
+ dst->bindTarget("tonemap", 1);
// gamma correct lighting
{
LL_PROFILE_GPU_ZONE("tonemap");
@@ -7221,7 +7273,7 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
shader.bind();
- S32 channel = 0;
+ //S32 channel = 0;
shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
@@ -7243,18 +7295,19 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
shader.uniform1i(tonemap_type, tonemap_type_setting);
shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
- gGL.getTexUnit(channel)->unbind(src->getUsage());
+ //gGL.getTexUnit(channel)->unbind(src->getUsage());
shader.unbind();
}
dst->flush();
+ LOG_GLERROR("LLPipeline::tonemap()");
}
void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)
{
- dst->bindTarget();
+ dst->bindTarget("gammaCorrect", 1);
+ dst->clear();
// gamma correct lighting
{
LL_PROFILE_GPU_ZONE("gamma correct");
@@ -7272,12 +7325,12 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)
shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
shader.unbind();
}
dst->flush();
+ LOG_GLERROR("LLPipeline::gammaCorrect()");
}
void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst)
@@ -7290,7 +7343,7 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*
LLRenderTarget& depth_src = mRT->deferredScreen;
- dst->bindTarget();
+ dst->bindTarget("copyScreenSpaceReflections", 1);
dst->clear();
gCopyDepthProgram.bind();
@@ -7300,11 +7353,11 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*
gGL.getTexUnit(diff_map)->bind(src);
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst->flush();
}
+ LOG_GLERROR("LLPipeline::copyScreenSpaceReflection()");
}
void LLPipeline::generateGlow(LLRenderTarget* src)
@@ -7312,7 +7365,9 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
if (sRenderGlow)
{
LL_PROFILE_GPU_ZONE("glow");
- mGlow[2].bindTarget();
+ LL_RECORD_BLOCK_TIME(FTM_RENDER_GLOW);
+
+ mGlow[2].bindTarget("mGlow[2]", 1);
mGlow[2].clear();
gGlowExtractProgram.bind();
@@ -7338,8 +7393,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
}
gGlowExtractProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
- (GLfloat)mGlow[2].getWidth(),
- (GLfloat)mGlow[2].getHeight());
+ (GLfloat)mGlow[2].getWidth(),
+ (GLfloat)mGlow[2].getHeight());
}
{
@@ -7352,8 +7407,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGL.color4f(1, 1, 1, 1);
gPipeline.enableLightsFullbright();
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
+ gGlowExtractProgram.unbindTexture(LLShaderMgr::GLOW_NOISE_MAP);
mGlow[2].flush();
}
@@ -7379,7 +7434,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
for (S32 i = 0; i < kernel; i++)
{
- mGlow[i % 2].bindTarget();
+ mGlow[i % 2].bindTarget("mGlow[i % 2]", 1);
mGlow[i % 2].clear();
if (i == 0)
@@ -7400,8 +7455,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);
}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
mGlow[i % 2].flush();
}
@@ -7411,25 +7465,26 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
}
else // !sRenderGlow, skip the glow ping-pong and just clear the result target
{
- mGlow[1].bindTarget();
+ mGlow[1].bindTarget("mGlow[1]", 1);
mGlow[1].clear();
mGlow[1].flush();
}
+ LOG_GLERROR("LLPipeline::generateGlow()");
}
-void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
{
static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
if (cas_sharpness == 0.0f || !gCASProgram.isComplete())
{
- gPipeline.copyRenderTarget(src, dst);
- return;
+ return false;
}
LLGLSLShader* sharpen_shader = &gCASProgram;
// Bind setup:
- dst->bindTarget();
+ dst->bindTarget("applyCAS", 1);
+ dst->clear();
sharpen_shader->bind();
@@ -7451,100 +7506,105 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight());
}
- sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
-
- // Draw
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
-
+ S32 channel = sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
+ renderTriangle();
+ sharpen_shader->unbindTexture(channel);
sharpen_shader->unbind();
dst->flush();
+
+ return true;
}
-void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
{
- {
- llassert(!gCubeSnapshot);
- bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
+ llassert(!gCubeSnapshot);
+ bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete();
- // Present everything.
- if (multisample)
- {
- LL_PROFILE_GPU_ZONE("aa");
- S32 width = dst->getWidth();
- S32 height = dst->getHeight();
+ if(!multisample) return false;
- // bake out texture2D with RGBL for FXAA shader
- mFXAAMap.bindTarget();
- mFXAAMap.clear(GL_COLOR_BUFFER_BIT);
+ LL_PROFILE_GPU_ZONE("aa");
+ S32 width = dst->getWidth();
+ S32 height = dst->getHeight();
- LLGLSLShader* shader = &gGlowCombineFXAAProgram;
- shader->bind();
+ //LL_WARNS() << "dst width=" << width << LL_ENDL;
- S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
- if (channel > -1)
- {
- src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
- }
+ // bake out texture2D with RGBL for FXAA shader
+ mFXAAMap.bindTarget("applyFXAA", 1);
+ mFXAAMap.clear(GL_COLOR_BUFFER_BIT);
- {
- LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- }
+ LLGLSLShader* shader = &gGlowCombineFXAAProgram;
+ shader->bind();
- shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
- shader->unbind();
+ S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+ if (channel > -1)
+ {
+ src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
+ }
- mFXAAMap.flush();
+ {
+ LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
+ renderTriangle();
+ }
- dst->bindTarget();
+ shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage());
+ shader->unbind();
- static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
- U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
+ mFXAAMap.flush();
- shader = &gFXAAProgram[fsaa_quality];
- shader->bind();
+ dst->bindTarget("applyFXAA", 1);
+ dst->clear();
- channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage());
- if (channel > -1)
- {
- mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
- }
+ static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
+ U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
- gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
- gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
- gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
- gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ shader = &gFXAAProgram[fsaa_quality];
+ shader->bind();
- glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+ channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage());
+ if (channel > -1)
+ {
+ mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
+ }
- F32 scale_x = (F32)width / mFXAAMap.getWidth();
- F32 scale_y = (F32)height / mFXAAMap.getHeight();
- shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
- shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y);
- shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y,
- 0.5f / width * scale_x, 0.5f / height * scale_y);
- shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y,
- 2.f / width * scale_x, 2.f / height * scale_y);
+ /*
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
- {
- LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
- S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
- gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true);
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+*/
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- }
+ F32 scale_x = (F32)width / mFXAAMap.getWidth();
+ F32 scale_y = (F32)height / mFXAAMap.getHeight();
- shader->unbind();
- dst->flush();
- }
- else {
- copyRenderTarget(src, dst);
- }
+ //LL_WARNS() << "vp width=" << gGLViewport[2] << " scale=" << scale_x << LL_ENDL;
+
+ shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y);
+ shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y,
+ 0.5f / width * scale_x, 0.5f / height * scale_y);
+ shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y,
+ 2.f / width * scale_x, 2.f / height * scale_y);
+
+ {
+ LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
+ S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH);
+ gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true);
+
+ renderTriangle();
+ }
+
+ if (channel > -1)
+ {
+ shader->unbindTexture(channel);
}
+
+ shader->unbind();
+ dst->flush();
+
+ return true;
}
void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
@@ -7576,7 +7636,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
LLRenderTarget& dest = mFXAAMap;
LLGLSLShader& edge_shader = gSMAAEdgeDetectProgram[fsaa_quality];
- dest.bindTarget();
+ dest.bindTarget("generateSMAABuffers", 1);
dest.clear(GL_COLOR_BUFFER_BIT);
edge_shader.bind();
@@ -7587,14 +7647,17 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
{
if (!use_sample)
{
- src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
- gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ //src->bindTexture(0, channel, LLTexUnit::TFO_POINT);
+ //gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);
}
else
{
gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);
- gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ //gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
}
+ gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
//if (use_stencil)
@@ -7603,13 +7666,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
// glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// glStencilMask(0xFF);
//}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+
+ renderTriangle();
edge_shader.unbind();
dest.flush();
- gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE);
+ //gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE);
}
{
@@ -7619,7 +7682,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
LLRenderTarget& dest = mSMAABlendBuffer;
LLGLSLShader& blend_weights_shader = gSMAABlendWeightsProgram[fsaa_quality];
- dest.bindTarget();
+ dest.bindTarget("mSMAABlendBuffer", 1);
dest.clear(GL_COLOR_BUFFER_BIT);
blend_weights_shader.bind();
@@ -7651,22 +7714,25 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)
// glStencilFunc(GL_EQUAL, 1, 0xFF);
// glStencilMask(0x00);
//}
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+
+ renderTriangle();
//if (use_stencil)
//{
// glStencilFunc(GL_ALWAYS, 0, 0xFF);
//}
+
blend_weights_shader.unbind();
dest.flush();
+
gGL.getTexUnit(edge_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(area_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(search_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
}
}
+ LOG_GLERROR("LLPipeline::generateSMAABuffers()");
}
-void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
{
llassert(!gCubeSnapshot);
@@ -7677,79 +7743,75 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)
multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();
}
- // Present everything.
- if (multisample)
- {
- LL_PROFILE_GPU_ZONE("aa");
- static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
- U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
+ if(!multisample) return false;
- S32 width = src->getWidth();
- S32 height = src->getHeight();
+ LL_PROFILE_GPU_ZONE("aa");
- float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height };
+ generateSMAABuffers(src);
- LLGLDepthTest depth(GL_FALSE, GL_FALSE);
- static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false);
- //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true);
+ static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);
+ U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U);
- {
- //LLGLDisable stencil(GL_STENCIL_TEST);
+ S32 width = src->getWidth();
+ S32 height = src->getHeight();
- // Bind setup:
- LLRenderTarget* bound_target = dst;
- LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality];
+ float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height };
- bound_target->bindTarget();
- bound_target->clear(GL_COLOR_BUFFER_BIT);
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
- blend_shader.bind();
- blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics);
+ static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false);
+ //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true);
- S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE);
- if(diffuse_channel > -1)
- {
- src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR);
- gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
- }
+ {
+ //LLGLDisable stencil(GL_STENCIL_TEST);
- S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX);
- if (blend_channel > -1)
- {
- mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR);
- }
+ // Bind setup:
+ LLRenderTarget* bound_target = dst;
+ LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality];
+
+ bound_target->bindTarget("applySMAA", 1);
+ bound_target->clear(GL_COLOR_BUFFER_BIT);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ blend_shader.bind();
+ blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics);
- bound_target->flush();
- blend_shader.unbind();
- gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
- gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
+ S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE);
+ if(diffuse_channel > -1)
+ {
+ src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR);
+ gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
}
+
+ S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX);
+ if (blend_channel > -1)
+ {
+ mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR);
+ }
+
+ renderTriangle();
+
+ bound_target->flush();
+ blend_shader.unbind();
+ gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
+ gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE);
}
- else
- {
- copyRenderTarget(src, dst);
- }
+
+ LOG_GLERROR("LLPipeline::applySMAA()");
+ return true;
}
void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)
{
-
LL_PROFILE_GPU_ZONE("copyRenderTarget");
- dst->bindTarget();
-
+ dst->bindTarget("copyRenderTarget", 1);
+ dst->clear(GL_COLOR_BUFFER_BIT);
gDeferredPostNoDoFProgram.bind();
gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src);
- gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
+ //gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
- {
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- }
+ renderTriangle();
gDeferredPostNoDoFProgram.unbind();
@@ -7760,214 +7822,323 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)
{
// Go ahead and do our glow combine here in our destination. We blit this later into the front buffer.
- dst->bindTarget();
+ dst->bindTarget("combineGlow", 1);
{
-
gGlowCombineProgram.bind();
gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src);
gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
dst->flush();
+ LOG_GLERROR("LLPipeline::combineGlow()");
}
-void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
+bool LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
{
- {
- bool dof_enabled =
+ bool dof_enabled =
(RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&
RenderDepthOfField &&
!gCubeSnapshot;
- gViewerWindow->setup3DViewport();
+ if(!dof_enabled) return false;
- if (dof_enabled)
- {
- LL_PROFILE_GPU_ZONE("dof");
- LLGLDisable blend(GL_BLEND);
+ gViewerWindow->setup3DViewport();
- // depth of field focal plane calculations
- static F32 current_distance = 16.f;
- static F32 start_distance = 16.f;
- static F32 transition_time = 1.f;
+ if (dof_enabled)
+ {
+ LL_PROFILE_GPU_ZONE("dof");
+ LLGLDisable blend(GL_BLEND);
- LLVector3 focus_point;
+ // depth of field focal plane calculations
+ static F32 current_distance = 16.f;
+ static F32 start_distance = 16.f;
+ static F32 transition_time = 1.f;
- LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
- if (obj && obj->mDrawable && obj->isSelected())
- { // focus on selected media object
- S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
- if (obj && obj->mDrawable)
- {
- LLFace* face = obj->mDrawable->getFace(face_idx);
- if (face)
- {
- focus_point = face->getPositionAgent();
- }
- }
- }
+ LLVector3 focus_point;
- if (focus_point.isExactlyZero())
+ LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
+ if (obj && obj->mDrawable && obj->isSelected())
+ { // focus on selected media object
+ S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
+ if (obj && obj->mDrawable)
{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- { // focus on point under cursor
- focus_point.set(gDebugRaycastIntersection.getF32ptr());
- }
- else if (gAgentCamera.cameraMouselook())
- { // focus on point under mouselook crosshairs
- LLVector4a result;
- result.clear();
-
- gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result);
-
- focus_point.set(result.getF32ptr());
- }
- else
+ LLFace* face = obj->mDrawable->getFace(face_idx);
+ if (face)
{
- // focus on alt-zoom target
- LLViewerRegion* region = gAgent.getRegion();
- if (region)
- {
- focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
- }
+ focus_point = face->getPositionAgent();
}
}
+ }
- LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
- F32 target_distance = 16.f;
- if (!focus_point.isExactlyZero())
- {
- target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye);
+ if (focus_point.isExactlyZero())
+ {
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ { // focus on point under cursor
+ focus_point.set(gDebugRaycastIntersection.getF32ptr());
}
+ else if (gAgentCamera.cameraMouselook())
+ { // focus on point under mouselook crosshairs
+ LLVector4a result;
+ result.clear();
- if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f)
- { // large shift happened, interpolate smoothly to new target distance
- transition_time = 0.f;
- start_distance = current_distance;
- }
- else if (transition_time < 1.f)
- { // currently in a transition, continue interpolating
- transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value();
- transition_time = llmin(transition_time, 1.f);
+ gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result);
- F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f;
- current_distance = start_distance + (target_distance - start_distance) * t;
+ focus_point.set(result.getF32ptr());
}
else
- { // small or no change, just snap to target distance
- current_distance = target_distance;
+ {
+ // focus on alt-zoom target
+ LLViewerRegion* region = gAgent.getRegion();
+ if (region)
+ {
+ focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
+ }
}
+ }
+
+ LLVector3 eye = LLViewerCamera::getInstance()->getOrigin();
+ F32 target_distance = 16.f;
+ if (!focus_point.isExactlyZero())
+ {
+ target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye);
+ }
+
+ if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f)
+ { // large shift happened, interpolate smoothly to new target distance
+ transition_time = 0.f;
+ start_distance = current_distance;
+ }
+ else if (transition_time < 1.f)
+ { // currently in a transition, continue interpolating
+ transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value();
+ transition_time = llmin(transition_time, 1.f);
- // convert to mm
- F32 subject_distance = current_distance * 1000.f;
- F32 fnumber = CameraFNumber;
- F32 default_focal_length = CameraFocalLength;
+ F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f;
+ current_distance = start_distance + (target_distance - start_distance) * t;
+ }
+ else
+ { // small or no change, just snap to target distance
+ current_distance = target_distance;
+ }
- F32 fov = LLViewerCamera::getInstance()->getView();
+ // convert to mm
+ F32 subject_distance = current_distance * 1000.f;
+ F32 fnumber = CameraFNumber;
+ F32 default_focal_length = CameraFocalLength;
- const F32 default_fov = CameraFieldOfView * F_PI / 180.f;
+ F32 fov = LLViewerCamera::getInstance()->getView();
- // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight();
+ const F32 default_fov = CameraFieldOfView * F_PI / 180.f;
- F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f);
+ // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight();
- F32 focal_length = dv / (2 * tanf(fov / 2.f));
+ F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f);
- // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
+ F32 focal_length = dv / (2 * tanf(fov / 2.f));
- // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
- // where N = fnumber
- // s2 = dot distance
- // s1 = subject distance
- // f = focal length
- //
+ // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle);
- F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length));
- blur_constant /= 1000.f; // convert to meters for shader
- F32 magnification = focal_length / (subject_distance - focal_length);
+ // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f))
+ // where N = fnumber
+ // s2 = dot distance
+ // s1 = subject distance
+ // f = focal length
+ //
- { // build diffuse+bloom+CoF
- mRT->deferredLight.bindTarget();
+ F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length));
+ blur_constant /= 1000.f; // convert to meters for shader
+ F32 magnification = focal_length / (subject_distance - focal_length);
- gDeferredCoFProgram.bind();
+ { // build diffuse+bloom+CoF
+ mRT->deferredLight.bindTarget("renderDOF", 1);
- gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT);
- gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
+ gDeferredCoFProgram.bind();
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
- gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f);
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle));
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
- gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+ gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT);
+ gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
- gDeferredCoFProgram.unbind();
- mRT->deferredLight.flush();
- }
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff);
+ gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f);
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant);
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle));
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification);
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
- U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale);
- U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale);
+ renderTriangle();
- { // perform DoF sampling at half-res (preserve alpha channel)
- src->bindTarget();
- glViewport(0, 0, dof_width, dof_height);
+ gDeferredCoFProgram.unbind();
+ mRT->deferredLight.flush();
+ }
- gGL.setColorMask(true, false);
+ U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale);
+ U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale);
- gDeferredPostProgram.bind();
- gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT);
+ { // perform DoF sampling at half-res (preserve alpha channel)
+ src->bindTarget("DoF sampling", 1);
+ glViewport(0, 0, dof_width, dof_height);
- gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
- gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
- gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+ gGL.setColorMask(true, false);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ gDeferredPostProgram.bind();
+ gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT);
- gDeferredPostProgram.unbind();
+ gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
+ gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
- src->flush();
- gGL.setColorMask(true, true);
- }
+ renderTriangle();
- { // combine result based on alpha
+ gDeferredPostProgram.unbind();
- dst->bindTarget();
- glViewport(0, 0, dst->getWidth(), dst->getHeight());
+ src->flush();
+ gGL.setColorMask(true, true);
+ }
- gDeferredDoFCombineProgram.bind();
- gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT);
- gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT);
+ { // combine result based on alpha
- gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
- gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
- gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
- gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth());
- gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight());
+ dst->bindTarget("DoF combine", 1);
+ glViewport(0, 0, dst->getWidth(), dst->getHeight());
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ gDeferredDoFCombineProgram.bind();
+ gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT);
+ gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT);
- gDeferredDoFCombineProgram.unbind();
+ gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight());
+ gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF);
+ gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale);
+ gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth());
+ gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight());
- dst->flush();
- }
- }
- else
- {
- copyRenderTarget(src, dst);
+
+ renderTriangle();
+
+ gDeferredDoFCombineProgram.unbind();
+ dst->flush();
}
}
+
+ return true;
+}
+
+bool LLPipeline::renderBloom(LLRenderTarget* src, LLRenderTarget* dst)
+{
+ static LLCachedControl<U32> mp_render_bloom(gSavedSettings, "MPRenderBloom", 0);
+
+ if(mp_render_bloom < 1) return false;
+
+ static LLCachedControl<F32> mp_bloom_extract_brightness(gSavedSettings, "MPBloomExtractBrightness", 0.10);
+ static LLCachedControl<F32> mp_bloom_radius(gSavedSettings, "MPBloomBlurRadius", 1.5);
+ static LLCachedControl<F32> mp_bloom_radius_add(gSavedSettings, "MPBloomBlurRadiusAdd", 0);
+ static LLCachedControl<F32> mp_bloom_strength(gSavedSettings, "MPBloomStrength", 1.0);
+ static LLCachedControl<F32> mp_bloom_metal(gSavedSettings, "MPBloomExtractMetal", 0.2);
+ static LLCachedControl<F32> mp_bloom_nonmetal(gSavedSettings, "MPBloomExtractNonMetal", 0.2);
+
+ LLGLDepthTest depth(GL_FALSE, GL_FALSE);
+ LLGLDisable blend(GL_BLEND);
+
+ mBloomMap.bindTarget("mBloomMap", 1);
+
+ glClearColor(0, 0, 0, 0);
+ mBloomMap.clear();
+
+ gBloomExtractProgram.bind();
+ gBloomExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src);
+ gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 1);
+ gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE, &mGlow[1], false, LLTexUnit::TFO_POINT, 0);
+ gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 3);
+
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_BRIGHTNESS, 1.0 - mp_bloom_extract_brightness);
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_METAL, mp_bloom_metal);
+ gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_NONMETAL, mp_bloom_nonmetal);
+
+ renderTriangle();
+
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE);
+ gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2);
+
+ gBloomExtractProgram.unbind();
+ mBloomMap.flush();
+
+
+ // ping pong blur
+
+ S16 horizontal = 1, first_iteration = true;
+ unsigned int amount = mp_render_bloom;
+ if(amount > 10) amount = 10;
+
+ F32 radius = mp_bloom_radius;
+
+ gBloomBlurProgram.bind();
+
+
+ // Iteration 0
+
+ gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius);
+
+ mBloomBlur[0].bindTarget("", 1);
+ //mBloomBlur[0].clear();
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomMap);
+ renderTriangle();
+ mBloomBlur[0].flush();
+
+ mBloomBlur[1].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]);
+ renderTriangle();
+ mBloomBlur[1].flush();
+
+
+ // additional iterations
+
+ for (unsigned int i = 1; i < amount; i++)
+ {
+ radius += mp_bloom_radius_add;
+ gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius);
+
+ mBloomBlur[0].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[1]);
+ renderTriangle();
+ mBloomBlur[0].flush();
+
+ mBloomBlur[1].bindTarget("", 1);
+ gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1);
+ gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]);
+ renderTriangle();
+ mBloomBlur[1].flush();
+ }
+
+ gBloomBlurProgram.unbindTexture(LLShaderMgr::BLOOM_EMAP);
+ gBloomBlurProgram.unbind();
+
+
+ // combine
+
+ dst->bindTarget("bloom combine", 1);
+ //dst->clear();
+
+ gBloomCombineProgram.bind();
+
+ gBloomCombineProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src);
+ gBloomCombineProgram.bindTexture(LLShaderMgr::BLOOM_BMAP, &mBloomBlur[1]);
+ gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_STRENGTH, mp_bloom_strength);
+
+ renderTriangle();
+
+ gBloomCombineProgram.unbind();
+ dst->flush();
+
+ return true;
}
void LLPipeline::renderFinalize()
@@ -7986,7 +8157,11 @@ void LLPipeline::renderFinalize()
LLGLDisable blend(GL_BLEND);
LLGLDisable cull(GL_CULL_FACE);
- enableLightsFullbright();
+ gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
+ glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
gGL.setColorMask(true, true);
glClearColor(0, 0, 0, 0);
@@ -7994,6 +8169,10 @@ void LLPipeline::renderFinalize()
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr();
+ U16 activeRT = 0;
+
+ LLRenderTarget* postHDRBuffer = &mRT->screen;
+
if (hdr)
{
copyScreenSpaceReflections(&mRT->screen, &mSceneMap);
@@ -8002,38 +8181,49 @@ void LLPipeline::renderFinalize()
generateExposure(&mLuminanceMap, &mExposureMap);
- tonemap(&mRT->screen, &mPostMap);
+ tonemap(&mRT->screen, &mRT->deferredLight);
+
+ postHDRBuffer = &mRT->deferredLight;
- applyCAS(&mPostMap, &mRT->screen);
}
- generateSMAABuffers(&mRT->screen);
+ gammaCorrect(postHDRBuffer, &mPostMaps[0]);
- gammaCorrect(&mRT->screen, &mPostMap);
+ generateGlow(&mPostMaps[0]);
LLVertexBuffer::unbind();
- applySMAA(&mPostMap, &mRT->screen);
+ if(renderBloom(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
- generateGlow(&mRT->screen);
+ combineGlow(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]);
+ activeRT = 1 - activeRT;
- combineGlow(&mRT->screen, &mPostMap);
+ if(applyFXAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
- gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
- gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
- gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
- gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
- glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
+ if(applyCAS(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
+
+ if(applySMAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
+ {
+ activeRT = 1 - activeRT;
+ }
- renderDoF(&mPostMap, &mRT->screen);
- LLRenderTarget* finalBuffer = &mRT->screen;
- if (RenderFSAAType == 1)
+ if(renderDoF(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))
{
- applyFXAA(&mRT->screen, &mPostMap);
- finalBuffer = &mPostMap;
+ activeRT = 1 - activeRT;
}
+ LLRenderTarget* finalBuffer = &mPostMaps[activeRT];
+
if (RenderBufferVisualization > -1)
{
switch (RenderBufferVisualization)
@@ -8063,6 +8253,27 @@ void LLPipeline::renderFinalize()
}
break;
}
+ case 7:
+ visualizeBuffers(&mBloomMap, finalBuffer, 0);
+ break;
+ case 8:
+ visualizeBuffers(&mBloomBlur[1], finalBuffer, 0);
+ break;
+ case 9:
+ visualizeBuffers(&mPostMaps[activeRT], finalBuffer, 0);
+ break;
+ case 10:
+ visualizeBuffers(&mGlow[0], finalBuffer, 0);
+ break;
+ case 11:
+ visualizeBuffers(&mGlow[1], finalBuffer, 0);
+ break;
+ case 12:
+ visualizeBuffers(&mGlow[2], finalBuffer, 0);
+ break;
+ case 13:
+ visualizeBuffers(&mSceneMap, finalBuffer, 0);
+ break;
default:
break;
}
@@ -8080,8 +8291,7 @@ void LLPipeline::renderFinalize()
{
LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
gDeferredPostNoDoFNoiseProgram.unbind();
@@ -8096,8 +8306,8 @@ void LLPipeline::renderFinalize()
/*if (LLRenderTarget::sUseFBO && !gCubeSnapshot)
{ // copy depth buffer from mRT->screen to framebuffer
LLRenderTarget::copyContentsToFramebuffer(mRT->screen, 0, 0, mRT->screen.getWidth(), mRT->screen.getHeight(), 0, 0,
- mRT->screen.getWidth(), mRT->screen.getHeight(),
- GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
+ mRT->screen.getWidth(), mRT->screen.getHeight(),
+ GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
}*/
LLVertexBuffer::unbind();
@@ -8106,6 +8316,7 @@ void LLPipeline::renderFinalize()
// flush calls made to "addTrianglesDrawn" so far to stats machinery
recordTrianglesDrawn();
+ LOG_GLERROR("LLPipeline::renderFinalize()");
}
void LLPipeline::bindLightFunc(LLGLSLShader& shader)
@@ -8125,6 +8336,8 @@ void LLPipeline::bindLightFunc(LLGLSLShader& shader)
void LLPipeline::bindShadowMaps(LLGLSLShader& shader)
{
+ LOG_GLERROR("bindShadowMaps() 1");
+
for (U32 i = 0; i < 4; i++)
{
LLRenderTarget* shadow_target = getSunShadowTarget(i);
@@ -8138,6 +8351,8 @@ void LLPipeline::bindShadowMaps(LLGLSLShader& shader)
}
}
+ LOG_GLERROR("bindShadowMaps() 2");
+
for (U32 i = 4; i < 6; i++)
{
S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i);
@@ -8246,7 +8461,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
bindLightFunc(shader);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader()");
light_target = light_target ? light_target : deferred_light_target;
channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_target->getUsage());
@@ -8262,11 +8477,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
}
}
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 2");
bindShadowMaps(shader);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 3");
F32 mat[16*6];
for (U32 i = 0; i < 16; i++)
@@ -8281,7 +8496,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat);
- stop_glerror();
+ LOG_GLERROR("bindDeferredShader() 4");
if (!LLPipeline::sReflectionProbesEnabled)
{
@@ -8298,8 +8513,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
F32* m = gGLModelView;
F32 mat[] = { m[0], m[1], m[2],
- m[4], m[5], m[6],
- m[8], m[9], m[10] };
+ m[4], m[5], m[6],
+ m[8], m[9], m[10] };
shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, true, mat);
}
@@ -8435,6 +8650,8 @@ void LLPipeline::renderDeferredLighting()
return;
}
+ LOG_GLERROR("renderDeferredLighting begin");
+
llassert(!sRenderingHUDs);
F32 light_scale = 1.f;
@@ -8479,7 +8696,7 @@ void LLPipeline::renderDeferredLighting()
if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0)
{
LL_PROFILE_GPU_ZONE("sun program");
- deferred_light_target->bindTarget();
+ deferred_light_target->bindTarget("sun_shader", 1);
{ // paint shadow/SSAO light map (direct lighting lightmap)
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow");
@@ -8491,8 +8708,8 @@ void LLPipeline::renderDeferredLighting()
glClearColor(0, 0, 0, 0);
sun_shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
- (GLfloat)deferred_light_target->getWidth(),
- (GLfloat)deferred_light_target->getHeight());
+ (GLfloat)deferred_light_target->getWidth(),
+ (GLfloat)deferred_light_target->getHeight());
{
LLGLDisable blend(GL_BLEND);
@@ -8511,7 +8728,7 @@ void LLPipeline::renderDeferredLighting()
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow");
LL_PROFILE_GPU_ZONE("soften shadow");
// blur lightmap
- screen_target->bindTarget();
+ screen_target->bindTarget("SSAO", 1);
glClearColor(1, 1, 1, 1);
screen_target->clear(GL_COLOR_BUFFER_BIT);
glClearColor(0, 0, 0, 0);
@@ -8544,8 +8761,7 @@ void LLPipeline::renderDeferredLighting()
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
screen_target->flush();
@@ -8553,27 +8769,27 @@ void LLPipeline::renderDeferredLighting()
bindDeferredShader(gDeferredBlurLightProgram, screen_target);
- deferred_light_target->bindTarget();
+ deferred_light_target->bindTarget("blur light", 1);
gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f);
{
LLGLDisable blend(GL_BLEND);
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
deferred_light_target->flush();
unbindDeferredShader(gDeferredBlurLightProgram);
}
- screen_target->bindTarget();
+ screen_target->bindTarget("renderDeferredLighting screen_target", 1);
// clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky
glClearColor(0, 0, 0, 0);
screen_target->clear(GL_COLOR_BUFFER_BIT);
if (RenderDeferredAtmospheric)
- { // apply sunlight contribution
+ {
+ // apply sunlight contribution
LLGLSLShader &soften_shader = gDeferredSoftenProgram;
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - atmospherics");
@@ -8600,8 +8816,7 @@ void LLPipeline::renderDeferredLighting()
LLGLDisable blend(GL_BLEND);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
unbindDeferredShader(gDeferredSoftenProgram);
@@ -8817,8 +9032,7 @@ void LLPipeline::renderDeferredLighting()
gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);
far_z = 0.f;
count = 0;
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(gDeferredMultiLightProgram[idx]);
}
}
@@ -8854,6 +9068,9 @@ void LLPipeline::renderDeferredLighting()
gDeferredMultiSpotLightProgram.uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ /*
+ gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ */
}
gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION);
@@ -8869,35 +9086,35 @@ void LLPipeline::renderDeferredLighting()
pushRenderTypeMask();
andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA,
- LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER,
- LLPipeline::RENDER_TYPE_ALPHA_POST_WATER,
- LLPipeline::RENDER_TYPE_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_VOLUME,
- LLPipeline::RENDER_TYPE_GLOW,
- LLPipeline::RENDER_TYPE_BUMP,
- LLPipeline::RENDER_TYPE_GLTF_PBR,
- LLPipeline::RENDER_TYPE_PASS_SIMPLE,
- LLPipeline::RENDER_TYPE_PASS_ALPHA,
- LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
- LLPipeline::RENDER_TYPE_PASS_BUMP,
- LLPipeline::RENDER_TYPE_PASS_POST_BUMP,
- LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
- LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
- LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY,
- LLPipeline::RENDER_TYPE_PASS_GLOW,
- LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW,
- LLPipeline::RENDER_TYPE_PASS_GRASS,
- LLPipeline::RENDER_TYPE_PASS_SHINY,
- LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
- LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
- LLPipeline::RENDER_TYPE_AVATAR,
- LLPipeline::RENDER_TYPE_CONTROL_AV,
- LLPipeline::RENDER_TYPE_ALPHA_MASK,
- LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
- LLPipeline::RENDER_TYPE_TERRAIN,
- LLPipeline::RENDER_TYPE_WATER,
- LLPipeline::RENDER_TYPE_WATEREXCLUSION,
- END_RENDER_TYPES);
+ LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER,
+ LLPipeline::RENDER_TYPE_ALPHA_POST_WATER,
+ LLPipeline::RENDER_TYPE_FULLBRIGHT,
+ LLPipeline::RENDER_TYPE_VOLUME,
+ LLPipeline::RENDER_TYPE_GLOW,
+ LLPipeline::RENDER_TYPE_BUMP,
+ LLPipeline::RENDER_TYPE_GLTF_PBR,
+ LLPipeline::RENDER_TYPE_PASS_SIMPLE,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA,
+ LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_PASS_BUMP,
+ LLPipeline::RENDER_TYPE_PASS_POST_BUMP,
+ LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT,
+ LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY,
+ LLPipeline::RENDER_TYPE_PASS_GLOW,
+ LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW,
+ LLPipeline::RENDER_TYPE_PASS_GRASS,
+ LLPipeline::RENDER_TYPE_PASS_SHINY,
+ LLPipeline::RENDER_TYPE_PASS_INVISIBLE,
+ LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY,
+ LLPipeline::RENDER_TYPE_AVATAR,
+ LLPipeline::RENDER_TYPE_CONTROL_AV,
+ LLPipeline::RENDER_TYPE_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,
+ LLPipeline::RENDER_TYPE_TERRAIN,
+ LLPipeline::RENDER_TYPE_WATER,
+ LLPipeline::RENDER_TYPE_WATEREXCLUSION,
+ END_RENDER_TYPES);
renderGeomPostDeferred(*LLViewerCamera::getInstance());
popRenderTypeMask();
@@ -8916,11 +9133,14 @@ void LLPipeline::renderDeferredLighting()
}
}
gGL.setColorMask(true, true);
+
+ LOG_GLERROR("renderDeferredLighting end");
}
void LLPipeline::doAtmospherics()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+ LOG_GLERROR("doAtmospherics begin");
if (sImpostorRender)
{ // do not attempt atmospherics on impostors
@@ -8938,7 +9158,7 @@ void LLPipeline::doAtmospherics()
LLRenderTarget& dst = gPipeline.mWaterDis;
mRT->screen.flush();
- dst.bindTarget();
+ dst.bindTarget("doAtmospherics dst", 1);
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
@@ -8948,11 +9168,10 @@ void LLPipeline::doAtmospherics()
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
gGL.setColorMask(false, false);
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst.flush();
- mRT->screen.bindTarget();
+ mRT->screen.bindTarget("atmospherics", 1);
}
LLGLEnable blend(GL_BLEND);
@@ -8974,13 +9193,14 @@ void LLPipeline::doAtmospherics()
LLGLDepthTest depth(GL_FALSE);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
unbindDeferredShader(haze_shader);
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
+
+ LOG_GLERROR("doAtmospherics end");
}
void LLPipeline::doWaterHaze()
@@ -9002,7 +9222,8 @@ void LLPipeline::doWaterHaze()
LLRenderTarget& dst = gPipeline.mWaterDis;
mRT->screen.flush();
- dst.bindTarget();
+
+ dst.bindTarget("water haze copy depth", 1);
gCopyDepthProgram.bind();
S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP);
@@ -9012,11 +9233,10 @@ void LLPipeline::doWaterHaze()
gGL.getTexUnit(depth_map)->bind(&depth_src, true);
gGL.setColorMask(false, false);
- gPipeline.mScreenTriangleVB->setBuffer();
- gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
dst.flush();
- mRT->screen.bindTarget();
+ mRT->screen.bindTarget("water haze", 1);
}
LLGLEnable blend(GL_BLEND);
@@ -9042,8 +9262,7 @@ void LLPipeline::doWaterHaze()
LLGLDepthTest depth(GL_FALSE);
// full screen blit
- mScreenTriangleVB->setBuffer();
- mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
+ renderTriangle();
}
else
{
@@ -9062,14 +9281,15 @@ void LLPipeline::doWaterHaze()
unbindDeferredShader(haze_shader);
-
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
+
+ LOG_GLERROR("after doWaterHaze()");
}
void LLPipeline::doWaterExclusionMask()
{
- mWaterExclusionMask.bindTarget();
+ mWaterExclusionMask.bindTarget("", 1);
glClearColor(1, 1, 1, 1);
mWaterExclusionMask.clear();
mWaterExclusionPool->render();
@@ -9222,6 +9442,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
}
}
+ LOG_GLERROR("setupSpotLight() end");
}
void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
@@ -9229,7 +9450,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
LLRenderTarget* deferred_target = &mRT->deferredScreen;
LLRenderTarget* deferred_light_target = &mRT->deferredLight;
- stop_glerror();
+ LOG_GLERROR("unbindDeferredShader() begin");
shader.disableTexture(LLShaderMgr::NORMAL_MAP, deferred_target->getUsage());
shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, deferred_target->getUsage());
shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage());
@@ -9278,6 +9499,8 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(0)->activate();
shader.unbind();
+
+ LOG_GLERROR("unbindDeferredShader() end");
}
void LLPipeline::setEnvMat(LLGLSLShader& shader)
@@ -9333,33 +9556,38 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)
}
// reflection probe shaders generally sample the scene map as well for SSR
- channel = shader.enableTexture(LLShaderMgr::SCENE_MAP);
- if (channel > -1)
- {
- gGL.getTexUnit(channel)->bind(&mSceneMap);
- }
+ //if(RenderScreenSpaceReflections)
+ //{
+ //LL_WARNS() << "binding SSR to reflection maps" << LL_ENDL;
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias);
- mPoissonOffset++;
+ channel = shader.enableTexture(LLShaderMgr::SCENE_MAP);
+ if (channel > -1)
+ {
+ gGL.getTexUnit(channel)->bind(&mSceneMap);
+ }
- if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples)
- mPoissonOffset = 0;
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias);
+ mPoissonOffset++;
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset);
- shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier);
+ if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples)
+ mPoissonOffset = 0;
- channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH);
- if (channel > -1)
- {
- gGL.getTexUnit(channel)->bind(&mSceneMap, true);
- }
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset);
+ shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier);
+ channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH);
+ if (channel > -1)
+ {
+ gGL.getTexUnit(channel)->bind(&mSceneMap, true);
+ }
+ //}
+ LOG_GLERROR("bindReflectionProbes() end");
}
void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader)
@@ -9373,6 +9601,8 @@ void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader)
gGL.getTexUnit(channel)->enable(LLTexUnit::TT_TEXTURE);
}
}
+
+ LOG_GLERROR("unbindReflectionProbes() end");
}
@@ -9431,11 +9661,13 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MASKED("Alpha Masked");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_BLEND("Alpha Blend");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass");
+static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MATERIAL("Alpha Material");
static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked");
void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp)
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);
LL_PROFILE_GPU_ZONE("renderShadow");
LLPipeline::sShadowRender = true;
@@ -9512,8 +9744,10 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
gGL.setColorMask(false, false);
}
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple");
LL_PROFILE_GPU_ZONE("shadow simple");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE);
+
gGL.getTexUnit(0)->disable();
for (U32 type : types)
@@ -9534,63 +9768,71 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa
{
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow geom");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_GEOM);
renderGeomShadow(shadow_cam);
}
- if(MPRenderShadowOpti < 3)
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha");
+ LL_PROFILE_GPU_ZONE("shadow alpha");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA);
+
+ const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0;
+ U32 target_width = LLRenderTarget::sCurResX;
+
+ for (int i = 0; i < 2; ++i)
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha");
- LL_PROFILE_GPU_ZONE("shadow alpha");
- const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0;
- U32 target_width = LLRenderTarget::sCurResX;
+ bool rigged = i == 1;
- for (int i = 0; i < 2; ++i)
{
- bool rigged = i == 1;
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked");
+ LL_PROFILE_GPU_ZONE("shadow alpha masked");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MASKED);
+ gDeferredShadowAlphaMaskProgram.bind(rigged);
+ LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
+ LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
+ renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged);
+ }
- {
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked");
- LL_PROFILE_GPU_ZONE("shadow alpha masked");
- gDeferredShadowAlphaMaskProgram.bind(rigged);
- LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
- LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
- renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged);
- }
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend");
+ LL_PROFILE_GPU_ZONE("shadow alpha blend");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_BLEND);
+ renderAlphaObjects(rigged);
+ }
- {
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend");
- LL_PROFILE_GPU_ZONE("shadow alpha blend");
- renderAlphaObjects(rigged);
- }
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked");
+ LL_PROFILE_GPU_ZONE("shadow alpha masked");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED);
+ gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged);
+ LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
+ LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
+ renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged);
+ }
+
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass");
+ LL_PROFILE_GPU_ZONE("shadow alpha grass");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_GRASS);
+
+ gDeferredTreeShadowProgram.bind(rigged);
+ LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);
+
+ if (i == 0)
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked");
- LL_PROFILE_GPU_ZONE("shadow alpha masked");
- gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged);
- LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);
- LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);
- renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged);
+ renderObjects(LLRenderPass::PASS_GRASS, true);
}
{
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass");
- LL_PROFILE_GPU_ZONE("shadow alpha grass");
- gDeferredTreeShadowProgram.bind(rigged);
- LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);
+ LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material");
+ LL_PROFILE_GPU_ZONE("shadow alpha material");
+ LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MATERIAL);
- if (i == 0)
- {
- renderObjects(LLRenderPass::PASS_GRASS, true);
- }
-
- {
- LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material");
- LL_PROFILE_GPU_ZONE("shadow alpha material");
- renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged);
- renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged);
- renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged);
- renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged);
- }
+ renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged);
+ renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged);
+ renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged);
+ renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged);
}
}
@@ -9868,16 +10110,24 @@ public:
void LLPipeline::generateSunShadow(LLCamera& camera)
{
- if (!sRenderDeferred || RenderShadowDetail <= 0 || (MPRenderShadowOpti > 0 && gCubeSnapshot))
+ if (!sRenderDeferred || RenderShadowDetail <= 0)
{
return;
}
+ if(gCubeSnapshot)
+ {
+ LL_WARNS() << "generateSunShadow() gCubeSnapshot" << LL_ENDL;
+ return;
+ }
+
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW);
LL_PROFILE_GPU_ZONE("generateSunShadow");
LLDisableOcclusionCulling no_occlusion;
+ U32 splits = 4;
+
bool skip_avatar_update = false;
if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)
{
@@ -9982,7 +10232,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLPlane shadow_near_clip;
{
LLVector3 p = camera.getOrigin(); // gAgent.getPositionAgent();
- p += caster_dir * RenderFarClip*2.f;
+ p += caster_dir * RenderFarClip*1.1f;
shadow_near_clip.setVec(p, caster_dir);
}
@@ -10055,30 +10305,36 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
update_min_max(min, max, fp[i]);
}
+ F32 maxDist = gSavedSettings.getF32("MPRenderShadowMaxDist");
near_clip = llclamp(-max.mV[2], 0.01f, 4.0f);
- F32 far_clip = llclamp(-min.mV[2]*2.f, 16.0f, 512.0f);
-
- //far_clip = llmin(far_clip, 128.f);
+ F32 far_clip = llclamp(-min.mV[2]*1.1, 16.0f, maxDist);
far_clip = llmin(far_clip, camera.getFar());
F32 range = far_clip-near_clip;
- LLVector3 split_exp = RenderShadowSplitExponent;
+ F32 closestDist = 2.0;
+ F32 closeDist = 10.0;
- F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
+ mSunClipPlanes.mV[0] = near_clip + closestDist;
+ mSunClipPlanes.mV[1] = near_clip + closeDist;
+ mSunClipPlanes.mV[2] = mSunClipPlanes.mV[1] + (range-closeDist)*0.4;
+ mSunClipPlanes.mV[3] = far_clip;
+ /*
+ LLVector3 split_exp = RenderShadowSplitExponent;
+ F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );
da = powf(da, split_exp.mV[2]);
-
F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da;
- for (U32 i = 0; i < 4; ++i)
+ for (U32 i = 0; i < splits; ++i)
{
- F32 x = (F32)(i+1)/4.f;
+ F32 x = (F32)(i+1)/(F32)splits;
x = powf(x, sxp);
mSunClipPlanes.mV[i] = near_clip+range*x;
}
+ */
- mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding
+ //mSunClipPlanes.mV[0] *= 1.1f; //bump back first split for transition padding
}
if (gCubeSnapshot)
@@ -10098,7 +10354,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
else
{
- for (S32 j = 0; j < (gCubeSnapshot ? 2 : 4); j++)
+ S32 begin = 0;
+ S32 end = splits-1;
+ if(gCubeSnapshot) end = 1;
+
+ for (S32 j = begin; j <= end; j++)
{
if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)
{
@@ -10136,8 +10396,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;
delta.normVec();
F32 dp = delta*pn;
- frust[i] = eye + (delta*dist[j]*0.75f)/dp;
- frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp;
+ frust[i] = eye + (delta*dist[j]*0.9f)/dp;
+ frust[i+4] = eye + (delta*dist[j+1]*1.1f)/dp;
}
shadow_cam.calcAgentFrustumPlanes(frust);
@@ -10150,12 +10410,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
std::vector<LLVector3> fp;
- U32 splits = 3;
- if(MPRenderShadowOpti == 1) splits = 2;
- else if(MPRenderShadowOpti >= 2) splits = 1;
-
- if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir)
- || j > splits)
+ if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))
{
//no possible shadow receivers
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)
@@ -10165,7 +10420,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
mShadowCamera[j+4] = shadow_cam;
}
- mRT->shadow[j].bindTarget();
+ mRT->shadow[j].bindTarget("", 1);
{
LLGLDepthTest depth(GL_TRUE);
mRT->shadow[j].clear();
@@ -10455,8 +10710,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
stop_glerror();
- mRT->shadow[j].bindTarget();
- mRT->shadow[j].getViewport(gGLViewport);
+ mRT->shadow[j].bindTarget("mRT->shadow[j] (rendering)", 1);
+ //mRT->shadow[j].getViewport(gGLViewport);
+ //mRT->shadow[j].getViewport(0, 0, SHADOWS_RESX, SHADOWS_RESY);
mRT->shadow[j].clear();
{
@@ -10604,8 +10860,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
//
- mSpotShadow[i].bindTarget();
- mSpotShadow[i].getViewport(gGLViewport);
+ mSpotShadow[i].bindTarget("mSpotShadow[i]", 1);
+ //mSpotShadow[i].getViewport(gGLViewport);
mSpotShadow[i].clear();
static LLCullResult result[2];
@@ -10653,6 +10909,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
+
+ LOG_GLERROR("LLPipeline::generateSunShadow()");
}
void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture)
@@ -10668,6 +10926,8 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture)
pass->renderGroup(group,type,texture);
}
}
+
+ LOG_GLERROR("LLPipeline::renderGroups()");
}
void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture)
@@ -10683,6 +10943,8 @@ void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture)
pass->renderRiggedGroup(group, type, texture);
}
}
+
+ LOG_GLERROR("LLPipeline::renderRiggedGroups()");
}
void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
@@ -10699,7 +10961,7 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr;
- mRT->deferredScreen.bindTarget();
+ mRT->deferredScreen.bindTarget("mRT->deferredScreen in profileAvatar", 1);
mRT->deferredScreen.clear();
if (!profile_attachments)
@@ -10753,6 +11015,8 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)
{
cur_shader->bind();
}
+
+ LOG_GLERROR("LLPipeline::profileAvatar()");
}
void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool for_profile, LLViewerObject* specific_attachment)
@@ -10777,12 +11041,12 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
// previews can't be muted or impostered
bool visually_muted = !for_profile && !preview_avatar && avatar->isVisuallyMuted();
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
- << " is " << ( visually_muted ? "" : "not ") << "visually muted"
- << LL_ENDL;
+ << " is " << ( visually_muted ? "" : "not ") << "visually muted"
+ << LL_ENDL;
bool too_complex = !for_profile && !preview_avatar && avatar->isTooComplex();
LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID()
- << " is " << ( too_complex ? "" : "not ") << "too complex"
- << LL_ENDL;
+ << " is " << ( too_complex ? "" : "not ") << "too complex"
+ << LL_ENDL;
pushRenderTypeMask();
@@ -10812,7 +11076,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
RENDER_TYPE_CLOUDS,
RENDER_TYPE_HUD_PARTICLES,
END_RENDER_TYPES
- );
+ );
}
if (specific_attachment && specific_attachment->isHUDAttachment())
@@ -10973,7 +11237,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
{
if (!avatar->mImpostor.isComplete())
{
- avatar->mImpostor.allocate(resX, resY, GL_RGBA, true);
+ avatar->mImpostor.allocate(resX, resY, GL_RGBA8, true);
if (LLPipeline::sRenderDeferred)
{
@@ -10989,7 +11253,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
avatar->mImpostor.resize(resX, resY);
}
- avatar->mImpostor.bindTarget();
+ avatar->mImpostor.bindTarget("avatar->mImpostor", 1);
}
}
@@ -11126,6 +11390,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool
}
LLVertexBuffer::unbind();
+
+ LOG_GLERROR("LLPipeline::generateImpostor()");
+
LLGLState::checkStates();
}
@@ -11401,7 +11668,7 @@ void LLPipeline::hideDrawable( LLDrawable *pDrawable )
//hide the children
LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();
for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end(); iter++ )
+ iter != child_list.end(); iter++ )
{
LLViewerObject* child = *iter;
LLDrawable* drawable = child->mDrawable;
@@ -11419,7 +11686,7 @@ void LLPipeline::unhideDrawable( LLDrawable *pDrawable )
//restore children
LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();
for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end(); iter++)
+ iter != child_list.end(); iter++)
{
LLViewerObject* child = *iter;
LLDrawable* drawable = child->mDrawable;
@@ -11450,7 +11717,7 @@ void LLPipeline::skipRenderingShadows()
for (S32 j = 0; j < 4; j++)
{
- mRT->shadow[j].bindTarget();
+ mRT->shadow[j].bindTarget("skip rendering shadows", 1);
mRT->shadow[j].clear();
mRT->shadow[j].flush();
}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index da9b8189e2..c56e181d2d 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -125,6 +125,8 @@ public:
private:
//implementation of above, wrapped for easy error handling
eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
+ void renderTriangle();
+
public:
//attempt to allocate screen buffers at resX, resY
@@ -158,15 +160,17 @@ public:
void tonemap(LLRenderTarget* src, LLRenderTarget* dst);
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
void generateGlow(LLRenderTarget* src);
- void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
- void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
+ bool applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
+ bool applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
void generateSMAABuffers(LLRenderTarget* src);
- void applySMAA(LLRenderTarget* src, LLRenderTarget* dst);
- void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
+ bool applySMAA(LLRenderTarget* src, LLRenderTarget* dst);
+ bool renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);
void combineGlow(LLRenderTarget* src, LLRenderTarget* dst);
void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex);
+ bool renderBloom(LLRenderTarget* src, LLRenderTarget* dst);
+
void init();
void cleanup();
bool isInit() { return mInitialized; };
@@ -228,12 +232,12 @@ public:
LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
- bool pick_transparent,
- S32* face_hit, // return the face hit
- LLVector4a* intersection = NULL, // return the intersection point
- LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
- LLVector4a* normal = NULL, // return the surface normal at the intersection point
- LLVector4a* tangent = NULL // return the surface tangent at the intersection point
+ bool pick_transparent,
+ S32* face_hit, // return the face hit
+ LLVector4a* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector4a* normal = NULL, // return the surface normal at the intersection point
+ LLVector4a* tangent = NULL // return the surface tangent at the intersection point
);
// Something about these textures has changed. Dirty them.
@@ -729,8 +733,12 @@ public:
LLRenderTarget mExposureMap;
LLRenderTarget mLastExposure;
+ LLRenderTarget mBloomMap;
+ LLRenderTarget mBloomBlur[2];
+
// tonemapped and gamma corrected render ready for post
- LLRenderTarget mPostMap;
+ //LLRenderTarget mPostMap;
+ LLRenderTarget mPostMaps[2];
// FXAA helper target
LLRenderTarget mFXAAMap;
@@ -835,8 +843,8 @@ protected:
{
Light(LLDrawable* ptr, F32 d, F32 f = 0.0f)
: drawable(ptr),
- dist(d),
- fade(f)
+ dist(d),
+ fade(f)
{}
LLPointer<LLDrawable> drawable;
F32 dist;
@@ -1008,7 +1016,7 @@ public:
static bool RenderDeferred;
static F32 RenderDeferredSunWash;
static U32 RenderFSAAType;
- static U32 RenderResolutionDivisor;
+ static F32 RenderResolutionDivisor;
static bool RenderUIBuffer;
static S32 RenderShadowDetail;
static S32 MPRenderShadowOpti;
diff --git a/indra/newview/skins/default/textures/megapahit/fps_button.png b/indra/newview/skins/default/textures/megapahit/fps_button.png
new file mode 100644
index 0000000000..fa436a620d
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/fps_button.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png
new file mode 100644
index 0000000000..1a27570786
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png
new file mode 100644
index 0000000000..f4c28e4bc9
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png
new file mode 100644
index 0000000000..64c8933a78
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png
new file mode 100644
index 0000000000..c90767b9ac
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png
new file mode 100644
index 0000000000..aeaa52b53b
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png
new file mode 100644
index 0000000000..026fbaf56d
--- /dev/null
+++ b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 1fe1ff333a..8af67c1f88 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -931,4 +931,13 @@ with the same filename but different name
<texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
<texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
+ <texture name="mp_fpsButton" file_name="megapahit/fps_button.png" preload="false" />
+
+ <texture name="mp_red_bullet" file_name="megapahit/mp_red_bullet.png" preload="false" />
+ <texture name="mp_yellow_bullet" file_name="megapahit/mp_yellow_bullet.png" preload="false" />
+ <texture name="mp_green_bullet" file_name="megapahit/mp_green_bullet.png" preload="false" />
+ <texture name="mp_blue_bullet" file_name="megapahit/mp_blue_bullet.png" preload="false" />
+ <texture name="mp_help_bullet" file_name="megapahit/mp_help_bullet.png" preload="false" />
+ <texture name="mp_info_bullet" file_name="megapahit/mp_info_bullet.png" preload="false" />
+
</textures>
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 0d22d37085..4e7ce2c32f 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -103,8 +103,8 @@ gwigz (nya) EmilyAmiee
Bavid Dailey Aria (Tashia Redrose)
Cate (32a) Hiroo Ono
Melodey Keysin (scoutkeysin)
-Yikes Lopez Padoria Teuden
-~ ( ^-^ ) ~ (cutie_qu) Markus Teuden
+Yikes Lopez Padoria
+~ ( ^-^ ) ~ (cutie_qu)
</text_editor>
<text
follows="top|left"
@@ -135,7 +135,6 @@ Vir Linden - Making it possible for the project to have a place in SL
nutsobvious - Early testing and video proof
Soft Linden - Security testing
Kyle Linden - Giving TPV parcel 2 to Erik Kundiman
-Signal Linden - Opening opportunities for Megapahit to contribute more
</text_editor>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/en/floater_mp_performance.xml b/indra/newview/skins/default/xui/en/floater_mp_performance.xml
index 1b5cf82dcb..13a32479fa 100644
--- a/indra/newview/skins/default/xui/en/floater_mp_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_mp_performance.xml
@@ -1,65 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- positioning="cascading"
- legacy_header_height="40"
- top="12"
- right="-334"
- height="80"
- min_height="120"
- width="330"
- min_width="330"
- can_minimize="true"
- can_close="true"
- can_resize="false"
- layout="topright"
- name="mpv_performance"
- single_instance="true"
- save_rect="true"
- save_visibility="true"
- title="FPS Limiter">
+positioning="cascading"
+legacy_header_height="40"
+top="12"
+right="-334"
+height="80"
+min_height="120"
+width="330"
+min_width="330"
+can_minimize="true"
+can_close="true"
+can_resize="false"
+layout="topright"
+name="mpv_performance"
+single_instance="true"
+save_rect="true"
+save_visibility="true"
+title="FPS Limiter">
- <panel
- name="panel_fps"
- border="false"
- width="320"
- height="60"
- left="10"
- top="40"
- follows="left|top|right|bottom"
- layout="topleft"
- >
+<panel
+ name="panel_fps"
+ border="false"
+ width="320"
+ height="60"
+ left="10"
+ top="40"
+ follows="left|top|right|bottom"
+ layout="topleft"
+ >
- <slider
- follows="left|top"
- width="240"
- height="15"
- left="12"
- layout="topleft"
- name="fpsSlider"
- enabled="true"
- control_name="fpsSlider"
- decimal_digits="0"
- increment="12"
- initial_value="0"
- label="Max FPS:"
- label_width="50"
- text_width="2"
- can_edit_text="false"
- show_text="false"
- >
- </slider>
+ <slider
+ follows="left|top"
+ width="240"
+ height="15"
+ left="12"
+ layout="topleft"
+ name="fpsSliderCtrl"
+ enabled="true"
+ decimal_digits="0"
+ min_val="0"
+ max_val="132"
+ increment="12"
+ initial_value="132"
+ label="Max FPS:"
+ label_width="50"
+ text_width="2"
+ can_edit_text="false"
+ show_text="false"
+ >
+ </slider>
- <text
- follows="left|top"
- width="50"
- height="15"
- left_delta="252"
- layout="topleft"
- type="string"
- name="fpsText"
- >
- no limit
- </text>
+ <text
+ follows="left|top"
+ width="50"
+ height="15"
+ left_delta="252"
+ layout="topleft"
+ type="string"
+ name="fpsTextCtrl"
+ >
+ no limit
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 4b0e0bb221..a96a4f2b75 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -1,175 +1,201 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- legacy_header_height="18"
- positioning="centered"
- default_tab_group="1"
- height="530"
- layout="topleft"
- name="Preferences"
- help_topic="preferences"
- save_rect="true"
- single_instance="true"
- title="PREFERENCES"
- width="658">
- <button
- follows="right|bottom"
- height="23"
- label="OK"
- label_selected="OK"
- layout="topleft"
- right="-105"
- name="OK"
- top="492"
- width="90">
- <button.commit_callback
- function="Pref.OK" />
- </button>
- <button
- follows="right|bottom"
- height="23"
- label="Cancel"
- label_selected="Cancel"
- layout="topleft"
- left_pad="5"
- name="Cancel"
- right="-10"
- width="90" >
- <button.commit_callback
- function="Pref.Cancel" />
- </button>
-
- <panel
- name="search_panel"
- layout="topleft"
- follows="left|top|right"
- left="4"
- right="-4"
- top="21"
- height="18"
- tab_group="2">
- <search_editor
- clear_button_visible="true"
- follows="left|top|right"
- height="18"
- label="Search Settings"
- layout="topleft"
- left="0"
- max_length_bytes="255"
- name="search_prefs_edit"
- right="-1"
- text_pad_left="6"
- tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment."
- top="0">
- <search_editor.commit_callback
- function="UpdateFilter" />
- <search_editor.clear_button
- rect.height="18"
- rect.width="18"
- rect.bottom="-1" />
- <search_editor.search_button
- rect.height="12"
- rect.width="12"
- rect.bottom="-1" />
- </search_editor>
- </panel>
-
- <tab_container
- follows="all"
- halign="left"
- height="440"
- layout="topleft"
- left="0"
- name="pref core"
- tab_group="1"
- tab_position="left"
- tab_width="140"
- tab_padding_right="0"
- top="40"
- width="658">
- <panel
- class="panel_preference"
- filename="panel_preferences_general.xml"
- label="General"
- layout="topleft"
- help_topic="preferences_general_tab"
- name="general" />
- <panel
- class="panel_preference_graphics"
- filename="panel_preferences_graphics1.xml"
- label="Graphics"
- layout="topleft"
- help_topic="preferences_display_tab"
- name="display" />
- <panel
- class="panel_preference"
- filename="panel_preferences_sound.xml"
- label="Sound &amp; Media"
- layout="topleft"
- help_topic="preferences_audio_tab"
- name="audio" />
- <panel
- class="panel_preference"
- filename="panel_preferences_chat.xml"
- label="Chat"
- layout="topleft"
- help_topic="preferences_chat_tab"
- name="chat" />
- <panel
- class="panel_preference"
- filename="panel_preferences_move.xml"
- label="Move &amp; View"
- layout="topleft"
- help_topic="preferences_move_tab"
- name="move" />
- <panel
- class="panel_preference"
- filename="panel_preferences_alerts.xml"
- label="Notifications"
- layout="topleft"
- help_topic="preferences_msgs_tab"
- name="msgs" />
- <panel
- class="panel_preference"
- filename="panel_preferences_colors.xml"
- label="Colors"
- layout="topleft"
- help_topic="preferences_colors_tab"
- name="colors" />
- <panel
- class="panel_preference_privacy"
- filename="panel_preferences_privacy.xml"
- label="Privacy"
- layout="topleft"
- help_topic="preferences_im_tab"
- name="im" />
- <panel
- class="panel_preference"
- filename="panel_preferences_setup.xml"
- label="Setup"
- layout="topleft"
- help_topic="preferences_input_tab"
- name="input" />
- <panel
- class="panel_preference"
- filename="panel_preferences_advanced.xml"
- label="Advanced"
- layout="topleft"
- help_topic="preferences_advanced1_tab"
- name="advanced1" />
- <panel
- class="panel_preference"
- filename="panel_preferences_uploads.xml"
- label="Uploads"
- layout="topleft"
- help_topic="preferences_uploads_tab"
- name="uploads" />
- <panel
- class="panel_preference_controls"
- filename="panel_preferences_controls.xml"
- label="Controls"
- layout="topleft"
- help_topic="preferences_controls_tab"
- name="controls" />
- </tab_container>
+legacy_header_height="18"
+positioning="centered"
+default_tab_group="1"
+height="530"
+layout="topleft"
+name="Preferences"
+help_topic="preferences"
+save_rect="true"
+single_instance="true"
+title="PREFERENCES"
+width="658">
+
+<button
+follows="right|bottom"
+height="23"
+label="OK"
+label_selected="OK"
+layout="topleft"
+right="-105"
+name="OK"
+top="492"
+width="90">
+ <button.commit_callback
+ function="Pref.OK" />
+</button>
+
+<button
+follows="right|bottom"
+height="23"
+label="Cancel"
+label_selected="Cancel"
+layout="topleft"
+left_pad="5"
+name="Cancel"
+right="-10"
+width="90" >
+ <button.commit_callback
+ function="Pref.Cancel" />
+</button>
+
+<panel
+name="search_panel"
+layout="topleft"
+follows="left|top|right"
+left="4"
+right="-4"
+top="21"
+height="18"
+tab_group="2">
+
+ <search_editor
+ clear_button_visible="true"
+ follows="left|top|right"
+ height="18"
+ label="Search Settings"
+ layout="topleft"
+ left="0"
+ max_length_bytes="255"
+ name="search_prefs_edit"
+ right="-1"
+ text_pad_left="6"
+ tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment."
+ top="0">
+
+ <search_editor.commit_callback
+ function="UpdateFilter" />
+
+ <search_editor.clear_button
+ rect.height="18"
+ rect.width="18"
+ rect.bottom="-1" />
+
+ <search_editor.search_button
+ rect.height="12"
+ rect.width="12"
+ rect.bottom="-1" />
+ </search_editor>
+</panel>
+
+<tab_container
+follows="all"
+halign="left"
+height="440"
+layout="topleft"
+left="0"
+name="pref core"
+tab_group="1"
+tab_position="left"
+tab_width="140"
+tab_padding_right="0"
+top="40"
+width="658">
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_general.xml"
+ label="General"
+ layout="topleft"
+ help_topic="preferences_general_tab"
+ name="general" />
+
+ <panel
+ class="panel_preference_graphics"
+ filename="panel_preferences_graphics1.xml"
+ label="Graphics"
+ layout="topleft"
+ help_topic="preferences_display_tab"
+ name="display" />
+
+ <panel
+ class="panel_preference_graphics3"
+ filename="panel_preferences_graphics3.xml"
+ label="Visual Effects"
+ layout="topleft"
+ help_topic="preferences_display_tab"
+ name="display3" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_sound.xml"
+ label="Sound &amp; Media"
+ layout="topleft"
+ help_topic="preferences_audio_tab"
+ name="audio" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_chat.xml"
+ label="Chat"
+ layout="topleft"
+ help_topic="preferences_chat_tab"
+ name="chat" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_move.xml"
+ label="Move &amp; View"
+ layout="topleft"
+ help_topic="preferences_move_tab"
+ name="move" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_alerts.xml"
+ label="Notifications"
+ layout="topleft"
+ help_topic="preferences_msgs_tab"
+ name="msgs" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_colors.xml"
+ label="Colors"
+ layout="topleft"
+ help_topic="preferences_colors_tab"
+ name="colors" />
+
+ <panel
+ class="panel_preference_privacy"
+ filename="panel_preferences_privacy.xml"
+ label="Privacy"
+ layout="topleft"
+ help_topic="preferences_im_tab"
+ name="im" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_setup.xml"
+ label="Setup"
+ layout="topleft"
+ help_topic="preferences_input_tab"
+ name="input" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_advanced.xml"
+ label="Advanced"
+ layout="topleft"
+ help_topic="preferences_advanced1_tab"
+ name="advanced1" />
+
+ <panel
+ class="panel_preference"
+ filename="panel_preferences_uploads.xml"
+ label="Uploads"
+ layout="topleft"
+ help_topic="preferences_uploads_tab"
+ name="uploads" />
+
+ <panel
+ class="panel_preference_controls"
+ filename="panel_preferences_controls.xml"
+ label="Controls"
+ layout="topleft"
+ help_topic="preferences_controls_tab"
+ name="controls" />
+</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index 88d6ae1bc2..ddb2833b5d 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -766,88 +766,12 @@
label="Sun/Moon + Projectors"
name="2"
value="2"/>
- </combo_box>
-
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="420"
- name="RenderShadowQualityText"
- text_readonly_color="LabelDisabledColor"
- top_delta="22"
- width="128">
- Shadows Optimisations
- </text>
-
- <combo_box
- control_name="MPRenderShadowOpti"
- height="18"
- layout="topleft"
- left_delta="130"
- top_delta="0"
- name="MPShadowQuality"
- width="150">
- <combo_box.item
- label="No optimisation"
- name="0"
- value="0"/>
- <combo_box.item
- label="Medium"
- name="1"
- value="1"/>
- <combo_box.item
- label="Faster"
- name="2"
- value="2"/>
- <combo_box.item
- label="Fastest"
+ <combo_box.item
+ label="Projectors only"
name="3"
value="3"/>
</combo_box>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="420"
- name="RenderShadowResolutionScaleText"
- text_readonly_color="LabelDisabledColor"
- top_delta="22"
- width="128">
- Shadows Resolution
- </text>
-
- <combo_box
- control_name="RenderShadowResolutionScale"
- height="18"
- layout="topleft"
- left_delta="130"
- top_delta="0"
- name="RenderShadowResolutionScale"
- width="150">
- <combo_box.item
- label="Default"
- name="Default"
- value="1.0"/>
- <combo_box.item
- label="High"
- name="High"
- value="1.5"/>
- <combo_box.item
- label="Ultra"
- name="Ultra"
- value="2.0"/>
- <combo_box.item
- label="Crazy"
- name="Crazy"
- value="3.0"/>
- </combo_box>
-
<check_box
control_name="RenderScreenSpaceReflections"
height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
index ece9bb2552..8d4e8dc8e8 100644
--- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
+++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml
@@ -420,6 +420,7 @@
width="180">
(Enter value between 0.0 and 4.0)
</text>
+
<text
follows="left|top"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 8248da9fda..c38af9d4fa 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -213,6 +213,7 @@
layout="topleft"
left="30"
name="stream_notification_channel_enabled"
+ top_pad="10"
width="256">
</check_box>
<spinner
@@ -232,15 +233,6 @@
name="stream_notification_channel"
top_pad="-15"
width="170" />
- <check_box
- control_name="SnapshotTimestamp"
- height="16"
- label="Add timestamp to snapshot file names"
- layout="topleft"
- left="30"
- name="snapshot_timestamp"
- width="256">
- </check_box>
<check_box
control_name="AllowMultipleViewers"
@@ -250,7 +242,7 @@
layout="topleft"
left="30"
name="allow_multiple_viewer_check"
- top_pad="15"
+ top_pad="20"
width="237"/>
<check_box
control_name="ForceShowGrid"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 6fd6c81217..df9f467fca 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -505,7 +505,6 @@
Skin
</text>
<radio_group
- control_name="skin_selection"
height="20"
layout="topleft"
left="35"
@@ -538,6 +537,15 @@
name="radio3"
value="contrast"
width="75" />
+ <radio_item
+ label="contrast gold"
+ left_pad="0"
+ layout="topleft"
+ top_delta="0"
+ height="16"
+ name="radio2"
+ value="contrast_gold"
+ width="75" />
<radio_group.commit_callback
function="Pref.SelectSkin" />
</radio_group>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml
new file mode 100644
index 0000000000..8b76ece106
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml
@@ -0,0 +1,1814 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+
+<panel
+name="Visuals effects panel"
+follows="left|top|right|bottom"
+label="Visuals Effects"
+layout="topleft"
+width="517"
+height="438"
+left="102"
+top="1"
+border="true"
+>
+
+<tab_container
+name="preferences_visuals_tab_container"
+enabled="true"
+top_pad="0"
+follows="left|top"
+width="517"
+height="430"
+left_delta="0"
+tab_position="top"
+tab_stop="false">
+
+<panel
+label="Megapahit"
+name="preferences_visuals_megapahit"
+layout="topleft"
+follows="top|left">
+
+<text
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="400"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Megapahit recommended settings:
+</text>
+
+<text
+follows="left|top"
+layout="topleft"
+width="400"
+height="18"
+left="120"
+top_pad="55"
+font="SansSerifSmall"
+>
+Clicking the button below is a good starting point
+</text>
+
+<button
+name="MPBalancedButton"
+follows="top|left"
+layout="topleft"
+width="200"
+height="23"
+left="155"
+top_pad="40"
+label="Recommended Settings"
+>
+</button>
+
+<text
+follows="left|top"
+layout="topleft"
+width="460"
+height="18"
+left="50"
+top_pad="60"
+font="SansSerifSmall"
+>
+We recommend capping the fps (touch the fps counter on the top right corner)
+</text>
+
+</panel>
+
+<panel
+label="Antialiasing"
+name="preferences_visuals_aa"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_aa_lbl"
+follows="left|top"
+layout="topleft"
+top_pad="20"
+width="100"
+height="18"
+left="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Antialiasing:
+</text>
+
+<text
+name="mp_aa_type_lbl"
+type="string"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="10"
+text_readonly_color="LabelDisabledColor"
+>
+Type:
+</text>
+
+<combo_box
+name="mp_aatype_ctrl"
+control_name="RenderFSAAType"
+label="Antialiasing"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+initial_value="0"
+>
+<combo_box.item
+ label="Disabled"
+ name="FSAADisabled"
+ value="0" />
+<combo_box.item
+ label="FXAA"
+ name="FXAA"
+ value="1" />
+<combo_box.item
+ label="SMAA"
+ name="SMAA"
+ value="2" />
+</combo_box>
+
+<icon
+name="mp_aa_bullet"
+tool_tip="Low performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_aa_info_bullet"
+tool_tip="Antialiasing method (FXAA is fast but blurry, SMAA is sharper)."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_aa_quality_lbl"
+tool_tip="Antialiasing quality: We recommend High or Ultra"
+type="string"
+length="1"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="10"
+text_readonly_color="LabelDisabledColor"
+>
+Quality:
+</text>
+
+<combo_box
+name="mp_aa_quality_ctrl"
+control_name="RenderFSAASamples"
+label="Antialiasing"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Low"
+name="Low"
+value="0" />
+<combo_box.item
+label="Medium"
+name="Medium"
+value="1" />
+<combo_box.item
+label="High"
+name="High"
+value="2" />
+<combo_box.item
+label="Ultra"
+name="Ultra"
+value="3" />
+</combo_box>
+
+<icon
+name="mp_aaq_bullet"
+tool_tip="Low performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_aaq_info_bullet"
+tool_tip="Quality of the selected antialiasing"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_cas_lbl"
+type="string"
+length="1"
+layout="topleft"
+follows="left|top"
+width="140"
+height="16"
+left="32"
+top_pad="20"
+text_readonly_color="LabelDisabledColor"
+>
+Sharpness:
+</text>
+
+<slider
+name="mp_cas_ctrl"
+control_name="RenderCASSharpness"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="0"
+initial_value="0.0"
+min_val="0.0"
+max_val="1.0"
+decimal_digits="1"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_cas_bullet"
+tool_tip="No performance impact, except there is an issue currently with the combination of SMAA and Sharpness, where the performance is going down. We are investigating..."
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_cas_info_bullet"
+tool_tip="Add sharpness to the image."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+follows="left|top"
+layout="topleft"
+width="400"
+height="18"
+left="55"
+top_pad="40"
+font="SansSerifSmall"
+>
+Beware: SMAA + Sharpness currently causes a slow down on Mac.
+</text>
+
+</panel>
+
+<panel
+label="Shadows"
+name="preferences_visuals_shadows"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_shadows_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Shadows
+</text>
+
+<text
+name="shadow_src_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows source:
+</text>
+
+<combo_box
+name="ShadowDetailCtrl"
+control_name="RenderShadowDetail"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Sun/Moon"
+name="1"
+value="1"/>
+<combo_box.item
+label="Sun/Moon + Projectors"
+name="2"
+value="2"/>
+<combo_box.item
+label="Projectors only"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_shadows_bullet"
+tool_tip="High to extreme performance impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadows_info_bullet"
+tool_tip="Enables a shadow source (Projectors only is experimental)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_dist_lbl"
+tool_tip="Maximum Shadow Draw distance (Enormous performance penalty)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall">
+Shadows Distance
+</text>
+
+<slider
+name="MPShadowDistCtrl"
+control_name="MPRenderShadowMaxDist"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="8"
+initial_value="64"
+min_val="16"
+max_val="256"
+decimal_digits="0"
+label_width="2">
+</slider>
+
+<icon
+name="mp_shadowd_bullet"
+tool_tip="Move to the left to improve performance"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowd_info_bullet"
+tool_tip="Limit the maximum shadow render distance"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_res_lbl"
+tool_tip="Shadow Resolution (Important video memory impact. Lower this if you encounter performance drop, or instability.)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows Resolution
+</text>
+
+<slider
+name="MPShadowResCtrl"
+control_name="RenderShadowResolutionScale"
+decimal_digits="1"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.5"
+initial_value="1.5"
+min_val="1.0"
+max_val="6.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_shadowdd_bullet"
+tool_tip="Move to the right to improve quality: High memory usage and potentially unstable on lower end gpus"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowdd_info_bullet"
+tool_tip="Improves the shadow map resolution (Use carefully)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_res_lbl"
+tool_tip="Shadow smoothness (This will only work if you activate Ambient Occlusion)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Shadows Smoothness
+</text>
+
+<slider
+name="shadowBlurCtrl"
+control_name="RenderShadowBlurSize"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.1"
+initial_value="1.0"
+min_val="0.0"
+max_val="3.0"
+decimal_digits="1"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_shadowsblur_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_shadowsblur_info_bullet"
+tool_tip="Adjust the shadow smoothness. This only works if SSAO is turned on"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="shadow_ssao_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="20"
+top_pad="40"
+font="SansSerifSmall"
+text_color="White"
+>
+Ambient Occlusion
+</text>
+
+<check_box
+name="mp_ssao_ctrl"
+control_name="RenderDeferredSSAO"
+label="Screen Space Ambient Occlusion"
+layout="topleft"
+width="200"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_ssao_bullet"
+tool_tip="Low to Medium performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_ssao_info_bullet"
+tool_tip="Adds some shadow based on surface proximity."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+label="Bloom"
+name="preferences_visuals_bloom"
+layout="topleft"
+follows="top|left">
+
+<text
+name="mp_bloom_lbl"
+follows="left|top"
+layout="topleft"
+width="200"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Bloom (experimental)
+</text>
+
+<text
+name="mp_bloom_level_lbl"
+tool_tip="Bloom Level: The higher, the more diffuse (medium gpu cost)\n Note: This setting can fix a performance issue when antialiasing is turned on)"
+type="string"
+length="1"
+follows="left|top"
+width="140"
+height="16"
+layout="topleft"
+left="32"
+top_pad="10"
+text_readonly_color="LabelDisabledColor"
+>
+Bloom level:
+</text>
+
+<combo_box
+name="MPBloomCtrl"
+control_name="MPRenderBloom"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Level 1"
+name="1"
+value="1"/>
+<combo_box.item
+label="Level 2"
+name="2"
+value="2"/>
+<combo_box.item
+label="Level 3"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_blooml_bullet"
+tool_tip="Low to Medium performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_blooml_info_bullet"
+tool_tip="Bloom adds a glowing effect around the brightest areas. The level affects the number of iterations, and the quality."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_radius_lbl"
+tool_tip="Bloom Radius"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Bloom Radius
+</text>
+
+<slider
+name="MPBloomRadiusCtrl"
+control_name="MPBloomBlurRadius"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.01"
+initial_value="1.0"
+label_width="2"
+min_val="0.0"
+max_val="3.0"
+>
+</slider>
+
+<icon
+name="mp_bloomr_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomr_info_bullet"
+tool_tip="Adjust the base radius of the effect"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_radiusadd_lbl"
+tool_tip="Bloom Radius addition"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Bloom Radius addition
+</text>
+
+<slider
+name="MPBloomRadiusAddCtrl"
+control_name="MPBloomBlurRadiusAdd"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.01"
+initial_value="1.0"
+label_width="2"
+min_val="-3.0"
+max_val="3.0"
+>
+</slider>
+
+<icon
+name="mp_bloomra_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomra_info_bullet"
+tool_tip="Adjust the added radius for each iteration"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_extract_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Bloom Range
+</text>
+
+<slider
+name="MPBloomRangeCtrl"
+control_name="MPBloomExtractBrightness"
+decimal_digits="2"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.025"
+initial_value="0.1"
+label_width="2"
+min_val="0.0"
+max_val="0.5"
+>
+</slider>
+
+<icon
+name="mp_bloomrange_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomrange_info_bullet"
+tool_tip="When moved to the right, it will take more of the bright areas."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_strength_lbl"
+tool_tip="Bloom: Strength of the effect (no performance impact)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall">
+Bloom Strength
+</text>
+
+<slider
+name="MPBloomStrCtrl"
+control_name="MPBloomStrength"
+decimal_digits="1"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.1"
+initial_value="1.0"
+min_val="0.5"
+max_val="2.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_bloomstr_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomstr_info_bullet"
+tool_tip="Controls the effect strength"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_metal_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Bloom Metal
+</text>
+
+<slider
+name="MPBloomMetalCtrl"
+control_name="MPBloomExtractMetal"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.05"
+initial_value="0.2"
+decimal_digits="2"
+min_val="0.0"
+max_val="1.0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_bloommetal_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloommetal_info_bullet"
+tool_tip="When moved to the right, the effect will apply on more metallic surfaces."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="bloom_nonmetal_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall">
+Bloom Non Metal
+</text>
+
+<slider
+name="MPBloomNonMetalCtrl"
+control_name="MPBloomExtractNonMetal"
+layout="topleft"
+follows="left|top"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+increment="0.05"
+initial_value="0.2"
+label_width="2"
+decimal_digits="2"
+min_val="0.0"
+max_val="1.0"
+>
+</slider>
+
+<icon
+name="mp_bloomnonmet_bullet"
+tool_tip="No performance impact"
+image_name="mp_blue_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_bloomnonmet_info_bullet"
+tool_tip="When moved to the right, the effect will apply on more non-metallic surfaces."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+name="preferences_visuals_probes"
+label="Probes"
+layout="topleft"
+follows="top|left"
+>
+
+<text
+name="mp_probes_lbl"
+follows="left|top"
+layout="topleft"
+width="100"
+height="18"
+left="20"
+top_pad="20"
+font="SansSerifSmall"
+text_color="White"
+>
+Reflection Probes
+</text>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Reflection probes are a fundamental part of how pbr lighting is calculated"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_detail_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Reflection Detail:
+</text>
+
+<combo_box
+name="mp_probes_detail_ctrl"
+control_name="RenderReflectionProbeDetail"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Static Only"
+name="0"
+value="0"/>
+<combo_box.item
+label="Static+Dynamic"
+name="1"
+value="1"/>
+<combo_box.item
+label="Realtime"
+name="2"
+value="2"/>
+</combo_box>
+
+<icon
+name="mp_probedetail_bullet"
+tool_tip="High to extreme performance impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Controls how often the reflection probes update with the surrounding. We recommend Static Only for daily usage (specially on Mac)"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_coverage_lbl"
+tool_tip="Reflection probes level (Important memory usage and performance penalty)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Reflection Coverage:
+</text>
+
+<combo_box
+name="probes_level_ctrl"
+control_name="RenderReflectionProbeLevel"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="0"
+value="0"/>
+<combo_box.item
+label="Manual only"
+name="1"
+value="1"/>
+<combo_box.item
+label="Manual + terrain"
+name="2"
+value="2"/>
+<combo_box.item
+label="Full scene"
+name="3"
+value="3"/>
+</combo_box>
+
+<icon
+name="mp_probedetail_bullet"
+tool_tip="Medium to High performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedetail_info_bullet"
+tool_tip="Controls what part of the surrounding the reflections probes are capturing. We recommend Manual only."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_count_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Max Reflection Probes:
+</text>
+
+<combo_box
+name="mp_probes_count_ctrl"
+control_name="RenderReflectionProbeCount"
+label="Max. Reflection Probes:"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="None"
+name="1"
+value="1"/>
+<combo_box.item
+label="Low"
+name="32"
+value="32"/>
+<combo_box.item
+label="Medium"
+name="64"
+value="64"/>
+<combo_box.item
+label="High"
+name="128"
+value="128"/>
+<combo_box.item
+label="Ultra"
+name="256"
+value="256"/>
+</combo_box>
+
+<icon
+name="mp_probecount_bullet"
+tool_tip="Medium to High performance and memory usage impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probecount_info_bullet"
+tool_tip="Limits the maximum number of active reflections probes"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="probes_res_lbl"
+tool_tip="Sets the resolution used to calculate the probes (Important to extreme video memory impact and performance)"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Reflection Resolution:
+</text>
+
+<combo_box
+name="ProbeResCtrl"
+control_name="RenderReflectionProbeResolution"
+layout="topleft"
+width="150"
+height="18"
+left_delta="150"
+top_delta="0"
+>
+<combo_box.item
+label="Low"
+name="low"
+value="64"/>
+<combo_box.item
+label="Default"
+name="default"
+value="128"/>
+<combo_box.item
+label="High"
+name="high"
+value="256"/>
+<combo_box.item
+label="Maximum"
+name="maximum"
+value="512"/>
+</combo_box>
+
+<icon
+name="mp_proberes_bullet"
+tool_tip="Medium to Extreme performance and memory usage impact"
+image_name="mp_red_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="55"
+top_delta="-2"
+/>
+
+<icon
+name="mp_proberes_info_bullet"
+tool_tip="Improves the quality of the probes"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_dd_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Draw Distance
+</text>
+
+<slider
+control_name="RenderReflectionProbeDrawDistance"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="32"
+min_val="8"
+max_val="64"
+increment="8"
+decimal_digits="0"
+label_width="2">
+</slider>
+
+<icon
+name="mp_probedd_bullet"
+tool_tip="Medium to High performance impact"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probedd_info_bullet"
+tool_tip="Controls the draw distance at which the probes are calculating the surrounding"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_ud_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Default Probe Update
+</text>
+
+<slider
+control_name="RenderDefaultProbeUpdatePeriod"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="15"
+increment="1"
+min_val="2"
+max_val="60"
+decimal_digits="0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_dprobeperiod_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_dprobeperiod_info_bullet"
+tool_tip="Controls how the default probe update is delayed."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_ud_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Other Probes delay
+</text>
+
+<slider
+name="MPProbeUpdCtrl"
+control_name="MPRenderProbeUpdatePeriod"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="15"
+increment="1"
+min_val="0"
+max_val="60"
+decimal_digits="0"
+label_width="2"
+>
+</slider>
+
+<icon
+name="mp_probeperiod_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probeperiod_info_bullet"
+tool_tip="Controls how each probe update is delayed."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_probe_slow_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="10"
+font="SansSerifSmall"
+>
+Refresh delay
+</text>
+
+<slider
+name="MPProbeSlowCtrl"
+control_name="MPRenderProbeSlowDown"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="0.01"
+increment="0.01"
+min_val="0"
+max_val="0.2"
+decimal_digits="2"
+label_width="2">
+</slider>
+
+<icon
+name="mp_probeslowdown_bullet"
+tool_tip="When moved to the right, the performance will improve."
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_probeslowdown_info_bullet"
+tool_tip="Controls how often the probes update process is called. When moved to the right, the update be slower."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+<panel
+label="Quality"
+name="preferences_visuals_others"
+layout="topleft"
+follows="top|left">
+
+<check_box
+name="VintageCtrl"
+control_name="RenderDisableVintageMode"
+label="HDR and Emissive"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_hdr_bullet"
+tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_hdr_info_bullet"
+tool_tip="Enables Higher color fidelity, and several other post-processing effects."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="mp_transparent_water"
+control_name="RenderTransparentWater"
+label="Transparent Water"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_twater_bullet"
+tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_twater_info_bullet"
+tool_tip="Enables higher quality water with transparency."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="colorPrecisionCtrl"
+control_name="MPLowColorPrecision"
+label="Lower color precision (needs restart)"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+<check_box.commit_callback
+function="Pref.RenderOptionUpdate" />
+</check_box>
+
+<icon
+name="mp_lowcolor_bullet"
+tool_tip="Can help performance specially in high resolution"
+image_name="mp_green_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_lowcolor_info_bullet"
+tool_tip="Lowers the internal color precision which can help with performance."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<text
+name="mp_resdiv_lbl"
+follows="left|top"
+layout="topleft"
+width="140"
+height="18"
+left="32"
+top_pad="30"
+font="SansSerifSmall"
+>
+Resolution divisor
+</text>
+
+<slider
+control_name="RenderResolutionDivisor"
+follows="left|top"
+layout="topleft"
+width="200"
+height="16"
+left_delta="150"
+top_delta="-1"
+initial_value="1.0"
+increment="0.25"
+min_val="1.0"
+max_val="4.0"
+decimal_digits="2"
+label_width="2">
+</slider>
+
+</panel>
+
+<panel
+label="For nerds"
+name="preferences_visuals_others"
+layout="topleft"
+follows="top|left">
+
+<check_box
+name="MultiTexCtrl"
+control_name="RenderGLMultiThreadedTextures"
+label="Multithreaded Textures"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+</check_box>
+
+<icon
+name="mp_multitex_bullet"
+tool_tip="Improves textures loading performance on certain hardware. But can be unstable."
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_multitex_info_bullet"
+tool_tip="Enables loading textures using multiple threads."
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="AppleMultGLCtrl"
+control_name="RenderAppleUseMultGL"
+label="Apple Multithreaded OpenGL"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="false"
+>
+</check_box>
+
+<icon
+name="mp_applemulti_bullet"
+tool_tip="Variable performance impact. Can be unstable!"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_applemulti_info_bullet"
+tool_tip="Enables Apple OpenGL Multithreaded optimisations. Can be unstable!!"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+<check_box
+name="NoGLDebugCtrl"
+control_name="MPNoGLDebug"
+label="No GL Debug"
+layout="topleft"
+width="250"
+height="16"
+left="20"
+top_delta="32"
+initial_value="true"
+>
+</check_box>
+
+<icon
+name="mp_nodebug_bullet"
+tool_tip="Leave this always to ON for optimal performance"
+image_name="mp_yellow_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="-2"
+/>
+
+<icon
+name="mp_nodebug_info_bullet"
+tool_tip="Ensures there is no opengl debug. This should be set to ON!"
+image_name="mp_info_bullet"
+follows="left|top"
+width="16"
+height="16"
+layout="topleft"
+left_pad="5"
+top_delta="0"
+/>
+
+</panel>
+
+</tab_container>
+
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
index 52f9068264..ae203d68de 100644
--- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml
@@ -28,9 +28,9 @@
top_delta="2">
Disk
</text>
- <view_border
+ <view_border
bevel_style="in"
- follows="left|top|right"
+ follows="left|top|right"
height="1"
left="9"
layout="topleft"
@@ -74,6 +74,10 @@
label="1600x1200"
name="1600x1200"
value="[i1600,i1200]" />
+ <combo_box.item
+ label="2048x2048"
+ name="2048x2048"
+ value="[i2048,i2048]" />
<combo_box.item
label="Custom"
name="Custom"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 5e05eb2837..3bf402b7fd 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -1,203 +1,209 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel
- background_opaque="true"
- background_visible="true"
- bg_opaque_color="DkGray"
- chrome="true"
- follows="top|right"
- height="19"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="status"
- top="19"
- width="1000">
- <panel.string
- name="packet_loss_tooltip">
- Packet Loss
- </panel.string>
- <panel.string
- name="bandwidth_tooltip">
- Bandwidth
- </panel.string>
- <panel.string
- name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
- </panel.string>
- <panel.string
- name="timeTooltip">
- [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
- </panel.string>
- <panel.string
- name="buycurrencylabel">
- L$ [AMT]
- </panel.string>
- <panel
- height="18"
- left="-398"
- top="0"
- width="120"
- follows="right|top"
- name="menu_search_panel"
- background_opaque="true"
- background_visible="true"
- bg_opaque_color="MouseGray">
- <search_editor
- clear_button_visible="true"
- follows="left|top"
- height="18"
- label="Search Menus"
- layout="topleft"
- left="0"
- max_length_bytes="255"
- name="search_menu_edit"
- right="-1"
- text_pad_left="6"
- tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu."
- top="0">
- <search_button
- top_pad="4"
- left_pad="4"
- width="12"
- height="12"
- image_unselected="Search"
- image_selected="Search"/>
- <clear_button
- bottom="2"
- height="12"
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press"
- pad_right="4"
- pad_left="4"
- width="12"/>
- </search_editor>
- </panel>
- <panel
- height="18"
- left="-398"
- width="185"
- top="1"
- follows="right|top"
- name="balance_bg">
- <text
- halign="center"
- font="SansSerifSmall"
- follows="all"
- height="18"
- left="0"
- name="balance"
- tool_tip="Click to refresh your L$ balance"
- v_pad="4"
- top="0"
- wrap="false"
- value="L$??"
- width="40" />
- <button
- halign="center"
- font="SansSerifSmall"
- follows="right|top|bottom"
- image_hover_unselected="PushButton_Over"
- image_unselected="PushButton_Off"
- image_pressed="PushButton_Press"
- height="18"
- label="Buy L$"
- label_color="White"
- left_pad="0"
- label_shadow="true"
- name="buyL"
- pad_right="0"
- tool_tip="Click to buy more L$"
- top="0"
- width="80" />
- <button
- halign="left"
- font="SansSerifSmall"
- follows="right|top|bottom"
- imgoverlay_label_space="7"
- image_overlay="Command_MiniCart_Icon"
- image_overlay_alignment="left"
- image_hover_unselected="PushButton_Over"
- image_unselected="PushButton_Off"
- image_pressed="PushButton_Press"
- height="18"
- label="Shop"
- label_color="White"
- left_pad="0"
- label_shadow="true"
- name="goShop"
- tool_tip="Open Second Life Marketplace"
- top="0"
- width="65" />
- </panel>
- <text
- type="string"
- font="SansSerifSmall"
- text_readonly_color="TimeTextColor"
- follows="right|top"
- halign="right"
- height="16"
- top="5"
- layout="topleft"
- left_pad="0"
- name="TimeText"
- tool_tip="Current time (Pacific)"
- width="85">
- 24:00 AM PST
- </text>
- <icon
- follows="right|top"
- height="16"
- image_name="Cam_FreeCam_Off"
- left_pad="8"
- top="2"
- name="presets_icon_camera"
- width="18" />
- <icon
- follows="right|top"
- height="13"
- image_name="Presets_Icon"
- left_pad="8"
- top="4"
- name="presets_icon_graphic"
- width="16" />
- <button
- follows="right|top"
- height="16"
- image_selected="Play_Off"
- image_unselected="Pause_Off"
- image_pressed="Pause_Press"
- image_pressed_selected="Play_Press"
- is_toggle="true"
- left_pad="5"
- top="1"
- name="media_toggle_btn"
- tool_tip="Start/Stop All Media (Music, Video, Web pages)"
- width="16" >
- </button>
- <button
- follows="right|top"
- height="16"
- image_selected="AudioMute_Off"
- image_pressed="Audio_Press"
- image_unselected="Audio_Off"
- is_toggle="true"
- left_pad="5"
- top="2"
- name="volume_btn"
- width="16" />
- <button
- type="string"
- font="SansSerif"
- label_color="FpsTextColor"
- follows="right|top"
- halign="center"
- valign="center"
- height="18"
- top="1"
- left_pad="4"
- name="FpsText"
- tool_tip="fps"
- width="32">
- 60
- </button>
+background_opaque="true"
+background_visible="true"
+bg_opaque_color="DkGray"
+chrome="true"
+follows="top|right"
+height="19"
+layout="topleft"
+left="0"
+mouse_opaque="false"
+name="status"
+top="19"
+width="1000">
+ <panel.string
+ name="packet_loss_tooltip">
+ Packet Loss
+ </panel.string>
+ <panel.string
+ name="bandwidth_tooltip">
+ Bandwidth
+ </panel.string>
+ <panel.string
+ name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string
+ name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+<panel.string
+ name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+<panel
+ height="18"
+ left="-398"
+ top="0"
+ width="120"
+ follows="right|top"
+ name="menu_search_panel"
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_color="MouseGray">
+ <search_editor
+ clear_button_visible="true"
+ follows="left|top"
+ height="18"
+ label="Search Menus"
+ layout="topleft"
+ left="0"
+ max_length_bytes="255"
+ name="search_menu_edit"
+ right="-1"
+ text_pad_left="6"
+ tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu."
+ top="0">
+ <search_button
+ top_pad="4"
+ left_pad="4"
+ width="12"
+ height="12"
+ image_unselected="Search"
+ image_selected="Search"/>
+ <clear_button
+ bottom="2"
+ height="12"
+ image_unselected="Icon_Close_Foreground"
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ pad_left="4"
+ width="12"/>
+ </search_editor>
+</panel>
+<panel
+ height="18"
+ left="-398"
+ width="185"
+ top="1"
+ follows="right|top"
+ name="balance_bg">
+ <text
+ halign="center"
+ font="SansSerifSmall"
+ follows="all"
+ height="18"
+ left="0"
+ name="balance"
+ tool_tip="Click to refresh your L$ balance"
+ v_pad="4"
+ top="0"
+ wrap="false"
+ value="L$??"
+ width="40" />
+ <button
+ halign="center"
+ font="SansSerifSmall"
+ follows="right|top|bottom"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
+ height="18"
+ label="Buy L$"
+ label_color="White"
+ left_pad="0"
+ label_shadow="true"
+ name="buyL"
+ pad_right="0"
+ tool_tip="Click to buy more L$"
+ top="0"
+ width="80" />
+ <button
+ halign="left"
+ font="SansSerifSmall"
+ follows="right|top|bottom"
+ imgoverlay_label_space="7"
+ image_overlay="Command_MiniCart_Icon"
+ image_overlay_alignment="left"
+ image_hover_unselected="PushButton_Over"
+ image_unselected="PushButton_Off"
+ image_pressed="PushButton_Press"
+ height="18"
+ label="Shop"
+ label_color="White"
+ left_pad="0"
+ label_shadow="true"
+ name="goShop"
+ tool_tip="Open Second Life Marketplace"
+ top="0"
+ width="65" />
+</panel>
+ <text
+ type="string"
+ font="SansSerifSmall"
+ text_readonly_color="TimeTextColor"
+ follows="right|top"
+ halign="right"
+ height="16"
+ top="5"
+ layout="topleft"
+ left_pad="0"
+ name="TimeText"
+ tool_tip="Current time (Pacific)"
+ width="85">
+ 24:00 AM PST
+ </text>
+ <icon
+ follows="right|top"
+ height="16"
+ image_name="Cam_FreeCam_Off"
+ left_pad="8"
+ top="2"
+ name="presets_icon_camera"
+ width="18" />
+ <icon
+ follows="right|top"
+ height="13"
+ image_name="Presets_Icon"
+ left_pad="8"
+ top="4"
+ name="presets_icon_graphic"
+ width="16" />
+ <button
+ follows="right|top"
+ height="16"
+ image_selected="Play_Off"
+ image_unselected="Pause_Off"
+ image_pressed="Pause_Press"
+ image_pressed_selected="Play_Press"
+ is_toggle="true"
+ left_pad="5"
+ top="1"
+ name="media_toggle_btn"
+ tool_tip="Start/Stop All Media (Music, Video, Web pages)"
+ width="16" >
+ </button>
+ <button
+ follows="right|top"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_pressed="Audio_Press"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ left_pad="5"
+ top="2"
+ name="volume_btn"
+ width="16" />
+ <button
+ type="string"
+ font="SansSerif"
+ image_unselected="mp_fpsButton"
+ image_selected="mp_fpsButton"
+ image_hover_unselected="mp_fpsButton"
+ image_pressed="mp_fpsButton"
+ image_pressed_selected="mp_fpsButton"
+ image_color="White"
+ label_color="FpsTextColor"
+ follows="right|top"
+ halign="center"
+ valign="center"
+ height="18"
+ top="1"
+ left_pad="2"
+ name="FpsText"
+ tool_tip="fps: Color indicates frametime fluctuations (Green is optimal)"
+ width="32">
+ 60
+ </button>
</panel>