From 9b75abdb0904871ca0b54e95f6cfa25113f76e8a Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 18 Nov 2017 17:31:56 -0600 Subject: [PATCH 01/23] Fixed issues with ring rendering on mini and world map when ui scale was not exactly 1.0 --- indra/newview/llnetmap.cpp | 20 +++++--------------- indra/newview/llworldmapview.cpp | 8 +++----- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 23f5f9708..53463dea8 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -132,8 +132,6 @@ LLNetMap::LLNetMap(const std::string& name) : mClosestAgentToCursor(), mPopupMenu(NULL) { - mPixelsPerMeter = mScale / REGION_WIDTH_METERS; - mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); setScale(gSavedSettings.getF32("MiniMapScale")); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_mini_map.xml"); @@ -763,9 +761,6 @@ LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos) LLVector3 pos_local; pos_local.setVec(relative_pos_global); // convert to floats from doubles -// Aurora Sim - mPixelsPerMeter = mScale / REGION_WIDTH_METERS; -// Aurora Sim pos_local.mV[VX] *= mPixelsPerMeter; pos_local.mV[VY] *= mPixelsPerMeter; // leave Z component in meters @@ -786,17 +781,12 @@ LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos) void LLNetMap::drawRing(const F32 radius, const LLVector3 pos_map, const LLColor4& color) { -// Aurora Sim - F32 meters_to_pixels = mScale / LLWorld::getInstance()->getRegionWidthInMeters(); - //F32 meters_to_pixels = mScale / REGION_WIDTH_METERS; -// Aurora Sim - F32 radius_pixels = radius * meters_to_pixels; + F32 radius_pixels = radius * mPixelsPerMeter; - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - gGL.translatef((F32)pos_map.mV[VX], (F32)pos_map.mV[VY], 0.f); - gl_ring(radius_pixels, WIDTH_PIXELS, color, color, CIRCLE_STEPS, FALSE); - gGL.popMatrix(); + gGL.pushUIMatrix(); + gGL.translateUI(pos_map.mV[VX], pos_map.mV[VY], 0.f); + gl_washer_2d(radius_pixels, radius_pixels-WIDTH_PIXELS, CIRCLE_STEPS, color, color); + gGL.popUIMatrix(); } void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color, diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 63ef8e245..8064b537b 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1688,12 +1688,10 @@ void LLWorldMapView::drawTrackingCircle( const LLRect& rect, S32 x, S32 y, const end_theta -= angle_adjust_y; } - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - gGL.translatef((F32)x, (F32)y, 0.f); + gGL.pushUIMatrix(); + gGL.translateUI(x, y, 0.f); gl_washer_segment_2d(inner_radius, outer_radius, start_theta, end_theta, 40, color, color); - gGL.popMatrix(); - + gGL.popUIMatrix(); } // static From d3dbbed6afdecee846af3259369d9a346fb3c9b2 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 18 Nov 2017 17:33:57 -0600 Subject: [PATCH 02/23] Explicitly alphamasked faces on HUD attached prims were not going into correct drawpool. --- indra/newview/llvovolume.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index bb64accc7..c927341e2 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5086,10 +5086,15 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) } else if (force_fullbright) //Hud is done in a forward render. Fullbright cannot be shared with simple. { - if(type == LLDrawPool::POOL_ALPHA_MASK) + LLMaterial* mat = te->getMaterialParams().get(); + if (type == LLDrawPool::POOL_ALPHA_MASK || (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK ) ) + { type = LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK; + } else + { type = LLDrawPool::POOL_FULLBRIGHT; + } } else if(force_simple && type != LLDrawPool::POOL_FULLBRIGHT && type != LLDrawPool::POOL_ALPHA_MASK && type != LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK) { From a3b37f58e3accd58c66087efb746c649129e9016 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 25 Nov 2017 19:03:04 -0600 Subject: [PATCH 03/23] Tweak shadows to look a little less crap. --- indra/llrender/llshadermgr.h | 1 + .../shaders/class2/deferred/sunLightF.glsl | 48 ++++++++---------- .../class2/deferred/sunLightSSAOF.glsl | 50 ++++++++----------- indra/newview/pipeline.cpp | 4 +- 4 files changed, 45 insertions(+), 58 deletions(-) diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 03df4c4ee..265f0c0b9 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -123,6 +123,7 @@ public: DEFERRED_SSAO_FACTOR, DEFERRED_SSAO_FACTOR_INV, DEFERRED_SSAO_EFFECT, + DEFERRED_SSAO_SCALE, DEFERRED_KERN_SCALE, DEFERRED_NOISE_SCALE, DEFERRED_NEAR_CLIP, diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index 6c4b437b6..d8a92ccbd 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -52,6 +52,7 @@ uniform float ssao_factor; uniform float ssao_factor_inv; VARYING vec2 vary_fragcoord; +uniform vec2 kern_scale; uniform mat4 inv_proj; uniform vec2 proj_shadow_res; @@ -93,46 +94,37 @@ vec4 getPosition(vec2 pos_screen) return pos; } +float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) +{ + //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. + + vec2 off = vec2(1,1.5)/res; + stc.x = floor(stc.x*res.x + fract(pos_screen.y*(1.0/kern_scale.y)*0.5))*off.x; + + + float shadow = shadow2D(shadowMap, stc.xyz).x; // cs + shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x; + + return shadow; +} + float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += shadow_bias; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. - stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here - - float cs = shadow2D(shadowMap, stc.xyz).x; - - float shadow = cs; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - - - return shadow*0.2; + return calcShadow(shadowMap, stc, shadow_res, pos_screen)*0.2; } float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += spot_shadow_bias*scl; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/proj_shadow_res.x); //Random dither. - stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap - float cs = shadow2D(shadowMap, stc.xyz).x; - float shadow = cs; - - vec2 off = 1.0/proj_shadow_res; - off.y *= 1.5; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; - - return shadow*0.2; + return calcShadow(shadowMap, stc, proj_shadow_res, pos_screen)*0.2; } void main() diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index 151ce67e7..e95f1b975 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -50,6 +50,7 @@ uniform vec4 shadow_clip; VARYING vec2 vary_fragcoord; +uniform vec2 ssao_scale; uniform vec2 kern_scale; uniform mat4 inv_proj; @@ -94,47 +95,40 @@ vec4 getPosition(vec2 pos_screen) return pos; } +float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) +{ + //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. + + vec2 off = vec2(1,1.5)/res; + stc.x = floor(stc.x*res.x + fract(pos_screen.y*(1.0/kern_scale.y)*0.5))*off.x; + + + float shadow = shadow2D(shadowMap, stc.xyz).x; // cs + shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, off.y, 0.0)).x; + shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, -off.y, 0.0)).x; + + return shadow; +} + float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += shadow_bias; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/shadow_res.x); //Random dither. - stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; - - float cs = shadow2D(shadowMap, stc.xyz).x; - - float shadow = cs; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - - return shadow*0.2; + return calcShadow(shadowMap, stc, shadow_res, pos_screen)*0.2; } float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) { stc.xyz /= stc.w; stc.z += spot_shadow_bias*scl; - //stc.x += (((texture2D(noiseMap, pos_screen/128.0).x)-.5)/proj_shadow_res.x); //Random dither. - stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap - - float cs = shadow2D(shadowMap, stc.xyz).x; - float shadow = cs; - vec2 off = 1.0/proj_shadow_res; - off.y *= 1.5; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; - - return shadow*0.2; + return calcShadow(shadowMap, stc, proj_shadow_res, pos_screen)*0.2; } + void main() { vec2 pos_screen = vary_fragcoord.xy; @@ -244,7 +238,7 @@ void main() } frag_color[0] = shadow; - frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * kern_scale).r; + frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * ssao_scale).r; spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 6d651267b..8dddfbebe 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -7741,7 +7741,7 @@ void LLPipeline::renderDeferredLighting() glClearColor(0,0,0,0); F32 ssao_scale = llclamp(RenderSSAOResolutionScale.get(), .01f, 1.f); - gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_KERN_SCALE, ssao_scale, ssao_scale); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SSAO_SCALE, ssao_scale, ssao_scale); //Enable bilinear filtering, as the screen tex resolution may not match current framebuffer resolution. Eg, half-res SSAO // diffuse map should only be found if the sun shader is the SSAO variant. @@ -8320,7 +8320,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) bindDeferredShader(gDeferredSunProgram); F32 ssao_scale = llclamp(RenderSSAOResolutionScale.get(), .01f, 1.f); - gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_KERN_SCALE, ssao_scale, ssao_scale); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SSAO_SCALE, ssao_scale, ssao_scale); glClearColor(1,1,1,1); mDeferredLight.clear(GL_COLOR_BUFFER_BIT); From 2195c2af37ca19fec0528fdba0ca7834a703c943 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 25 Nov 2017 19:23:30 -0600 Subject: [PATCH 04/23] And.. a missing line. --- indra/llrender/llshadermgr.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 62036dec5..056816939 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1214,6 +1214,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("ssao_factor"); mReservedUniforms.push_back("ssao_factor_inv"); mReservedUniforms.push_back("ssao_effect"); + mReservedUniforms.push_back("ssao_scale"); mReservedUniforms.push_back("kern_scale"); mReservedUniforms.push_back("noise_scale"); mReservedUniforms.push_back("near_clip"); From a39844f9f30f42d3dc962406d0804ae88f55f911 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 22:55:51 -0600 Subject: [PATCH 05/23] Double the maximum texture memory. --- indra/llimage/llimage.cpp | 10 +++++----- indra/llimage/llimage.h | 2 +- indra/llrender/llimagegl.cpp | 16 ++++++++-------- indra/llrender/llimagegl.h | 12 ++++++------ indra/newview/lltextureview.cpp | 6 +++--- indra/newview/llviewerstats.cpp | 4 ++-- indra/newview/llviewertexture.cpp | 8 ++++---- indra/newview/llviewertexture.h | 6 +++--- indra/newview/llviewertexturelist.cpp | 4 ++-- 9 files changed, 34 insertions(+), 34 deletions(-) diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 1d6a733ec..06d8e5746 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -281,7 +281,7 @@ U8* LLImageBase::allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 si // LLImageRaw //--------------------------------------------------------------------------- -AIThreadSafeSimpleDC LLImageRaw::sGlobalRawMemory; +AIThreadSafeSimpleDC LLImageRaw::sGlobalRawMemory; S32 LLImageRaw::sRawImageCount = 0; S32 LLImageRaw::sRawImageCachedCount = 0; @@ -358,7 +358,7 @@ LLImageRaw::~LLImageRaw() U8* LLImageRaw::allocateData(S32 size) { U8* res = LLImageBase::allocateData(size); - *AIAccess(sGlobalRawMemory) += getDataSize(); + *AIAccess(sGlobalRawMemory) += getDataSize(); return res; } @@ -367,7 +367,7 @@ U8* LLImageRaw::reallocateData(S32 size) { S32 old_data_size = getDataSize(); U8* res = LLImageBase::reallocateData(size); - *AIAccess(sGlobalRawMemory) += getDataSize() - old_data_size; + *AIAccess(sGlobalRawMemory) += getDataSize() - old_data_size; return res; } @@ -375,7 +375,7 @@ U8* LLImageRaw::reallocateData(S32 size) void LLImageRaw::deleteData() { { - *AIAccess(sGlobalRawMemory) -= getDataSize(); + *AIAccess(sGlobalRawMemory) -= getDataSize(); } LLImageBase::deleteData(); } @@ -392,7 +392,7 @@ void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components) LLImageBase::setSize(width, height, components) ; LLImageBase::setDataAndSize(data, width * height * components) ; - *AIAccess(sGlobalRawMemory) += getDataSize(); + *AIAccess(sGlobalRawMemory) += getDataSize(); } BOOL LLImageRaw::resize(U16 width, U16 height, S8 components) diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index 1e94f49f4..392155fc7 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -257,7 +257,7 @@ protected: void setDataAndSize(U8 *data, S32 width, S32 height, S8 components) ; public: - static AIThreadSafeSimpleDC sGlobalRawMemory; + static AIThreadSafeSimpleDC sGlobalRawMemory; static S32 sRawImageCount; static S32 sRawImageCachedCount; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 8164764bf..968897dde 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -50,9 +50,9 @@ U32 wpo2(U32 i); U32 LLImageGL::sUniqueCount = 0; U32 LLImageGL::sBindCount = 0; -S32Bytes LLImageGL::sGlobalTextureMemory(0); -S32Bytes LLImageGL::sBoundTextureMemory(0); -S32Bytes LLImageGL::sCurBoundTextureMemory(0); +S64Bytes LLImageGL::sGlobalTextureMemory(0); +S64Bytes LLImageGL::sBoundTextureMemory(0); +S64Bytes LLImageGL::sCurBoundTextureMemory(0); S32 LLImageGL::sCount = 0; BOOL LLImageGL::sGlobalUseAnisotropic = FALSE; @@ -78,9 +78,9 @@ S32 LLImageGL::sCurTexPickSize = -1 ; LLPointer LLImageGL::sHighlightTexturep = NULL; S32 LLImageGL::sMaxCategories = 1 ; -std::vector LLImageGL::sTextureMemByCategory; -std::vector LLImageGL::sTextureMemByCategoryBound ; -std::vector LLImageGL::sTextureCurMemByCategoryBound ; +std::vector LLImageGL::sTextureMemByCategory; +std::vector LLImageGL::sTextureMemByCategoryBound ; +std::vector LLImageGL::sTextureCurMemByCategoryBound ; //------------------------ // **************************************************************************************************** //End for texture auditing use only @@ -293,7 +293,7 @@ void LLImageGL::updateStats(F32 current_time) LL_RECORD_BLOCK_TIME(FTM_IMAGE_UPDATE_STATS); sLastFrameTime = current_time; sBoundTextureMemory = sCurBoundTextureMemory; - sCurBoundTextureMemory = S32Bytes(0); + sCurBoundTextureMemory = S64Bytes(0); if(gAuditTexture) { @@ -305,7 +305,7 @@ void LLImageGL::updateStats(F32 current_time) for(U32 i = 0 ; i < sTextureCurMemByCategoryBound.size() ; i++) { sTextureMemByCategoryBound[i] = sTextureCurMemByCategoryBound[i] ; - sTextureCurMemByCategoryBound[i] = (S32Bytes)0 ; + sTextureCurMemByCategoryBound[i] = (S64Bytes)0 ; } } } diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 8508646c3..f2d32c087 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -233,9 +233,9 @@ public: static F32 sLastFrameTime; // Global memory statistics - static S32Bytes sGlobalTextureMemory; // Tracks main memory texmem - static S32Bytes sBoundTextureMemory; // Tracks bound texmem for last completed frame - static S32Bytes sCurBoundTextureMemory; // Tracks bound texmem for current frame + static S64Bytes sGlobalTextureMemory; // Tracks main memory texmem + static S64Bytes sBoundTextureMemory; // Tracks bound texmem for last completed frame + static S64Bytes sCurBoundTextureMemory; // Tracks bound texmem for current frame static U32 sBindCount; // Tracks number of texture binds for current frame static U32 sUniqueCount; // Tracks number of unique texture binds for current frame static BOOL sGlobalUseAnisotropic; @@ -288,9 +288,9 @@ public: //for debug use: show texture category distribution //---------------------------------------- - static std::vector sTextureMemByCategory; - static std::vector sTextureMemByCategoryBound ; - static std::vector sTextureCurMemByCategoryBound ; + static std::vector sTextureMemByCategory; + static std::vector sTextureMemByCategoryBound ; + static std::vector sTextureCurMemByCategoryBound ; //---------------------------------------- // **************************************************************************************************** //End of definitions for texture auditing use only diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index f32c6f695..19d74fcba 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -583,11 +583,11 @@ void LLGLTexMemBar::draw() std::string text = ""; - S32 global_raw_memory; + S64 global_raw_memory; { - global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); + global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); } - text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB FBO: %d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d", + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB FBO: %d MB Raw Tot: %lld MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB Tot Htp: %d", total_mem.value(), max_total_mem.value(), bound_mem.value(), diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index ea6e98d23..af6c56891 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -444,9 +444,9 @@ void reset_statistics() void output_statistics(void*) { - S32 global_raw_memory; + S64 global_raw_memory; { - global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); + global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); } LL_INFOS() << "Number of orphans: " << gObjectList.getOrphanCount() << LL_ENDL; LL_INFOS() << "Number of dead objects: " << gObjectList.mNumDeadObjects << LL_ENDL; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 1f27df1bf..57d5af19e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -65,7 +65,7 @@ // extern const S32Megabytes gMinVideoRam(32); -const S32Megabytes gMaxVideoRam(1024); +const S32Megabytes gMaxVideoRam(2048); // statics @@ -88,11 +88,11 @@ S32 LLViewerTexture::sAuxCount = 0; LLFrameTimer LLViewerTexture::sEvaluationTimer; F32 LLViewerTexture::sDesiredDiscardBias = 0.f; F32 LLViewerTexture::sDesiredDiscardScale = 1.1f; -S32Bytes LLViewerTexture::sBoundTextureMemory; -S32Bytes LLViewerTexture::sTotalTextureMemory; +S64Bytes LLViewerTexture::sBoundTextureMemory; +S64Bytes LLViewerTexture::sTotalTextureMemory; S32Megabytes LLViewerTexture::sMaxBoundTextureMemory; S32Megabytes LLViewerTexture::sMaxTotalTextureMem; -S32Bytes LLViewerTexture::sMaxDesiredTextureMem; +S64Bytes LLViewerTexture::sMaxDesiredTextureMem; S8 LLViewerTexture::sCameraMovingDiscardBias = 0; F32 LLViewerTexture::sCameraMovingBias = 0.0f ; S32 LLViewerTexture::sMaxSculptRez = 128 ; //max sculpt image size diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 1c2e8f9a0..b546673e6 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -218,11 +218,11 @@ public: static LLFrameTimer sEvaluationTimer; static F32 sDesiredDiscardBias; static F32 sDesiredDiscardScale; - static S32Bytes sBoundTextureMemory; - static S32Bytes sTotalTextureMemory; + static S64Bytes sBoundTextureMemory; + static S64Bytes sTotalTextureMemory; static S32Megabytes sMaxBoundTextureMemory; static S32Megabytes sMaxTotalTextureMem; - static S32Bytes sMaxDesiredTextureMem ; + static S64Bytes sMaxDesiredTextureMem ; static S8 sCameraMovingDiscardBias; static F32 sCameraMovingBias; static S32 sMaxSculptRez ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 137c3f6c5..f3e57ec72 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -746,9 +746,9 @@ void LLViewerTextureList::updateImages(F32 max_time) } cleared = FALSE; - S32 global_raw_memory; + S64 global_raw_memory; { - global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); + global_raw_memory = *AIAccess(LLImageRaw::sGlobalRawMemory); } LLViewerStats::getInstance()->mNumImagesStat.addValue(sNumImages); LLViewerStats::getInstance()->mNumRawImagesStat.addValue(LLImageRaw::sRawImageCount); From 54fc42cc73b1b2e027da234271f0997f1a052930 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 22:56:54 -0600 Subject: [PATCH 06/23] Fixed ssao without shadows enabled. (Thanks LightDrake) --- .../app_settings/shaders/class1/deferred/sunLightSSAOF.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 85b850ba5..cca0fa80f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -37,12 +37,12 @@ uniform sampler2D depthMap; uniform sampler2D diffuseRect; -uniform vec2 kern_scale; +uniform vec2 ssao_scale; void main() { frag_color[0] = 1.0; - frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * kern_scale).r; // Scales to handle lower-res ssao. + frag_color[1] = texture2D(diffuseRect,vary_fragcoord.xy * ssao_scale).r; // Scales to handle lower-res ssao. frag_color[2] = 1.0; frag_color[3] = 1.0; } From cf1ce7d7e5c98ecdeb56b3785861a40d32651e62 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 22:58:39 -0600 Subject: [PATCH 07/23] Per-frame per-avie rigged transform matrix cache from Alchemy, with minor alterations. --- indra/newview/lldrawpoolavatar.cpp | 82 ++++++++++++++++++------------ indra/newview/llviewerdisplay.cpp | 14 +++++ indra/newview/llvoavatar.h | 15 ++++++ 3 files changed, 78 insertions(+), 33 deletions(-) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 1c790728f..e6e1465ce 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1457,6 +1457,9 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* } } +extern int sMaxCacheHit; +extern int sCurCacheHit; + void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) { if ((avatar->isSelf() && !gAgent.needsRenderAvatar()) || !gMeshRepo.meshRezEnabled()) @@ -1516,44 +1519,57 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) if (buff) { if (sShaderLevel > 0) - { //upload matrix palette to shader - // upload matrix palette to shader - LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; - U32 count = LLSkinningUtil::getMeshJointCount(skin); - LLSkinningUtil::initSkinningMatrixPalette(mat, count, skin, avatar); - - stop_glerror(); - - F32 mp[LL_MAX_JOINTS_PER_MESH_OBJECT*12]; - - for (U32 i = 0; i < count; ++i) + { + auto& mesh_cache = avatar->getRiggedMatrixCache(); + auto& mesh_id = skin->mMeshID; + auto rigged_matrix_data_iter = find_if(mesh_cache.begin(), mesh_cache.end(), [&mesh_id](decltype(mesh_cache[0]) & entry) { return entry.first == mesh_id; }); + if (rigged_matrix_data_iter != avatar->getRiggedMatrixCache().cend()) { - F32* m = (F32*) mat[i].getF32ptr(); + LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, + rigged_matrix_data_iter->second.first, + FALSE, + (GLfloat*)rigged_matrix_data_iter->second.second.data()); + LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(rigged_matrix_data_iter->second.first - 1)); - U32 idx = i*12; - - mp[idx+0] = m[0]; - mp[idx+1] = m[1]; - mp[idx+2] = m[2]; - mp[idx+3] = m[12]; - - mp[idx+4] = m[4]; - mp[idx+5] = m[5]; - mp[idx+6] = m[6]; - mp[idx+7] = m[13]; - - mp[idx+8] = m[8]; - mp[idx+9] = m[9]; - mp[idx+10] = m[10]; - mp[idx+11] = m[14]; + stop_glerror(); } + else + { + // upload matrix palette to shader + LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; + U32 count = LLSkinningUtil::getMeshJointCount(skin); + LLSkinningUtil::initSkinningMatrixPalette(mat, count, skin, avatar); - LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, - count, - FALSE, - (GLfloat*) mp); + std::array mp; - LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(count-1)); + for (U32 i = 0; i < count; ++i) + { + F32* m = (F32*)mat[i].getF32ptr(); + + U32 idx = i * 12; + + mp[idx + 0] = m[0]; + mp[idx + 1] = m[1]; + mp[idx + 2] = m[2]; + mp[idx + 3] = m[12]; + + mp[idx + 4] = m[4]; + mp[idx + 5] = m[5]; + mp[idx + 6] = m[6]; + mp[idx + 7] = m[13]; + + mp[idx + 8] = m[8]; + mp[idx + 9] = m[9]; + mp[idx + 10] = m[10]; + mp[idx + 11] = m[14]; + } + mesh_cache.emplace_back(std::make_pair( skin->mMeshID, std::make_pair(count, mp) ) ); + LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, + count, + FALSE, + (GLfloat*)mp.data()); + LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(count - 1)); + } stop_glerror(); } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 8b2690d2d..af647b912 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -81,6 +81,7 @@ #include "llviewerregion.h" #include "lldrawpoolwater.h" #include "lldrawpoolbump.h" +#include "lldrawpoolavatar.h" #include "llwlparammanager.h" #include "llwaterparammanager.h" #include "llpostprocess.h" @@ -255,11 +256,24 @@ static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_CLASS("Class"); static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_BUMP("Bump"); static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_LIST("List"); static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE_DELETE("Delete"); + +int sMaxCacheHit = 0; +int sCurCacheHit = 0; + // Paint the display! void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, bool tiling) { LL_RECORD_BLOCK_TIME(FTM_RENDER); + for (auto avatar : LLCharacter::sInstances) + { + LLVOAvatar* avatarp = dynamic_cast(avatar); + if (!avatarp) continue; + if (avatarp->isDead()) continue; + avatarp->clearRiggedMatrixCache(); + } + sCurCacheHit = 0; + if (gWindowResized) { //skip render on frames where window has been resized gGL.flush(); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 5d8442d6f..d8f90a1bc 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1096,6 +1096,21 @@ protected: // Shared with LLVOAvatarSelf /** Support classes ** ** *******************************************************************************/ + +public: + typedef std::array rigged_matrix_array_t; + typedef std::vector > > rigged_transformation_cache_t; + auto& getRiggedMatrixCache() + { + return mRiggedMatrixDataCache; + } + void clearRiggedMatrixCache() + { + mRiggedMatrixDataCache.clear(); + } +private: + rigged_transformation_cache_t mRiggedMatrixDataCache; + // //Avatar idle timer From 8fd728ca59435e7562753df3d6f4541b6045272f Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 23:15:49 -0600 Subject: [PATCH 08/23] Clean up generated prepended shader preprocessor mess. --- indra/llrender/llshadermgr.cpp | 93 ++++++++++++++++------------------ 1 file changed, 44 insertions(+), 49 deletions(-) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 056816939..69566cbcf 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -611,95 +611,90 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade if (minor_version <= 19) { text[count++] = strdup("#version 110\n"); - text[count++] = strdup("#define ATTRIBUTE attribute\n"); - text[count++] = strdup("#define VARYING varying\n"); - text[count++] = strdup("#define VARYING_FLAT varying\n"); - // Need to enable extensions here instead of in the shader files, - // before any non-preprocessor directives (per spec) - text[count++] = strdup("#extension GL_ARB_texture_rectangle : enable\n"); - text[count++] = strdup("#extension GL_ARB_shader_texture_lod : enable\n"); } else if (minor_version <= 29) { //set version to 1.20 text[count++] = strdup("#version 120\n"); - text[count++] = strdup("#define FXAA_GLSL_120 1\n"); - text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n"); - text[count++] = strdup("#define ATTRIBUTE attribute\n"); - text[count++] = strdup("#define VARYING varying\n"); - text[count++] = strdup("#define VARYING_FLAT varying\n"); - // Need to enable extensions here instead of in the shader files, - // before any non-preprocessor directives (per spec) - text[count++] = strdup("#extension GL_ARB_texture_rectangle : enable\n"); - text[count++] = strdup("#extension GL_ARB_shader_texture_lod : enable\n"); + if (type == GL_FRAGMENT_SHADER_ARB) + { + // Need to enable extensions here instead of in the shader files, + // before any non-preprocessor directives (per spec) + text[count++] = strdup("#extension GL_ARB_shader_texture_lod : enable\n"); + text[count++] = strdup("#define FXAA_GLSL_120 1\n"); + text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n"); + } } + + text[count++] = strdup("#define ATTRIBUTE attribute\n"); + text[count++] = strdup("#define VARYING varying\n"); + text[count++] = strdup("#define VARYING_FLAT varying\n"); } else { if (major_version < 4) { - //set version to 1.30 - text[count++] = strdup("#version 130\n"); - // Need to enable extensions here instead of in the shader files, - // before any non-preprocessor directives (per spec) - text[count++] = strdup("#extension GL_ARB_texture_rectangle : enable\n"); - text[count++] = strdup("#extension GL_ARB_shader_texture_lod : enable\n"); + if (major_version > 1 || minor_version >= 40) + { + //set version to 1.40 + text[count++] = strdup("#version 140\n"); + } + else + { + //set version to 1.30 + text[count++] = strdup("#version 130\n"); + } if (minor_version == 50 && gGLManager.mHasGpuShader5) { + // Need to enable extensions here instead of in the shader files, + // before any non-preprocessor directives (per spec) text[count++] = strdup("#extension GL_ARB_gpu_shader5 : enable\n"); } //some implementations of GLSL 1.30 require integer precision be explicitly declared text[count++] = strdup("precision mediump int;\n"); text[count++] = strdup("precision highp float;\n"); - text[count++] = strdup("#define FXAA_GLSL_130 1\n"); + if (type == GL_FRAGMENT_SHADER_ARB) + { + text[count++] = strdup("#define FXAA_GLSL_130 1\n"); + } } else { //set version to 400 text[count++] = strdup("#version 400\n"); - // Need to enable extensions here instead of in the shader files, - // before any non-preprocessor directives (per spec) - text[count++] = strdup("#extension GL_ARB_texture_rectangle : enable\n"); - text[count++] = strdup("#extension GL_ARB_shader_texture_lod : enable\n"); - text[count++] = strdup("#define FXAA_GLSL_400 1\n"); + if (type == GL_FRAGMENT_SHADER_ARB) + { + text[count++] = strdup("#define FXAA_GLSL_400 1\n"); + } } - - - text[count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n"); - - text[count++] = strdup("#define ATTRIBUTE in\n"); if (type == GL_VERTEX_SHADER_ARB) { //"varying" state is "out" in a vertex program, "in" in a fragment program // ("varying" is deprecated after version 1.20) + text[count++] = strdup("#define ATTRIBUTE in\n"); text[count++] = strdup("#define VARYING out\n"); text[count++] = strdup("#define VARYING_FLAT flat out\n"); } else { + text[count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n"); text[count++] = strdup("#define VARYING in\n"); text[count++] = strdup("#define VARYING_FLAT flat in\n"); - } - //backwards compatibility with legacy texture lookup syntax - text[count++] = strdup("#define texture2D texture\n"); - text[count++] = strdup("#define textureCube texture\n"); - text[count++] = strdup("#define texture2DLod textureLod\n"); - text[count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n"); - - if (major_version > 1 || minor_version >= 40) - { //GLSL 1.40 replaces texture2DRect et al with texture - text[count++] = strdup("#define texture2DRect texture\n"); - text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n"); + //backwards compatibility with legacy texture lookup syntax + text[count++] = strdup("#define texture2D texture\n"); + text[count++] = strdup("#define textureCube texture\n"); + text[count++] = strdup("#define texture2DLod textureLod\n"); + text[count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n"); } } if(defines) { for (std::map::iterator iter = defines->begin(); iter != defines->end(); ++iter) - { - std::string define = "#define " + iter->first + " " + iter->second + "\n"; - text[count++] = (GLcharARB *) strdup(define.c_str()); - } + { + std::string define = "#define " + iter->first + " " + iter->second + "\n"; + text[count++] = (GLcharARB *) strdup(define.c_str()); + } } if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB) @@ -796,7 +791,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade LL_ERRS() << "Indexed texture rendering requires GLSL 1.30 or later." << LL_ENDL; } } - else + else if( type == GL_FRAGMENT_SHADER_ARB ) { text[count++] = strdup("#define HAS_DIFFUSE_LOOKUP 0\n"); } From ec91f9a02602e21d5707557400573b536958647e Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 23:18:00 -0600 Subject: [PATCH 09/23] Skip binding emissive shader for alpha glow. Caused huge pipeline stalls. Looking into alternate solution. --- indra/newview/lldrawpoolalpha.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 20b59ade8..04d1e7904 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -554,20 +554,21 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE, // don't touch color LLRender::BF_ONE, LLRender::BF_ONE); // add to alpha (glow) - emissive_shader->bind(); - + //emissive_shader->bind(); + // glow doesn't use vertex colors from the mesh data // Singu Note: Pull attribs from shader, since we always have one here. - params.mVertexBuffer->setBuffer(emissive_shader->mAttributeMask); - + // Singu Note: To avoid ridiculous shader bind cost, simply re-use prior shader, but let llvertexbuffer replace the color attrib ptr with the emissive one. + params.mVertexBuffer->setBuffer(current_shader->mAttributeMask | LLVertexBuffer::MAP_EMISSIVE); + // do the actual drawing, again params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); + //current_shader->bind(); + // restore our alpha blend mode gGL.blendFunc(mColorSFactor, mColorDFactor, mAlphaSFactor, mAlphaDFactor); - - current_shader->bind(); } if (tex_setup) From 85cb3cb0d07aa5430f817e1867ff921f0b3459c1 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 17 Jan 2018 23:44:02 -0600 Subject: [PATCH 10/23] Clean up deferred shaders by moving common methods into shared glsl file --- indra/llrender/llglslshader.cpp | 2 +- indra/llrender/llshadermgr.h | 1 + .../shaders/class1/deferred/SSAOF.glsl | 24 +--- .../shaders/class1/deferred/alphaF.glsl | 57 +--------- .../shaders/class1/deferred/avatarF.glsl | 6 +- .../shaders/class1/deferred/blurLightF.glsl | 32 +----- .../shaders/class1/deferred/bumpF.glsl | 6 +- .../deferred/components/utilityFuncF.glsl | 104 ++++++++++++++++++ .../class1/deferred/diffuseAlphaMaskF.glsl | 6 +- .../deferred/diffuseAlphaMaskIndexedF.glsl | 6 +- .../deferred/diffuseAlphaMaskNoColorF.glsl | 6 +- .../shaders/class1/deferred/diffuseF.glsl | 6 +- .../class1/deferred/diffuseIndexedF.glsl | 7 +- .../shaders/class1/deferred/emissiveF.glsl | 12 +- .../shaders/class1/deferred/emissiveV.glsl | 5 - .../shaders/class1/deferred/fullbrightF.glsl | 39 +------ .../shaders/class1/deferred/impostorF.glsl | 36 ------ .../shaders/class1/deferred/materialF.glsl | 69 +----------- .../class1/deferred/multiPointLightF.glsl | 30 +---- .../class1/deferred/multiSpotLightF.glsl | 63 ++--------- .../shaders/class1/deferred/pointLightF.glsl | 30 +---- .../deferred/postDeferredGammaCorrectF.glsl | 20 +--- .../shaders/class1/deferred/postgiF.glsl | 13 +-- .../shaders/class1/deferred/softenLightF.glsl | 56 +--------- .../shaders/class1/deferred/spotLightF.glsl | 61 +--------- .../shaders/class1/deferred/terrainF.glsl | 6 +- .../shaders/class1/deferred/treeF.glsl | 6 +- .../shaders/class1/deferred/underWaterF.glsl | 44 +------- .../shaders/class1/deferred/waterF.glsl | 24 +--- .../class2/deferred/multiSpotLightF.glsl | 67 +++-------- .../shaders/class2/deferred/softenLightF.glsl | 62 +---------- .../shaders/class2/deferred/spotLightF.glsl | 75 +++---------- .../shaders/class2/deferred/sunLightF.glsl | 30 +---- .../class2/deferred/sunLightSSAOF.glsl | 30 +---- indra/newview/llviewershadermgr.cpp | 13 +++ indra/newview/llviewershadermgr.h | 2 + 36 files changed, 214 insertions(+), 842 deletions(-) create mode 100644 indra/newview/app_settings/shaders/class1/deferred/components/utilityFuncF.glsl diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index f8b346c93..fede4f87b 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -414,7 +414,7 @@ BOOL LLGLSLShader::createShader(std::vector * attributes, } // Attach existing objects - if (!LLShaderMgr::instance()->attachShaderFeatures(this)) + if (!LLShaderMgr::instance()->attachClassSharedShaders(*this, mShaderClass) || !LLShaderMgr::instance()->attachShaderFeatures(this)) { if(mProgramObject) glDeleteObjectARB(mProgramObject); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 265f0c0b9..f10487710 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -240,6 +240,7 @@ DISPLAY_GAMMA, // Implemented in the application to actually update out of date uniforms for a particular shader virtual void updateShaderUniforms(LLGLSLShader * shader) = 0; // Pure Virtual + virtual bool attachClassSharedShaders(LLGLSLShader& shader, S32 shader_class) = 0; // Pure Virtual public: struct CachedObjectInfo diff --git a/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl index fd3bbdd15..acb2f173e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/SSAOF.glsl @@ -45,28 +45,8 @@ uniform float ssao_factor; uniform vec2 kern_scale; uniform vec2 noise_scale; -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMapDownsampled, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); vec2 getKern(int i) { diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 68f02c258..334c3e0db 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -99,59 +99,10 @@ uniform vec3 light_direction[8]; uniform vec3 light_attenuation[8]; uniform vec3 light_diffuse[8]; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} +vec2 encode_normal(vec3 n); +vec3 decode_normal(vec2 enc); +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); vec3 calcDirectionalLight(vec3 n, vec3 l) { diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index 662c762bc..e52ff0e22 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -36,11 +36,7 @@ uniform float minimum_alpha; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index 2c50e8b6a..27d2991b1 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -44,6 +44,9 @@ VARYING vec2 vary_fragcoord; uniform mat4 inv_proj; +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); + vec2 getKern(int i) { vec2 kern[4]; @@ -55,35 +58,6 @@ vec2 getKern(int i) return kern[i]; } -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - void main() { vec2 tc = vary_fragcoord.xy; diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl index 595c11fae..3827f4759 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl @@ -39,11 +39,7 @@ VARYING vec3 vary_mat2; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/components/utilityFuncF.glsl b/indra/newview/app_settings/shaders/class1/deferred/components/utilityFuncF.glsl new file mode 100644 index 000000000..806e65169 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/components/utilityFuncF.glsl @@ -0,0 +1,104 @@ +/** + * @file utilityFuncF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform sampler2D depthMap; + +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + +vec3 decode_normal(vec2 enc) +{ + vec2 fenc = enc*4-2; + float f = dot(fenc,fenc); + float g = sqrt(1-f/4); + vec3 n; + n.xy = fenc*g; + n.z = 1-f/2; + return n; +} + +vec4 getPosition(vec2 pos_screen) +{ + float depth = texture2D(depthMap, pos_screen.xy).r; + vec2 sc = pos_screen.xy*2.0; + sc -= vec2(1.0,1.0); + vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); + vec4 pos = inv_proj * ndc; + pos /= pos.w; + pos.w = 1.0; + return pos; +} + +vec3 srgb_to_linear(vec3 cs) +{ + vec3 low_range = cs / vec3(12.92); + vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); + + bvec3 lte = lessThanEqual(cs,vec3(0.04045)); + vec3 result; +#ifdef OLD_SELECT + vec3 result; + result.r = lte.r ? low_range.r : high_range.r; + result.g = lte.g ? low_range.g : high_range.g; + result.b = lte.b ? low_range.b : high_range.b; + return result; +#else + return mix(high_range, low_range, lte); +#endif +} + +vec4 srgb_to_linear(vec4 cs) +{ + return vec4(srgb_to_linear(cs.rgb), cs.a); +} + +vec3 linear_to_srgb(vec3 cl) +{ + cl = clamp(cl, vec3(0), vec3(1)); + vec3 low_range = cl * 12.92; + vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; + + bvec3 lt = lessThan(cl,vec3(0.0031308)); +#ifdef OLD_SELECT + vec3 result; + result.r = lt.r ? low_range.r : high_range.r; + result.g = lt.g ? low_range.g : high_range.g; + result.b = lt.b ? low_range.b : high_range.b; + return result; +#else + return mix(high_range, low_range, lt); +#endif + +} + +vec4 linear_to_srgb(vec4 cl) +{ + return vec4(linear_to_srgb(cl.rgb), cl.a); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl index 7930b5d18..7310f1ebb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskF.glsl @@ -37,11 +37,7 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl index 8525e1333..08ce60525 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskIndexedF.glsl @@ -36,11 +36,7 @@ uniform float minimum_alpha; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl index 37d70a241..e6de9bcf0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseAlphaMaskNoColorF.glsl @@ -37,11 +37,7 @@ uniform sampler2D diffuseMap; VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl index 6befb1bd8..d104c7d02 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseF.glsl @@ -35,11 +35,7 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl index adc361d7a..4a195bbb3 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseIndexedF.glsl @@ -33,12 +33,7 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl index 9a3157bfe..4fa5f7a9b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl @@ -39,16 +39,10 @@ VARYING vec2 vary_texcoord0; void main() { - float shadow = 1.0; - - vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; - if(color.a < .01) + float alpha = diffuseLookup(vary_texcoord0.xy).a*vertex_color.a; + if(alpha < .01) discard; - color.rgb = pow(color.rgb, vec3(2.2)); - color.rgb = fullbrightAtmosTransport(color.rgb); - color.rgb = fullbrightScaleSoftClip(color.rgb); - - frag_color = color; + frag_color = vec4(0,0,0,alpha); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl index 115b04797..3252b441f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveV.glsl @@ -46,17 +46,12 @@ VARYING vec2 vary_texcoord0; void main() { - //transform vertex - vec4 vert = vec4(position.xyz, 1.0); - vec4 pos = (modelview_matrix * vert); passTextureIndex(); gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - calcAtmospherics(pos.xyz); - vertex_color = emissive; diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 2152a1bd0..5e73b8be0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -39,43 +39,8 @@ VARYING vec3 vary_position; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; - -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); vec3 fullbrightAtmosTransportDeferred(vec3 light) { diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index f8fdde43f..5ec0856be 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -38,42 +38,6 @@ uniform sampler2D specularMap; VARYING vec2 vary_texcoord0; -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - void main() { vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index afb170635..5a06b8888 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -30,42 +30,11 @@ uniform float emissive_brightness; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} +vec2 encode_normal(vec3 n); +vec3 decode_normal(vec2 enc); +vec3 encode_diffuse(vec3 color); +vec4 srgb_to_linear(vec4 cs); +vec3 linear_to_srgb(vec3 cl); #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) @@ -271,17 +240,6 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe } -vec4 getPosition_d(vec2 pos_screen, float depth) -{ - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - #ifndef WATER_FOG vec3 getPositionEye() { @@ -504,23 +462,6 @@ VARYING vec3 vary_normal; VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - void main() { vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index de8efe1b8..4e84d38b7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -55,34 +55,8 @@ uniform float far_z; uniform mat4 inv_proj; uniform vec2 noise_scale; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index d5216e19f..153c7391d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -63,55 +63,29 @@ uniform float size; VARYING vec4 vary_fragcoord; +vec3 decode_normal(vec2 enc); uniform mat4 inv_proj; uniform vec2 noise_scale; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} +vec4 getPosition(vec2 pos_screen); +vec3 srgb_to_linear(vec3 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); ret.rgb = srgb_to_linear(ret.rgb); - vec2 dist = tc-vec2(0.5); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float det = max(1.0-lod/(proj_lod*0.5), 0.0); + float det = min(lod/(proj_lod*0.5), 1.0); - float d = dot(dist,dist); - - ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + float d = min(dist.x, dist.y); + + d *= min(1, d * (proj_lod - lod)); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); return ret; } @@ -148,19 +122,6 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) return ret; } - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - void main() { vec4 frag = vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index d9c30ab18..664595a92 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -53,34 +53,8 @@ uniform mat4 inv_proj; uniform vec4 viewport; uniform vec2 noise_scale; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrectF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrectF.glsl index 50d0378e0..db8013054 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrectF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrectF.glsl @@ -37,25 +37,7 @@ VARYING vec2 vary_fragcoord; //uniform float display_gamma; -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - +vec3 linear_to_srgb(vec3 cl); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl index 96f962842..3c035ef7b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl @@ -47,18 +47,7 @@ VARYING vec2 vary_fragcoord; uniform mat4 inv_proj; uniform vec2 screen_res; -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} +vec4 getPosition(vec2 pos_screen); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 172b8ead5..06c509708 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -74,53 +74,9 @@ vec3 vary_AtmosAttenuation; uniform mat4 inv_proj; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} +vec3 decode_normal(vec2 enc); +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); vec4 getPosition_d(vec2 pos_screen, float depth) { @@ -133,12 +89,6 @@ vec4 getPosition_d(vec2 pos_screen, float depth) return pos; } -vec4 getPosition(vec2 pos_screen) -{ //get position in screen space (world units) given window coordinate and depth map - float depth = texture2D(depthMap, pos_screen.xy).a; - return getPosition_d(pos_screen, depth); -} - vec3 getPositionEye() { return vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index f56d5aff0..582e1032c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -66,50 +66,14 @@ VARYING vec4 vary_fragcoord; uniform mat4 inv_proj; uniform vec2 noise_scale; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec4 correctWithGamma(vec4 col) -{ - return vec4(srgb_to_linear(col.rgb), col.a); -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); +vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); vec2 dist = tc-vec2(0.5); @@ -125,7 +89,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -143,7 +107,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); vec2 dist = tc-vec2(0.5); @@ -154,19 +118,6 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) return ret; } - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - void main() { vec4 frag = vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl index 52a429465..0474086bd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/terrainF.glsl @@ -39,11 +39,7 @@ VARYING vec3 vary_normal; VARYING vec4 vary_texcoord0; VARYING vec4 vary_texcoord1; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl index 808750496..c5bb8ddc8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeF.glsl @@ -37,11 +37,7 @@ VARYING vec2 vary_texcoord0; uniform float minimum_alpha; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl index 77edb136b..77126bd0d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -56,48 +56,8 @@ VARYING vec4 refCoord; VARYING vec4 littleWave; VARYING vec4 view; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); +vec3 encode_diffuse(vec3 color); vec4 applyWaterFog(vec4 color, vec3 viewVec) { diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 2abb6bfe6..6a24c1bd4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -62,29 +62,7 @@ VARYING vec4 littleWave; VARYING vec4 view; VARYING vec4 vary_position; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} +vec2 encode_normal(vec3 n); void main() { diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 41094318d..a74b2187d 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -67,54 +67,26 @@ VARYING vec4 vary_fragcoord; uniform mat4 inv_proj; uniform vec2 noise_scale; - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); +vec3 srgb_to_linear(vec3 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); ret.rgb = srgb_to_linear(ret.rgb); - - vec2 dist = tc-vec2(0.5); - float det = max(1.0-lod/(proj_lod*0.5), 0.0); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float d = dot(dist,dist); - - ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + float det = min(lod/(proj_lod*0.5), 1.0); + + float d = min(dist.x, dist.y); + + d *= min(1, d * (proj_lod - lod)); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); return ret; } @@ -151,19 +123,6 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) return ret; } - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - void main() { vec4 frag = vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 9c9ed9a75..b9184655f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -77,59 +77,9 @@ vec3 vary_AtmosAttenuation; uniform mat4 inv_proj; -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec3 linear_to_srgb(vec3 cl) -{ - cl = clamp(cl, vec3(0), vec3(1)); - vec3 low_range = cl * 12.92; - vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - bvec3 lt = lessThan(cl,vec3(0.0031308)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lt.r ? low_range.r : high_range.r; - result.g = lt.g ? low_range.g : high_range.g; - result.b = lt.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lt); -#endif - -} - -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} +vec3 decode_normal(vec2 enc); +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); vec4 getPosition_d(vec2 pos_screen, float depth) { @@ -142,12 +92,6 @@ vec4 getPosition_d(vec2 pos_screen, float depth) return pos; } -vec4 getPosition(vec2 pos_screen) -{ //get position in screen space (world units) given window coordinate and depth map - float depth = texture2D(depthMap, pos_screen.xy).r; - return getPosition_d(pos_screen, depth); -} - vec3 getPositionEye() { return vary_PositionEye; diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 2b0fd4a61..c44c630ec 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -67,58 +67,26 @@ VARYING vec4 vary_fragcoord; uniform mat4 inv_proj; uniform vec2 noise_scale; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec3 srgb_to_linear(vec3 cs) -{ - vec3 low_range = cs / vec3(12.92); - vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - bvec3 lte = lessThanEqual(cs,vec3(0.04045)); - -#ifdef OLD_SELECT - vec3 result; - result.r = lte.r ? low_range.r : high_range.r; - result.g = lte.g ? low_range.g : high_range.g; - result.b = lte.b ? low_range.b : high_range.b; - return result; -#else - return mix(high_range, low_range, lte); -#endif - -} - -vec4 correctWithGamma(vec4 col) -{ - return vec4(srgb_to_linear(col.rgb), col.a); -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); +vec4 srgb_to_linear(vec4 cs); vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); - vec2 dist = tc-vec2(0.5); + vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); - float det = max(1.0-lod/(proj_lod*0.5), 0.0); + float det = min(lod/(proj_lod*0.5), 1.0); - float d = dot(dist,dist); - - ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0)+det, 1.0); + float d = min(dist.x, dist.y); + + d *= min(1, d * (proj_lod - lod)); + + float edge = 0.25*det; + + ret *= clamp(d/edge, 0.0, 1.0); return ret; } @@ -126,7 +94,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -144,7 +112,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) { vec4 ret = texture2DLod(projectionMap, tc, lod); - ret = correctWithGamma(ret); + ret = srgb_to_linear(ret); vec2 dist = tc-vec2(0.5); @@ -155,19 +123,6 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) return ret; } - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - void main() { vec4 frag = vary_fragcoord; diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index d8a92ccbd..becff8506 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -65,34 +65,8 @@ uniform float shadow_offset; uniform float spot_shadow_bias; uniform float spot_shadow_offset; -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) { diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index e95f1b975..61519639f 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -65,35 +65,9 @@ uniform float shadow_offset; uniform float spot_shadow_bias; uniform float spot_shadow_offset; +vec3 decode_normal(vec2 enc); +vec4 getPosition(vec2 pos_screen); -vec2 encode_normal(vec3 n) -{ - float f = sqrt(8 * n.z + 8); - return n.xy / f + 0.5; -} - -vec3 decode_normal (vec2 enc) -{ - vec2 fenc = enc*4-2; - float f = dot(fenc,fenc); - float g = sqrt(1-f/4); - vec3 n; - n.xy = fenc*g; - n.z = 1-f/2; - return n; -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2D(depthMap, pos_screen.xy).r; - vec2 sc = pos_screen.xy*2.0; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} float calcShadow( sampler2DShadow shadowMap, vec4 stc, vec2 res, vec2 pos_screen ) { diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index c7e96f302..f1b8223ca 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -952,6 +952,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() BOOL success = TRUE; + success = loadShaderFile("deferred/components/utilityFuncF.glsl", mVertexShaderLevel[SHADER_DEFERRED], GL_FRAGMENT_SHADER_ARB); + if (success) { gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader"; @@ -2533,6 +2535,17 @@ void LLViewerShaderMgr::updateShaderUniforms(LLGLSLShader * shader) LLWaterParamManager::getInstance()->updateShaderUniforms(shader); } +/* virtual */ bool LLViewerShaderMgr::attachClassSharedShaders(LLGLSLShader& shader, S32 shader_class) +{ + switch (shader_class) + { + case LLViewerShaderMgr::SHADER_DEFERRED: + LL_INFOS() << "deferred/components/utilityFuncF.glsl" << LL_ENDL; + return shader.attachObject("deferred/components/utilityFuncF.glsl"); + } + return true; +} + /*static*/ void LLShaderMgr::unloadShaderClass(int shader_class) { std::vector &shader_list = getGlobalShaderList(); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 01c4ca545..e39380f16 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -146,6 +146,8 @@ public: /* virtual */ void updateShaderUniforms(LLGLSLShader * shader); // Virtual + /* virtual */ bool attachClassSharedShaders(LLGLSLShader& shader, S32 shader_class); // Virtual + private: std::vector mShinyUniforms; From ecc820f784efd46144a2c251fe8849f86a8159d3 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Fri, 19 Jan 2018 00:49:15 -0600 Subject: [PATCH 11/23] Fix shader compilation errors. Pulling bits and pieces out of massive set of unstaged changes never ends well.. --- .../app_settings/shaders/class1/deferred/impostorF.glsl | 2 ++ .../app_settings/shaders/class1/deferred/materialF.glsl | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index 5ec0856be..506285849 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -38,6 +38,8 @@ uniform sampler2D specularMap; VARYING vec2 vary_texcoord0; +vec3 linear_to_srgb(vec3 cs); + void main() { vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 5a06b8888..02b9e71c7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -32,8 +32,7 @@ uniform float emissive_brightness; vec2 encode_normal(vec3 n); vec3 decode_normal(vec2 enc); -vec3 encode_diffuse(vec3 color); -vec4 srgb_to_linear(vec4 cs); +vec3 srgb_to_linear(vec3 cs); vec3 linear_to_srgb(vec3 cl); #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) From 92eb988f2abfcffdcac1a01f8513f9926bf29ec2 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 22 Jan 2018 19:32:46 -0600 Subject: [PATCH 12/23] Pull in vertex buffer changes from alch. --- indra/llrender/llvertexbuffer.cpp | 180 ++++++++++++++------------- indra/llrender/llvertexbuffer.h | 11 +- indra/newview/llface.cpp | 148 +--------------------- indra/newview/llselectmgr.cpp | 2 +- indra/newview/llspatialpartition.cpp | 12 +- 5 files changed, 103 insertions(+), 250 deletions(-) diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 65b3d475e..c4977e9bc 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -97,7 +97,6 @@ U32 LLVertexBuffer::sCurVAOName = 1; U32 LLVertexBuffer::sAllocatedIndexBytes = 0; U32 LLVertexBuffer::sIndexCount = 0; -LLPrivateMemoryPool* LLVertexBuffer::sPrivatePoolp = NULL; U32 LLVertexBuffer::sBindCount = 0; U32 LLVertexBuffer::sSetCount = 0; S32 LLVertexBuffer::sCount = 0; @@ -117,6 +116,7 @@ bool LLVertexBuffer::sMapped = false; bool LLVertexBuffer::sUseStreamDraw = true; bool LLVertexBuffer::sUseVAO = false; bool LLVertexBuffer::sPreferStreamDraw = false; +LLVertexBuffer* LLVertexBuffer::sUtilityBuffer = nullptr; U32 LLVBOPool::genBuffer() @@ -135,7 +135,7 @@ void LLVBOPool::deleteBuffer(U32 name) LLVertexBuffer::unbind(); glBindBufferARB(mType, name); - glBufferDataARB(mType, 0, NULL, mUsage); + glBufferDataARB(mType, 0, nullptr, mUsage); glBindBufferARB(mType, 0); glDeleteBuffersARB(1, &name); @@ -154,7 +154,7 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed) { llassert(vbo_block_size(size) == size); - volatile U8* ret = NULL; + volatile U8* ret = nullptr; U32 i = vbo_block_index(size); @@ -186,12 +186,12 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed) if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB) { - glBufferDataARB(mType, size, 0, mUsage); + glBufferDataARB(mType, size, nullptr, mUsage); ret = (U8*) ll_aligned_malloc<64>(size); } else { //always use a true hint of static draw when allocating non-client-backed buffers - glBufferDataARB(mType, size, 0, GL_STATIC_DRAW_ARB); + glBufferDataARB(mType, size, nullptr, GL_STATIC_DRAW_ARB); } glBindBufferARB(mType, 0); @@ -449,7 +449,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask) else { - GLenum array[] = + static const GLenum array[] = { GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, @@ -457,7 +457,7 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask) GL_COLOR_ARRAY, }; - GLenum mask[] = + static const GLenum mask[] = { MAP_VERTEX, MAP_NORMAL, @@ -564,77 +564,96 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector& pos, con gGL.syncMatrices(); U32 count = pos.size(); - + llassert(norm.size() >= pos.size()); llassert(count > 0); - if( count == 0 ) + if (count == 0) { LL_WARNS() << "Called drawArrays with 0 vertices" << LL_ENDL; return; } - if( norm.size() < pos.size() ) + if (norm.size() < pos.size()) { LL_WARNS() << "Called drawArrays with #" << norm.size() << " normals and #" << pos.size() << " vertices" << LL_ENDL; return; } - unbind(); - - setupClientArrays(MAP_VERTEX | MAP_NORMAL); - - LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; - - if (shader) + if (!sUtilityBuffer) { - glVertexAttribPointerARB(TYPE_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, pos[0].mV); - glVertexAttribPointerARB(TYPE_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, norm[0].mV); + sUtilityBuffer = new LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0, GL_STREAM_DRAW); + sUtilityBuffer->allocateBuffer(count, count, true); } - else + if (sUtilityBuffer->getNumVerts() < (S32)count) { - glVertexPointer(3, GL_FLOAT, 0, pos[0].mV); - glNormalPointer(GL_FLOAT, 0, norm[0].mV); + sUtilityBuffer->resizeBuffer(count, count); } - glDrawArrays(sGLMode[mode], 0, count); + LLStrider vertex_strider; + LLStrider normal_strider; + sUtilityBuffer->getVertexStrider(vertex_strider); + sUtilityBuffer->getNormalStrider(normal_strider); + for (U32 i = 0; i < count; ++i) + { + *(vertex_strider++) = pos[i]; + *(normal_strider++) = norm[i]; + } + + sUtilityBuffer->setBuffer(MAP_VERTEX | MAP_NORMAL); + sUtilityBuffer->drawArrays(mode, 0, pos.size()); } //static -void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp) +void LLVertexBuffer::drawElements(U32 mode, const S32 num_vertices, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp) { llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL); + if (num_vertices <= 0) + { + LL_WARNS() << "Called drawElements with 0 vertices" << LL_ENDL; + return; + } + + if (num_indices <= 0) + { + LL_WARNS() << "Called drawElements with 0 indices" << LL_ENDL; + return; + } + gGL.syncMatrices(); + if (!sUtilityBuffer) + { + sUtilityBuffer = new LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0, GL_STREAM_DRAW); + sUtilityBuffer->allocateBuffer(num_vertices, num_indices, true); + } + if (sUtilityBuffer->getNumVerts() < num_vertices || sUtilityBuffer->getNumIndices() < num_indices) + { + sUtilityBuffer->resizeBuffer(llmax(sUtilityBuffer->getNumVerts(), num_vertices), llmax(sUtilityBuffer->getNumIndices(), num_indices)); + } + U32 mask = LLVertexBuffer::MAP_VERTEX; + + LLStrider index_strider; + LLStrider vertex_strider; + sUtilityBuffer->getIndexStrider(index_strider); + sUtilityBuffer->getVertexStrider(vertex_strider); + const S32 index_size = ((num_indices * sizeof(U16)) + 0xF) & ~0xF; + const S32 vertex_size = ((num_vertices * 4 * sizeof(F32)) + 0xF) & ~0xF; + LLVector4a::memcpyNonAliased16((F32*)index_strider.get(), (F32*)indicesp, index_size); + LLVector4a::memcpyNonAliased16((F32*)vertex_strider.get(), (F32*)pos, vertex_size); if (tc) { mask = mask | LLVertexBuffer::MAP_TEXCOORD0; + LLStrider tc_strider; + sUtilityBuffer->getTexCoord0Strider(tc_strider); + const S32 tc_size = ((num_vertices * 2 * sizeof(F32)) + 0xF) & ~0xF; + LLVector4a::memcpyNonAliased16((F32*)tc_strider.get(), (F32*)tc, tc_size); } - unbind(); - - setupClientArrays(mask); - - if (LLGLSLShader::sNoFixedFunction) - { - glVertexAttribPointerARB(TYPE_VERTEX, 3, GL_FLOAT, GL_FALSE, 16, pos); - if (tc) - { - glVertexAttribPointerARB(TYPE_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, 0, tc); - } - } - else - { - glVertexPointer(3, GL_FLOAT, 16, pos); - if (tc) - { - glTexCoordPointer(2, GL_FLOAT, 0, tc); - } - } - - glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp); + sUtilityBuffer->setBuffer(mask); + sUtilityBuffer->draw(mode, num_indices, 0); } void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const @@ -822,7 +841,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const } { - LL_RECORD_BLOCK_TIME(FTM_GL_DRAW_ARRAYS); + //LL_RECORD_BLOCK_TIME(FTM_GL_DRAW_ARRAYS); stop_glerror(); glDrawArrays(sGLMode[mode], first, count); } @@ -834,12 +853,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping) { sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject; - sDisableVBOMapping = sEnableVBOs;// && no_vbo_mapping; //Temporary workaround for vbo mapping being straight up broken - - if (!sPrivatePoolp) - { - sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC); - } + sDisableVBOMapping = sEnableVBOs;// && no_vbo_mapping; } //static @@ -882,11 +896,8 @@ void LLVertexBuffer::cleanupClass() sStreamVBOPool.cleanup(); sDynamicVBOPool.cleanup(); - if(sPrivatePoolp) - { - LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp); - sPrivatePoolp = NULL; - } + delete sUtilityBuffer; + sUtilityBuffer = nullptr; } //---------------------------------------------------------------------------- @@ -944,8 +955,8 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) : mGLBuffer(0), mGLIndices(0), mGLArray(0), - mMappedData(NULL), - mMappedIndexData(NULL), + mMappedData(nullptr), + mMappedIndexData(nullptr), mMappedDataUsingVBOs(false), mMappedIndexDataUsingVBOs(false), mVertexLocked(false), @@ -953,7 +964,7 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) : mFinal(false), mEmpty(true), mMappable(false), - mFence(NULL) + mFence(nullptr) { mMappable = (mUsage == GL_DYNAMIC_DRAW_ARB && !sDisableVBOMapping); @@ -1031,7 +1042,7 @@ LLVertexBuffer::~LLVertexBuffer() delete mFence; } - mFence = NULL; + mFence = nullptr; sVertexCount -= mNumVerts; sIndexCount -= mNumIndices; @@ -1109,7 +1120,7 @@ void LLVertexBuffer::releaseBuffer() } mGLBuffer = 0; - mMappedData = NULL; + mMappedData = nullptr; sGLCount--; } @@ -1126,7 +1137,7 @@ void LLVertexBuffer::releaseIndices() } mGLIndices = 0; - mMappedIndexData = NULL; + mMappedIndexData = nullptr; sGLCount--; } @@ -1155,7 +1166,7 @@ void LLVertexBuffer::createGLBuffer(U32 size) { static int gl_buffer_idx = 0; mGLBuffer = ++gl_buffer_idx; - mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size); + mMappedData = (U8*)ll_aligned_malloc_16(size); mSize = size; } } @@ -1187,7 +1198,7 @@ void LLVertexBuffer::createGLIndices(U32 size) } else { - mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size); + mMappedIndexData = (U8*)ll_aligned_malloc_16(size); static int gl_buffer_idx = 0; mGLIndices = ++gl_buffer_idx; mIndicesSize = size; @@ -1204,8 +1215,8 @@ void LLVertexBuffer::destroyGLBuffer() } else { - FREE_MEM(sPrivatePoolp, (void*) mMappedData); - mMappedData = NULL; + ll_aligned_free_16((void*) mMappedData); + mMappedData = nullptr; mEmpty = true; } } @@ -1224,8 +1235,8 @@ void LLVertexBuffer::destroyGLIndices() } else { - FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData); - mMappedIndexData = NULL; + ll_aligned_free_16((void*) mMappedIndexData); + mMappedIndexData = nullptr; mEmpty = true; } } @@ -1529,7 +1540,7 @@ volatile U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, boo } else { - volatile U8* src = NULL; + volatile U8* src = nullptr; waitFence(); if (gGLManager.mHasMapBufferRange) { @@ -1716,7 +1727,7 @@ volatile U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range } else { - volatile U8* src = NULL; + volatile U8* src = nullptr; waitFence(); if (gGLManager.mHasMapBufferRange) { @@ -1849,7 +1860,7 @@ void LLVertexBuffer::unmapBuffer() else { stop_glerror(); - glBufferDataARB(GL_ARRAY_BUFFER_ARB, getSize(), NULL, mUsage); + glBufferDataARB(GL_ARRAY_BUFFER_ARB, getSize(), nullptr, mUsage); // glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, getSize(), (U8*) mMappedData); stop_glerror(); } @@ -1887,7 +1898,7 @@ void LLVertexBuffer::unmapBuffer() glUnmapBufferARB(GL_ARRAY_BUFFER_ARB); stop_glerror(); - mMappedData = NULL; + mMappedData = nullptr; } mVertexLocked = false; @@ -1916,7 +1927,7 @@ void LLVertexBuffer::unmapBuffer() else { stop_glerror(); - glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, getIndicesSize(), NULL, mUsage); + glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, getIndicesSize(), nullptr, mUsage); // glBufferSubDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0, getIndicesSize(), (U8*) mMappedIndexData); stop_glerror(); } @@ -1955,7 +1966,7 @@ void LLVertexBuffer::unmapBuffer() glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB); stop_glerror(); - mMappedIndexData = NULL; + mMappedIndexData = nullptr; } mIndexLocked = false; @@ -1970,7 +1981,8 @@ void LLVertexBuffer::unmapBuffer() //---------------------------------------------------------------------------- -template struct VertexBufferStrider +template +struct VertexBufferStrider { typedef LLStrider strider_t; static bool get(LLVertexBuffer& vbo, @@ -1983,7 +1995,7 @@ template struct VertexBufferStrider volatile U8* ptr = vbo.mapVertexBuffer(type, index, count, map_range); - if (ptr == NULL) + if (ptr == nullptr) { LL_WARNS() << "mapVertexBuffer failed!" << LL_ENDL; return false; @@ -2011,7 +2023,7 @@ struct VertexBufferStrider { volatile U8* ptr = vbo.mapIndexBuffer(index, count, map_range); - if (ptr == NULL) + if (ptr == nullptr) { LL_WARNS() << "mapIndexBuffer failed!" << LL_ENDL; return false; @@ -2176,16 +2188,6 @@ void LLVertexBuffer::flush() } } -// bind for transform feedback (quick 'n dirty) -void LLVertexBuffer::bindForFeedback(U32 channel, U32 type, U32 index, U32 count) -{ -#ifdef GL_TRANSFORM_FEEDBACK_BUFFER - U32 offset = mOffsets[type] + sTypeSize[type]*index; - U32 size= (sTypeSize[type]*count); - glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, channel, mGLBuffer, offset, size); -#endif -} - // Set for rendering void LLVertexBuffer::setBuffer(U32 data_mask) { diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 1cebd96bd..afddf5ad2 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -93,7 +93,6 @@ public: //============================================================================ // base class -class LLPrivateMemoryPool; class LLVertexBuffer : public LLRefCount { public: @@ -142,7 +141,7 @@ public: static void cleanupClass(); static void setupClientArrays(U32 data_mask); static void drawArrays(U32 mode, const std::vector& pos, const std::vector& norm); - static void drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp); + static void drawElements(U32 mode, const S32 num_vertices, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp); static void unbind(); //unbind any bound vertex buffer @@ -227,8 +226,6 @@ public: volatile U8* mapVertexBuffer(S32 type, S32 index, S32 count, bool map_range); volatile U8* mapIndexBuffer(S32 index, S32 count, bool map_range); - void bindForFeedback(U32 channel, U32 type, U32 index, U32 count); - // set for rendering virtual void setBuffer(U32 data_mask); // calls setupVertexBuffer() if data_mask is not 0 void flush(); //flush pending data to GL memory @@ -327,9 +324,6 @@ protected: static S32 determineUsage(S32 usage); -private: - static LLPrivateMemoryPool* sPrivatePoolp; - public: static S32 sCount; static S32 sGLCount; @@ -353,6 +347,9 @@ public: static U32 sIndexCount; static U32 sBindCount; static U32 sSetCount; + +private: + static LLVertexBuffer* sUtilityBuffer; }; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index e1c909a5d..7ef9c5601 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -607,7 +607,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) gGL.diffuseColor4fv(color.mV); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mPositions, vol_face.mTexCoords, vol_face.mNumIndices, vol_face.mIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mNumVertices, vol_face.mPositions, vol_face.mTexCoords, vol_face.mNumIndices, vol_face.mIndices); if(prev_shader) { @@ -1439,152 +1439,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } static LLCachedControl use_transform_feedback("RenderUseTransformFeedback", false); - -#ifdef GL_TRANSFORM_FEEDBACK_BUFFER - if (use_transform_feedback && - gTransformPositionProgram.mProgramObject && //transform shaders are loaded - mVertexBuffer->useVBOs() && //target buffer is in VRAM - !rebuild_weights && //TODO: add support for weights - !volume.isUnique()) //source volume is NOT flexi - { //use transform feedback to pack vertex buffer - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK); - LLGLEnable discard(GL_RASTERIZER_DISCARD); - LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get(); - - if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices) - { - mVObjp->getVolume()->genTangents(f); - LLFace::cacheFaceInVRAM(vf); - buff = (LLVertexBuffer*) vf.mVertexBuffer.get(); - } - - LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr; - - gGL.pushMatrix(); - gGL.loadMatrix(mat_vert_in); - - if (rebuild_pos) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_POSITION); - gTransformPositionProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount); - - U8 index = mTextureIndex < 255 ? mTextureIndex : 0; - - S32 val = 0; - U8* vp = (U8*) &val; - vp[0] = index; - vp[1] = 0; - vp[2] = 0; - vp[3] = 0; - - gTransformPositionProgram.uniform1i(sTextureIndexIn, val); - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_VERTEX); - - push_for_transform(buff, vf.mNumVertices, mGeomCount); - - glEndTransformFeedback(); - } - - if (rebuild_color) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_COLOR); - gTransformColorProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount); - - S32 val = *((S32*) color.mV); - - gTransformColorProgram.uniform1i(sColorIn, val); - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_VERTEX); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - } - - if (rebuild_emissive) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_EMISSIVE); - gTransformColorProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount); - - U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255); - - S32 glow32 = glow | - (glow << 8) | - (glow << 16) | - (glow << 24); - - gTransformColorProgram.uniform1i(sColorIn, glow32); - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_VERTEX); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - } - - if (rebuild_normal) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_NORMAL); - gTransformNormalProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount); - - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_NORMAL); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - } - - if (rebuild_tangent) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_TANGENT); - gTransformTangentProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TANGENT, mGeomIndex, mGeomCount); - - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_TANGENT); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - } - - if (rebuild_tcoord) - { - LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_TEXTURE); - gTransformTexCoordProgram.bind(); - - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount); - - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - - bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1); - - if (do_bump) - { - mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD1, mGeomIndex, mGeomCount); - glBeginTransformFeedback(GL_POINTS); - buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0); - push_for_transform(buff, vf.mNumVertices, mGeomCount); - glEndTransformFeedback(); - } - } - - glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0); - gGL.popMatrix(); - - if (cur_shader) - { - cur_shader->bind(); - } - } - else -#endif { //if it's not fullbright and has no normals, bake sunlight based on face normal //bool bake_sunlight = !getTextureEntry()->getFullbright() && diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 1acfc9617..e36764d02 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6140,7 +6140,7 @@ void pushWireframe(LLDrawable* drawable) for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) { const LLVolumeFace& face = volume->getVolumeFace(i); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mNumVertices, face.mPositions, NULL, face.mNumIndices, face.mIndices); } } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index b0c914b79..392a48c08 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1456,7 +1456,7 @@ void pushVerts(LLVolume* volume) for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) { const LLVolumeFace& face = volume->getVolumeFace(i); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mNumVertices, face.mPositions, NULL, face.mNumIndices, face.mIndices); } } @@ -2325,11 +2325,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShader != 0); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mNumHullPoints phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); gGL.diffuseColor4fv(color.mV); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mNumHullPoints phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); } else @@ -2406,11 +2406,11 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); gGL.diffuseColor4fv(line_color.mV); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mNumHullPoints, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); gGL.diffuseColor4fv(color.mV); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, phys_volume->mNumHullPoints, phys_volume->mHullPoints, NULL, phys_volume->mNumHullIndices, phys_volume->mHullIndices); } else { @@ -2824,7 +2824,7 @@ void renderRaycast(LLDrawable* drawablep) { //render face positions gGL.diffuseColor4f(0,1,1,0.5f); - LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices); + LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mNumVertices, face.mPositions, NULL, face.mNumIndices, face.mIndices); } if (!volume->isUnique()) From fa628ce4d1b55285435be669cda178ad18f446cc Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 5 Feb 2018 01:40:36 -0600 Subject: [PATCH 13/23] Use standard SL splash screen. --- indra/newview/app_settings/settings_ascent.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index 6641a03fd..94faa90f6 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -1004,7 +1004,7 @@ Type String Value - http://singularity-viewer.github.io + SingularitySplashPagePath From 30df7dacdefbe34018f53c5e8440bfc0b0cbd48c Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 7 Feb 2018 21:18:35 -0600 Subject: [PATCH 14/23] Add bulk speaker updates. Sped up speaker fetching by disabling list sorting during bulk updates. --- indra/llui/llscrolllistctrl.cpp | 13 ++- indra/llui/llscrolllistctrl.h | 2 + indra/newview/llparticipantlist.cpp | 26 ++++- indra/newview/llparticipantlist.h | 18 +++ indra/newview/llspeakers.cpp | 168 ++++++++++++++++------------ indra/newview/llspeakers.h | 24 +++- 6 files changed, 177 insertions(+), 74 deletions(-) diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 67e4ff4d1..788adfa70 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -125,6 +125,7 @@ LLScrollListCtrl::LLScrollListCtrl(const std::string& name, const LLRect& rect, mNeedsScroll(false), mCanSelect(true), mColumnsDirty(false), + mSortEnabled(true), mMaxItemCount(INT_MAX), mMaxContentWidth(0), mBorderThickness( 2 ), @@ -2301,6 +2302,16 @@ BOOL LLScrollListCtrl::setSort(S32 column_idx, BOOL ascending) } } +void LLScrollListCtrl::setSortEnabled(bool sort) +{ + bool update = sort && !mSortEnabled; + mSortEnabled = sort; + if (update) + { + updateSort(); + } +} + S32 LLScrollListCtrl::getLinesPerPage() { //if mPageLines is NOT provided display all item @@ -2942,7 +2953,7 @@ std::string LLScrollListCtrl::getSortColumnName() BOOL LLScrollListCtrl::hasSortOrder() const { - return !mSortColumns.empty(); + return mSortEnabled && !mSortColumns.empty(); } void LLScrollListCtrl::clearSortOrder() diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 68905327c..e10a29373 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -322,6 +322,7 @@ public: BOOL getSortAscending() { return mSortColumns.empty() ? TRUE : mSortColumns.back().second; } BOOL hasSortOrder() const; void clearSortOrder(); + void setSortEnabled(bool sort); template S32 selectMultiple(const std::vector& vec) { @@ -423,6 +424,7 @@ private: bool mDisplayColumnHeaders; bool mColumnsDirty; bool mColumnWidthsDirty; + bool mSortEnabled; mutable item_list mItemList; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index d9b34ca93..499c014e3 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -58,10 +58,13 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, mSpeakerClearListener = new SpeakerClearListener(*this); //mSpeakerModeratorListener = new SpeakerModeratorUpdateListener(*this); mSpeakerMuteListener = new SpeakerMuteListener(*this); - + mSpeakerBatchBeginListener = new SpeakerBatchBeginListener(*this); + mSpeakerBatchEndListener = new SpeakerBatchEndListener(*this); mSpeakerMgr->addListener(mSpeakerAddListener, "add"); mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); + mSpeakerMgr->addListener(mSpeakerBatchBeginListener, "batch_begin"); + mSpeakerMgr->addListener(mSpeakerBatchEndListener, "batch_end"); //mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator"); } @@ -378,6 +381,16 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer event return true; } +void LLParticipantList::onSpeakerBatchBeginEvent() +{ + mAvatarList->setSortEnabled(false); +} + +void LLParticipantList::onSpeakerBatchEndEvent() +{ + mAvatarList->setSortEnabled(true); +} + void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id) { //if (mExcludeAgent && gAgent.getID() == avatar_id) return; @@ -468,6 +481,17 @@ bool LLParticipantList::SpeakerMuteListener::handleEvent(LLPointer event, const LLSD& userdata) +{ + mParent.onSpeakerBatchBeginEvent(); + return true; +} +bool LLParticipantList::SpeakerBatchEndListener::handleEvent(LLPointer event, const LLSD& userdata) +{ + mParent.onSpeakerBatchEndEvent(); + return true; +} + // Singu Note: The following functions are actually of the LLParticipantListMenu class, but we haven't married lists with menus yet. void LLParticipantList::toggleAllowTextChat(const LLSD& userdata) { diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 1177b778a..17be7bc78 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -76,6 +76,8 @@ protected: bool onClearListEvent(LLPointer event, const LLSD& userdata); //bool onModeratorUpdateEvent(LLPointer event, const LLSD& userdata); bool onSpeakerMuteEvent(LLPointer event, const LLSD& userdata); + void onSpeakerBatchBeginEvent(); + void onSpeakerBatchEndEvent(); /** * List of listeners implementing LLOldEvents::LLSimpleListener. @@ -126,6 +128,20 @@ protected: /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); }; + class SpeakerBatchBeginListener : public BaseSpeakerListener + { + public: + SpeakerBatchBeginListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + }; + + class SpeakerBatchEndListener : public BaseSpeakerListener + { + public: + SpeakerBatchEndListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + }; + /** * Menu used in the participant list. class LLParticipantListMenu : public LLListContextMenu @@ -202,6 +218,8 @@ private: LLPointer mSpeakerClearListener; //LLPointer mSpeakerModeratorListener; LLPointer mSpeakerMuteListener; + LLPointer mSpeakerBatchBeginListener; + LLPointer mSpeakerBatchEndListener; validate_speaker_callback_t mValidateSpeakerCallback; }; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 8f989454c..dc352bc18 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -338,7 +338,20 @@ LLSpeakerMgr::~LLSpeakerMgr() delete mSpeakerDelayRemover; } -LLPointer LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type) +void LLSpeakerMgr::setSpeakers(const std::vector& speakers) +{ + if (!speakers.empty()) + { + fireEvent(new LLOldEvents::LLEvent(this), "batch_begin"); + for (auto entry : speakers) + { + setSpeaker(entry.id, entry.name, entry.status, entry.type, entry.moderator, entry.moderator_muted_text); + } + fireEvent(new LLOldEvents::LLEvent(this), "batch_end"); + } +} + +LLPointer LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::string& name, LLSpeaker::ESpeakerStatus status, LLSpeaker::ESpeakerType type, bool moderator, bool moderator_muted_text) { LLUUID session_id = getSessionID(); if (id.isNull() || (id == session_id)) @@ -347,34 +360,37 @@ LLPointer LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin } LLPointer speakerp; - if (mSpeakers.find(id) == mSpeakers.end()) + auto it = mSpeakers.find(id); + if (it == mSpeakers.end() || it->second.isNull()) { speakerp = new LLSpeaker(id, name, type); speakerp->mStatus = status; + speakerp->mIsModerator = moderator; + speakerp->mModeratorMutedText = moderator_muted_text; mSpeakers.insert(std::make_pair(speakerp->mID, speakerp)); mSpeakersSorted.push_back(speakerp); - LL_DEBUGS("Speakers") << "Added speaker " << id << LL_ENDL; fireEvent(new LLSpeakerListChangeEvent(this, speakerp->mID), "add"); } else { - speakerp = findSpeaker(id); - if (speakerp.notNull()) + speakerp = it->second; + bool update_moderator = (bool)speakerp->mIsModerator != moderator; + + // keep highest priority status (lowest value) instead of overriding current value + speakerp->mStatus = llmin(speakerp->mStatus, status); + speakerp->mIsModerator = moderator; + speakerp->mModeratorMutedText = moderator_muted_text; + // RN: due to a weird behavior where IMs from attached objects come from the wearer's agent_id + // we need to override speakers that we think are objects when we find out they are really + // residents + if (type == LLSpeaker::SPEAKER_AGENT) { - // keep highest priority status (lowest value) instead of overriding current value - speakerp->mStatus = llmin(speakerp->mStatus, status); - // RN: due to a weird behavior where IMs from attached objects come from the wearer's agent_id - // we need to override speakers that we think are objects when we find out they are really - // residents - if (type == LLSpeaker::SPEAKER_AGENT) - { - speakerp->mType = LLSpeaker::SPEAKER_AGENT; - speakerp->lookupName(); - } + speakerp->mType = LLSpeaker::SPEAKER_AGENT; + speakerp->lookupName(); } - else + if (update_moderator) { - LL_WARNS("Speakers") << "Speaker " << id << " not found" << LL_ENDL; + fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); } } @@ -534,13 +550,17 @@ void LLSpeakerMgr::updateSpeakerList() std::set participants; LLVoiceClient::getInstance()->getParticipantList(participants); // If we are, add all voice client participants to our list of known speakers + std::vector speakers; + speakers.reserve(participants.size()); for (std::set::iterator participant_it = participants.begin(); participant_it != participants.end(); ++participant_it) { - setSpeaker(*participant_it, - LLVoiceClient::getInstance()->getDisplayName(*participant_it), - LLSpeaker::STATUS_VOICE_ACTIVE, - (LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL)); + speakers.emplace_back(speaker_entry_t( + *participant_it, + LLSpeaker::STATUS_VOICE_ACTIVE, + LLVoiceClient::getInstance()->getDisplayName(*participant_it), + (LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL))); } + setSpeakers(speakers); } else { @@ -569,10 +589,11 @@ void LLSpeakerMgr::updateSpeakerList() } else if (gdatap && gdatap->isMemberDataComplete() && !gdatap->mMembers.empty()) { + std::vector speakers; + speakers.reserve(gdatap->mMembers.size()); + // Add group members when we get the complete list (note: can take a while before we get that list) LLGroupMgrGroupData::member_list_t::iterator member_it = gdatap->mMembers.begin(); - const S32 load_group_max_members = gSavedSettings.getS32("ChatLoadGroupMaxMembers"); - S32 updated = 0; while (member_it != gdatap->mMembers.end()) { LLGroupMemberData* member = member_it->second; @@ -581,16 +602,16 @@ void LLSpeakerMgr::updateSpeakerList() const std::string& localized_online(); if ((member->getOnlineStatus() == localized_online()) && (mSpeakers.find(id) == mSpeakers.end())) { - LLPointer speakerp = setSpeaker(id, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT); - speakerp->mIsModerator = ((member->getAgentPowers() & GP_SESSION_MODERATOR) == GP_SESSION_MODERATOR); - updated++; + speakers.emplace_back(speaker_entry_t( + id, + LLSpeaker::STATUS_VOICE_ACTIVE, + "", + LLSpeaker::SPEAKER_AGENT, + (member->getAgentPowers() & GP_SESSION_MODERATOR) == GP_SESSION_MODERATOR)); } ++member_it; - // Limit the number of "manually updated" participants to a reasonable number to avoid severe fps drop - // *TODO : solve the perf issue of having several hundreds of widgets in the conversation list - if (updated >= load_group_max_members) - break; } + setSpeakers(speakers); mSpeakerListUpdated = true; } } @@ -617,7 +638,7 @@ void LLSpeakerMgr::updateSpeakerList() } } // Always add the current agent (it has to be there...). Will do nothing if already there. - setSpeaker(gAgentID, "", LLSpeaker::STATUS_VOICE_ACTIVE, LLSpeaker::SPEAKER_AGENT); + setSpeaker(gAgentID, "", LLSpeaker::STATUS_VOICE_ACTIVE); } void LLSpeakerMgr::setSpeakerNotInChannel(LLSpeaker* speakerp) @@ -737,6 +758,7 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers) { if ( !speakers.isMap() ) return; + std::vector speakerentries; if ( speakers.has("agent_info") && speakers["agent_info"].isMap() ) { LLSD::map_const_iterator speaker_it; @@ -744,26 +766,21 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers) speaker_it != speakers["agent_info"].endMap(); ++speaker_it) { - LLUUID agent_id(speaker_it->first); - - LLPointer speakerp = setSpeaker( - agent_id, - LLStringUtil::null, - LLSpeaker::STATUS_TEXT_ONLY); - - if ( speaker_it->second.isMap() ) + bool moderator = false; + bool moderator_muted = false; + if (speaker_it->second.isMap()) { - BOOL is_moderator = speakerp->mIsModerator; - speakerp->mIsModerator = speaker_it->second["is_moderator"]; - speakerp->mModeratorMutedText = - speaker_it->second["mutes"]["text"]; - // Fire event only if moderator changed - if ( is_moderator != speakerp->mIsModerator ) - { - LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << LL_ENDL; - fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); - } + moderator = speaker_it->second["is_moderator"]; + moderator_muted = speaker_it->second["mutes"]["text"]; } + speakerentries.emplace_back( + LLUUID(speaker_it->first), + LLSpeaker::STATUS_TEXT_ONLY, + "", + LLSpeaker::SPEAKER_AGENT, + moderator, + moderator_muted + ); } } else if ( speakers.has("agents" ) && speakers["agents"].isArray() ) @@ -775,22 +792,20 @@ void LLIMSpeakerMgr::setSpeakers(const LLSD& speakers) speaker_it != speakers["agents"].endArray(); ++speaker_it) { - const LLUUID agent_id = (*speaker_it).asUUID(); - - LLPointer speakerp = setSpeaker( - agent_id, - LLStringUtil::null, - LLSpeaker::STATUS_TEXT_ONLY); + speakerentries.emplace_back((*speaker_it).asUUID()); } } + LLSpeakerMgr::setSpeakers(speakerentries); } void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) { if ( !update.isMap() ) return; + std::vector speakerentries; if ( update.has("agent_updates") && update["agent_updates"].isMap() ) { + LLSD::map_const_iterator update_it; for( update_it = update["agent_updates"].beginMap(); @@ -800,8 +815,11 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) LLUUID agent_id(update_it->first); LLPointer speakerp = findSpeaker(agent_id); - LLSD agent_data = update_it->second; + bool new_speaker = false; + bool moderator = false; + bool moderator_muted = false; + LLSD agent_data = update_it->second; if (agent_data.isMap() && agent_data.has("transition")) { if (agent_data["transition"].asString() == "LEAVE" && speakerp.notNull()) @@ -811,15 +829,17 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) else if (agent_data["transition"].asString() == "ENTER") { // add or update speaker - speakerp = setSpeaker(agent_id); + new_speaker = true; } else { LL_WARNS() << "bad membership list update from 'agent_updates' for agent " << agent_id << ", transition " << ll_print_sd(agent_data["transition"]) << LL_ENDL; } } - - if (speakerp.isNull()) continue; + if (speakerp.isNull() && !new_speaker) + { + continue; + } // should have a valid speaker from this point on if (agent_data.isMap() && agent_data.has("info")) @@ -828,21 +848,21 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) if (agent_info.has("is_moderator")) { - BOOL is_moderator = speakerp->mIsModerator; - speakerp->mIsModerator = agent_info["is_moderator"]; - // Fire event only if moderator changed - if ( is_moderator != speakerp->mIsModerator ) - { - LL_DEBUGS("Speakers") << "Speaker " << agent_id << (is_moderator ? "is now" : "no longer is") << " a moderator" << LL_ENDL; - fireEvent(new LLSpeakerUpdateModeratorEvent(speakerp), "update_moderator"); - } + moderator = agent_info["is_moderator"]; } - if (agent_info.has("mutes")) { - speakerp->mModeratorMutedText = agent_info["mutes"]["text"]; + moderator_muted = agent_info["mutes"]["text"]; } } + speakerentries.emplace_back( + agent_id, + LLSpeaker::STATUS_TEXT_ONLY, + "", + LLSpeaker::SPEAKER_AGENT, + moderator, + moderator_muted + ); } } else if ( update.has("updates") && update["updates"].isMap() ) @@ -864,7 +884,9 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) else if ( agent_transition == "ENTER") { // add or update speaker - speakerp = setSpeaker(agent_id); + speakerentries.emplace_back( + agent_id + ); } else { @@ -872,6 +894,7 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update) } } } + LLSpeakerMgr::setSpeakers(speakerentries); } void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id) @@ -1039,10 +1062,13 @@ void LLLocalSpeakerMgr::updateSpeakerList() // pick up non-voice speakers in chat range uuid_vec_t avatar_ids; LLWorld::getInstance()->getAvatars(&avatar_ids, nullptr, gAgent.getPositionGlobal(), CHAT_NORMAL_RADIUS); + std::vector speakers; + speakers.reserve(avatar_ids.size()); for (const auto& id : avatar_ids) { - setSpeaker(id); + speakers.emplace_back(id); } + setSpeakers(speakers); // check if text only speakers have moved out of chat range for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it) diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 107749224..a2f05f71a 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -230,10 +230,32 @@ public: void update(BOOL resort_ok); void setSpeakerTyping(const LLUUID& speaker_id, BOOL typing); void speakerChatted(const LLUUID& speaker_id); + + struct speaker_entry_t + { + speaker_entry_t(const LLUUID& id, + LLSpeaker::ESpeakerStatus status = LLSpeaker::STATUS_TEXT_ONLY, + const std::string& name = LLStringUtil::null, + LLSpeaker::ESpeakerType type = LLSpeaker::SPEAKER_AGENT, + const bool moderator = false, + const bool moderator_muted_text = false) : + id(id), name(name), status(status), type(type), moderator(moderator), moderator_muted_text(moderator_muted_text) + {} + const LLUUID id; + const std::string name; + const LLSpeaker::ESpeakerStatus status; + const LLSpeaker::ESpeakerType type; + const bool moderator; + const bool moderator_muted_text; + }; + + void setSpeakers(const std::vector& speakers); LLPointer setSpeaker(const LLUUID& id, const std::string& name = LLStringUtil::null, LLSpeaker::ESpeakerStatus status = LLSpeaker::STATUS_TEXT_ONLY, - LLSpeaker::ESpeakerType = LLSpeaker::SPEAKER_AGENT); + LLSpeaker::ESpeakerType = LLSpeaker::SPEAKER_AGENT, + bool moderator = false, + bool moderator_muted_text = false); BOOL isVoiceActive(); From 2dc46964b4894474591e0b2bc7c075fcf1476af6 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 8 Feb 2018 01:26:09 -0600 Subject: [PATCH 15/23] Simple update check mechanism, and tons of notification tweaking to make the notifications look less crap. --- indra/llmessage/aihttptimeoutpolicy.cpp | 1 + indra/llui/llalertdialog.cpp | 16 ++ indra/llui/llcheckboxctrl.h | 6 +- indra/llui/lldraghandle.cpp | 7 + indra/llui/lldraghandle.h | 2 + indra/llui/llnotifications.cpp | 2 +- indra/newview/CMakeLists.txt | 2 + .../newview/app_settings/settings_ascent.xml | 55 ++++++ indra/newview/llnotify.cpp | 42 +++++ indra/newview/llstartup.cpp | 2 + indra/newview/shupdatechecker.cpp | 171 ++++++++++++++++++ .../skins/default/xui/en-us/notifications.xml | 86 +++++++-- 12 files changed, 375 insertions(+), 17 deletions(-) create mode 100644 indra/newview/shupdatechecker.cpp diff --git a/indra/llmessage/aihttptimeoutpolicy.cpp b/indra/llmessage/aihttptimeoutpolicy.cpp index ca3b24a76..bbe1d9e6a 100644 --- a/indra/llmessage/aihttptimeoutpolicy.cpp +++ b/indra/llmessage/aihttptimeoutpolicy.cpp @@ -962,3 +962,4 @@ P(wholeModelFeeResponder); P(wholeModelUploadResponder); P2(XMLRPCResponder, connect_40s); P2(crashLoggerResponder, transfer_300s); +P(getUpdateInfoResponder); \ No newline at end of file diff --git a/indra/llui/llalertdialog.cpp b/indra/llui/llalertdialog.cpp index 3b4931341..b7cef0a2e 100644 --- a/indra/llui/llalertdialog.cpp +++ b/indra/llui/llalertdialog.cpp @@ -48,6 +48,7 @@ #include "lluictrlfactory.h" #include "llnotifications.h" #include "llfunctorregistry.h" +#include "lldraghandle.h" const S32 MAX_ALLOWED_MSG_WIDTH = 400; const F32 DEFAULT_BUTTON_DELAY = 0.5f; @@ -233,6 +234,12 @@ LLAlertDialog::LLAlertDialog( LLNotificationPtr notification, bool modal) msg_box->setColor( LLUI::sColorsGroup->getColor( "AlertTextColor" ) ); } + LLDragHandle* handle = getDragHandle(); + if (handle) + { + getDragHandle()->setTextColor(LLUI::sColorsGroup->getColor(mCaution ? "AlertCautionTextColor" : "AlertTextColor")); + } + LLRect rect; rect.setLeftTopAndSize( msg_x, msg_y, text_rect.getWidth(), text_rect.getHeight() ); msg_box->setRect( rect ); @@ -257,6 +264,10 @@ LLAlertDialog::LLAlertDialog( LLNotificationPtr notification, bool modal) button_data.mText); btn->setClickedCallback(boost::bind(&LLAlertDialog::onButtonPressed, this, _1, button_data.mUrl)); + if (mCaution) + { + btn->setColor(LLUI::sColorsGroup->getColor("ButtonCautionImageColor")); + } addChild(btn); @@ -370,6 +381,11 @@ bool LLAlertDialog::setCheckBox( const std::string& check_title, const std::stri max_msg_width, LINE_HEIGHT); mCheck = new LLCheckboxCtrl(std::string("check"), check_rect, check_title, font, boost::bind(&LLAlertDialog::onClickIgnore, this, _1)); + mCheck->setEnabledColor(LLUI::sColorsGroup->getColor( mCaution ? "AlertCautionTextColor" : "AlertTextColor")); + if (mCaution) + { + mCheck->setButtonColor(LLUI::sColorsGroup->getColor("ButtonCautionImageColor")); + } addChild(mCheck); return true; diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 47eb46670..c0fdf842d 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -100,8 +100,10 @@ public: // LLCheckBoxCtrl interface virtual BOOL toggle() { return mButton->toggleState(); } // returns new state - void setEnabledColor( const LLColor4 &color ) { mTextEnabledColor = color; } - void setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; } + void setEnabledColor(const LLColor4 &color) { mTextEnabledColor = color; setEnabled(getEnabled()); } + void setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; setEnabled(getEnabled()); } + + void setButtonColor(const LLColor4 &color) { if (mButton) mButton->setColor(color); } void setLabel( const LLStringExplicit& label ); std::string getLabel() const; diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 929548137..741f1c694 100644 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -301,6 +301,13 @@ BOOL LLDragHandle::handleMouseUp(S32 x, S32 y, MASK mask) return TRUE; } +void LLDragHandle::setTextColor(const LLColor4& color) +{ + if (mTitleBox) + { + mTitleBox->setColor(color); + } +} BOOL LLDragHandle::handleHover(S32 x, S32 y, MASK mask) { diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h index 9eb3e55a6..a573d458d 100644 --- a/indra/llui/lldraghandle.h +++ b/indra/llui/lldraghandle.h @@ -63,6 +63,8 @@ public: virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); + virtual void setTextColor(const LLColor4& color); + protected: LLTextBox* getTitleBox() const { return mTitleBox; } void setTitleBox(LLTextBox*); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 990416c9a..5c9dfb74a 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -891,7 +891,7 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt assert(!wasFound); if (passesFilter) { - LL_INFOS() << "Inserting " << pNotification->getName() << LL_ENDL; + //LL_INFOS() << "Inserting " << pNotification->getName() << LL_ENDL; // not in our list, add it and say so mItems.insert(pNotification); abortProcessing = mChanged(payload); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1b28fcdca..1374f9835 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -594,6 +594,7 @@ set(viewer_SOURCE_FILES scriptcounter.cpp sgmemstat.cpp shcommandhandler.cpp + shupdatechecker.cpp shfloatermediaticker.cpp wlfPanel_AdvSettings.cpp ) @@ -1136,6 +1137,7 @@ set(viewer_HEADER_FILES sgmemstat.h shcommandhandler.h shfloatermediaticker.h + shupdatechecker.h wlfPanel_AdvSettings.h ) diff --git a/indra/newview/app_settings/settings_ascent.xml b/indra/newview/app_settings/settings_ascent.xml index 94faa90f6..dd373885d 100644 --- a/indra/newview/app_settings/settings_ascent.xml +++ b/indra/newview/app_settings/settings_ascent.xml @@ -873,6 +873,61 @@ Value 1 + SinguLastKnownReleaseBuild + + Comment + Latest known available verson. + Persist + 1 + Type + S32 + Value + 0 + + SinguLastKnownAlphaBuild + + Comment + Latest known available verson. + Persist + 1 + Type + S32 + Value + 0 + + WarnRecommendedUpdate + + Comment + Enables recommended update notification dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnUrgentUpdate + + Comment + Enables critical update notification dialog + Persist + 1 + Type + Boolean + Value + 1 + + WarnUrgentUpdateModal + + Comment + Enables critical update modal dialog + Persist + 1 + Type + Boolean + Value + 1 + UseWebProfiles Comment diff --git a/indra/newview/llnotify.cpp b/indra/newview/llnotify.cpp index 2bba6d4f9..d60d53275 100644 --- a/indra/newview/llnotify.cpp +++ b/indra/newview/llnotify.cpp @@ -54,6 +54,7 @@ #include "llfloaterchat.h" // for add_chat_history() #include "lloverlaybar.h" // for gOverlayBar #include "lluictrlfactory.h" +#include "llcheckboxctrl.h" #include "hippogridmanager.h" @@ -183,6 +184,8 @@ LLNotifyBox::LLNotifyBox(LLNotificationPtr notification) bool layout_script_dialog(notification->getName() == "ScriptDialog" || notification->getName() == "ScriptDialogGroup"); LLRect rect = mIsTip ? getNotifyTipRect(message) : getNotifyRect(is_textbox ? 10 : mNumOptions, layout_script_dialog, mIsCaution); + if ((form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE || form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)) + rect.mBottom -= BTN_HEIGHT; setRect(rect); setFollows(mIsTip ? (FOLLOWS_BOTTOM|FOLLOWS_RIGHT) : (FOLLOWS_TOP|FOLLOWS_RIGHT)); setBackgroundVisible(FALSE); @@ -359,6 +362,45 @@ LLNotifyBox::LLNotifyBox(LLNotificationPtr notification) addButton("OK", "OK", false, true, layout_script_dialog); mAddedDefaultBtn = true; } + + std::string check_title; + if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE) + { + check_title = LLNotificationTemplates::instance().getGlobalString("skipnexttime"); + } + else if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE) + { + check_title = LLNotificationTemplates::instance().getGlobalString("alwayschoose"); + } + if (!check_title.empty()) + { + const LLFontGL* font = LLResMgr::getInstance()->getRes(LLFONT_SANSSERIF); + S32 line_height = llfloor(font->getLineHeight() + 0.99f); + + // Extend dialog for "check next time" + S32 max_msg_width = getRect().getWidth() - HPAD * 9; + S32 check_width = S32(font->getWidth(check_title) + 0.99f) + 16; + max_msg_width = llmax(max_msg_width, check_width); + + S32 msg_x = (getRect().getWidth() - max_msg_width) / 2; + + LLRect check_rect; + check_rect.setOriginAndSize(msg_x, BOTTOM_PAD + BTN_HEIGHT + VPAD*2 + (BTN_HEIGHT + VPAD) * (mNumButtons / 3), + max_msg_width, line_height); + + LLCheckboxCtrl* check = new LLCheckboxCtrl(std::string("check"), check_rect, check_title, font, + // Lambda abuse. + [this](LLUICtrl* ctrl, const LLSD& param) + { + this->mNotification->setIgnored(ctrl->getValue()); + }); + check->setEnabledColor(LLUI::sColorsGroup->getColor(mIsCaution ? "AlertCautionTextColor" : "AlertTextColor")); + if (mIsCaution) + { + check->setButtonColor(LLUI::sColorsGroup->getColor("ButtonCautionImageColor")); + } + addChild(check); + } if (++sNotifyBoxCount <= 0) LL_WARNS() << "A notification was mishandled. sNotifyBoxCount = " << sNotifyBoxCount << LL_ENDL; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4a6463bfd..ea17267b9 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -225,6 +225,7 @@ #include "llfloaterblacklist.h" #include "scriptcounter.h" #include "shfloatermediaticker.h" +#include "shupdatechecker.h" #include "llpacketring.h" // @@ -849,6 +850,7 @@ bool idle_startup() // Go to the next startup state LLStartUp::setStartupState( STATE_BROWSER_INIT ); + check_for_updates(); return FALSE; } diff --git a/indra/newview/shupdatechecker.cpp b/indra/newview/shupdatechecker.cpp new file mode 100644 index 000000000..997ac6b44 --- /dev/null +++ b/indra/newview/shupdatechecker.cpp @@ -0,0 +1,171 @@ +#include "llviewerprecompiledheaders.h" + +#include "llviewerwindow.h" +#include "llwindow.h" +#include "llpanelgeneral.h" +#include "llappviewer.h" +#include "llbutton.h" +#include "llviewercontrol.h" +#include "llnotificationsutil.h" +#include "llstartup.h" +#include "llviewerwindow.h" // to link into child list +#include "llnotify.h" +#include "lluictrlfactory.h" +#include "llhttpclient.h" +#include "llversioninfo.h" +#include "llbufferstream.h" +#include "llweb.h" + + +#include + +extern AIHTTPTimeoutPolicy getUpdateInfoResponder_timeout; +/////////////////////////////////////////////////////////////////////////////// +// GetUpdateInfoResponder +class GetUpdateInfoResponder : public LLHTTPClient::ResponderWithCompleted +{ + LOG_CLASS(GetUpdateInfoResponder); + +public: + GetUpdateInfoResponder(std::string type) + : mType(type) + {} + void onNotifyButtonPress(const LLSD& notification, const LLSD& response, std::string name, std::string url) + { + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option == 0) // URL + { + std::string escaped_url = LLWeb::escapeURL(url); + if (gViewerWindow) + { + gViewerWindow->getWindow()->spawnWebBrowser(escaped_url, true); + } + } + if (option == 1) // Later + {} + else if (option == 2) // Ignore + { + LLNotificationPtr notifyptr = LLNotificationsUtil::find(notification["id"]); + if (notifyptr) + { + notifyptr->setIgnored(true); + } + } + } + /*virtual*/ void completedRaw(LLChannelDescriptors const& channels, buffer_ptr_t const& buffer) + { + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + const std::string body = strstrm.str(); + + if (mStatus != HTTP_OK) + { + LL_WARNS() << "Failed to get update info (" << mStatus << ")" << LL_ENDL; + return; + } + + Json::Value root; + Json::Reader reader; + if (!reader.parse(body, root)) + { + LL_WARNS() << "Failed to parse update info: " << reader.getFormattedErrorMessages() << LL_ENDL; + return; + } + + std::string viewer_version = llformat("%s (%i)", LLVersionInfo::getShortVersion(), LLVersionInfo::getBuild()); + + const Json::Value data = root[mType]; +#if LL_WINDOWS + std::string recommended_version = data["recommended"]["windows"].asString(); + std::string minimum_version = data["minimum"]["windows"].asString(); +#elif LL_LINUX + std::string recommended_version = data["recommended"]["linux"].asString(); + std::string minimum_version = data["minimum"]["linux"].asString(); +#elif LL_DARWIN + std::string recommended_version = data["recommended"]["apple"].asString(); + std::string minimum_version = data["minimum"]["apple"].asString(); +#endif + + S32 minimum_build, recommended_build; + sscanf(recommended_version.c_str(), "%*i.%*i.%*i (%i)", &recommended_build); + sscanf(minimum_version.c_str(), "%*i.%*i.%*i (%i)", &minimum_build); + + LL_INFOS() << LLVersionInfo::getBuild() << LL_ENDL; + LLSD args; + args["CURRENT_VER"] = viewer_version; + args["RECOMMENDED_VER"] = recommended_version; + args["MINIMUM_VER"] = minimum_version; + args["URL"] = data["url"].asString(); + args["TYPE"] = mType == "release" ? "Viewer" : "Alpha"; + + static LLCachedControl sLastKnownReleaseBuild("SinguLastKnownReleaseBuild", 0); + static LLCachedControl sLastKnownAlphaBuild("SinguLastKnownAlphaBuild", 0); + + LLCachedControl& lastver = mType == "release" ? sLastKnownReleaseBuild : sLastKnownAlphaBuild; + + if (LLVersionInfo::getBuild() < minimum_build || LLVersionInfo::getBuild() < recommended_build) + { + if (lastver.get() < recommended_build) + { + lastver = recommended_build; + LLUI::sIgnoresGroup->setWarning("UrgentUpdateModal", true); + LLUI::sIgnoresGroup->setWarning("UrgentUpdate", true); + LLUI::sIgnoresGroup->setWarning("RecommendedUpdate", true); + } + std::string notificaiton; + if (LLVersionInfo::getBuild() < minimum_build) + { + if (LLUI::sIgnoresGroup->getWarning("UrgentUpdateModal")) + { + notificaiton = "UrgentUpdateModal"; + } + else + { + notificaiton = "UrgentUpdate"; + } + } + else if (LLVersionInfo::getBuild() < recommended_build) + { + notificaiton = "RecommendedUpdate"; + } + if (!notificaiton.empty()) + { + LLNotificationsUtil::add(notificaiton, args, LLSD(), boost::bind(&GetUpdateInfoResponder::onNotifyButtonPress, this, _1, _2, notificaiton, data["url"].asString())); + } + } + } + +protected: + /*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return getUpdateInfoResponder_timeout; } + /*virtual*/ char const* getName(void) const { return "GetUpdateInfoResponder"; } + +private: + std::string mType; +}; + +void check_for_updates() +{ +#if LL_WINDOWS | LL_LINUX | LL_DARWIN + // Hard-code the update url for now. + std::string url = "http://singularity-viewer.github.io/pages/api/get_update_info.json";//gSavedSettings.getString("SHUpdateCheckURL"); + if (!url.empty()) + { + std::string type; + auto& channel = LLVersionInfo::getChannel(); + if (channel == std::string("Singularity")) + { + type = "release"; + } + else if (channel == std::string("Singularity Test") || channel == std::string("Singularity Alpha")) + { + type = "alpha"; + } + else + { + return; + } + LLHTTPClient::get(url, new GetUpdateInfoResponder(type)); + } +#endif +} diff --git a/indra/newview/skins/default/xui/en-us/notifications.xml b/indra/newview/skins/default/xui/en-us/notifications.xml index d80695863..28d0a6b0b 100644 --- a/indra/newview/skins/default/xui/en-us/notifications.xml +++ b/indra/newview/skins/default/xui/en-us/notifications.xml @@ -57,20 +57,6 @@ - - +