diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7eaf9f529..971af78f7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -775,6 +775,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) mSampleBuffer.release(); mScreen.release(); + mFinalScreen.release(); mDeferredDownsampledDepth.release(); @@ -806,6 +807,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) } if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; + if (!mFinalScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; if (samples > 0) { if (!mFXAABuffer.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_TEXTURE, FALSE)) return false; @@ -887,6 +889,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) } mFXAABuffer.release(); mScreen.release(); + mFinalScreen.release(); mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first mDeferredDepth.release(); mDeferredDownsampledDepth.release(); @@ -909,6 +912,8 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) if (LLPipeline::sRenderDeferred) { //share depth buffer between deferred targets mDeferredScreen.shareDepthBuffer(mScreen); + mDeferredScreen.shareDepthBuffer(mFinalScreen); + //mDeferredScreen.shareDepthBuffer(mDeferredLight); /*for (U32 i = 0; i < 3; i++) { //share stencil buffer with screen space lightmap to stencil out sky if (mDeferredLight[i].getTexture(0)) @@ -1008,6 +1013,7 @@ void LLPipeline::releaseLUTBuffers() void LLPipeline::releaseScreenBuffers() { mScreen.release(); + mFinalScreen.release(); mFXAABuffer.release(); mPhysicsDisplay.release(); mDeferredScreen.release(); @@ -6994,14 +7000,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA); - mScreen.bindTexture(0, 0); + mFinalScreen.bindTexture(0, 0); gGL.color4f(1,1,1,1); gPipeline.enableLightsFullbright(LLColor4(1,1,1,1)); drawFullScreenRect(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); - gGL.getTexUnit(0)->unbind(mScreen.getUsage()); + gGL.getTexUnit(0)->unbind(mFinalScreen.getUsage()); mGlow[1].flush(); } @@ -7188,13 +7194,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b mDeferredLight.bindTarget(); shader = &gDeferredCoFProgram; - bindDeferredShader(*shader); - - S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); - if (channel > -1) - { - mScreen.bindTexture(0, channel); - } + bindDeferredShader(*shader, &mFinalScreen); shader->uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance/1000.f); shader->uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant); @@ -7213,17 +7213,12 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b U32 dof_height = (U32) (mScreen.getHeight()*CameraDoFResScale); { //perform DoF sampling at half-res (preserve alpha channel) - mScreen.bindTarget(); + mFinalScreen.bindTarget(); glViewport(0,0, dof_width, dof_height); gGL.setColorMask(true, false); shader = &gDeferredPostProgram; - bindDeferredShader(*shader); - S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); - if (channel > -1) - { - mDeferredLight.bindTexture(0, channel); - } + bindDeferredShader(*shader, &mDeferredLight); shader->uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); shader->uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); @@ -7231,14 +7226,14 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b drawFullScreenRect(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); unbindDeferredShader(*shader); - mScreen.flush(); + mFinalScreen.flush(); gGL.setColorMask(true, true); } { //combine result based on alpha if (multisample) { - mDeferredLight.bindTarget(); + mScreen.bindTarget(); glViewport(0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight()); } else @@ -7251,12 +7246,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b } shader = &gDeferredDoFCombineProgram; - bindDeferredShader(*shader); + bindDeferredShader(*shader, &mFinalScreen); S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); if (channel > -1) { - mScreen.bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } @@ -7283,7 +7277,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b if (multisample) { - mDeferredLight.flush(); + mScreen.flush(); } } } @@ -7295,12 +7289,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b } LLGLSLShader* shader = &gDeferredPostNoDoFProgram; - bindDeferredShader(*shader); + bindDeferredShader(*shader, &mFinalScreen); S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); if (channel > -1) { - mScreen.bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } @@ -7331,26 +7324,29 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b //bake out texture2D with RGBL for FXAA shader mFXAABuffer.bindTarget(); - S32 width = mScreen.getWidth(); - S32 height = mScreen.getHeight(); + LLRenderTarget& render_target = dof_enabled ? mScreen : mDeferredLight; + S32 width = render_target.getWidth(); + S32 height = render_target.getHeight(); glViewport(0, 0, width, height); LLGLSLShader* shader = &gGlowCombineFXAAProgram; - shader->bind(); - shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, width, height); + bindDeferredShader(*shader, &render_target); - S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); + S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, render_target.getUsage()); if (channel > -1) { - mDeferredLight.bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } drawFullScreenRect(LLVertexBuffer::MAP_VERTEX); - shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredLight.getUsage()); - shader->unbind(); + if (channel > -1) + { + gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + } + + unbindDeferredShader(*shader); mFXAABuffer.flush(); @@ -7479,7 +7475,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, b static LLFastTimer::DeclareTimer FTM_BIND_DEFERRED("Bind Deferred"); -void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 noise_map) +void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* diffuse_source, LLRenderTarget* light_source) { LLFastTimer t(FTM_BIND_DEFERRED); @@ -7501,17 +7497,15 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n static const LLCachedControl RenderEdgeNormCutoff("RenderEdgeNormCutoff",.25f); static const LLCachedControl RenderSSAOResolutionScale("SHRenderSSAOResolutionScale",.5f); - if (noise_map == 0xFFFFFFFF) - { - noise_map = mNoiseMap; - } + diffuse_source = diffuse_source ? diffuse_source : &mDeferredScreen; + light_source = light_source ? light_source : &mDeferredLight; shader.bind(); S32 channel = 0; - channel = shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mDeferredScreen.getUsage()); + channel = shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, diffuse_source->getUsage()); if (channel > -1) { - mDeferredScreen.bindTexture(0,channel); + diffuse_source->bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -7565,7 +7559,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n channel = shader.enableTexture(LLShaderMgr::DEFERRED_NOISE); if (channel > -1) { - gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, noise_map); + gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -7577,17 +7571,10 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n stop_glerror(); - channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, mDeferredLight.getUsage()); + channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_source->getUsage()); if (channel > -1) { - if (light_index > 0) - { - mScreen.bindTexture(0, channel); - } - else - { - mDeferredLight.bindTexture(0, channel); - } + light_source->bindTexture(0, channel); gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } @@ -7787,7 +7774,7 @@ void LLPipeline::renderDeferredLighting() { mDeferredDownsampledDepth.bindTarget(); mDeferredDownsampledDepth.clear(GL_DEPTH_BUFFER_BIT); - bindDeferredShader(gDeferredDownsampleDepthNearestProgram, 0); + bindDeferredShader(gDeferredDownsampleDepthNearestProgram); gDeferredDownsampleDepthNearestProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredDownsampledDepth.getWidth()/ssao_scale, mDeferredDownsampledDepth.getHeight()/ssao_scale); { LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); @@ -7803,7 +7790,7 @@ void LLPipeline::renderDeferredLighting() glClearColor(1,1,1,1); mScreen.clear(GL_COLOR_BUFFER_BIT); glClearColor(0,0,0,0); - bindDeferredShader(gDeferredSSAOProgram, 0); + bindDeferredShader(gDeferredSSAOProgram); if(ssao_scale < 1.f) { glViewport(0,0,mDeferredDownsampledDepth.getWidth(),mDeferredDownsampledDepth.getHeight()); @@ -7823,7 +7810,7 @@ void LLPipeline::renderDeferredLighting() mDeferredLight.bindTarget(); { //paint shadow/SSAO light map (direct lighting lightmap) LLFastTimer ftm(FTM_SUN_SHADOW); - bindDeferredShader(gDeferredSunProgram, 0); + bindDeferredShader(gDeferredSunProgram); glClearColor(1,1,1,1); mDeferredLight.clear(GL_COLOR_BUFFER_BIT); glClearColor(0,0,0,0); @@ -7898,7 +7885,7 @@ void LLPipeline::renderDeferredLighting() mScreen.flush(); unbindDeferredShader(gDeferredBlurLightProgram); - bindDeferredShader(gDeferredBlurLightProgram, 1); + bindDeferredShader(gDeferredBlurLightProgram, &mScreen, &mScreen); mDeferredLight.bindTarget(); gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f); @@ -8239,7 +8226,7 @@ void LLPipeline::renderDeferredLighting() { LLGLDepthTest depth(GL_FALSE, GL_FALSE); - mScreen.bindTarget(); + mFinalScreen.bindTarget(); // Apply gamma correction to the frame here. gDeferredPostGammaCorrectProgram.bind(); S32 channel = 0; @@ -8256,7 +8243,7 @@ void LLPipeline::renderDeferredLighting() gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); gDeferredPostGammaCorrectProgram.unbind(); - mScreen.flush(); + mFinalScreen.flush(); } gGL.matrixMode(LLRender::MM_PROJECTION); @@ -8264,7 +8251,7 @@ void LLPipeline::renderDeferredLighting() gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.popMatrix(); - mScreen.bindTarget(); + mFinalScreen.bindTarget(); { //render non-deferred geometry (alpha, fullbright, glow) LLGLDisable blend(GL_BLEND); @@ -8313,7 +8300,7 @@ void LLPipeline::renderDeferredLighting() } } - mScreen.flush(); + mFinalScreen.flush(); } @@ -8387,7 +8374,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) { mDeferredDownsampledDepth.bindTarget(); mDeferredDownsampledDepth.clear(GL_DEPTH_BUFFER_BIT); - bindDeferredShader(gDeferredDownsampleDepthNearestProgram, 0); + bindDeferredShader(gDeferredDownsampleDepthNearestProgram); gDeferredDownsampleDepthNearestProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredDownsampledDepth.getWidth()/ssao_scale, mDeferredDownsampledDepth.getHeight()/ssao_scale); { LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); @@ -8403,7 +8390,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) glClearColor(1,1,1,1); mScreen.clear(GL_COLOR_BUFFER_BIT); glClearColor(0,0,0,0); - bindDeferredShader(gDeferredSSAOProgram, 0); + bindDeferredShader(gDeferredSSAOProgram); if(ssao_scale < 1.f) { glViewport(0,0,mDeferredDownsampledDepth.getWidth(),mDeferredDownsampledDepth.getHeight()); @@ -8777,7 +8764,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) gGL.setColorMask(true, true); } - /*mScreen.flush(); + mScreen.flush(); //gamma correct lighting gGL.matrixMode(LLRender::MM_PROJECTION); @@ -8794,7 +8781,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) LLVector2 tc2((F32) mScreen.getWidth()*2, (F32) mScreen.getHeight()*2); - mScreen.bindTarget(); + mFinalScreen.bindTarget(); // Apply gamma correction to the frame here. gDeferredPostGammaCorrectProgram.bind(); //mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); @@ -8826,7 +8813,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) gGL.getTexUnit(channel)->unbind(mScreen.getUsage()); gDeferredPostGammaCorrectProgram.unbind(); - mScreen.flush(); + mFinalScreen.flush(); } gGL.matrixMode(LLRender::MM_PROJECTION); @@ -8834,7 +8821,7 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.popMatrix(); - mScreen.bindTarget();*/ + mFinalScreen.bindTarget(); { //render non-deferred geometry (alpha, fullbright, glow) LLGLDisable blend(GL_BLEND); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index b7d357f97..bf834b1fd 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -286,7 +286,7 @@ public: void renderGeomDeferred(LLCamera& camera); void renderGeomPostDeferred(LLCamera& camera, bool do_occlusion=true); void renderGeomShadow(LLCamera& camera); - void bindDeferredShader(LLGLSLShader& shader, U32 light_index = 0, U32 noise_map = 0xFFFFFFFF); + void bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* diffuse_source = NULL, LLRenderTarget* light_source = NULL); void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep); void unbindDeferredShader(LLGLSLShader& shader); @@ -586,6 +586,7 @@ public: public: //screen texture LLRenderTarget mScreen; + LLRenderTarget mFinalScreen; LLRenderTarget mDeferredScreen; private: LLRenderTarget mFXAABuffer;