summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
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>