diff options
Diffstat (limited to 'indra/newview/pipeline.cpp')
| -rw-r--r-- | indra/newview/pipeline.cpp | 110 | 
1 files changed, 69 insertions, 41 deletions
| diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 209b06fd85..6413c08e44 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -346,7 +346,7 @@ void validate_framebuffer_object();  bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)  {      U32 orm = GL_RGBA; -    U32 norm = GL_RGBA16F; +    U32 norm = GL_RGBA16;      U32 emissive = GL_RGB16F;      static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false); @@ -858,12 +858,12 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)      GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA; -    if (!mRT->screen.allocate(resX, resY, GL_RGBA16F)) return false; +    if (!mRT->screen.allocate(resX, resY, screenFormat)) return false;      mRT->deferredScreen.shareDepthBuffer(mRT->screen); -    if (shadow_detail > 0 || ssao || RenderDepthOfField) -    { //only need mRT->deferredLight for shadows OR ssao OR dof +    if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField) +    { //only need mRT->deferredLight for hdr OR shadows OR ssao OR dof          if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false;      }      else @@ -909,7 +909,8 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)              mSceneMap.release();          } -        mPostMap.allocate(resX, resY, screenFormat); +        mPostPingMap.allocate(resX, resY, GL_RGBA); +        mPostPongMap.allocate(resX, resY, GL_RGBA);          // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes.          // Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask. @@ -1181,7 +1182,8 @@ void LLPipeline::releaseGLBuffers()      mWaterExclusionMask.release(); -    mPostMap.release(); +    mPostPingMap.release(); +    mPostPongMap.release();      mFXAAMap.release(); @@ -1455,9 +1457,12 @@ void LLPipeline::createLUTBuffers()          U32 pix_format = GL_R16F;  #if LL_DARWIN -        // Need to work around limited precision with 10.6.8 and older drivers -        // -        pix_format = GL_R32F; +        if(!gGLManager.mIsApple) +        { +            // Need to work around limited precision with 10.6.8 and older drivers +            // +            pix_format = GL_R32F; +        }  #endif          LLImageGL::generateTextures(1, &mLightFunc);          gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc); @@ -7197,11 +7202,11 @@ extern LLPointer<LLImageGL> gEXRImage;  void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)  { +    LL_PROFILE_GPU_ZONE("tonemap"); +      dst->bindTarget();      // gamma correct lighting      { -        LL_PROFILE_GPU_ZONE("tonemap"); -          static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false);          LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7250,11 +7255,11 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)  void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)  { +    LL_PROFILE_GPU_ZONE("gamma correct"); +      dst->bindTarget();      // gamma correct lighting      { -        LL_PROFILE_GPU_ZONE("gamma correct"); -          LLGLDepthTest depth(GL_FALSE, GL_FALSE);          static LLCachedControl<bool> buildNoPost(gSavedSettings, "RenderDisablePostProcessing", false); @@ -7305,9 +7310,9 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*  void LLPipeline::generateGlow(LLRenderTarget* src)  { +    LL_PROFILE_GPU_ZONE("glow generate");      if (sRenderGlow)      { -        LL_PROFILE_GPU_ZONE("glow");          mGlow[2].bindTarget();          mGlow[2].clear(); @@ -7416,6 +7421,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)  void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)  {      static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f); +    LL_PROFILE_GPU_ZONE("cas");      if (cas_sharpness == 0.0f || !gCASProgram.isComplete())      {          gPipeline.copyRenderTarget(src, dst); @@ -7460,6 +7466,7 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)  void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)  { +    LL_PROFILE_GPU_ZONE("FXAA");      {          llassert(!gCubeSnapshot);          bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); @@ -7551,7 +7558,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)      // Present everything.      if (multisample)      { -        LL_PROFILE_GPU_ZONE("aa"); +        LL_PROFILE_GPU_ZONE("SMAA Edge");          static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);          U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); @@ -7582,14 +7589,14 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              {                  if (!use_sample)                  { -                    src->bindTexture(0, channel, LLTexUnit::TFO_POINT); -                    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);                  }                  else                  {                      gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap); -                    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);                  } +                gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);              }              //if (use_stencil) @@ -7663,13 +7670,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)  void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)  { +    LL_PROFILE_GPU_ZONE("SMAA");      llassert(!gCubeSnapshot);      bool multisample = RenderFSAAType == 2 && gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();      // Present everything.      if (multisample)      { -        LL_PROFILE_GPU_ZONE("aa");          static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U);          U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); @@ -7747,8 +7754,9 @@ void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)  void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)  { -    // Go ahead and do our glow combine here in our destination.  We blit this later into the front buffer. +    LL_PROFILE_GPU_ZONE("glow combine"); +    // Go ahead and do our glow combine here in our destination.  We blit this later into the front buffer.      dst->bindTarget();      { @@ -7767,6 +7775,7 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)  void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)  { +    LL_PROFILE_GPU_ZONE("dof");      {          bool dof_enabled =              (RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) && @@ -7777,7 +7786,6 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)          if (dof_enabled)          { -            LL_PROFILE_GPU_ZONE("dof");              LLGLDisable blend(GL_BLEND);              // depth of field focal plane calculations @@ -7982,7 +7990,7 @@ void LLPipeline::renderFinalize()      static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);      bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr(); - +    LLRenderTarget* postHDRBuffer = &mRT->screen;      if (hdr)      {          copyScreenSpaceReflections(&mRT->screen, &mSceneMap); @@ -7991,22 +7999,31 @@ void LLPipeline::renderFinalize()          generateExposure(&mLuminanceMap, &mExposureMap); -        tonemap(&mRT->screen, &mPostMap); +        tonemap(&mRT->screen, &mRT->deferredLight); -        applyCAS(&mPostMap, &mRT->screen); +        static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f); +        if (cas_sharpness != 0.0f && gCASProgram.isComplete()) +        { +            applyCAS(&mRT->deferredLight, &mRT->screen); +            postHDRBuffer = &mRT->screen; +        } +        else +        { +            postHDRBuffer = &mRT->deferredLight; +        }      } -    generateSMAABuffers(&mRT->screen); - -    gammaCorrect(&mRT->screen, &mPostMap); +    gammaCorrect(postHDRBuffer, &mPostPingMap);      LLVertexBuffer::unbind(); -    applySMAA(&mPostMap, &mRT->screen); +    generateGlow(&mPostPingMap); -    generateGlow(&mRT->screen); +    LLRenderTarget* sourceBuffer = &mPostPingMap; +    LLRenderTarget* targetBuffer = &mPostPongMap; -    combineGlow(&mRT->screen, &mPostMap); +    combineGlow(sourceBuffer, targetBuffer); +    std::swap(sourceBuffer, targetBuffer);      gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;      gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; @@ -8014,13 +8031,24 @@ void LLPipeline::renderFinalize()      gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();      glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); -    renderDoF(&mPostMap, &mRT->screen); +    if((RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) && +        RenderDepthOfField && +        !gCubeSnapshot) +    { +        renderDoF(sourceBuffer, targetBuffer); +        std::swap(sourceBuffer, targetBuffer); +    } -    LLRenderTarget* finalBuffer = &mRT->screen; -    if (RenderFSAAType == 1) +     if (RenderFSAAType == 1) +    { +        applyFXAA(sourceBuffer, targetBuffer); +        std::swap(sourceBuffer, targetBuffer); +    } +    else if (RenderFSAAType == 2)      { -        applyFXAA(&mRT->screen, &mPostMap); -        finalBuffer = &mPostMap; +        generateSMAABuffers(sourceBuffer); +        applySMAA(sourceBuffer, targetBuffer); +        std::swap(sourceBuffer, targetBuffer);      }      if (RenderBufferVisualization > -1) @@ -8031,16 +8059,16 @@ void LLPipeline::renderFinalize()          case 1:          case 2:          case 3: -            visualizeBuffers(&mRT->deferredScreen, finalBuffer, RenderBufferVisualization); +            visualizeBuffers(&mRT->deferredScreen, sourceBuffer, RenderBufferVisualization);              break;          case 4: -            visualizeBuffers(&mLuminanceMap, finalBuffer, 0); +            visualizeBuffers(&mLuminanceMap, sourceBuffer, 0);              break;          case 5:          {              if (RenderFSAAType > 0)              { -                visualizeBuffers(&mFXAAMap, finalBuffer, 0); +                visualizeBuffers(&mFXAAMap, sourceBuffer, 0);              }              break;          } @@ -8048,7 +8076,7 @@ void LLPipeline::renderFinalize()          {              if (RenderFSAAType == 2)              { -                visualizeBuffers(&mSMAABlendBuffer, finalBuffer, 0); +                visualizeBuffers(&mSMAABlendBuffer, sourceBuffer, 0);              }              break;          } @@ -8062,10 +8090,10 @@ void LLPipeline::renderFinalize()      gDeferredPostNoDoFNoiseProgram.bind(); // Add noise as part of final render to screen pass to avoid damaging other post effects      // Whatever is last in the above post processing chain should _always_ be rendered directly here.  If not, expect problems. -    gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, finalBuffer); +    gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, sourceBuffer);      gDeferredPostNoDoFNoiseProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); -    gDeferredPostNoDoFNoiseProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)finalBuffer->getWidth(), (GLfloat)finalBuffer->getHeight()); +    gDeferredPostNoDoFNoiseProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)sourceBuffer->getWidth(), (GLfloat)sourceBuffer->getHeight());      {          LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); | 
