diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3d3404e494..51f4ccd36d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -616,7 +616,10 @@ static void settings_to_globals() static void settings_modify() { - LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred"); +// LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred"); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred") || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] LLPipeline::sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); LLPipeline::sRenderDeferred = LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred"); LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index dc984694be..528cc68eea 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -395,9 +395,21 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue) return true; } +// [RLVa:KB] - @setsphere +static bool handleWindLightAtmosShadersChanged(const LLSD& newvalue) +{ + LLRenderTarget::sUseFBO = newvalue.asBoolean() && LLPipeline::sUseDepthTexture; + handleSetShaderChanged(LLSD()); + return true; +} +// [/RLVa:KB] + static bool handleRenderDeferredChanged(const LLSD& newvalue) { - LLRenderTarget::sUseFBO = newvalue.asBoolean(); +// LLRenderTarget::sUseFBO = newvalue.asBoolean(); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = newvalue.asBoolean() || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] if (gPipeline.isInit()) { LLPipeline::refreshCachedSettings(); @@ -419,7 +431,10 @@ static bool handleRenderDeferredChanged(const LLSD& newvalue) // static bool handleRenderBumpChanged(const LLSD& newval) { - LLRenderTarget::sUseFBO = newval.asBoolean(); +// LLRenderTarget::sUseFBO = newval.asBoolean(); +// [RLVa:KB] - @setsphere + LLRenderTarget::sUseFBO = newval.asBoolean() || (gSavedSettings.getBOOL("WindLightUseAtmosShaders") && LLPipeline::sUseDepthTexture); +// [/RLVa:KB] if (gPipeline.isInit()) { gPipeline.updateRenderBump(); @@ -624,7 +639,10 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); - gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +// gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); +// [RLVa:KB] - @setsphere + gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleWindLightAtmosShadersChanged, _2)); +// [/RLVa:KB] gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2)); gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 817ff4ee53..b0eef1f446 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -1036,6 +1036,15 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) { gPipeline.renderDeferredLighting(); } +// [RLVa:KB] - @setsphere + else if (LLRenderTarget::sUseFBO && LLPipeline::sUseDepthTexture) + { + if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) + { + LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); + } + } +// [/RLVa:KB] LLPipeline::sUnderWaterRender = FALSE; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 7497e122aa..d31e4629d6 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -244,7 +244,7 @@ LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightProgram; LLGLSLShader gNormalMapGenProgram; // [RLVa:KB] - @setsphere -LLGLSLShader gDeferredRlvProgram; +LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] // Deferred materials shaders @@ -352,7 +352,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredWLSkyProgram); mShaderList.push_back(&gDeferredWLCloudProgram); // [RLVa:KB] - @setsphere - mShaderList.push_back(&gDeferredRlvProgram); + mShaderList.push_back(&gRlvSphereProgram); // [/RLVa:KB] } @@ -1181,9 +1181,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightProgram.unload(); -// [RLVa:KB] - @setsphere - gDeferredRlvProgram.unload(); -// [/RLVa:KB] gDeferredHighlightProgram.unload(); gDeferredHighlightNormalProgram.unload(); @@ -2096,18 +2093,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gNormalMapGenProgram.createShader(NULL, NULL); } -// [RLVa:KB] - @setsphere - if (success) - { - gDeferredRlvProgram.mName = "Deferred (RLVa) Post Processing Shader"; - gDeferredRlvProgram.mShaderFiles.clear(); - gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); - gDeferredRlvProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredRlvProgram.createShader(NULL, NULL); - } -// [/RLV:KB] - return success; } @@ -3417,6 +3402,9 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() { gWLSkyProgram.unload(); gWLCloudProgram.unload(); +// [RLVa:KB] - @setsphere + gRlvSphereProgram.unload(); +// [/RLVa:KB] return TRUE; } @@ -3444,6 +3432,18 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() success = gWLCloudProgram.createShader(NULL, NULL); } +// [RLVa:KB] - @setsphere + if (success) + { + gRlvSphereProgram.mName = "RLVa Sphere Post Processing Shader"; + gRlvSphereProgram.mShaderFiles.clear(); + gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); + gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); + gRlvSphereProgram.mShaderLevel = mVertexShaderLevel[SHADER_WINDLIGHT]; + success = gRlvSphereProgram.createShader(NULL, NULL); + } +// [/RLV:KB] + return success; } diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index dfcfbb89c7..486617a405 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -345,7 +345,7 @@ extern LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightProgram; extern LLGLSLShader gNormalMapGenProgram; // [RLVa:KB] - @setsphere -extern LLGLSLShader gDeferredRlvProgram; +extern LLGLSLShader gRlvSphereProgram; // [/RLVa:KB] // Deferred materials shaders diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 886d58e3b0..ffe5786547 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -260,9 +260,6 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State"); LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline"); LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy"); LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); -// [RLVa:KB] - @setsphere -LLTrace::BlockTimerStatHandle FTM_POST_DEFERRED_RLV("Post-process (Deferred RLVa)"); -// [/RLVa:KB] static LLTrace::BlockTimerStatHandle FTM_STATESORT_DRAWABLE("Sort Drawables"); @@ -412,6 +409,9 @@ bool LLPipeline::sRenderingHUDs; // [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0) bool LLPipeline::sRenderTextures = true; // [/SL:KB] +// [RLVa:KB] - @setsphere +bool LLPipeline::sUseDepthTexture = false; +// [/RLVa:KB] // EventHost API LLPipeline listener. static LLPipelineListener sPipelineListener; @@ -1069,9 +1069,22 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) mFXAABuffer.release(); mScreen.release(); mDeferredScreen.release(); //make sure to release any render targets that share a depth buffer with mDeferredScreen first - mDeferredDepth.release(); - mOcclusionDepth.release(); - +// [RLVa:KB] - @setsphere + if (!LLRenderTarget::sUseFBO || !LLPipeline::sUseDepthTexture) + { + mDeferredDepth.release(); + mOcclusionDepth.release(); + } + else + { + const U32 occlusion_divisor = 3; + if (!mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + if (!mOcclusionDepth.allocate(resX / occlusion_divisor, resY / occlusion_divisor, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; + } +// [/RLVa:KB] +// mDeferredDepth.release(); +// mOcclusionDepth.release(); + if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; } @@ -4509,7 +4522,17 @@ void LLPipeline::renderGeom(LLCamera& camera, bool forceVBOUpdate) gGLLastMatrix = NULL; gGL.loadMatrix(gGLModelView); LLGLSLShader::bindNoShader(); - doOcclusion(camera); +// [RLVa:KB] - @setsphere + if (LLPipeline::RenderDeferred || !LLRenderTarget::sUseFBO || !LLPipeline::sUseDepthTexture) + { + doOcclusion(camera); + } + else + { + doOcclusion(camera, mScreen, mOcclusionDepth, &mDeferredDepth); + } +// [/RLVa:KB] +// doOcclusion(camera); } pool_set_t::iterator iter2 = iter1; @@ -9087,7 +9110,6 @@ void LLPipeline::renderDeferredLighting() // [RLVa:KB] - @setsphere if (RlvActions::hasBehaviour(RLV_BHVR_SETSPHERE)) { - LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); LLVfxManager::instance().runEffect(EVisualEffect::RlvSphere); } // [/RLVa:KB] diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index fc79ae5016..1e59c3c0d1 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -592,6 +592,9 @@ public: // [SL:KB] - Patch: Render-TextureToggle (Catznip-4.0) static bool sRenderTextures; // [/SL:KB] +// [RLVa:KB] - @setsphere + static bool sUseDepthTexture; +// [/RLVa:KB] static LLTrace::EventStatHandle sStatBatchSize; diff --git a/indra/newview/rlvactions.h b/indra/newview/rlvactions.h index 122c2d4863..a6a5219933 100644 --- a/indra/newview/rlvactions.h +++ b/indra/newview/rlvactions.h @@ -24,10 +24,8 @@ // Forward declarations // -class LLGLSLShader; class LLInventoryCategory; class LLInventoryItem; -class LLRenderTarget; // ============================================================================ // RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index 526572975b..da9716b083 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -271,6 +271,7 @@ enum ERlvBehaviourModifier RLV_MODIFIER_SETCAM_TEXTURE, // Specifies the UUID of the texture used to texture the world view RLV_MODIFIER_SITTPDIST, RLV_MODIFIER_TPLOCALDIST, + RLV_MODIFIER_COUNT, RLV_MODIFIER_UNKNOWN }; diff --git a/indra/newview/rlveffects.cpp b/indra/newview/rlveffects.cpp index 954e428022..8b303847e3 100644 --- a/indra/newview/rlveffects.cpp +++ b/indra/newview/rlveffects.cpp @@ -17,6 +17,7 @@ #include "llviewerprecompiledheaders.h" #include "llagent.h" +#include "llfasttimer.h" #include "llglslshader.h" #include "llrender2dutils.h" #include "llviewershadermgr.h" @@ -383,27 +384,30 @@ void RlvSphereEffect::renderPass(LLGLSLShader* pShader) const gPipeline.mScreen.flush(); } +LLTrace::BlockTimerStatHandle FTM_RLV_EFFECT_SPHERE("Post-process (RLVa sphere)"); + void RlvSphereEffect::run() { + LL_RECORD_BLOCK_TIME(FTM_RLV_EFFECT_SPHERE); LLGLDepthTest depth(GL_FALSE, GL_FALSE); - gDeferredRlvProgram.bind(); - setShaderUniforms(&gDeferredRlvProgram, &gPipeline.mScreen); + gRlvSphereProgram.bind(); + setShaderUniforms(&gRlvSphereProgram, &gPipeline.mScreen); switch (m_eMode) { case ESphereMode::Blend: - renderPass(&gDeferredRlvProgram); + renderPass(&gRlvSphereProgram); break; case ESphereMode::Blur: - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); - renderPass(&gDeferredRlvProgram); - gDeferredRlvProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); - renderPass(&gDeferredRlvProgram); + gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 1.f, 0.f); + renderPass(&gRlvSphereProgram); + gRlvSphereProgram.uniform2f(LLShaderMgr::RLV_EFFECT_PARAM5, 0.f, 1.f); + renderPass(&gRlvSphereProgram); break; } - gDeferredRlvProgram.unbind(); + gRlvSphereProgram.unbind(); } // ==================================================================================== diff --git a/indra/newview/rlvhandler.cpp b/indra/newview/rlvhandler.cpp index af44f0dd15..e0acc3c279 100644 --- a/indra/newview/rlvhandler.cpp +++ b/indra/newview/rlvhandler.cpp @@ -51,8 +51,10 @@ #include "lltabcontainer.h" // @showinv - Tab container control for inventory tabs #include "lltoolmgr.h" // @edit #include "llviewercamera.h" // @setcam and related +#include "llviewershadermgr.h" // @setsphere #include "llworldmapmessage.h" // @tpto #include "llviewertexturelist.h" // @setcam_texture +#include "pipeline.h" // @setsphere // RLVa includes #include "rlvactions.h" @@ -2066,6 +2068,18 @@ ERlvCmdRet RlvBehaviourHandler::onCommand(const RlvCommand& ERlvCmdRet eRet = RlvBehaviourGenericHandler::onCommand(rlvCmd, fRefCount); if ( (RLV_RET_SUCCESS == eRet) && (!rlvCmd.isModifier()) ) { + // If we're not using deferred but are using Windlight shaders we need to force use of FBO and depthmap texture + if ( (!LLPipeline::RenderDeferred) && (LLPipeline::WindLightUseAtmosShaders) && (!LLPipeline::sUseDepthTexture) ) + { + LLRenderTarget::sUseFBO = true; + LLPipeline::sUseDepthTexture = true; + + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + gPipeline.resetVertexBuffers(); + LLViewerShaderMgr::instance()->setShaders(); + } + if (gRlvHandler.hasBehaviour(rlvCmd.getObjectID(), rlvCmd.getBehaviourType())) LLVfxManager::instance().addEffect(new RlvSphereEffect(rlvCmd.getObjectID())); else