diff options
| author | cosmic-linden <111533034+cosmic-linden@users.noreply.github.com> | 2023-04-28 13:21:33 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-28 13:21:33 -0700 | 
| commit | 04604a921d35cf877073828f98a05ae83d03c96e (patch) | |
| tree | 4db7ff4d02556bdbdc9df18629a14a8fcc67bd4d /indra/newview | |
| parent | 01565d122a371820f4287dec3b1a52a5f4d342ea (diff) | |
| parent | 0fedb22d77bc67cd5c619537d985b905fe57e385 (diff) | |
Merge pull request #196 from secondlife/SL-19644
SL-19644: Move GLTF transform reset out of pushBatch
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl | 50 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskV.glsl | 75 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl | 3 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl | 5 | ||||
| -rw-r--r-- | indra/newview/lldrawpool.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/lldrawpool.h | 12 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolbump.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolbump.h | 2 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 51 | 
10 files changed, 177 insertions, 59 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl new file mode 100644 index 0000000000..5ef9bb6805 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl @@ -0,0 +1,50 @@ +/**  + * @file pbrShadowAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2023&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2023, 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$ + */ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +in vec4 post_pos; +in float target_pos_x; +in vec4 vertex_color; +in vec2 vary_texcoord0; +uniform float minimum_alpha; + +void main()  +{ +    float alpha = diffuseLookup(vary_texcoord0.xy).a; + +    if (alpha < minimum_alpha) +    { +        discard; +    } + +    frag_color = vec4(1,1,1,1); +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskV.glsl new file mode 100644 index 0000000000..4fb5fbcf06 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskV.glsl @@ -0,0 +1,75 @@ +/**  + * @file pbrShadowAlphaMaskV.glsl + * + * $LicenseInfo:firstyear=2023&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2023, 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 texture_matrix0; +#if defined(HAS_SKIN) +uniform mat4 modelview_matrix; +uniform mat4 projection_matrix; +mat4 getObjectSkinnedTransform(); +#else +uniform mat4 modelview_projection_matrix; +#endif + +uniform vec4[2] texture_base_color_transform; +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); + +uniform float shadow_target_width; + +in vec3 position; +in vec4 diffuse_color; +in vec2 texcoord0; + +out vec4 post_pos; +out float target_pos_x; +out vec4 vertex_color; +out vec2 vary_texcoord0; + +void passTextureIndex(); + +void main() +{ +    //transform vertex +#if defined(HAS_SKIN) +    vec4 pre_pos = vec4(position.xyz, 1.0); +    mat4 mat = getObjectSkinnedTransform(); +    mat = modelview_matrix * mat; +    vec4 pos = mat * pre_pos; +    pos = projection_matrix * pos; +#else +    vec4 pre_pos = vec4(position.xyz, 1.0); +    vec4 pos = modelview_projection_matrix * pre_pos; +#endif + +    target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +    post_pos = pos; + +    gl_Position = pos; +     +    passTextureIndex(); + +    vary_texcoord0 = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    vertex_color = diffuse_color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index eb2ba68415..8c9b6f8190 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -48,8 +48,6 @@ void main()          discard;      } -#if !defined(GLTF) -  #if !defined(IS_FULLBRIGHT)      alpha *= vertex_color.a;  #endif @@ -66,7 +64,6 @@ void main()              discard;          }      } -#endif  	frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl index 72a07fa3d0..26db1a5d4d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskV.glsl @@ -32,9 +32,6 @@ mat4 getObjectSkinnedTransform();  uniform mat4 modelview_projection_matrix;  #endif -uniform vec4[2] texture_base_color_transform; -vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform); -  uniform float shadow_target_width;  in vec3 position; @@ -70,6 +67,6 @@ void main()  	passTextureIndex(); -	vary_texcoord0 = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  	vertex_color = diffuse_color;  } diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index edabb55cc3..34d8f8b9ce 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -444,7 +444,7 @@ void LLRenderPass::renderRiggedGroup(LLSpatialGroup* group, U32 type, bool textu      }  } -void LLRenderPass::pushBatches(U32 type, bool texture, bool batch_textures, bool reset_gltf) +void LLRenderPass::pushBatches(U32 type, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      std::unique_ptr<LLPerfStats::RecordAttachmentTime> ratPtr{}; @@ -465,11 +465,11 @@ void LLRenderPass::pushBatches(U32 type, bool texture, bool batch_textures, bool                  }              }  #endif -            pushBatch(*pparams, texture, batch_textures, reset_gltf); +		pushBatch(*pparams, texture, batch_textures);  	}  } -void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures, bool reset_gltf) +void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      LLVOAvatar* lastAvatar = nullptr; @@ -500,12 +500,11 @@ void LLRenderPass::pushRiggedBatches(U32 type, bool texture, bool batch_textures              lastMeshId = pparams->mSkinInfo->mHash;          } -        pushBatch(*pparams, texture, batch_textures, reset_gltf); -        reset_gltf = false; +        pushBatch(*pparams, texture, batch_textures);      }  } -void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures, bool reset_gltf) +void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      std::unique_ptr<LLPerfStats::RecordAttachmentTime> ratPtr{}; @@ -526,12 +525,11 @@ void LLRenderPass::pushMaskBatches(U32 type, bool texture, bool batch_textures,              }  #endif  		LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(pparams->mAlphaMaskCutoff); -		pushBatch(*pparams, texture, batch_textures, reset_gltf); -        reset_gltf = false; +		pushBatch(*pparams, texture, batch_textures);  	}  } -void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_textures, bool reset_gltf) +void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      LLVOAvatar* lastAvatar = nullptr; @@ -573,8 +571,7 @@ void LLRenderPass::pushRiggedMaskBatches(U32 type, bool texture, bool batch_text              lastMeshId = pparams->mSkinInfo->mHash;          } -        pushBatch(*pparams, texture, batch_textures, reset_gltf); -        reset_gltf = false; +        pushBatch(*pparams, texture, batch_textures);      }  } @@ -593,14 +590,7 @@ void LLRenderPass::applyModelMatrix(const LLDrawInfo& params)  	}  } -void LLRenderPass::resetGLTFTextureTransform() -{ -    F32 ignore_gltf_transform[8]; -    LLGLTFMaterial::sDefault.mTextureTransform[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR].getPacked(ignore_gltf_transform); -    LLGLSLShader::sCurBoundShaderPtr->uniform4fv(LLShaderMgr::TEXTURE_BASE_COLOR_TRANSFORM, 2, (F32*)ignore_gltf_transform); -} - -void LLRenderPass::pushBatch(LLDrawInfo& params, bool texture, bool batch_textures, bool reset_gltf) +void LLRenderPass::pushBatch(LLDrawInfo& params, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      if (!params.mCount) @@ -609,7 +599,6 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, bool texture, bool batch_textur      }  	applyModelMatrix(params); -    if (reset_gltf) { resetGLTFTextureTransform(); }  	bool tex_setup = false; diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 8704f2e340..09c95a1705 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -349,17 +349,15 @@ public:  	void resetDrawOrders() { }  	static void applyModelMatrix(const LLDrawInfo& params); -    static void resetGLTFTextureTransform(); -	virtual void pushBatches(U32 type, bool texture = true, bool batch_textures = false, bool reset_gltf = false); -    virtual void pushRiggedBatches(U32 type, bool texture = true, bool batch_textures = false, bool reset_gltf = false); +	virtual void pushBatches(U32 type, bool texture = true, bool batch_textures = false); +    virtual void pushRiggedBatches(U32 type, bool texture = true, bool batch_textures = false);      void pushGLTFBatches(U32 type);      void pushGLTFBatch(LLDrawInfo& params);      void pushRiggedGLTFBatches(U32 type);      void pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId); -	virtual void pushMaskBatches(U32 type, bool texture = true, bool batch_textures = false, bool reset_gltf = false); -    virtual void pushRiggedMaskBatches(U32 type, bool texture = true, bool batch_textures = false, bool reset_gltf = false); -    // reset_gltf: batch is interleaved with GLTF batches that share the same shader -	virtual void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false, bool reset_gltf = false); +	virtual void pushMaskBatches(U32 type, bool texture = true, bool batch_textures = false); +    virtual void pushRiggedMaskBatches(U32 type, bool texture = true, bool batch_textures = false); +	virtual void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false);      static bool uploadMatrixPalette(LLDrawInfo& params);      static bool uploadMatrixPalette(LLVOAvatar* avatar, LLMeshSkinInfo* skinInfo);  	virtual void renderGroup(LLSpatialGroup* group, U32 type, bool texture = true); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 75b47b2c22..a548740ec4 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -1254,15 +1254,13 @@ void LLDrawPoolBump::pushBumpBatches(U32 type)  	}  } -void LLDrawPoolBump::pushBatch(LLDrawInfo& params, bool texture, bool batch_textures, bool reset_gltf) +void LLDrawPoolBump::pushBatch(LLDrawInfo& params, bool texture, bool batch_textures)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;  	applyModelMatrix(params);  	bool tex_setup = false; -	if (reset_gltf) { LLRenderPass::resetGLTFTextureTransform(); } -  	if (batch_textures && params.mTextureList.size() > 1)  	{  		for (U32 i = 0; i < params.mTextureList.size(); ++i) diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index 41c4879ded..840af0c99d 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -53,7 +53,7 @@ public:  	LLDrawPoolBump();  	/*virtual*/ void prerender() override; -	void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false, bool reset_gltf = false) override; +	void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false) override;  	void pushBumpBatches(U32 type);  	void renderGroup(LLSpatialGroup* group, U32 type, bool texture) override; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 8925cc2f9b..4ceef07e72 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2344,11 +2344,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gDeferredShadowGLTFAlphaMaskProgram.mName = "Deferred GLTF Shadow Alpha Mask Shader";          gDeferredShadowGLTFAlphaMaskProgram.mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;          gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.clear(); -        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER)); -        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER)); +        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/pbrShadowAlphaMaskV.glsl", GL_VERTEX_SHADER)); +        gDeferredShadowGLTFAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/pbrShadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));          gDeferredShadowGLTFAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];          gDeferredShadowGLTFAlphaMaskProgram.clearPermutations(); -        gDeferredShadowGLTFAlphaMaskProgram.addPermutation("GLTF", "1");          success = make_rigged_variant(gDeferredShadowGLTFAlphaMaskProgram, gDeferredSkinnedShadowGLTFAlphaMaskProgram);          success = success && gDeferredShadowGLTFAlphaMaskProgram.createShader(NULL, NULL);          llassert(success); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c482256309..2912d0da82 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -197,6 +197,7 @@ LLTrace::EventStatHandle<S64> LLPipeline::sStatBatchSize("renderbatchsize");  const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;  const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f; +const F32 ALPHA_BLEND_CUTOFF = 0.598f;  const F32 DEFERRED_LIGHT_FALLOFF = 0.5f;  const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1; @@ -6764,6 +6765,8 @@ void LLPipeline::renderAlphaObjects(bool rigged)      assertInitialized();      gGL.loadMatrix(gGLModelView);      gGLLastMatrix = NULL; +    S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; +    U32 target_width = LLRenderTarget::sCurResX;      U32 type = LLRenderPass::PASS_ALPHA;      LLVOAvatar* lastAvatar = nullptr;      U64 lastMeshId = 0; @@ -6786,10 +6789,18 @@ void LLPipeline::renderAlphaObjects(bool rigged)          {              if (pparams->mGLTFMaterial)              { +                gDeferredShadowGLTFAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);                  mSimplePool->pushRiggedGLTFBatch(*pparams, lastAvatar, lastMeshId);              }              else              { +                gDeferredShadowAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);                  if (lastAvatar != pparams->mAvatar || lastMeshId != pparams->mSkinInfo->mHash)                  {                      mSimplePool->uploadMatrixPalette(*pparams); @@ -6797,18 +6808,26 @@ void LLPipeline::renderAlphaObjects(bool rigged)                      lastMeshId = pparams->mSkinInfo->mHash;                  } -                mSimplePool->pushBatch(*pparams, true, true, true); +                mSimplePool->pushBatch(*pparams, true, true);              }          }          else          {              if (pparams->mGLTFMaterial)              { +                gDeferredShadowGLTFAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF);                  mSimplePool->pushGLTFBatch(*pparams);              }              else              { -                mSimplePool->pushBatch(*pparams, true, true, true); +                gDeferredShadowAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); +                mSimplePool->pushBatch(*pparams, true, true);              }          }      } @@ -6825,11 +6844,11 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture,  	gGLLastMatrix = NULL;      if (rigged)      { -        mAlphaMaskPool->pushRiggedMaskBatches(type+1, texture, batch_texture, true); +        mAlphaMaskPool->pushRiggedMaskBatches(type+1, texture, batch_texture);      }      else      { -        mAlphaMaskPool->pushMaskBatches(type, texture, batch_texture, true); +        mAlphaMaskPool->pushMaskBatches(type, texture, batch_texture);      }  	gGL.loadMatrix(gGLModelView);  	gGLLastMatrix = NULL;		 @@ -6843,11 +6862,11 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc  	gGLLastMatrix = NULL;      if (rigged)      { -        mFullbrightAlphaMaskPool->pushRiggedMaskBatches(type+1, texture, batch_texture, true); +        mFullbrightAlphaMaskPool->pushRiggedMaskBatches(type+1, texture, batch_texture);      }      else      { -        mFullbrightAlphaMaskPool->pushMaskBatches(type, texture, batch_texture, true); +        mFullbrightAlphaMaskPool->pushMaskBatches(type, texture, batch_texture);      }  	gGL.loadMatrix(gGLModelView);  	gGLLastMatrix = NULL;		 @@ -8834,8 +8853,6 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera      stop_glerror(); -    LLEnvironment& environment = LLEnvironment::instance(); -      struct CompareVertexBuffer      {          bool operator()(const LLDrawInfo* const& lhs, const LLDrawInfo* const& rhs) @@ -8850,7 +8867,6 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera      {          bool rigged = j == 1;          gDeferredShadowProgram.bind(rigged); -        LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);          gGL.diffuseColor4f(1, 1, 1, 1); @@ -8895,27 +8911,25 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera      {          LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha");          LL_PROFILE_GPU_ZONE("shadow alpha"); - +        const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0;          U32 target_width = LLRenderTarget::sCurResX;          for (int i = 0; i < 2; ++i)          {              bool rigged = i == 1; -            gDeferredShadowAlphaMaskProgram.bind(rigged); -            LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); -            LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0); -              {                  LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked");                  LL_PROFILE_GPU_ZONE("shadow alpha masked"); +                gDeferredShadowAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width);                  renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged);              }              {                  LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend");                  LL_PROFILE_GPU_ZONE("shadow alpha blend"); -                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(0.598f);                  renderAlphaObjects(rigged);              } @@ -8923,8 +8937,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera                  LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked");                  LL_PROFILE_GPU_ZONE("shadow alpha masked");                  gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);                  LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); -                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);                  renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged);              } @@ -8932,9 +8946,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera                  LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass");                  LL_PROFILE_GPU_ZONE("shadow alpha grass");                  gDeferredTreeShadowProgram.bind(rigged); +                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); +                  if (i == 0)                  { -                    LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(0.598f);                      renderObjects(LLRenderPass::PASS_GRASS, true);                  } @@ -8953,8 +8968,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera          {              bool rigged = i == 1;              gDeferredShadowGLTFAlphaMaskProgram.bind(rigged); +            LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up);              LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); -            LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);              gGL.loadMatrix(gGLModelView);              gGLLastMatrix = NULL;  | 
