diff options
Diffstat (limited to 'indra/newview/pipeline.cpp')
| -rw-r--r-- | indra/newview/pipeline.cpp | 78 | 
1 files changed, 50 insertions, 28 deletions
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4df8936d4d..0120e1487e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -856,12 +856,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 @@ -907,7 +907,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. @@ -1179,7 +1180,8 @@ void LLPipeline::releaseGLBuffers()      mWaterExclusionMask.release(); -    mPostMap.release(); +    mPostPingMap.release(); +    mPostPongMap.release();      mFXAAMap.release(); @@ -7585,14 +7587,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) @@ -7986,7 +7988,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); @@ -7995,22 +7997,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; @@ -8018,13 +8029,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) @@ -8035,16 +8057,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;          } @@ -8052,7 +8074,7 @@ void LLPipeline::renderFinalize()          {              if (RenderFSAAType == 2)              { -                visualizeBuffers(&mSMAABlendBuffer, finalBuffer, 0); +                visualizeBuffers(&mSMAABlendBuffer, sourceBuffer, 0);              }              break;          } @@ -8066,10 +8088,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);  | 
