diff options
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl | 7 | ||||
| -rw-r--r-- | indra/newview/llavatarrenderinfoaccountant.cpp | 31 | ||||
| -rw-r--r-- | indra/newview/llchathistory.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolalpha.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llface.h | 9 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 12 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.cpp | 66 | ||||
| -rw-r--r-- | indra/newview/llviewerstats.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewertexturelist.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 45 | 
11 files changed, 150 insertions, 44 deletions
| diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index f26e3a84d2..9feccd7874 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2426,6 +2426,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_              LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_SYSKEYDOWN");              // allow system keys, such as ALT-F4 to be processed by Windows              eat_keystroke = FALSE; +            break;          }          case WM_KEYDOWN:          { diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index d3a05c34c0..638a0f4e15 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -215,6 +215,11 @@ void main()      float final_alpha = diffuse_linear.a;  #ifdef USE_VERTEX_COLOR +    if (vertex_color.a <= 0.0) +    { // TODO: figure out how to get invisible faces out of  +        // render batches without breaking glow +        discard; +    }      final_alpha *= vertex_color.a;      diffuse_srgb.rgb *= vertex_color.rgb;      diffuse_linear.rgb = srgb_to_linear(diffuse_srgb.rgb); @@ -308,7 +313,7 @@ vec3 post_atmo = color.rgb;  #endif // WATER_FOG  #endif -     +      frag_color = color;  } diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index ca83afb5ab..140b9e6f36 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -82,7 +82,15 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoGetCoro(std::string url, U64      LLSD result = httpAdapter->getAndSuspend(httpRequest, url); -    LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    LLWorld *world_inst = LLWorld::getInstance(); +    if (!world_inst) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight info received but world no longer exists " +            << regionHandle << LL_ENDL; +        return; +    } + +    LLViewerRegion * regionp = world_inst->getRegionFromHandle(regionHandle);      if (!regionp)      {          LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight info received but region not found for "  @@ -183,7 +191,15 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U          httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("AvatarRenderInfoAccountant", httpPolicy));      LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); -    LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    LLWorld *world_inst = LLWorld::getInstance(); +    if (!world_inst) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight calculation but world no longer exists " +            << regionHandle << LL_ENDL; +        return; +    } + +    LLViewerRegion * regionp = world_inst->getRegionFromHandle(regionHandle);      if (!regionp)      {          LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight calculation but region not found for " @@ -239,9 +255,18 @@ void LLAvatarRenderInfoAccountant::avatarRenderInfoReportCoro(std::string url, U      report[KEY_AGENTS] = agents;      regionp = NULL; +    world_inst = NULL;      LLSD result = httpAdapter->postAndSuspend(httpRequest, url, report); -    regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +    world_inst = LLWorld::getInstance(); +    if (!world_inst) +    { +        LL_WARNS("AvatarRenderInfoAccountant") << "Avatar render weight POST result but world no longer exists " +            << regionHandle << LL_ENDL; +        return; +    } + +    regionp = world_inst->getRegionFromHandle(regionHandle);      if (!regionp)      {          LL_INFOS("AvatarRenderInfoAccountant") << "Avatar render weight POST result received but region not found for " diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index c110e0d815..cdf82c77c1 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -752,7 +752,7 @@ public:  		if ( chat.mSourceType == CHAT_SOURCE_OBJECT)  		{  			std::string slurl = args["slurl"].asString(); -			if (slurl.empty()) +			if (slurl.empty() && LLWorld::instanceExists())  			{  				LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);  				if(region) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 2bf8e9b911..5656eb1471 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -228,8 +228,8 @@ void LLDrawPoolAlpha::forwardRender(bool rigged)      //enable writing to alpha for emissive effects      gGL.setColorMask(true, true); -    bool write_depth = rigged -        || LLDrawPoolWater::sSkipScreenCopy +    bool write_depth = rigged ||  +        LLDrawPoolWater::sSkipScreenCopy          // we want depth written so that rendered alpha will          // contribute to the alpha mask used for impostors          || LLPipeline::sImpostorRenderAlphaDepthPass; @@ -484,6 +484,7 @@ void LLDrawPoolAlpha::renderEmissives(U32 mask, std::vector<LLDrawInfo*>& emissi  void LLDrawPoolAlpha::renderRiggedEmissives(U32 mask, std::vector<LLDrawInfo*>& emissives)  { +    LLGLDepthTest depth(GL_TRUE, GL_FALSE); //disable depth writes since "emissive" is additive so sorting doesn't matter      LLGLSLShader* shader = emissive_shader->mRiggedVariant;      shader->bind();      shader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, 1.f); diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 79f50f2273..aa00c9d052 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -143,7 +143,7 @@ public:  	LLViewerObject*	getViewerObject()	const	{ return mVObjp; }  	S32				getLOD()			const	{ return mVObjp.notNull() ? mVObjp->getLOD() : 0; }  	void			setPoolType(U32 type)		{ mPoolType = type; } -	S32				getTEOffset()				{ return mTEOffset; } +	S32				getTEOffset()       const   { return mTEOffset; }  	LLViewerTexture*	getTexture(U32 ch = LLRender::DIFFUSE_MAP) const;  	void			setViewerObject(LLViewerObject* object); @@ -233,6 +233,12 @@ public:  	void	notifyAboutCreatingTexture(LLViewerTexture *texture);  	void	notifyAboutMissingAsset(LLViewerTexture *texture); +    // used to preserve draw order of faces that are batched together.  +    // Allows content creators to manipulate linked sets and face ordering  +    // for consistent alpha sorting results, particularly for rigged attachments +    void setDrawOrderIndex(U32 index) { mDrawOrderIndex = index; } +    U32 getDrawOrderIndex() const { return mDrawOrderIndex; } +  public: //aligned members  	LLVector4a		mExtents[2]; @@ -305,6 +311,7 @@ private:  	bool        mHasMedia ;  	bool        mIsMediaAllowed; +    U32 mDrawOrderIndex = 0; // see setDrawOrderIndex  protected:  	static BOOL	sSafeRenderSelect; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 94bafcb612..bb6ad5d8fb 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -310,6 +310,12 @@ void update_texture_fetch()  	LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread  	LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread  	gTextureList.updateImages(0.10f); + +    if (LLImageGLThread::sEnabled) +    { +        std::shared_ptr<LL::WorkQueue> main_queue = LL::WorkQueue::getInstance("mainloop"); +        main_queue->runFor(std::chrono::milliseconds(1)); +    }  }  void set_flags_and_update_appearance() @@ -1518,7 +1524,11 @@ bool idle_startup()  		display_startup();  		LL_DEBUGS("AppInit") << "Decoding images..." << LL_ENDL; -		// For all images pre-loaded into viewer cache, decode them. +		// For all images pre-loaded into viewer cache, init +        // priorities and fetching using decodeAllImages. +        // Most of the fetching and decoding likely to be done +        // by update_texture_fetch() later, while viewer waits. +        //  		// Need to do this AFTER we init the sky  		const S32 DECODE_TIME_SEC = 2;  		for (int i = 0; i < DECODE_TIME_SEC; i++) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 27fbf39673..501148a112 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -266,7 +266,14 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)              return;          } -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        LLWorld *world_inst = LLWorld::getInstance(); // Not a singleton! +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Attempting to get capabilities, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "Capabilities") << "Attempting to get capabilities for region that no longer exists!" << LL_ENDL; @@ -314,6 +321,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)          regionp = NULL;          impl = NULL; +        world_inst = NULL;          result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames);          if (STATE_WORLD_INIT > LLStartUp::getStartupState()) @@ -327,7 +335,14 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)              return;          } -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        world_inst = LLWorld::getInstance(); +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Received capabilities, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "Capabilities") << "Received capabilities for region that no longer exists!" << LL_ENDL; @@ -411,7 +426,14 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)      // This loop is used for retrying a capabilities request.      do      { -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        LLWorld *world_inst = LLWorld::getInstance(); // Not a singleton! +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Attempting to get capabilities, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "Capabilities") << "Attempting to get capabilities for region that no longer exists!" << LL_ENDL; @@ -434,6 +456,7 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)          LL_INFOS("AppInit", "Capabilities") << "Requesting second Seed from " << url << " for region " << regionp->getRegionID() << LL_ENDL;          regionp = NULL; +        world_inst = NULL;          result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames);          LLSD httpResults = result["http_result"]; @@ -449,7 +472,14 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCompleteCoro(U64 regionHandle)              break;          } -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        world_inst = LLWorld::getInstance(); +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Received capabilities, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "Capabilities") << "Received capabilities for region that no longer exists!" << LL_ENDL; @@ -533,7 +563,14 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region              break;          } -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        LLWorld *world_inst = LLWorld::getInstance(); // Not a singleton! +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Attempting to request Sim Feature, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "SimulatorFeatures") << "Attempting to request Sim Feature for region that no longer exists!" << LL_ENDL; @@ -541,6 +578,7 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region          }          regionp = NULL; +        world_inst = NULL;          LLSD result = httpAdapter->getAndSuspend(httpRequest, url);          LLSD httpResults = result["http_result"]; @@ -559,7 +597,14 @@ void LLViewerRegionImpl::requestSimulatorFeatureCoro(std::string url, U64 region          // remove the http_result from the llsd          result.erase("http_result"); -        regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle); +        world_inst = LLWorld::getInstance(); +        if (!world_inst) +        { +            LL_WARNS("AppInit", "Capabilities") << "Attempting to request Sim Feature, but world no longer exists!" << LL_ENDL; +            return; +        } + +        regionp = world_inst->getRegionFromHandle(regionHandle);          if (!regionp) //region was removed          {              LL_WARNS("AppInit", "SimulatorFeatures") << "Attempting to set Sim Feature for region that no longer exists!" << LL_ENDL; @@ -2092,7 +2137,14 @@ public:  		const LLSD& input) const  	{  		LLHost host(input["sender"].asString()); -		LLViewerRegion* region = LLWorld::getInstance()->getRegion(host); + +        LLWorld *world_inst = LLWorld::getInstance(); // Not a singleton! +        if (!world_inst) +        { +            return; +        } + +		LLViewerRegion* region = world_inst->getRegion(host);  		if( !region )  		{  			return; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 57a3d011d5..9d6cfbce7c 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -392,8 +392,12 @@ void update_statistics()  	gTransferManager.resetTransferBitsIn(LLTCT_ASSET);  	sample(LLStatViewer::VISIBLE_AVATARS, LLVOAvatar::sNumVisibleAvatars); -	LLWorld::getInstance()->updateNetStats(); -	LLWorld::getInstance()->requestCacheMisses(); +    LLWorld *world = LLWorld::getInstance(); // not LLSingleton +    if (world) +    { +        world->updateNetStats(); +        world->requestCacheMisses(); +    }  	// Reset all of these values.  	gVLManager.resetBitCounts(); diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 94a91d4a72..e0b778af59 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1222,6 +1222,7 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)  		LLViewerFetchedTexture* imagep = *iter++;  		imagep->updateFetch();  	} +    std::shared_ptr<LL::WorkQueue> main_queue = LLImageGLThread::sEnabled ? LL::WorkQueue::getInstance("mainloop") : NULL;  	// Run threads  	S32 fetch_pending = 0;  	while (1) @@ -1229,6 +1230,13 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)  		LLAppViewer::instance()->getTextureCache()->update(1); // unpauses the texture cache thread  		LLAppViewer::instance()->getImageDecodeThread()->update(1); // unpauses the image thread  		fetch_pending = LLAppViewer::instance()->getTextureFetch()->update(1); // unpauses the texture fetch thread + +        if (LLImageGLThread::sEnabled) +        { +            main_queue->runFor(std::chrono::milliseconds(1)); +            fetch_pending += main_queue->size(); +        } +  		if (fetch_pending == 0 || timer.getElapsedTimeF32() > max_time)  		{  			break; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index f8728a5ab7..f18f6b1116 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5467,6 +5467,7 @@ static inline void add_face(T*** list, U32* count, T* face)      {          if (count[1] < MAX_FACE_COUNT)          { +            face->setDrawOrderIndex(count[1]);              list[1][count[1]++] = face;          }      } @@ -5474,6 +5475,7 @@ static inline void add_face(T*** list, U32* count, T* face)      {          if (count[0] < MAX_FACE_COUNT)          { +            face->setDrawOrderIndex(count[0]);              list[0][count[0]++] = face;          }      } @@ -6088,7 +6090,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  	}   } -struct CompareBatchBreakerModified +struct CompareBatchBreaker  {  	bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)  	{ @@ -6103,18 +6105,23 @@ struct CompareBatchBreakerModified  		{  			return lte->getFullbright() < rte->getFullbright();  		} -		else if (LLPipeline::sRenderDeferred && lte->getMaterialParams() != rte->getMaterialParams()) -		{ -			return lte->getMaterialParams() < rte->getMaterialParams(); -		} -		else if (LLPipeline::sRenderDeferred && (lte->getMaterialParams() == rte->getMaterialParams()) && (lte->getShiny() != rte->getShiny())) +        else if (LLPipeline::sRenderDeferred && lte->getMaterialID() != rte->getMaterialID()) +        { +            return lte->getMaterialID() < rte->getMaterialID(); +        } +		else if (lte->getShiny() != rte->getShiny())  		{  			return lte->getShiny() < rte->getShiny();  		} -		else +        else if (lhs->getTexture() != rhs->getTexture())  		{  			return lhs->getTexture() < rhs->getTexture();  		} +        else  +        { +            // all else being equal, maintain consistent draw order +            return lhs->getDrawOrderIndex() < rhs->getDrawOrderIndex(); +        }  	}  }; @@ -6122,9 +6129,6 @@ struct CompareBatchBreakerRigged  {      bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)      { -        const LLTextureEntry* lte = lhs->getTextureEntry(); -        const LLTextureEntry* rte = rhs->getTextureEntry(); -          if (lhs->mAvatar != rhs->mAvatar)          {              return lhs->mAvatar < rhs->mAvatar; @@ -6133,23 +6137,12 @@ struct CompareBatchBreakerRigged          {              return lhs->mSkinInfo->mHash < rhs->mSkinInfo->mHash;          } -        else if (lhs->getTexture() != rhs->getTexture()) -        { -            return lhs->getTexture() < rhs->getTexture(); -        } -        else if (lte->getBumpmap() != rte->getBumpmap()) -        { -            return lte->getBumpmap() < rte->getBumpmap(); -        } -        else if (LLPipeline::sRenderDeferred && lte->getMaterialID() != rte->getMaterialID()) -        { -            return lte->getMaterialID() < rte->getMaterialID(); -        } -        else // if (LLPipeline::sRenderDeferred && (lte->getMaterialParams() == rte->getMaterialParams()) && (lte->getShiny() != rte->getShiny())) +        else          { -            return lte->getShiny() < rte->getShiny(); +            // "inherit" non-rigged behavior +            CompareBatchBreaker comp; +            return comp(lhs, rhs);          } -              }  }; @@ -6198,7 +6191,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace          else if (!distance_sort)          {              //sort faces by things that break batches, not including avatar and mesh id -            std::sort(faces, faces + face_count, CompareBatchBreakerModified()); +            std::sort(faces, faces + face_count, CompareBatchBreaker());          }  		else  		{ | 
