diff options
| -rw-r--r-- | indra/newview/pipeline.cpp | 60 | 
1 files changed, 60 insertions, 0 deletions
| diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 362930a71e..e441e189ad 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -431,6 +431,7 @@ void LLPipeline::init()      stop_glerror();      //create render pass pools +    getPool(LLDrawPool::POOL_WATEREXCLUSION);      getPool(LLDrawPool::POOL_ALPHA_PRE_WATER);      getPool(LLDrawPool::POOL_ALPHA_POST_WATER);      getPool(LLDrawPool::POOL_SIMPLE); @@ -673,6 +674,8 @@ void LLPipeline::cleanup()      // don't delete wl sky pool it was handled above in the for loop      //delete mWLSkyPool;      mWLSkyPool = NULL; +    delete mWaterExclusionPool; +    mWaterExclusionPool = nullptr;      releaseGLBuffers(); @@ -907,6 +910,15 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)          mPostMap.allocate(resX, resY, screenFormat); +        // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes. +        // Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask. +        // Why do we do this? Because it saves us some janky logic in the exclusion shader when we generate the mask. +        // Regardless, this should always only be an R8 texture unless we choose to start having multiple kinds of exclusion that 8 bits can't handle. +        // - Geenz 2025-02-06 +        bool success = mWaterExclusionMask.allocate(resX, resY, GL_R8, true); + +        assert(success); +          // used to scale down textures          // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown          mDownResMap.allocate(1024, 1024, GL_RGBA); @@ -1166,6 +1178,8 @@ void LLPipeline::releaseGLBuffers()      mSceneMap.release(); +    mWaterExclusionMask.release(); +      mPostMap.release();      mFXAAMap.release(); @@ -1676,6 +1690,10 @@ LLDrawPool *LLPipeline::findPool(const U32 type, LLViewerTexture *tex0)          poolp = mPBRAlphaMaskPool;          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        poolp = mWaterExclusionPool; +        break; +      default:          llassert(0);          LL_ERRS() << "Invalid Pool Type in  LLPipeline::findPool() type=" << type << LL_ENDL; @@ -4072,6 +4090,8 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)  #endif  } +// Render all of our geometry that's required after our deferred pass. +// This is gonna be stuff like alpha, water, etc.  void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; @@ -4090,6 +4110,10 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)      bool done_atmospherics = LLPipeline::sRenderingHUDs; //skip atmospherics on huds      bool done_water_haze = done_atmospherics; +    bool done_water_exclusion = false; + +    // do water exclusion just before water pass. +    U32 water_exclusion_pass = LLDrawPool::POOL_WATEREXCLUSION;      // do atmospheric haze just before post water alpha      U32 atmospherics_pass = LLDrawPool::POOL_ALPHA_POST_WATER; @@ -4128,6 +4152,12 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)          cur_type = poolp->getType(); +        if (cur_type >= water_exclusion_pass && !done_water_exclusion) +        { // do water exclusion against depth buffer before rendering alpha +            doWaterExclusionMask(); +            done_water_exclusion = true; +        } +          if (cur_type >= atmospherics_pass && !done_atmospherics)          { // do atmospherics against depth buffer before rendering alpha              doAtmospherics(); @@ -5243,6 +5273,17 @@ void LLPipeline::addToQuickLookup( LLDrawPool* new_poolp )          }          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        if (mWaterExclusionPool) +        { +            llassert(0); +            LL_WARNS() << "LLPipeline::addPool(): Ignoring duplicate Water Exclusion Pool" << LL_ENDL; +        } +        else +        { +            mWaterExclusionPool = new_poolp; +        } +        break;      default:          llassert(0); @@ -5365,6 +5406,11 @@ void LLPipeline::removeFromQuickLookup( LLDrawPool* poolp )          mPBRAlphaMaskPool = NULL;          break; +    case LLDrawPool::POOL_WATEREXCLUSION: +        llassert(poolp == mWaterExclusionPool); +        mWaterExclusionPool = nullptr; +        break; +      default:          llassert(0);          LL_WARNS() << "Invalid Pool Type in  LLPipeline::removeFromQuickLookup() type=" << poolp->getType() << LL_ENDL; @@ -8866,6 +8912,7 @@ void LLPipeline::renderDeferredLighting()                            LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK,                            LLPipeline::RENDER_TYPE_TERRAIN,                            LLPipeline::RENDER_TYPE_WATER, +                          LLPipeline::RENDER_TYPE_WATEREXCLUSION,                            END_RENDER_TYPES);          renderGeomPostDeferred(*LLViewerCamera::getInstance()); @@ -9004,6 +9051,8 @@ void LLPipeline::doWaterHaze()          static LLStaticHashedString above_water_str("above_water");          haze_shader.uniform1i(above_water_str, sUnderWaterRender ? -1 : 1); +        haze_shader.bindTexture(LLShaderMgr::WATER_EXCLUSIONTEX, &mWaterExclusionMask); +          if (LLPipeline::sUnderWaterRender)          {              LLGLDepthTest depth(GL_FALSE); @@ -9034,6 +9083,17 @@ void LLPipeline::doWaterHaze()      }  } +void LLPipeline::doWaterExclusionMask() +{ +    mWaterExclusionMask.bindTarget(); +    glClearColor(1, 1, 1, 1); +    mWaterExclusionMask.clear(); +    mWaterExclusionPool->render(); + +    mWaterExclusionMask.flush(); +    glClearColor(0, 0, 0, 0); +} +  void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)  {      //construct frustum | 
