diff options
Diffstat (limited to 'indra/newview/pipeline.cpp')
-rw-r--r-- | indra/newview/pipeline.cpp | 1513 |
1 files changed, 890 insertions, 623 deletions
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 6b3a5b1892..924efde89b 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1,28 +1,28 @@ /** - * @file pipeline.cpp - * @brief Rendering pipeline. - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ +* @file pipeline.cpp +* @brief Rendering pipeline. +* +* $LicenseInfo:firstyear=2005&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ #include "llviewerprecompiledheaders.h" @@ -141,7 +141,7 @@ bool LLPipeline::WindLightUseAtmosShaders; bool LLPipeline::RenderDeferred; F32 LLPipeline::RenderDeferredSunWash; U32 LLPipeline::RenderFSAAType; -U32 LLPipeline::RenderResolutionDivisor; +F32 LLPipeline::RenderResolutionDivisor; bool LLPipeline::RenderUIBuffer; S32 LLPipeline::RenderShadowDetail; S32 LLPipeline::MPRenderShadowOpti; @@ -229,6 +229,9 @@ const F32 ALPHA_BLEND_CUTOFF = 0.598f; const F32 DEFERRED_LIGHT_FALLOFF = 0.5f; const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1; +const U32 SHADOWS_RESX = 1024; +const U32 SHADOWS_RESY = 768; + extern S32 gBoxFrame; extern bool gDisplaySwapBuffers; extern bool gDebugGL; @@ -268,6 +271,7 @@ 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"); +LLTrace::BlockTimerStatHandle FTM_RENDER_SHADOWS("Shadows"); LLTrace::BlockTimerStatHandle FTM_RENDER_UI_HUD("HUD"); LLTrace::BlockTimerStatHandle FTM_RENDER_UI_3D("3D"); @@ -346,18 +350,20 @@ void validate_framebuffer_object(); // target -- RenderTarget to add attachments to bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false) { - U32 orm = GL_RGBA; + U32 orm = GL_RGBA8; U32 norm = GL_RGBA16F; U32 emissive = GL_RGB16F; + static LLCachedControl<bool> MPLowColorPrecision(gSavedSettings, "MPLowColorPrecision", 0); + static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false); static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true); bool hdr = has_hdr() && gGLManager.mGLVersion > 4.05f; - if (!hdr) + if (!hdr || MPLowColorPrecision) { norm = GL_RGB10_A2; - emissive = GL_RGB; + emissive = GL_RGB8; } bool valid = true; @@ -429,7 +435,7 @@ void LLPipeline::init() mInitialized = true; - stop_glerror(); + LOG_GLERROR("LLPipeline::init()"); //create render pass pools getPool(LLDrawPool::POOL_WATEREXCLUSION); @@ -701,7 +707,8 @@ void LLPipeline::cleanup() void LLPipeline::destroyGL() { - stop_glerror(); + LOG_GLERROR("LLPipeline::destroyGL()"); + unloadShaders(); mHighlightFaces.clear(); @@ -730,9 +737,9 @@ void LLPipeline::resizeShadowTexture() { releaseSunShadowTargets(); releaseSpotShadowTargets(); - GLuint resX = gViewerWindow->getWorldViewWidthRaw(); - GLuint resY = gViewerWindow->getWorldViewHeightRaw(); - allocateShadowBuffer(resX, resY); + //GLuint resX = gViewerWindow->getWorldViewWidthRaw(); + //GLuint resY = gViewerWindow->getWorldViewHeightRaw(); + allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY); gResizeShadowTexture = false; } @@ -762,6 +769,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) return ret == FBO_SUCCESS_FULLRES; } +void LLPipeline::renderTriangle() +{ + gPipeline.mScreenTriangleVB->setBuffer(); + gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +} + LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY) { @@ -843,28 +856,31 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mRT->width = resX; mRT->height = resY; - U32 res_mod = RenderResolutionDivisor; + F32 res_mod = fmin(RenderResolutionDivisor, 4.0); - if (res_mod > 1 && res_mod < resX && res_mod < resY) + LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL; + + if (res_mod >= 0.5 && res_mod <= 4.0) { - resX /= res_mod; - resY /= res_mod; + resX = (U32)(floor((F32)resX / res_mod)); + resY = (U32)(floor((F32)resY / res_mod)); + LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL; } S32 shadow_detail = RenderShadowDetail; bool ssao = RenderDeferredSSAO; //allocate deferred rendering color buffers - if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA, true)) return false; + if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA8, true)) return false; if (!addDeferredAttachments(mRT->deferredScreen)) return false; - GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA; + GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA8; - 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) + if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField) { //only need mRT->deferredLight for shadows OR ssao OR dof if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false; } @@ -873,13 +889,14 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mRT->deferredLight.release(); } - allocateShadowBuffer(resX, resY); + //allocateShadowBuffer(resX, resY); + allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY); if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots { if (RenderUIBuffer) { - if (!mUIScreen.allocate(resX, resY, GL_RGBA)) + if (!mUIScreen.allocate(resX, resY, GL_RGBA8)) { return false; } @@ -887,10 +904,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) if (RenderFSAAType > 0) { - if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false; + if (!mFXAAMap.allocate(resX, resY, GL_RGBA8)) return false; if (RenderFSAAType == 2) { - if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA, false)) return false; + if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA8, false)) return false; } } else @@ -911,7 +928,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) mSceneMap.release(); } - mPostMap.allocate(resX, resY, screenFormat); + //mPostMaps[0].allocate(resX, resY, screenFormat); + //mPostMaps[1].allocate(resX, resY, screenFormat); + mPostMaps[0].allocate(resX, resY, GL_RGBA); + mPostMaps[1].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. @@ -924,9 +944,9 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) // used to scale down textures // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown - mDownResMap.allocate(1024, 1024, GL_RGBA); + mDownResMap.allocate(1024, 1024, GL_RGBA8); - mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA); + mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA8); } //HACK make screenbuffer allocations start failing after 30 seconds if (gSavedSettings.getBOOL("SimulateFBOFailure")) @@ -936,7 +956,7 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY) gGL.getTexUnit(0)->disable(); - stop_glerror(); + LOG_GLERROR("LLPipeline::allocateScreenBufferInternal end"); return true; } @@ -950,15 +970,18 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY) S32 shadow_detail = RenderShadowDetail; F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps - U32 sun_shadow_map_width = BlurHappySize(resX, scale); - U32 sun_shadow_map_height = BlurHappySize(resY, scale); + //U32 sun_shadow_map_width = BlurHappySize(resX, scale); + //U32 sun_shadow_map_height = BlurHappySize(resY, scale); + U32 sun_shadow_map_width = resX * scale; + U32 sun_shadow_map_height = resY * scale; if (shadow_detail > 0) { //allocate 4 sun shadow maps for (U32 i = 0; i < 4; i++) { - if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true)) + if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_NONE)) { + LL_WARNS() << "failed allocating shadow buffer " << i << " w:" << sun_shadow_map_width << " h:" << sun_shadow_map_height << LL_ENDL; return false; } } @@ -1058,10 +1081,9 @@ void LLPipeline::refreshCachedSettings() RenderDeferred = true; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred"); RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash"); RenderFSAAType = gSavedSettings.getU32("RenderFSAAType"); - RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor"); + RenderResolutionDivisor = gSavedSettings.getF32("RenderResolutionDivisor"); RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer"); RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); - MPRenderShadowOpti = gSavedSettings.getS32("MPRenderShadowOpti"); RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits"); RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO"); RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale"); @@ -1152,6 +1174,13 @@ void LLPipeline::releaseGLBuffers() { assertInitialized(); + mBloomMap.release(); + + for (U32 i = 0; i < 2; i++) + { + mBloomBlur[i].release(); + } + if (mNoiseMap) { LLImageGL::deleteTextures(1, &mNoiseMap); @@ -1184,7 +1213,8 @@ void LLPipeline::releaseGLBuffers() mWaterExclusionMask.release(); - mPostMap.release(); + mPostMaps[0].release(); + mPostMaps[1].release(); mFXAAMap.release(); @@ -1272,23 +1302,28 @@ void LLPipeline::releaseSpotShadowTargets() void LLPipeline::createGLBuffers() { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; - stop_glerror(); + LOG_GLERROR("LLPipeline::createGLBuffers()"); assertInitialized(); - stop_glerror(); - GLuint resX = gViewerWindow->getWorldViewWidthRaw(); GLuint resY = gViewerWindow->getWorldViewHeightRaw(); // allocate screen space glow buffers const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow"))); const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR"); - const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA; + const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA8; for (U32 i = 0; i < 3; i++) { mGlow[i].allocate(512, glow_res, glow_color_fmt); } + mBloomMap.allocate(resX/2.0, resY/2.0, glow_color_fmt); + + for (U32 i = 0; i < 2; i++) + { + mBloomBlur[i].allocate(resX/2.0, resY/2.0, glow_color_fmt); + } + allocateScreenBuffer(resX, resY); // Do not zero out mRT dimensions here. allocateScreenBuffer() above // already sets the correct dimensions. Zeroing them caused resizeShadowTexture() @@ -1397,7 +1432,7 @@ void LLPipeline::createGLBuffers() gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB, raw_image->getWidth(), raw_image->getHeight(), format, GL_UNSIGNED_BYTE, raw_image->getData(), false); - stop_glerror(); + LOG_GLERROR("LLPipeline::createGLBuffers after setManualImage"); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } @@ -1457,11 +1492,7 @@ void LLPipeline::createLUTBuffers() } U32 pix_format = GL_R16F; -#if 0 && LL_DARWIN - // 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); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false); @@ -1474,7 +1505,7 @@ void LLPipeline::createLUTBuffers() } mPbrBrdfLut.allocate(512, 512, GL_RG16F); - mPbrBrdfLut.bindTarget(); + mPbrBrdfLut.bindTarget("mPbrBrdfLut", 1); if (gDeferredGenBrdfLutProgram.isComplete()) { @@ -1498,13 +1529,13 @@ void LLPipeline::createLUTBuffers() mPbrBrdfLut.flush(); mExposureMap.allocate(1, 1, GL_R16F); - mExposureMap.bindTarget(); + mExposureMap.bindTarget("mExposureMap", 1); glClearColor(1, 1, 1, 0); mExposureMap.clear(); glClearColor(0, 0, 0, 0); mExposureMap.flush(); - mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE); + mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO); mLastExposure.allocate(1, 1, GL_R16F); } @@ -1526,7 +1557,7 @@ void LLPipeline::restoreGL() if (part) { part->restoreGL(); - } + } } } } @@ -2062,7 +2093,7 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list) { LL_PROFILE_ZONE_SCOPED; for (LLDrawable::drawable_vector_t::iterator iter = moved_list.begin(); - iter != moved_list.end(); ) + iter != moved_list.end(); ) { LLDrawable::drawable_vector_t::iterator curiter = iter++; LLDrawable *drawablep = *curiter; @@ -2529,7 +2560,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result) gSky.mVOSkyp->mDrawable->setVisible(camera); sCull->pushDrawable(gSky.mVOSkyp->mDrawable); gSky.updateCull(); - stop_glerror(); + LOG_GLERROR("LLPipeline::updateCull sky"); } if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) && @@ -2539,6 +2570,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result) { gSky.mVOWLSkyp->mDrawable->setVisible(camera); sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable); + LOG_GLERROR("LLPipeline::updateCull pushDrawable"); } } @@ -2691,6 +2723,8 @@ void LLPipeline::doOcclusion(LLCamera& camera) gGL.setColorMask(true, true); } + + LOG_GLERROR("LLPipeline::doOcclusion()"); } bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep) @@ -2725,7 +2759,7 @@ void LLPipeline::clearRebuildGroups() mGroupQ1Locked = true; // Iterate through all drawables on the priority build queue, for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin(); - iter != mGroupQ1.end(); ++iter) + iter != mGroupQ1.end(); ++iter) { LLSpatialGroup* group = *iter; @@ -2753,7 +2787,7 @@ void LLPipeline::clearRebuildDrawables() { // Clear all drawables on the priority build queue, for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin(); - iter != mBuildQ1.end(); ++iter) + iter != mBuildQ1.end(); ++iter) { LLDrawable* drawablep = *iter; if (drawablep && !drawablep->isDead()) @@ -2765,7 +2799,7 @@ void LLPipeline::clearRebuildDrawables() //clear all moving bridges for (LLDrawable::drawable_vector_t::iterator iter = mMovedBridge.begin(); - iter != mMovedBridge.end(); ++iter) + iter != mMovedBridge.end(); ++iter) { LLDrawable *drawablep = *iter; drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD); @@ -2774,7 +2808,7 @@ void LLPipeline::clearRebuildDrawables() //clear all moving drawables for (LLDrawable::drawable_vector_t::iterator iter = mMovedList.begin(); - iter != mMovedList.end(); ++iter) + iter != mMovedList.end(); ++iter) { LLDrawable *drawablep = *iter; drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD); @@ -2803,7 +2837,7 @@ void LLPipeline::rebuildPriorityGroups() mGroupQ1Locked = true; // Iterate through all drawables on the priority build queue, for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin(); - iter != mGroupQ1.end(); ++iter) + iter != mGroupQ1.end(); ++iter) { LLSpatialGroup* group = *iter; group->rebuildGeom(); @@ -2835,7 +2869,7 @@ void LLPipeline::updateGeom(F32 max_dtime) // Iterate through all drawables on the priority build queue, for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin(); - iter != mBuildQ1.end();) + iter != mBuildQ1.end();) { LLDrawable::drawable_list_t::iterator curiter = iter++; LLDrawable* drawablep = *curiter; @@ -2860,6 +2894,7 @@ void LLPipeline::updateGeom(F32 max_dtime) } updateMovedList(mMovedBridge); + LOG_GLERROR("LLPipeline::updateGeom()"); } void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) @@ -2884,8 +2919,8 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) LLVOAvatar* av = vobj->asAvatar(); if (av && ((!sImpostorRender && av->isImpostor()) //ignore impostor flag during impostor pass - || av->isInMuteList() - || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) )) + || av->isInMuteList() + || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) )) { return; } @@ -3102,13 +3137,13 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) LL_PROFILE_GPU_ZONE("stateSort"); if (hasAnyRenderType(LLPipeline::RENDER_TYPE_AVATAR, - LLPipeline::RENDER_TYPE_CONTROL_AV, - LLPipeline::RENDER_TYPE_TERRAIN, - LLPipeline::RENDER_TYPE_TREE, - LLPipeline::RENDER_TYPE_SKY, - LLPipeline::RENDER_TYPE_VOIDWATER, - LLPipeline::RENDER_TYPE_WATER, - LLPipeline::END_RENDER_TYPES)) + LLPipeline::RENDER_TYPE_CONTROL_AV, + LLPipeline::RENDER_TYPE_TERRAIN, + LLPipeline::RENDER_TYPE_TREE, + LLPipeline::RENDER_TYPE_SKY, + LLPipeline::RENDER_TYPE_VOIDWATER, + LLPipeline::RENDER_TYPE_WATER, + LLPipeline::END_RENDER_TYPES)) { //clear faces from face pools gPipeline.resetDrawOrders(); @@ -3206,7 +3241,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) { LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWABLE("stateSort"); // LL_RECORD_BLOCK_TIME(FTM_STATESORT_DRAWABLE); for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); - iter != sCull->endVisibleList(); ++iter) + iter != sCull->endVisibleList(); ++iter) { LLDrawable *drawablep = *iter; if (!drawablep->isDead()) @@ -3341,8 +3376,8 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera) void forAllDrawables(LLCullResult::sg_iterator begin, - LLCullResult::sg_iterator end, - void (*func)(LLDrawable*)) + LLCullResult::sg_iterator end, + void (*func)(LLDrawable*)) { for (LLCullResult::sg_iterator i = begin; i != end; ++i) { @@ -3405,7 +3440,7 @@ void renderScriptedTouchBeacons(LLDrawable *drawablep) if (gPipeline.sRenderBeacons) { gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), - LLPipeline::DebugBeaconLineWidth); + LLPipeline::DebugBeaconLineWidth); } if (gPipeline.sRenderHighlight) @@ -3435,7 +3470,7 @@ void renderPhysicalBeacons(LLDrawable *drawablep) if (gPipeline.sRenderBeacons) { gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), - LLPipeline::DebugBeaconLineWidth); + LLPipeline::DebugBeaconLineWidth); } if (gPipeline.sRenderHighlight) @@ -3476,7 +3511,7 @@ void renderMOAPBeacons(LLDrawable *drawablep) if (gPipeline.sRenderBeacons) { gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), - LLPipeline::DebugBeaconLineWidth); + LLPipeline::DebugBeaconLineWidth); } if (gPipeline.sRenderHighlight) @@ -3505,7 +3540,7 @@ void renderParticleBeacons(LLDrawable *drawablep) { LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f); gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), - LLPipeline::DebugBeaconLineWidth); + LLPipeline::DebugBeaconLineWidth); } if (gPipeline.sRenderHighlight) @@ -3590,7 +3625,7 @@ void LLPipeline::postSort(LLCamera &camera) if ((sUseOcclusion && group->isOcclusionState(LLSpatialGroup::OCCLUDED)) || (RenderAutoHideSurfaceAreaLimit > 0.f && - group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f))) + group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f))) { continue; } @@ -3858,6 +3893,8 @@ void render_hud_elements() } gUIProgram.unbind(); + + LOG_GLERROR("LLPipeline::render_hud_elements()"); } static inline void bindHighlightProgram(LLGLSLShader& program) @@ -3962,6 +3999,8 @@ void LLPipeline::renderHighlights() unbindHighlightProgram(gHighlightSpecularProgram); } } + + LOG_GLERROR("LLPipeline::renderHighlights()"); } //debug use @@ -3971,6 +4010,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) { LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred"); LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); + LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); LL_PROFILE_GPU_ZONE("renderGeomDeferred"); llassert(!sRenderingHUDs); @@ -3999,6 +4039,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled; setupHWLights(); + LOG_GLERROR("LLPipeline::renderGeomDeferred() setupHWLights"); { LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred pools"); @@ -4087,7 +4128,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR(""); } gGLLastMatrix = NULL; @@ -4110,6 +4151,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) { LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; LL_PROFILE_GPU_ZONE("renderGeomPostDeferred"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED); if (gUseWireframe) { @@ -4226,7 +4268,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR("after pools"); } gGLLastMatrix = NULL; @@ -4246,6 +4288,8 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera) { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } + + LOG_GLERROR("LLPipeline::renderGeomPostDeferred()"); } void LLPipeline::renderGeomShadow(LLCamera& camera) @@ -4305,11 +4349,12 @@ void LLPipeline::renderGeomShadow(LLCamera& camera) } } iter1 = iter2; - stop_glerror(); + LOG_GLERROR(""); } gGLLastMatrix = NULL; gGL.loadMatrix(gGLModelView); + LOG_GLERROR("LLPipeline::renderGeomShadow()"); } @@ -4340,7 +4385,7 @@ void LLPipeline::renderPhysicsDisplay() LLGLEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(3.f, 3.f); - glLineWidth(3.f); + //glLineWidth(3.f); LLGLEnable blend(GL_BLEND); gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -4382,7 +4427,7 @@ void LLPipeline::renderPhysicsDisplay() glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } } - glLineWidth(1.f); + //glLineWidth(1.f); gDebugProgram.unbind(); } @@ -4467,7 +4512,7 @@ void LLPipeline::renderDebug() if ( pathfindingConsole->isRenderNavMesh() ) { gGL.flush(); - glLineWidth(2.0f); + //glLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); LLGLDisable blend(GL_BLEND); @@ -4491,7 +4536,7 @@ void LLPipeline::renderDebug() gGL.flush(); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - glLineWidth(1.0f); + //glLineWidth(1.0f); gGL.flush(); } //User designated path @@ -4607,11 +4652,11 @@ void LLPipeline::renderDebug() gPathfindingProgram.uniform1f(sTint, 1.f); gPathfindingProgram.uniform1f(sAlphaScale, 1.f); - glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); + //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); LLGLDisable blendOut(GL_BLEND); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); gGL.flush(); - glLineWidth(1.f); + //glLineWidth(1.f); } glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); @@ -4634,7 +4679,7 @@ void LLPipeline::renderDebug() LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); gGL.flush(); - glLineWidth(2.0f); + //glLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); @@ -4661,7 +4706,7 @@ void LLPipeline::renderDebug() gPathfindingProgram.bind(); gGL.flush(); - glLineWidth(1.0f); + //glLineWidth(1.0f); } glPolygonOffset(0.f, 0.f); @@ -4798,12 +4843,11 @@ void LLPipeline::renderDebug() LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display"); bindDeferredShader(gReflectionProbeDisplayProgram, NULL); - mScreenTriangleVB->setBuffer(); LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_FALSE); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(gReflectionProbeDisplayProgram); } @@ -5564,8 +5608,8 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) LLDrawable* drawable = light->drawable; const LLViewerObject *vobj = light->drawable->getVObj(); if(vobj && vobj->getAvatar() - && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow()) - ) + && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow()) + ) { drawable->clearState(LLDrawable::NEARBY_LIGHT); continue; @@ -5626,7 +5670,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) // FIND NEW LIGHTS THAT ARE IN RANGE light_set_t new_nearby_lights; for (LLDrawable::ordered_drawable_set_t::iterator iter = mLights.begin(); - iter != mLights.end(); ++iter) + iter != mLights.end(); ++iter) { LLDrawable* drawable = *iter; LLVOVolume* light = drawable->getVOVolume(); @@ -5664,7 +5708,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) // INSERT ANY NEW LIGHTS for (light_set_t::iterator iter = new_nearby_lights.begin(); - iter != new_nearby_lights.end(); iter++) + iter != new_nearby_lights.end(); iter++) { const Light* light = &(*iter); if (LLPipeline::sRenderDeferred || mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS) @@ -5706,7 +5750,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) //mark nearby lights not-removable. for (light_set_t::iterator iter = mNearbyLights.begin(); - iter != mNearbyLights.end(); iter++) + iter != mNearbyLights.end(); iter++) { const Light* light = &(*iter); ((LLViewerOctreeEntryData*) light->drawable)->setVisible(); @@ -5810,7 +5854,7 @@ void LLPipeline::setupHWLights() if (local_light_count >= 1) { for (light_set_t::iterator iter = mNearbyLights.begin(); - iter != mNearbyLights.end(); ++iter) + iter != mNearbyLights.end(); ++iter) { LLDrawable* drawable = iter->drawable; LLVOVolume* light = drawable->getVOVolume(); @@ -6654,7 +6698,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, !drawable->getVObj()->isAttachment() || delta.getLength3().getF32() > ATTACHMENT_OVERRIDE_DIST) { //avatar overrides if previously hit drawable is not an attachment or - //attachment is far enough away from detected intersection + //attachment is far enough away from detected intersection drawable = hit; local_end = position; } @@ -6724,12 +6768,12 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start, } LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end, - bool pick_transparent, - S32* face_hit, - LLVector4a* intersection, // return the intersection point - LLVector2* tex_coord, // return the texture coordinates of the intersection point - LLVector4a* normal, // return the surface normal at the intersection point - LLVector4a* tangent // return the surface tangent at the intersection point + bool pick_transparent, + S32* face_hit, + LLVector4a* intersection, // return the intersection point + LLVector2* tex_coord, // return the texture coordinates of the intersection point + LLVector4a* normal, // return the surface normal at the intersection point + LLVector4a* tangent // return the surface tangent at the intersection point ) { LLDrawable* drawable = NULL; @@ -6792,6 +6836,8 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable) facep->clearVertexBuffer(); } } + + LOG_GLERROR("LLPipeline::resetVertexBuffers()"); } void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged) @@ -6811,6 +6857,7 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderObjects()"); } void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged) @@ -6839,6 +6886,7 @@ void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged) { LL::GLTFSceneManager::instance().render(true, true); } + LOG_GLERROR("LLPipeline::renderGLTFObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6919,6 +6967,7 @@ void LLPipeline::renderAlphaObjects(bool rigged) gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderAlphaObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6937,6 +6986,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture, } gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderMaskedObjects()"); } // Currently only used for shadows -Cosmic,2023-04-19 @@ -6955,6 +7005,7 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc } gGL.loadMatrix(gGLModelView); gGLLastMatrix = NULL; + LOG_GLERROR("LLPipeline::renderFullbrightMaskedObjects()"); } void apply_cube_face_rotation(U32 face) @@ -7017,11 +7068,12 @@ void LLPipeline::bindScreenToTexture() } -static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom"); +static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Post processing"); void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex) { - dst->bindTarget(); + dst->bindTarget("visualizeBuffers", 1); + dst->clear(); gDeferredBufferVisualProgram.bind(); gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex); @@ -7031,8 +7083,7 @@ void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 else gDeferredBufferVisualProgram.uniform1f(mipLevel, 8); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); gDeferredBufferVisualProgram.unbind(); dst->flush(); } @@ -7043,7 +7094,8 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) { LL_PROFILE_GPU_ZONE("luminance sample"); - dst->bindTarget(); + dst->bindTarget("generateLuminance", 0); + dst->clear(); LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7074,14 +7126,15 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst) static LLStaticHashedString diffuse_luminance_scale_s("diffuse_luminance_scale"); gLuminanceProgram.uniform1f(diffuse_luminance_scale_s, diffuse_luminance_scale); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst->flush(); // note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance" // also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader gLuminanceProgram.unbind(); } + + LOG_GLERROR("LLPipeline::generateLuminance()"); } void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) { @@ -7092,17 +7145,15 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool if (use_history) { // copy last frame's exposure into mLastExposure - mLastExposure.bindTarget(); + mLastExposure.bindTarget("mLastExposure", 1); gCopyProgram.bind(); gGL.getTexUnit(0)->bind(dst); - - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - + renderTriangle(); mLastExposure.flush(); } - dst->bindTarget(); + dst->bindTarget("generateExposure", 1); + //dst->clear(); LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7185,23 +7236,24 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error); shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); if (use_history) { - gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); + //gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); } shader->unbind(); dst->flush(); } + + LOG_GLERROR("LLPipeline::generateExposure()"); } extern LLPointer<LLImageGL> gEXRImage; void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) { - dst->bindTarget(); + dst->bindTarget("tonemap", 1); // gamma correct lighting { LL_PROFILE_GPU_ZONE("tonemap"); @@ -7221,7 +7273,7 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) shader.bind(); - S32 channel = 0; + //S32 channel = 0; shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); @@ -7243,18 +7295,19 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst) shader.uniform1i(tonemap_type, tonemap_type_setting); shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust())); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); - gGL.getTexUnit(channel)->unbind(src->getUsage()); + //gGL.getTexUnit(channel)->unbind(src->getUsage()); shader.unbind(); } dst->flush(); + LOG_GLERROR("LLPipeline::tonemap()"); } void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) { - dst->bindTarget(); + dst->bindTarget("gammaCorrect", 1); + dst->clear(); // gamma correct lighting { LL_PROFILE_GPU_ZONE("gamma correct"); @@ -7272,12 +7325,12 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst) shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); shader.unbind(); } dst->flush(); + LOG_GLERROR("LLPipeline::gammaCorrect()"); } void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst) @@ -7290,7 +7343,7 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* LLRenderTarget& depth_src = mRT->deferredScreen; - dst->bindTarget(); + dst->bindTarget("copyScreenSpaceReflections", 1); dst->clear(); gCopyDepthProgram.bind(); @@ -7300,11 +7353,11 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* gGL.getTexUnit(diff_map)->bind(src); gGL.getTexUnit(depth_map)->bind(&depth_src, true); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst->flush(); } + LOG_GLERROR("LLPipeline::copyScreenSpaceReflection()"); } void LLPipeline::generateGlow(LLRenderTarget* src) @@ -7312,7 +7365,9 @@ void LLPipeline::generateGlow(LLRenderTarget* src) if (sRenderGlow) { LL_PROFILE_GPU_ZONE("glow"); - mGlow[2].bindTarget(); + LL_RECORD_BLOCK_TIME(FTM_RENDER_GLOW); + + mGlow[2].bindTarget("mGlow[2]", 1); mGlow[2].clear(); gGlowExtractProgram.bind(); @@ -7338,8 +7393,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src) gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); } gGlowExtractProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, - (GLfloat)mGlow[2].getWidth(), - (GLfloat)mGlow[2].getHeight()); + (GLfloat)mGlow[2].getWidth(), + (GLfloat)mGlow[2].getHeight()); } { @@ -7352,8 +7407,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src) gGL.color4f(1, 1, 1, 1); gPipeline.enableLightsFullbright(); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); + gGlowExtractProgram.unbindTexture(LLShaderMgr::GLOW_NOISE_MAP); mGlow[2].flush(); } @@ -7379,7 +7434,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src) for (S32 i = 0; i < kernel; i++) { - mGlow[i % 2].bindTarget(); + mGlow[i % 2].bindTarget("mGlow[i % 2]", 1); mGlow[i % 2].clear(); if (i == 0) @@ -7400,8 +7455,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src) gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta); } - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); mGlow[i % 2].flush(); } @@ -7411,25 +7465,26 @@ void LLPipeline::generateGlow(LLRenderTarget* src) } else // !sRenderGlow, skip the glow ping-pong and just clear the result target { - mGlow[1].bindTarget(); + mGlow[1].bindTarget("mGlow[1]", 1); mGlow[1].clear(); mGlow[1].flush(); } + LOG_GLERROR("LLPipeline::generateGlow()"); } -void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) { static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f); if (cas_sharpness == 0.0f || !gCASProgram.isComplete()) { - gPipeline.copyRenderTarget(src, dst); - return; + return false; } LLGLSLShader* sharpen_shader = &gCASProgram; // Bind setup: - dst->bindTarget(); + dst->bindTarget("applyCAS", 1); + dst->clear(); sharpen_shader->bind(); @@ -7451,100 +7506,105 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight()); } - sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); - - // Draw - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - + S32 channel = sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); + renderTriangle(); + sharpen_shader->unbindTexture(channel); sharpen_shader->unbind(); dst->flush(); + + return true; } -void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) { - { - llassert(!gCubeSnapshot); - bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); + llassert(!gCubeSnapshot); + bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); - // Present everything. - if (multisample) - { - LL_PROFILE_GPU_ZONE("aa"); - S32 width = dst->getWidth(); - S32 height = dst->getHeight(); + if(!multisample) return false; - // bake out texture2D with RGBL for FXAA shader - mFXAAMap.bindTarget(); - mFXAAMap.clear(GL_COLOR_BUFFER_BIT); + LL_PROFILE_GPU_ZONE("aa"); + S32 width = dst->getWidth(); + S32 height = dst->getHeight(); - LLGLSLShader* shader = &gGlowCombineFXAAProgram; - shader->bind(); + //LL_WARNS() << "dst width=" << width << LL_ENDL; - S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); - if (channel > -1) - { - src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); - } + // bake out texture2D with RGBL for FXAA shader + mFXAAMap.bindTarget("applyFXAA", 1); + mFXAAMap.clear(GL_COLOR_BUFFER_BIT); - { - LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - } + LLGLSLShader* shader = &gGlowCombineFXAAProgram; + shader->bind(); - shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); - shader->unbind(); + S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + if (channel > -1) + { + src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); + } - mFXAAMap.flush(); + { + LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); + renderTriangle(); + } - dst->bindTarget(); + shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); + shader->unbind(); - static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); - U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); + mFXAAMap.flush(); - shader = &gFXAAProgram[fsaa_quality]; - shader->bind(); + dst->bindTarget("applyFXAA", 1); + dst->clear(); - channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage()); - if (channel > -1) - { - mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); - } + static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); + U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); - gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; - gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; - gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); - gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); + shader = &gFXAAProgram[fsaa_quality]; + shader->bind(); - glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); + channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage()); + if (channel > -1) + { + mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); + } - F32 scale_x = (F32)width / mFXAAMap.getWidth(); - F32 scale_y = (F32)height / mFXAAMap.getHeight(); - shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y); - shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y); - shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y, - 0.5f / width * scale_x, 0.5f / height * scale_y); - shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y, - 2.f / width * scale_x, 2.f / height * scale_y); + /* + gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; + gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; + gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); + gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); - { - LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH); - gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true); + glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); +*/ - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - } + F32 scale_x = (F32)width / mFXAAMap.getWidth(); + F32 scale_y = (F32)height / mFXAAMap.getHeight(); - shader->unbind(); - dst->flush(); - } - else { - copyRenderTarget(src, dst); - } + //LL_WARNS() << "vp width=" << gGLViewport[2] << " scale=" << scale_x << LL_ENDL; + + shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y); + shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y); + shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y, + 0.5f / width * scale_x, 0.5f / height * scale_y); + shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y, + 2.f / width * scale_x, 2.f / height * scale_y); + + { + LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); + S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH); + gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true); + + renderTriangle(); + } + + if (channel > -1) + { + shader->unbindTexture(channel); } + + shader->unbind(); + dst->flush(); + + return true; } void LLPipeline::generateSMAABuffers(LLRenderTarget* src) @@ -7576,7 +7636,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) LLRenderTarget& dest = mFXAAMap; LLGLSLShader& edge_shader = gSMAAEdgeDetectProgram[fsaa_quality]; - dest.bindTarget(); + dest.bindTarget("generateSMAABuffers", 1); dest.clear(GL_COLOR_BUFFER_BIT); edge_shader.bind(); @@ -7587,14 +7647,17 @@ 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_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)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); + gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } + gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } //if (use_stencil) @@ -7603,13 +7666,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) // glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // glStencilMask(0xFF); //} - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + + renderTriangle(); edge_shader.unbind(); dest.flush(); - gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE); + //gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE); } { @@ -7619,7 +7682,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) LLRenderTarget& dest = mSMAABlendBuffer; LLGLSLShader& blend_weights_shader = gSMAABlendWeightsProgram[fsaa_quality]; - dest.bindTarget(); + dest.bindTarget("mSMAABlendBuffer", 1); dest.clear(GL_COLOR_BUFFER_BIT); blend_weights_shader.bind(); @@ -7651,22 +7714,25 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src) // glStencilFunc(GL_EQUAL, 1, 0xFF); // glStencilMask(0x00); //} - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + + renderTriangle(); //if (use_stencil) //{ // glStencilFunc(GL_ALWAYS, 0, 0xFF); //} + blend_weights_shader.unbind(); dest.flush(); + gGL.getTexUnit(edge_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(area_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(search_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE); } } + LOG_GLERROR("LLPipeline::generateSMAABuffers()"); } -void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) { llassert(!gCubeSnapshot); @@ -7677,79 +7743,75 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) multisample = 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); + if(!multisample) return false; - S32 width = src->getWidth(); - S32 height = src->getHeight(); + LL_PROFILE_GPU_ZONE("aa"); - float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height }; + generateSMAABuffers(src); - LLGLDepthTest depth(GL_FALSE, GL_FALSE); - static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false); - //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true); + static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); + U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); - { - //LLGLDisable stencil(GL_STENCIL_TEST); + S32 width = src->getWidth(); + S32 height = src->getHeight(); - // Bind setup: - LLRenderTarget* bound_target = dst; - LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality]; + float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height }; - bound_target->bindTarget(); - bound_target->clear(GL_COLOR_BUFFER_BIT); + LLGLDepthTest depth(GL_FALSE, GL_FALSE); - blend_shader.bind(); - blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics); + static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false); + //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true); - S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE); - if(diffuse_channel > -1) - { - src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR); - gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); - } + { + //LLGLDisable stencil(GL_STENCIL_TEST); - S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX); - if (blend_channel > -1) - { - mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR); - } + // Bind setup: + LLRenderTarget* bound_target = dst; + LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality]; + + bound_target->bindTarget("applySMAA", 1); + bound_target->clear(GL_COLOR_BUFFER_BIT); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + blend_shader.bind(); + blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics); - bound_target->flush(); - blend_shader.unbind(); - gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE); - gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE); + S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE); + if(diffuse_channel > -1) + { + src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR); + gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); } + + S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX); + if (blend_channel > -1) + { + mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR); + } + + renderTriangle(); + + bound_target->flush(); + blend_shader.unbind(); + gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE); } - else - { - copyRenderTarget(src, dst); - } + + LOG_GLERROR("LLPipeline::applySMAA()"); + return true; } void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst) { - LL_PROFILE_GPU_ZONE("copyRenderTarget"); - dst->bindTarget(); - + dst->bindTarget("copyRenderTarget", 1); + dst->clear(GL_COLOR_BUFFER_BIT); gDeferredPostNoDoFProgram.bind(); gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src); - gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); + //gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); - { - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - } + renderTriangle(); gDeferredPostNoDoFProgram.unbind(); @@ -7760,214 +7822,323 @@ 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. - dst->bindTarget(); + dst->bindTarget("combineGlow", 1); { - gGlowCombineProgram.bind(); gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src); gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } dst->flush(); + LOG_GLERROR("LLPipeline::combineGlow()"); } -void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) { - { - bool dof_enabled = + bool dof_enabled = (RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) && RenderDepthOfField && !gCubeSnapshot; - gViewerWindow->setup3DViewport(); + if(!dof_enabled) return false; - if (dof_enabled) - { - LL_PROFILE_GPU_ZONE("dof"); - LLGLDisable blend(GL_BLEND); + gViewerWindow->setup3DViewport(); - // depth of field focal plane calculations - static F32 current_distance = 16.f; - static F32 start_distance = 16.f; - static F32 transition_time = 1.f; + if (dof_enabled) + { + LL_PROFILE_GPU_ZONE("dof"); + LLGLDisable blend(GL_BLEND); - LLVector3 focus_point; + // depth of field focal plane calculations + static F32 current_distance = 16.f; + static F32 start_distance = 16.f; + static F32 transition_time = 1.f; - LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); - if (obj && obj->mDrawable && obj->isSelected()) - { // focus on selected media object - S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); - if (obj && obj->mDrawable) - { - LLFace* face = obj->mDrawable->getFace(face_idx); - if (face) - { - focus_point = face->getPositionAgent(); - } - } - } + LLVector3 focus_point; - if (focus_point.isExactlyZero()) + LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); + if (obj && obj->mDrawable && obj->isSelected()) + { // focus on selected media object + S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); + if (obj && obj->mDrawable) { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) - { // focus on point under cursor - focus_point.set(gDebugRaycastIntersection.getF32ptr()); - } - else if (gAgentCamera.cameraMouselook()) - { // focus on point under mouselook crosshairs - LLVector4a result; - result.clear(); - - gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result); - - focus_point.set(result.getF32ptr()); - } - else + LLFace* face = obj->mDrawable->getFace(face_idx); + if (face) { - // focus on alt-zoom target - LLViewerRegion* region = gAgent.getRegion(); - if (region) - { - focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal()); - } + focus_point = face->getPositionAgent(); } } + } - LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); - F32 target_distance = 16.f; - if (!focus_point.isExactlyZero()) - { - target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye); + if (focus_point.isExactlyZero()) + { + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { // focus on point under cursor + focus_point.set(gDebugRaycastIntersection.getF32ptr()); } + else if (gAgentCamera.cameraMouselook()) + { // focus on point under mouselook crosshairs + LLVector4a result; + result.clear(); - if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f) - { // large shift happened, interpolate smoothly to new target distance - transition_time = 0.f; - start_distance = current_distance; - } - else if (transition_time < 1.f) - { // currently in a transition, continue interpolating - transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value(); - transition_time = llmin(transition_time, 1.f); + gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result); - F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f; - current_distance = start_distance + (target_distance - start_distance) * t; + focus_point.set(result.getF32ptr()); } else - { // small or no change, just snap to target distance - current_distance = target_distance; + { + // focus on alt-zoom target + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal()); + } } + } + + LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); + F32 target_distance = 16.f; + if (!focus_point.isExactlyZero()) + { + target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye); + } + + if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f) + { // large shift happened, interpolate smoothly to new target distance + transition_time = 0.f; + start_distance = current_distance; + } + else if (transition_time < 1.f) + { // currently in a transition, continue interpolating + transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value(); + transition_time = llmin(transition_time, 1.f); - // convert to mm - F32 subject_distance = current_distance * 1000.f; - F32 fnumber = CameraFNumber; - F32 default_focal_length = CameraFocalLength; + F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f; + current_distance = start_distance + (target_distance - start_distance) * t; + } + else + { // small or no change, just snap to target distance + current_distance = target_distance; + } - F32 fov = LLViewerCamera::getInstance()->getView(); + // convert to mm + F32 subject_distance = current_distance * 1000.f; + F32 fnumber = CameraFNumber; + F32 default_focal_length = CameraFocalLength; - const F32 default_fov = CameraFieldOfView * F_PI / 180.f; + F32 fov = LLViewerCamera::getInstance()->getView(); - // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight(); + const F32 default_fov = CameraFieldOfView * F_PI / 180.f; - F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f); + // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight(); - F32 focal_length = dv / (2 * tanf(fov / 2.f)); + F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f); - // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); + F32 focal_length = dv / (2 * tanf(fov / 2.f)); - // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) - // where N = fnumber - // s2 = dot distance - // s1 = subject distance - // f = focal length - // + // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); - F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length)); - blur_constant /= 1000.f; // convert to meters for shader - F32 magnification = focal_length / (subject_distance - focal_length); + // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) + // where N = fnumber + // s2 = dot distance + // s1 = subject distance + // f = focal length + // - { // build diffuse+bloom+CoF - mRT->deferredLight.bindTarget(); + F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length)); + blur_constant /= 1000.f; // convert to meters for shader + F32 magnification = focal_length / (subject_distance - focal_length); - gDeferredCoFProgram.bind(); + { // build diffuse+bloom+CoF + mRT->deferredLight.bindTarget("renderDOF", 1); - gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); - gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); + gDeferredCoFProgram.bind(); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); - gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle)); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); - gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); + gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); + gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - gDeferredCoFProgram.unbind(); - mRT->deferredLight.flush(); - } + gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); + gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle)); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); + gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); - U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale); - U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale); + renderTriangle(); - { // perform DoF sampling at half-res (preserve alpha channel) - src->bindTarget(); - glViewport(0, 0, dof_width, dof_height); + gDeferredCoFProgram.unbind(); + mRT->deferredLight.flush(); + } - gGL.setColorMask(true, false); + U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale); + U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale); - gDeferredPostProgram.bind(); - gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT); + { // perform DoF sampling at half-res (preserve alpha channel) + src->bindTarget("DoF sampling", 1); + glViewport(0, 0, dof_width, dof_height); - gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); - gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); - gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); + gGL.setColorMask(true, false); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + gDeferredPostProgram.bind(); + gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT); - gDeferredPostProgram.unbind(); + gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); + gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); + gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); - src->flush(); - gGL.setColorMask(true, true); - } + renderTriangle(); - { // combine result based on alpha + gDeferredPostProgram.unbind(); - dst->bindTarget(); - glViewport(0, 0, dst->getWidth(), dst->getHeight()); + src->flush(); + gGL.setColorMask(true, true); + } - gDeferredDoFCombineProgram.bind(); - gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); - gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT); + { // combine result based on alpha - gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); - gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); - gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); - gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth()); - gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight()); + dst->bindTarget("DoF combine", 1); + glViewport(0, 0, dst->getWidth(), dst->getHeight()); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + gDeferredDoFCombineProgram.bind(); + gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); + gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT); - gDeferredDoFCombineProgram.unbind(); + gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); + gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); + gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); + gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth()); + gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight()); - dst->flush(); - } - } - else - { - copyRenderTarget(src, dst); + + renderTriangle(); + + gDeferredDoFCombineProgram.unbind(); + dst->flush(); } } + + return true; +} + +bool LLPipeline::renderBloom(LLRenderTarget* src, LLRenderTarget* dst) +{ + static LLCachedControl<U32> mp_render_bloom(gSavedSettings, "MPRenderBloom", 0); + + if(mp_render_bloom < 1) return false; + + static LLCachedControl<F32> mp_bloom_extract_brightness(gSavedSettings, "MPBloomExtractBrightness", 0.10); + static LLCachedControl<F32> mp_bloom_radius(gSavedSettings, "MPBloomBlurRadius", 1.5); + static LLCachedControl<F32> mp_bloom_radius_add(gSavedSettings, "MPBloomBlurRadiusAdd", 0); + static LLCachedControl<F32> mp_bloom_strength(gSavedSettings, "MPBloomStrength", 1.0); + static LLCachedControl<F32> mp_bloom_metal(gSavedSettings, "MPBloomExtractMetal", 0.2); + static LLCachedControl<F32> mp_bloom_nonmetal(gSavedSettings, "MPBloomExtractNonMetal", 0.2); + + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + LLGLDisable blend(GL_BLEND); + + mBloomMap.bindTarget("mBloomMap", 1); + + glClearColor(0, 0, 0, 0); + mBloomMap.clear(); + + gBloomExtractProgram.bind(); + gBloomExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src); + gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 1); + gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE, &mGlow[1], false, LLTexUnit::TFO_POINT, 0); + gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 3); + + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_BRIGHTNESS, 1.0 - mp_bloom_extract_brightness); + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_METAL, mp_bloom_metal); + gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_NONMETAL, mp_bloom_nonmetal); + + renderTriangle(); + + gBloomExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE); + gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2); + + gBloomExtractProgram.unbind(); + mBloomMap.flush(); + + + // ping pong blur + + S16 horizontal = 1, first_iteration = true; + unsigned int amount = mp_render_bloom; + if(amount > 10) amount = 10; + + F32 radius = mp_bloom_radius; + + gBloomBlurProgram.bind(); + + + // Iteration 0 + + gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + + mBloomBlur[0].bindTarget("", 1); + //mBloomBlur[0].clear(); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomMap); + renderTriangle(); + mBloomBlur[0].flush(); + + mBloomBlur[1].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); + renderTriangle(); + mBloomBlur[1].flush(); + + + // additional iterations + + for (unsigned int i = 1; i < amount; i++) + { + radius += mp_bloom_radius_add; + gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + + mBloomBlur[0].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[1]); + renderTriangle(); + mBloomBlur[0].flush(); + + mBloomBlur[1].bindTarget("", 1); + gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); + gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); + renderTriangle(); + mBloomBlur[1].flush(); + } + + gBloomBlurProgram.unbindTexture(LLShaderMgr::BLOOM_EMAP); + gBloomBlurProgram.unbind(); + + + // combine + + dst->bindTarget("bloom combine", 1); + //dst->clear(); + + gBloomCombineProgram.bind(); + + gBloomCombineProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src); + gBloomCombineProgram.bindTexture(LLShaderMgr::BLOOM_BMAP, &mBloomBlur[1]); + gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_STRENGTH, mp_bloom_strength); + + renderTriangle(); + + gBloomCombineProgram.unbind(); + dst->flush(); + + return true; } void LLPipeline::renderFinalize() @@ -7986,7 +8157,11 @@ void LLPipeline::renderFinalize() LLGLDisable blend(GL_BLEND); LLGLDisable cull(GL_CULL_FACE); - enableLightsFullbright(); + gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; + gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; + gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); + gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); + glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); gGL.setColorMask(true, true); glClearColor(0, 0, 0, 0); @@ -7994,6 +8169,10 @@ void LLPipeline::renderFinalize() static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true); bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr(); + U16 activeRT = 0; + + LLRenderTarget* postHDRBuffer = &mRT->screen; + if (hdr) { copyScreenSpaceReflections(&mRT->screen, &mSceneMap); @@ -8002,38 +8181,49 @@ void LLPipeline::renderFinalize() generateExposure(&mLuminanceMap, &mExposureMap); - tonemap(&mRT->screen, &mPostMap); + tonemap(&mRT->screen, &mRT->deferredLight); + + postHDRBuffer = &mRT->deferredLight; - applyCAS(&mPostMap, &mRT->screen); } - generateSMAABuffers(&mRT->screen); + gammaCorrect(postHDRBuffer, &mPostMaps[0]); - gammaCorrect(&mRT->screen, &mPostMap); + generateGlow(&mPostMaps[0]); LLVertexBuffer::unbind(); - applySMAA(&mPostMap, &mRT->screen); + if(renderBloom(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } - generateGlow(&mRT->screen); + combineGlow(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]); + activeRT = 1 - activeRT; - combineGlow(&mRT->screen, &mPostMap); + if(applyFXAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } - gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; - gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; - gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); - gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); - glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); + if(applyCAS(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } + + if(applySMAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) + { + activeRT = 1 - activeRT; + } - renderDoF(&mPostMap, &mRT->screen); - LLRenderTarget* finalBuffer = &mRT->screen; - if (RenderFSAAType == 1) + if(renderDoF(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) { - applyFXAA(&mRT->screen, &mPostMap); - finalBuffer = &mPostMap; + activeRT = 1 - activeRT; } + LLRenderTarget* finalBuffer = &mPostMaps[activeRT]; + if (RenderBufferVisualization > -1) { switch (RenderBufferVisualization) @@ -8063,6 +8253,27 @@ void LLPipeline::renderFinalize() } break; } + case 7: + visualizeBuffers(&mBloomMap, finalBuffer, 0); + break; + case 8: + visualizeBuffers(&mBloomBlur[1], finalBuffer, 0); + break; + case 9: + visualizeBuffers(&mPostMaps[activeRT], finalBuffer, 0); + break; + case 10: + visualizeBuffers(&mGlow[0], finalBuffer, 0); + break; + case 11: + visualizeBuffers(&mGlow[1], finalBuffer, 0); + break; + case 12: + visualizeBuffers(&mGlow[2], finalBuffer, 0); + break; + case 13: + visualizeBuffers(&mSceneMap, finalBuffer, 0); + break; default: break; } @@ -8080,8 +8291,7 @@ void LLPipeline::renderFinalize() { LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } gDeferredPostNoDoFNoiseProgram.unbind(); @@ -8096,8 +8306,8 @@ void LLPipeline::renderFinalize() /*if (LLRenderTarget::sUseFBO && !gCubeSnapshot) { // copy depth buffer from mRT->screen to framebuffer LLRenderTarget::copyContentsToFramebuffer(mRT->screen, 0, 0, mRT->screen.getWidth(), mRT->screen.getHeight(), 0, 0, - mRT->screen.getWidth(), mRT->screen.getHeight(), - GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + mRT->screen.getWidth(), mRT->screen.getHeight(), + GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); }*/ LLVertexBuffer::unbind(); @@ -8106,6 +8316,7 @@ void LLPipeline::renderFinalize() // flush calls made to "addTrianglesDrawn" so far to stats machinery recordTrianglesDrawn(); + LOG_GLERROR("LLPipeline::renderFinalize()"); } void LLPipeline::bindLightFunc(LLGLSLShader& shader) @@ -8125,6 +8336,8 @@ void LLPipeline::bindLightFunc(LLGLSLShader& shader) void LLPipeline::bindShadowMaps(LLGLSLShader& shader) { + LOG_GLERROR("bindShadowMaps() 1"); + for (U32 i = 0; i < 4; i++) { LLRenderTarget* shadow_target = getSunShadowTarget(i); @@ -8138,6 +8351,8 @@ void LLPipeline::bindShadowMaps(LLGLSLShader& shader) } } + LOG_GLERROR("bindShadowMaps() 2"); + for (U32 i = 4; i < 6; i++) { S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i); @@ -8246,7 +8461,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ bindLightFunc(shader); - stop_glerror(); + LOG_GLERROR("bindDeferredShader()"); light_target = light_target ? light_target : deferred_light_target; channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_target->getUsage()); @@ -8262,11 +8477,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ } } - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 2"); bindShadowMaps(shader); - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 3"); F32 mat[16*6]; for (U32 i = 0; i < 16; i++) @@ -8281,7 +8496,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat); - stop_glerror(); + LOG_GLERROR("bindDeferredShader() 4"); if (!LLPipeline::sReflectionProbesEnabled) { @@ -8298,8 +8513,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_ F32* m = gGLModelView; F32 mat[] = { m[0], m[1], m[2], - m[4], m[5], m[6], - m[8], m[9], m[10] }; + m[4], m[5], m[6], + m[8], m[9], m[10] }; shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, true, mat); } @@ -8435,6 +8650,8 @@ void LLPipeline::renderDeferredLighting() return; } + LOG_GLERROR("renderDeferredLighting begin"); + llassert(!sRenderingHUDs); F32 light_scale = 1.f; @@ -8479,7 +8696,7 @@ void LLPipeline::renderDeferredLighting() if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0) { LL_PROFILE_GPU_ZONE("sun program"); - deferred_light_target->bindTarget(); + deferred_light_target->bindTarget("sun_shader", 1); { // paint shadow/SSAO light map (direct lighting lightmap) LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow"); @@ -8491,8 +8708,8 @@ void LLPipeline::renderDeferredLighting() glClearColor(0, 0, 0, 0); sun_shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, - (GLfloat)deferred_light_target->getWidth(), - (GLfloat)deferred_light_target->getHeight()); + (GLfloat)deferred_light_target->getWidth(), + (GLfloat)deferred_light_target->getHeight()); { LLGLDisable blend(GL_BLEND); @@ -8511,7 +8728,7 @@ void LLPipeline::renderDeferredLighting() LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow"); LL_PROFILE_GPU_ZONE("soften shadow"); // blur lightmap - screen_target->bindTarget(); + screen_target->bindTarget("SSAO", 1); glClearColor(1, 1, 1, 1); screen_target->clear(GL_COLOR_BUFFER_BIT); glClearColor(0, 0, 0, 0); @@ -8544,8 +8761,7 @@ void LLPipeline::renderDeferredLighting() { LLGLDisable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } screen_target->flush(); @@ -8553,27 +8769,27 @@ void LLPipeline::renderDeferredLighting() bindDeferredShader(gDeferredBlurLightProgram, screen_target); - deferred_light_target->bindTarget(); + deferred_light_target->bindTarget("blur light", 1); gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f); { LLGLDisable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } deferred_light_target->flush(); unbindDeferredShader(gDeferredBlurLightProgram); } - screen_target->bindTarget(); + screen_target->bindTarget("renderDeferredLighting screen_target", 1); // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky glClearColor(0, 0, 0, 0); screen_target->clear(GL_COLOR_BUFFER_BIT); if (RenderDeferredAtmospheric) - { // apply sunlight contribution + { + // apply sunlight contribution LLGLSLShader &soften_shader = gDeferredSoftenProgram; LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - atmospherics"); @@ -8600,8 +8816,7 @@ void LLPipeline::renderDeferredLighting() LLGLDisable blend(GL_BLEND); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } unbindDeferredShader(gDeferredSoftenProgram); @@ -8817,8 +9032,7 @@ void LLPipeline::renderDeferredLighting() gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0); far_z = 0.f; count = 0; - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(gDeferredMultiLightProgram[idx]); } } @@ -8854,6 +9068,9 @@ void LLPipeline::renderDeferredLighting() gDeferredMultiSpotLightProgram.uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0); mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + /* + gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + */ } gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); @@ -8869,35 +9086,35 @@ void LLPipeline::renderDeferredLighting() pushRenderTypeMask(); andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, - LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER, - LLPipeline::RENDER_TYPE_ALPHA_POST_WATER, - LLPipeline::RENDER_TYPE_FULLBRIGHT, - LLPipeline::RENDER_TYPE_VOLUME, - LLPipeline::RENDER_TYPE_GLOW, - LLPipeline::RENDER_TYPE_BUMP, - LLPipeline::RENDER_TYPE_GLTF_PBR, - LLPipeline::RENDER_TYPE_PASS_SIMPLE, - LLPipeline::RENDER_TYPE_PASS_ALPHA, - LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, - LLPipeline::RENDER_TYPE_PASS_BUMP, - LLPipeline::RENDER_TYPE_PASS_POST_BUMP, - LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, - LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, - LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, - LLPipeline::RENDER_TYPE_PASS_GLOW, - LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW, - LLPipeline::RENDER_TYPE_PASS_GRASS, - LLPipeline::RENDER_TYPE_PASS_SHINY, - LLPipeline::RENDER_TYPE_PASS_INVISIBLE, - LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, - LLPipeline::RENDER_TYPE_AVATAR, - LLPipeline::RENDER_TYPE_CONTROL_AV, - LLPipeline::RENDER_TYPE_ALPHA_MASK, - LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, - LLPipeline::RENDER_TYPE_TERRAIN, - LLPipeline::RENDER_TYPE_WATER, - LLPipeline::RENDER_TYPE_WATEREXCLUSION, - END_RENDER_TYPES); + LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER, + LLPipeline::RENDER_TYPE_ALPHA_POST_WATER, + LLPipeline::RENDER_TYPE_FULLBRIGHT, + LLPipeline::RENDER_TYPE_VOLUME, + LLPipeline::RENDER_TYPE_GLOW, + LLPipeline::RENDER_TYPE_BUMP, + LLPipeline::RENDER_TYPE_GLTF_PBR, + LLPipeline::RENDER_TYPE_PASS_SIMPLE, + LLPipeline::RENDER_TYPE_PASS_ALPHA, + LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, + LLPipeline::RENDER_TYPE_PASS_BUMP, + LLPipeline::RENDER_TYPE_PASS_POST_BUMP, + LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, + LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, + LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, + LLPipeline::RENDER_TYPE_PASS_GLOW, + LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW, + LLPipeline::RENDER_TYPE_PASS_GRASS, + LLPipeline::RENDER_TYPE_PASS_SHINY, + LLPipeline::RENDER_TYPE_PASS_INVISIBLE, + LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, + LLPipeline::RENDER_TYPE_AVATAR, + LLPipeline::RENDER_TYPE_CONTROL_AV, + LLPipeline::RENDER_TYPE_ALPHA_MASK, + LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, + LLPipeline::RENDER_TYPE_TERRAIN, + LLPipeline::RENDER_TYPE_WATER, + LLPipeline::RENDER_TYPE_WATEREXCLUSION, + END_RENDER_TYPES); renderGeomPostDeferred(*LLViewerCamera::getInstance()); popRenderTypeMask(); @@ -8916,11 +9133,14 @@ void LLPipeline::renderDeferredLighting() } } gGL.setColorMask(true, true); + + LOG_GLERROR("renderDeferredLighting end"); } void LLPipeline::doAtmospherics() { LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; + LOG_GLERROR("doAtmospherics begin"); if (sImpostorRender) { // do not attempt atmospherics on impostors @@ -8938,7 +9158,7 @@ void LLPipeline::doAtmospherics() LLRenderTarget& dst = gPipeline.mWaterDis; mRT->screen.flush(); - dst.bindTarget(); + dst.bindTarget("doAtmospherics dst", 1); gCopyDepthProgram.bind(); S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -8948,11 +9168,10 @@ void LLPipeline::doAtmospherics() gGL.getTexUnit(depth_map)->bind(&depth_src, true); gGL.setColorMask(false, false); - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst.flush(); - mRT->screen.bindTarget(); + mRT->screen.bindTarget("atmospherics", 1); } LLGLEnable blend(GL_BLEND); @@ -8974,13 +9193,14 @@ void LLPipeline::doAtmospherics() LLGLDepthTest depth(GL_FALSE); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); unbindDeferredShader(haze_shader); gGL.setSceneBlendType(LLRender::BT_ALPHA); } + + LOG_GLERROR("doAtmospherics end"); } void LLPipeline::doWaterHaze() @@ -9002,7 +9222,8 @@ void LLPipeline::doWaterHaze() LLRenderTarget& dst = gPipeline.mWaterDis; mRT->screen.flush(); - dst.bindTarget(); + + dst.bindTarget("water haze copy depth", 1); gCopyDepthProgram.bind(); S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -9012,11 +9233,10 @@ void LLPipeline::doWaterHaze() gGL.getTexUnit(depth_map)->bind(&depth_src, true); gGL.setColorMask(false, false); - gPipeline.mScreenTriangleVB->setBuffer(); - gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); dst.flush(); - mRT->screen.bindTarget(); + mRT->screen.bindTarget("water haze", 1); } LLGLEnable blend(GL_BLEND); @@ -9042,8 +9262,7 @@ void LLPipeline::doWaterHaze() LLGLDepthTest depth(GL_FALSE); // full screen blit - mScreenTriangleVB->setBuffer(); - mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + renderTriangle(); } else { @@ -9062,14 +9281,15 @@ void LLPipeline::doWaterHaze() unbindDeferredShader(haze_shader); - gGL.setSceneBlendType(LLRender::BT_ALPHA); } + + LOG_GLERROR("after doWaterHaze()"); } void LLPipeline::doWaterExclusionMask() { - mWaterExclusionMask.bindTarget(); + mWaterExclusionMask.bindTarget("", 1); glClearColor(1, 1, 1, 1); mWaterExclusionMask.clear(); mWaterExclusionPool->render(); @@ -9222,6 +9442,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep) } } + LOG_GLERROR("setupSpotLight() end"); } void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) @@ -9229,7 +9450,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) LLRenderTarget* deferred_target = &mRT->deferredScreen; LLRenderTarget* deferred_light_target = &mRT->deferredLight; - stop_glerror(); + LOG_GLERROR("unbindDeferredShader() begin"); shader.disableTexture(LLShaderMgr::NORMAL_MAP, deferred_target->getUsage()); shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, deferred_target->getUsage()); shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage()); @@ -9278,6 +9499,8 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(0)->activate(); shader.unbind(); + + LOG_GLERROR("unbindDeferredShader() end"); } void LLPipeline::setEnvMat(LLGLSLShader& shader) @@ -9333,33 +9556,38 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader) } // reflection probe shaders generally sample the scene map as well for SSR - channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); - if (channel > -1) - { - gGL.getTexUnit(channel)->bind(&mSceneMap); - } + //if(RenderScreenSpaceReflections) + //{ + //LL_WARNS() << "binding SSR to reflection maps" << LL_ENDL; - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations); - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias); - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep); - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples); - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias); - mPoissonOffset++; + channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); + if (channel > -1) + { + gGL.getTexUnit(channel)->bind(&mSceneMap); + } - if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples) - mPoissonOffset = 0; + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations); + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias); + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep); + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples); + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias); + mPoissonOffset++; - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset); - shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier); + if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples) + mPoissonOffset = 0; - channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH); - if (channel > -1) - { - gGL.getTexUnit(channel)->bind(&mSceneMap, true); - } + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset); + shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier); + channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH); + if (channel > -1) + { + gGL.getTexUnit(channel)->bind(&mSceneMap, true); + } + //} + LOG_GLERROR("bindReflectionProbes() end"); } void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) @@ -9373,6 +9601,8 @@ void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) gGL.getTexUnit(channel)->enable(LLTexUnit::TT_TEXTURE); } } + + LOG_GLERROR("unbindReflectionProbes() end"); } @@ -9431,11 +9661,13 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MASKED("Alpha Masked"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_BLEND("Alpha Blend"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass"); +static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MATERIAL("Alpha Material"); static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked"); void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp) { - LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER); + LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; + LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER); LL_PROFILE_GPU_ZONE("renderShadow"); LLPipeline::sShadowRender = true; @@ -9512,8 +9744,10 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa gGL.setColorMask(false, false); } - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); LL_PROFILE_GPU_ZONE("shadow simple"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); + gGL.getTexUnit(0)->disable(); for (U32 type : types) @@ -9534,63 +9768,71 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa { LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow geom"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_GEOM); renderGeomShadow(shadow_cam); } - if(MPRenderShadowOpti < 3) + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); + LL_PROFILE_GPU_ZONE("shadow alpha"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA); + + const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; + U32 target_width = LLRenderTarget::sCurResX; + + for (int i = 0; i < 2; ++i) { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); - LL_PROFILE_GPU_ZONE("shadow alpha"); - const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; - U32 target_width = LLRenderTarget::sCurResX; + bool rigged = i == 1; - for (int i = 0; i < 2; ++i) { - bool rigged = i == 1; + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked"); + LL_PROFILE_GPU_ZONE("shadow alpha masked"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MASKED); + gDeferredShadowAlphaMaskProgram.bind(rigged); + LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); + LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); + renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged); + } - { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked"); - LL_PROFILE_GPU_ZONE("shadow alpha masked"); - gDeferredShadowAlphaMaskProgram.bind(rigged); - LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); - LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); - renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged); - } + { + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend"); + LL_PROFILE_GPU_ZONE("shadow alpha blend"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_BLEND); + renderAlphaObjects(rigged); + } - { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend"); - LL_PROFILE_GPU_ZONE("shadow alpha blend"); - renderAlphaObjects(rigged); - } + { + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked"); + LL_PROFILE_GPU_ZONE("shadow alpha masked"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED); + gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); + LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); + LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); + renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged); + } + + { + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass"); + LL_PROFILE_GPU_ZONE("shadow alpha grass"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_GRASS); + + gDeferredTreeShadowProgram.bind(rigged); + LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); + + if (i == 0) { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked"); - LL_PROFILE_GPU_ZONE("shadow alpha masked"); - gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); - LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); - LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); - renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged); + renderObjects(LLRenderPass::PASS_GRASS, true); } { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass"); - LL_PROFILE_GPU_ZONE("shadow alpha grass"); - gDeferredTreeShadowProgram.bind(rigged); - LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); + LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material"); + LL_PROFILE_GPU_ZONE("shadow alpha material"); + LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MATERIAL); - if (i == 0) - { - renderObjects(LLRenderPass::PASS_GRASS, true); - } - - { - LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material"); - LL_PROFILE_GPU_ZONE("shadow alpha material"); - renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged); - renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged); - renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged); - renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged); - } + renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged); + renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged); + renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged); + renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged); } } @@ -9868,16 +10110,24 @@ public: void LLPipeline::generateSunShadow(LLCamera& camera) { - if (!sRenderDeferred || RenderShadowDetail <= 0 || (MPRenderShadowOpti > 0 && gCubeSnapshot)) + if (!sRenderDeferred || RenderShadowDetail <= 0) { return; } + if(gCubeSnapshot) + { + LL_WARNS() << "generateSunShadow() gCubeSnapshot" << LL_ENDL; + return; + } + LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW); LL_PROFILE_GPU_ZONE("generateSunShadow"); LLDisableOcclusionCulling no_occlusion; + U32 splits = 4; + bool skip_avatar_update = false; if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson) { @@ -9982,7 +10232,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) LLPlane shadow_near_clip; { LLVector3 p = camera.getOrigin(); // gAgent.getPositionAgent(); - p += caster_dir * RenderFarClip*2.f; + p += caster_dir * RenderFarClip*1.1f; shadow_near_clip.setVec(p, caster_dir); } @@ -10055,30 +10305,36 @@ void LLPipeline::generateSunShadow(LLCamera& camera) update_min_max(min, max, fp[i]); } + F32 maxDist = gSavedSettings.getF32("MPRenderShadowMaxDist"); near_clip = llclamp(-max.mV[2], 0.01f, 4.0f); - F32 far_clip = llclamp(-min.mV[2]*2.f, 16.0f, 512.0f); - - //far_clip = llmin(far_clip, 128.f); + F32 far_clip = llclamp(-min.mV[2]*1.1, 16.0f, maxDist); far_clip = llmin(far_clip, camera.getFar()); F32 range = far_clip-near_clip; - LLVector3 split_exp = RenderShadowSplitExponent; + F32 closestDist = 2.0; + F32 closeDist = 10.0; - F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) ); + mSunClipPlanes.mV[0] = near_clip + closestDist; + mSunClipPlanes.mV[1] = near_clip + closeDist; + mSunClipPlanes.mV[2] = mSunClipPlanes.mV[1] + (range-closeDist)*0.4; + mSunClipPlanes.mV[3] = far_clip; + /* + LLVector3 split_exp = RenderShadowSplitExponent; + F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) ); da = powf(da, split_exp.mV[2]); - F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da; - for (U32 i = 0; i < 4; ++i) + for (U32 i = 0; i < splits; ++i) { - F32 x = (F32)(i+1)/4.f; + F32 x = (F32)(i+1)/(F32)splits; x = powf(x, sxp); mSunClipPlanes.mV[i] = near_clip+range*x; } + */ - mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding + //mSunClipPlanes.mV[0] *= 1.1f; //bump back first split for transition padding } if (gCubeSnapshot) @@ -10098,7 +10354,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera) } else { - for (S32 j = 0; j < (gCubeSnapshot ? 2 : 4); j++) + S32 begin = 0; + S32 end = splits-1; + if(gCubeSnapshot) end = 1; + + for (S32 j = begin; j <= end; j++) { if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) { @@ -10136,8 +10396,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f; delta.normVec(); F32 dp = delta*pn; - frust[i] = eye + (delta*dist[j]*0.75f)/dp; - frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp; + frust[i] = eye + (delta*dist[j]*0.9f)/dp; + frust[i+4] = eye + (delta*dist[j+1]*1.1f)/dp; } shadow_cam.calcAgentFrustumPlanes(frust); @@ -10150,12 +10410,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) std::vector<LLVector3> fp; - U32 splits = 3; - if(MPRenderShadowOpti == 1) splits = 2; - else if(MPRenderShadowOpti >= 2) splits = 1; - - if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir) - || j > splits) + if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir)) { //no possible shadow receivers if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) @@ -10165,7 +10420,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) mShadowCamera[j+4] = shadow_cam; } - mRT->shadow[j].bindTarget(); + mRT->shadow[j].bindTarget("", 1); { LLGLDepthTest depth(GL_TRUE); mRT->shadow[j].clear(); @@ -10455,8 +10710,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera) stop_glerror(); - mRT->shadow[j].bindTarget(); - mRT->shadow[j].getViewport(gGLViewport); + mRT->shadow[j].bindTarget("mRT->shadow[j] (rendering)", 1); + //mRT->shadow[j].getViewport(gGLViewport); + //mRT->shadow[j].getViewport(0, 0, SHADOWS_RESX, SHADOWS_RESY); mRT->shadow[j].clear(); { @@ -10604,8 +10860,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) // - mSpotShadow[i].bindTarget(); - mSpotShadow[i].getViewport(gGLViewport); + mSpotShadow[i].bindTarget("mSpotShadow[i]", 1); + //mSpotShadow[i].getViewport(gGLViewport); mSpotShadow[i].clear(); static LLCullResult result[2]; @@ -10653,6 +10909,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera) { gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode()); } + + LOG_GLERROR("LLPipeline::generateSunShadow()"); } void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10668,6 +10926,8 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture) pass->renderGroup(group,type,texture); } } + + LOG_GLERROR("LLPipeline::renderGroups()"); } void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10683,6 +10943,8 @@ void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture) pass->renderRiggedGroup(group, type, texture); } } + + LOG_GLERROR("LLPipeline::renderRiggedGroups()"); } void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) @@ -10699,7 +10961,7 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr; - mRT->deferredScreen.bindTarget(); + mRT->deferredScreen.bindTarget("mRT->deferredScreen in profileAvatar", 1); mRT->deferredScreen.clear(); if (!profile_attachments) @@ -10753,6 +11015,8 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) { cur_shader->bind(); } + + LOG_GLERROR("LLPipeline::profileAvatar()"); } void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool for_profile, LLViewerObject* specific_attachment) @@ -10777,12 +11041,12 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool // previews can't be muted or impostered bool visually_muted = !for_profile && !preview_avatar && avatar->isVisuallyMuted(); LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() - << " is " << ( visually_muted ? "" : "not ") << "visually muted" - << LL_ENDL; + << " is " << ( visually_muted ? "" : "not ") << "visually muted" + << LL_ENDL; bool too_complex = !for_profile && !preview_avatar && avatar->isTooComplex(); LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() - << " is " << ( too_complex ? "" : "not ") << "too complex" - << LL_ENDL; + << " is " << ( too_complex ? "" : "not ") << "too complex" + << LL_ENDL; pushRenderTypeMask(); @@ -10812,7 +11076,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool RENDER_TYPE_CLOUDS, RENDER_TYPE_HUD_PARTICLES, END_RENDER_TYPES - ); + ); } if (specific_attachment && specific_attachment->isHUDAttachment()) @@ -10973,7 +11237,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool { if (!avatar->mImpostor.isComplete()) { - avatar->mImpostor.allocate(resX, resY, GL_RGBA, true); + avatar->mImpostor.allocate(resX, resY, GL_RGBA8, true); if (LLPipeline::sRenderDeferred) { @@ -10989,7 +11253,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool avatar->mImpostor.resize(resX, resY); } - avatar->mImpostor.bindTarget(); + avatar->mImpostor.bindTarget("avatar->mImpostor", 1); } } @@ -11126,6 +11390,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool } LLVertexBuffer::unbind(); + + LOG_GLERROR("LLPipeline::generateImpostor()"); + LLGLState::checkStates(); } @@ -11401,7 +11668,7 @@ void LLPipeline::hideDrawable( LLDrawable *pDrawable ) //hide the children LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren(); for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++ ) + iter != child_list.end(); iter++ ) { LLViewerObject* child = *iter; LLDrawable* drawable = child->mDrawable; @@ -11419,7 +11686,7 @@ void LLPipeline::unhideDrawable( LLDrawable *pDrawable ) //restore children LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren(); for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) + iter != child_list.end(); iter++) { LLViewerObject* child = *iter; LLDrawable* drawable = child->mDrawable; @@ -11450,7 +11717,7 @@ void LLPipeline::skipRenderingShadows() for (S32 j = 0; j < 4; j++) { - mRT->shadow[j].bindTarget(); + mRT->shadow[j].bindTarget("skip rendering shadows", 1); mRT->shadow[j].clear(); mRT->shadow[j].flush(); } |