diff options
| -rwxr-xr-x | doc/contributions.txt | 1 | ||||
| -rw-r--r-- | indra/edit-me-to-trigger-new-build.txt | 1 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterial.cpp | 40 | ||||
| -rw-r--r-- | indra/llprimitive/llmaterial.h | 11 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 10 | ||||
| -rw-r--r-- | indra/llrender/llshadermgr.cpp | 60 | ||||
| -rw-r--r-- | indra/newview/VIEWER_VERSION.txt | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 40 | ||||
| -rw-r--r-- | indra/newview/llconversationmodel.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llconversationview.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfloaterimcontainer.cpp | 69 | ||||
| -rw-r--r-- | indra/newview/llfloaterimcontainer.h | 5 | ||||
| -rw-r--r-- | indra/newview/llfloaterimsessiontab.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 191 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.h | 24 | ||||
| -rw-r--r-- | indra/newview/llvosky.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 254 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 20 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 6 | 
22 files changed, 444 insertions, 329 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 92d97c1ff8..6a23e8093c 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1360,6 +1360,7 @@ Sovereign Engineer  	SL-14707  	SL-14731  	SL-14732 +	SL-15096  SpacedOut Frye  	VWR-34  	VWR-45 diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 0cad6370a9..5366987cff 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,2 +1,3 @@  euclid 5/29/2020  euclid 7/23/2020 +euclid 4/29/2021
\ No newline at end of file diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp index a1bfc4edd9..a219ac1450 100644 --- a/indra/llprimitive/llmaterial.cpp +++ b/indra/llprimitive/llmaterial.cpp @@ -28,8 +28,6 @@  #include "llmaterial.h" -#include "../llrender/llglheaders.h" -  /**   * Materials cap parameters   */ @@ -107,8 +105,6 @@ LLMaterial::LLMaterial()      , mSpecularLightExponent(LLMaterial::DEFAULT_SPECULAR_LIGHT_EXPONENT)      , mEnvironmentIntensity(LLMaterial::DEFAULT_ENV_INTENSITY)      , mDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) -    , mDiffuseFormatPrimary(GL_RGBA) -    , mDiffuseBaked(false)      , mAlphaMaskCutoff(0)  {  } @@ -315,20 +311,6 @@ void LLMaterial::setEnvironmentIntensity(U8 intensity)      mEnvironmentIntensity = intensity;  } -U8 LLMaterial::getDiffuseAlphaModeRender() const -{ -    if (mDiffuseBaked -        || mDiffuseFormatPrimary == GL_RGBA -        || mDiffuseFormatPrimary == GL_ALPHA) -    { -        return mDiffuseAlphaMode; -    } -    else -    { -        return DIFFUSE_ALPHA_MODE_NONE; -    } -} -  U8 LLMaterial::getDiffuseAlphaMode() const  {      return mDiffuseAlphaMode; @@ -339,26 +321,6 @@ void LLMaterial::setDiffuseAlphaMode(U8 alpha_mode)      mDiffuseAlphaMode = alpha_mode;  } -U32 LLMaterial::getDiffuseFormatPrimary() const -{ -    return mDiffuseFormatPrimary; -} - -void LLMaterial::setDiffuseFormatPrimary(U32 format_primary) -{ -    mDiffuseFormatPrimary = format_primary; -} - -bool LLMaterial::getIsDiffuseBaked() const -{ -    return mDiffuseBaked; -} - -void LLMaterial::setDiffuseBaked(bool baked) -{ -    mDiffuseBaked = baked; -} -  U8 LLMaterial::getAlphaMaskCutoff() const  {      return mAlphaMaskCutoff; @@ -475,7 +437,7 @@ U32 LLMaterial::getShaderMask(U32 alpha_mode)      }      else      { -        ret = getDiffuseAlphaModeRender(); +        ret = getDiffuseAlphaMode();      }      llassert(ret < SHADER_COUNT); diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h index 1207917568..d58b7ee812 100644 --- a/indra/llprimitive/llmaterial.h +++ b/indra/llprimitive/llmaterial.h @@ -115,17 +115,8 @@ public:      void        setSpecularLightExponent(U8 exponent);      U8          getEnvironmentIntensity() const;      void        setEnvironmentIntensity(U8 intensity); - -    // getDiffuseAlphaModeRender takes into account if image supports alpha -    // and returns value apropriate for render -    // getDiffuseAlphaMode() returns value as is -    U8          getDiffuseAlphaModeRender() const;      U8          getDiffuseAlphaMode() const;      void        setDiffuseAlphaMode(U8 alpha_mode); -    U32         getDiffuseFormatPrimary() const; -    void        setDiffuseFormatPrimary(U32 format_primary); -    bool        getIsDiffuseBaked() const; -    void        setDiffuseBaked(bool baked);      U8          getAlphaMaskCutoff() const;      void        setAlphaMaskCutoff(U8 cutoff); @@ -156,8 +147,6 @@ protected:      U8          mSpecularLightExponent;      U8          mEnvironmentIntensity;      U8          mDiffuseAlphaMode; -    U32         mDiffuseFormatPrimary; // value from texture, LLGLenum, is not included in fromLLSD/asLLSD -    bool        mDiffuseBaked; // is not included in fromLLSD/asLLSD      U8          mAlphaMaskCutoff;  }; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index d669e7134c..42b8c35442 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -411,10 +411,18 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,      mLightHash = 0xFFFFFFFF;      llassert_always(!mShaderFiles.empty()); -    BOOL success = TRUE;      // Create program      mProgramObject = glCreateProgramObjectARB(); +    if (mProgramObject == 0) +    { +        // Shouldn't happen if shader related extensions, like ARB_vertex_shader, exist. +        LL_SHADER_LOADING_WARNS() << "Failed to create handle for shader: " << mName << LL_ENDL; +        unloadInternal(); +        return FALSE; +    } + +    BOOL success = TRUE;  #if LL_DARWIN      // work-around missing mix(vec3,vec3,bvec3) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 236ebbd78f..e8c6295930 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -611,13 +611,11 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  #endif  	GLenum error = GL_NO_ERROR; -	if (gDebugGL) + +	error = glGetError(); +	if (error != GL_NO_ERROR)  	{ -		error = glGetError(); -		if (error != GL_NO_ERROR) -		{ -			LL_SHADER_LOADING_WARNS() << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL; -		} +		LL_SHADER_LOADING_WARNS() << "GL ERROR entering loadShaderFile(): " << error << " for file: " << filename << LL_ENDL;  	}  	if (filename.empty())  @@ -966,55 +964,45 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade  	//create shader object  	GLhandleARB ret = glCreateShaderObjectARB(type); -	if (gDebugGL) + +	error = glGetError(); +	if (error != GL_NO_ERROR)  	{ -		error = glGetError(); -		if (error != GL_NO_ERROR) -		{ -			LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL; -		} +		LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << " for file: " << open_file_name << LL_ENDL;  	} -	 +  	//load source  	glShaderSourceARB(ret, shader_code_count, (const GLcharARB**) shader_code_text, NULL); -	if (gDebugGL) +	error = glGetError(); +	if (error != GL_NO_ERROR)  	{ -		error = glGetError(); -		if (error != GL_NO_ERROR) -		{ -			LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << LL_ENDL; -		} +		LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << " for file: " << open_file_name << LL_ENDL;  	}  	//compile source  	glCompileShaderARB(ret); -	if (gDebugGL) +	error = glGetError(); +	if (error != GL_NO_ERROR)  	{ -		error = glGetError(); -		if (error != GL_NO_ERROR) -		{ -			LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL; -		} +		LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << " for file: " << open_file_name << LL_ENDL;  	} -		 +  	if (error == GL_NO_ERROR)  	{  		//check for errors  		GLint success = GL_TRUE;  		glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success); -		if (gDebugGL || success == GL_FALSE) + +		error = glGetError(); +		if (error != GL_NO_ERROR || success == GL_FALSE)   		{ -			error = glGetError(); -			if (error != GL_NO_ERROR || success == GL_FALSE)  -			{ -				//an error occured, print log -				LL_WARNS("ShaderLoading") << "GLSL Compilation Error:" << LL_ENDL; -				dumpObjectLog(ret, TRUE, open_file_name); -                dumpShaderSource(shader_code_count, shader_code_text); -				ret = 0; -			} +			//an error occured, print log +			LL_WARNS("ShaderLoading") << "GLSL Compilation Error:" << LL_ENDL; +			dumpObjectLog(ret, TRUE, open_file_name); +			dumpShaderSource(shader_code_count, shader_code_text); +			ret = 0;  		}  	}  	else diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 427dc381ad..e786022da5 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.4.19 +6.4.20 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index a8f44e2b81..76f9aa9dee 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1098,6 +1098,46 @@ bool LLAppViewer::init()  		}  	} +#if LL_WINDOWS && ADDRESS_SIZE == 64 +    if (gGLManager.mIsIntel) +    { +        // Check intel driver's version +        // Ex: "3.1.0 - Build 8.15.10.2559"; +        std::string version = ll_safe_string((const char *)glGetString(GL_VERSION)); + +        const boost::regex is_intel_string("[0-9].[0-9].[0-9] - Build [0-9]{1,2}.[0-9]{2}.[0-9]{2}.[0-9]{4}"); + +        if (boost::regex_search(version, is_intel_string)) +        { +            // Valid string, extract driver version +            std::size_t found = version.find("Build "); +            std::string driver = version.substr(found + 6); +            S32 v1, v2, v3, v4; +            S32 count = sscanf(driver.c_str(), "%d.%d.%d.%d", &v1, &v2, &v3, &v4); +            if (count > 0 && v1 <= 10) +            { +                LL_INFOS("AppInit") << "Detected obsolete intel driver: " << driver << LL_ENDL; +                LLUIString details = LLNotifications::instance().getGlobalString("UnsupportedIntelDriver"); +                std::string gpu_name = ll_safe_string((const char *)glGetString(GL_RENDERER)); +                details.setArg("[VERSION]", driver); +                details.setArg("[GPUNAME]", gpu_name); +                S32 button = OSMessageBox(details.getString(), +                                          LLStringUtil::null, +                                          OSMB_YESNO); +                if (OSBTN_YES == button && gViewerWindow) +                { +                    std::string url = LLWeb::escapeURL(LLTrans::getString("IntelDriverPage")); +                    if (gViewerWindow->getWindow()) +                    { +                        gViewerWindow->getWindow()->spawnWebBrowser(url, false); +                    } +                } +            } +        } +    } +#endif + +    // Obsolete? mExpectedGLVersion is always zero  #if LL_WINDOWS  	if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())  	{ diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 4cfde21e32..a685639427 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -380,7 +380,7 @@ LLConversationItemParticipant* LLConversationItemSession::findParticipant(const  	for (iter = mChildren.begin(); iter != mChildren.end(); iter++)  	{  		participant = dynamic_cast<LLConversationItemParticipant*>(*iter); -		if (participant->hasSameValue(participant_id)) +		if (participant && participant->hasSameValue(participant_id))  		{  			break;  		} @@ -491,7 +491,7 @@ const bool LLConversationItemSession::getTime(F64& time) const  	{  		participant = dynamic_cast<LLConversationItemParticipant*>(*iter);  		F64 participant_time; -		if (participant->getTime(participant_time)) +		if (participant && participant->getTime(participant_time))  		{  			has_time = true;  			most_recent_time = llmax(most_recent_time,participant_time); diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index df16868132..65cec68884 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -696,10 +696,13 @@ void LLConversationViewParticipant::refresh()  {  	// Refresh the participant view from its model data  	LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); -	participant_model->resetRefresh(); -	 -	// *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat -	mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); +    if (participant_model) +    { +        participant_model->resetRefresh(); + +        // *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat +        mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); +    }  	// Do the regular upstream refresh  	LLFolderViewItem::refresh(); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 55b3864b6d..687b13d2c8 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -2129,7 +2129,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)              if (mat)              {                 -                switch (LLMaterial::eDiffuseAlphaMode(mat->getDiffuseAlphaModeRender())) +                switch (LLMaterial::eDiffuseAlphaMode(mat->getDiffuseAlphaMode()))                  {                      case LLMaterial::DIFFUSE_ALPHA_MODE_MASK:                      { @@ -2267,7 +2267,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  				sVertexProgram->uniform4f(LLShaderMgr::SPECULAR_COLOR, col.mV[0], col.mV[1], col.mV[2], spec);  				sVertexProgram->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, env); -				if (mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +				if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  				{                      F32 cutoff = mat->getAlphaMaskCutoff()/255.f;  					sVertexProgram->setMinimumAlpha(cutoff); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 01d8b6775b..4a802ad9aa 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1165,7 +1165,7 @@ bool LLFace::canRenderAsMask()  	}  	LLMaterial* mat = te->getMaterialParams(); -	if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) +	if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)  	{  		return false;  	} @@ -1412,7 +1412,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,  			}  			else  			{ -				if (!mat || mat->getDiffuseAlphaModeRender() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +				if (!mat || mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  				{  					shiny_in_alpha = true;  				} diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 8d38a5743b..9c84fa1991 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -59,7 +59,9 @@  #include "boost/foreach.hpp" -const S32 EVENTS_PER_IDLE_LOOP = 100; +const S32 EVENTS_PER_IDLE_LOOP_CURRENT_SESSION = 80; +const S32 EVENTS_PER_IDLE_LOOP_BACKGROUND = 40; +const F32 EVENTS_PER_IDLE_LOOP_MIN_PERCENTAGE = 0.01f; // process a minimum of 1% of total events per frame  //  // LLFloaterIMContainer @@ -426,8 +428,11 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate()  		while (current_participant_model != end_participant_model)  		{  			LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); -			// Get the avatar name for this participant id from the cache and update the model -			participant_model->updateName(); +            if (participant_model) +            { +                // Get the avatar name for this participant id from the cache and update the model +                participant_model->updateName(); +            }  			// Next participant  			current_participant_model++;  		} @@ -474,8 +479,11 @@ void LLFloaterIMContainer::idleUpdate()                  while (current_participant_model != end_participant_model)                  {                      LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); -                    participant_model->setModeratorOptionsVisible(is_moderator); -                    participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); +                    if (participant_model) +                    { +                        participant_model->setModeratorOptionsVisible(is_moderator); +                        participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); +                    }                      current_participant_model++;                  } @@ -508,20 +516,49 @@ void LLFloaterIMContainer::idleUpdate()  void LLFloaterIMContainer::idleProcessEvents()  { -	if (!mConversationEventQueue.empty()) -	{ -		S32 events_to_handle = llmin((S32)mConversationEventQueue.size(), EVENTS_PER_IDLE_LOOP); -		for (S32 i = 0; i < events_to_handle; i++) -		{ -			handleConversationModelEvent(mConversationEventQueue.back()); -			mConversationEventQueue.pop_back(); -		} -	} +    LLUUID current_session_id = getSelectedSession(); +    conversations_items_deque::iterator iter = mConversationEventQueue.begin(); +    conversations_items_deque::iterator end = mConversationEventQueue.end(); +    while (iter != end) +    { +        std::deque<LLSD> &events = iter->second; +        if (!events.empty()) +        { +            S32 events_to_handle; +            S32 query_size = (S32)events.size(); +            if (current_session_id == iter->first) +            { +                events_to_handle = EVENTS_PER_IDLE_LOOP_CURRENT_SESSION; +            } +            else +            { +                events_to_handle = EVENTS_PER_IDLE_LOOP_BACKGROUND; +            } + +            if (events_to_handle <= query_size) +            { +                // Some groups can be very large and can generate huge amount of updates, scale processing up to keep up +                events_to_handle = llmax(events_to_handle, (S32)(query_size * EVENTS_PER_IDLE_LOOP_MIN_PERCENTAGE)); +            } +            else +            { +                events_to_handle = query_size; +            } + +            for (S32 i = 0; i < events_to_handle; i++) +            { +                handleConversationModelEvent(events.back()); +                events.pop_back(); +            } +        } +        iter++; +    }  }  bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)  { -	mConversationEventQueue.push_front(event); +	LLUUID id = event.get("session_uuid").asUUID(); +	mConversationEventQueue[id].push_front(event);  	return true;  } @@ -1834,6 +1871,8 @@ bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool c  	// Suppress the conversation items and widgets from their respective maps  	mConversationsItems.erase(uuid);  	mConversationsWidgets.erase(uuid); +	// Clear event query (otherwise reopening session in some way can bombard session with stale data) +	mConversationEventQueue.erase(uuid);  	// Don't let the focus fall IW, select and refocus on the first conversation in the list  	if (change_focus) diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 468b47f1f1..b4a9d377ab 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -229,9 +229,10 @@ private:  	conversations_widgets_map mConversationsWidgets;  	LLConversationViewModel mConversationViewModel;  	LLFolderView* mConversationsRoot; -	LLEventStream mConversationsEventStream;  +	LLEventStream mConversationsEventStream; -	std::deque<LLSD> mConversationEventQueue; +	typedef std::map<LLUUID, std::deque<LLSD> > conversations_items_deque; +	conversations_items_deque mConversationEventQueue;  	LLTimer mParticipantRefreshTimer;  }; diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index e7f428c06a..7541bb5efe 100644 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -497,7 +497,10 @@ void LLFloaterIMSessionTab::buildConversationViewParticipant()  	while (current_participant_model != end_participant_model)  	{  		LLConversationItem* participant_model = dynamic_cast<LLConversationItem*>(*current_participant_model); -		addConversationViewParticipant(participant_model); +        if (participant_model) +        { +            addConversationViewParticipant(participant_model); +        }  		current_participant_model++;  	}  } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 395dd0495f..b88baf6aa7 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4880,78 +4880,22 @@ void LLViewerObject::refreshBakeTexture()  	}  } -void LLViewerObject::updateDiffuseMatParams(const U8 te, LLMaterial* mat, LLViewerTexture *imagep, bool baked_texture) -{ -    // Objects getting non-alpha texture and alpha mask can result in graphical bugs, like white or red alphas. -    // To resolve the issue this function provides image format to material and based on format material's -    // getDiffuseAlphaModeRender() function will decide what value to provide to render -    // -    // Unfortunately LLMaterial has no access to diffuse image, so we have to set this data in LLViewerObject -    // regardles of object being used/seen or frequency of image-updates. -    mat->setDiffuseBaked(baked_texture); - -    if (!baked_texture) -    { -        if (imagep->isMissingAsset()) -        { -            mat->setDiffuseFormatPrimary(0); -        } -        else if (0 == imagep->getPrimaryFormat()) -        { -            // We don't have information about this texture, wait for it -            mWaitingTextureInfo.insert(uuid_material_mmap_t::value_type(imagep->getID(), material_info(LLRender::DIFFUSE_MAP, te))); -            // Temporary assume RGBA image -            mat->setDiffuseFormatPrimary(GL_RGBA); -        } -        else -        { -            mat->setDiffuseFormatPrimary(imagep->getPrimaryFormat()); -        } -    } -} - -S32 LLViewerObject::setDiffuseImageAndParams(const U8 te, LLViewerTexture *imagep) -{ -    LLUUID new_id = imagep->getID(); -    S32 retval = LLPrimitive::setTETexture(te, new_id); - -    LLTextureEntry* tep = getTE(te); -    LLUUID old_image_id = tep->getID(); - -    LLViewerTexture* baked_texture = getBakedTextureForMagicId(new_id); -    mTEImages[te] = baked_texture ? baked_texture : imagep; -    updateAvatarMeshVisibility(new_id, old_image_id); - -    LLMaterial* mat = tep->getMaterialParams(); -    if (mat) -    { -        // Don't update format from texture (and don't shedule one) if material has no alpha mode set, -        // just assume RGBA format, format will get updated with setTEMaterialParams call if mode changes -        if (mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_NONE) -        { -            bool baked = baked_texture != NULL; -            updateDiffuseMatParams(te, mat, imagep, baked); -        } -        else -        { -            mat->setDiffuseFormatPrimary(GL_RGBA); -        } -    } - -    setChanged(TEXTURE); -    if (mDrawable.notNull()) -    { -        gPipeline.markTextured(mDrawable); -    } - -    return retval; -} -  void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)  {  	if (mTEImages[te] != imagep)  	{ -        setDiffuseImageAndParams(te, imagep); +		LLUUID old_image_id = getTE(te) ? getTE(te)->getID() : LLUUID::null; +		 +		LLPrimitive::setTETexture(te, imagep->getID()); + +		LLViewerTexture* baked_texture = getBakedTextureForMagicId(imagep->getID()); +		mTEImages[te] = baked_texture ? baked_texture : imagep; +		updateAvatarMeshVisibility(imagep->getID(), old_image_id); +		setChanged(TEXTURE); +		if (mDrawable.notNull()) +		{ +			gPipeline.markTextured(mDrawable); +		}  	}  } @@ -4963,7 +4907,15 @@ S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image)  	if (uuid != getTE(te)->getID() ||  		uuid == LLUUID::null)  	{ -		retval = setDiffuseImageAndParams(te, image); +		retval = LLPrimitive::setTETexture(te, uuid); +		LLViewerTexture* baked_texture = getBakedTextureForMagicId(uuid); +		mTEImages[te] = baked_texture ? baked_texture : image; +		updateAvatarMeshVisibility(uuid,old_image_id); +		setChanged(TEXTURE); +		if (mDrawable.notNull()) +		{ +			gPipeline.markTextured(mDrawable); +		}  	}  	return retval;  } @@ -5258,29 +5210,6 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri  		return 0;  	} -    if (pMaterialParams.notNull() -        && pMaterialParams->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_NONE) -    { -        // Don't update if no alpha is set. If alpha changes, this function will run again, -        // no point in sheduling additional texture callbacks (in updateDiffuseMatParams) -        LLTextureEntry* tex_entry = getTE(te); -        bool is_baked = tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID()); - -        LLViewerTexture *img_diffuse = getTEImage(te); -        llassert(NULL != img_diffuse); - -        if (NULL != img_diffuse) -        { -            // Will modify alpha mask provided to renderer to fit image -            updateDiffuseMatParams(te, pMaterialParams.get(), img_diffuse, is_baked); -        } -        else -        { -            LLMaterial *mat = pMaterialParams.get(); // to avoid const -            mat->setDiffuseFormatPrimary(0); -        } -    } -  	retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);  	LL_DEBUGS("Material") << "Changing material params for te " << (S32)te  							<< ", object " << mID @@ -5293,84 +5222,6 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri  	return retval;  } -bool LLViewerObject::notifyAboutCreatingTexture(LLViewerTexture *texture) -{ -    // Confirmation about texture creation, check wait-list -    // and make changes, or return false - -    std::pair<uuid_material_mmap_t::iterator, uuid_material_mmap_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID()); - -    bool refresh_materials = false; - -    // RGB textures without alpha channels won't work right with alpha, -    // we provide format to material for material to decide when to drop alpha -    for (uuid_material_mmap_t::iterator range_it = range.first; range_it != range.second; ++range_it) -    { -        LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); -        if (cur_material.notNull() -            && LLRender::DIFFUSE_MAP == range_it->second.map) -        { -            U32 format = texture->getPrimaryFormat(); -            if (format != cur_material->getDiffuseFormatPrimary()) -            { -                cur_material->setDiffuseFormatPrimary(format); -                refresh_materials = true; -            } -        } -    } //for - -    if (refresh_materials) -    { -        LLViewerObject::refreshMaterials(); -    } - -    //clear wait-list -    mWaitingTextureInfo.erase(range.first, range.second); - -    return refresh_materials; -} - -bool LLViewerObject::notifyAboutMissingAsset(LLViewerTexture *texture) -{ -    // When waiting information about texture it turned out to be missing. -    // Confirm the state, update values accordingly -    std::pair<uuid_material_mmap_t::iterator, uuid_material_mmap_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID()); -    if (range.first == range.second) return false; - -    bool refresh_materials = false; - -    for (uuid_material_mmap_t::iterator range_it = range.first; range_it != range.second; ++range_it) -    { -        LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); -        if (cur_material.isNull()) -            continue; - -        if (range_it->second.map == LLRender::DIFFUSE_MAP) -        { -            LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); -            if (cur_material.notNull() -                && LLRender::DIFFUSE_MAP == range_it->second.map) -            { -                if (0 != cur_material->getDiffuseFormatPrimary()) -                { -                    cur_material->setDiffuseFormatPrimary(0); -                    refresh_materials = true; -                } -            } -        } -    } //for - -    if (refresh_materials) -    { -        LLViewerObject::refreshMaterials(); -    } - -    //clear wait-list -    mWaitingTextureInfo.erase(range.first, range.second); - -    return refresh_materials; -} -  void LLViewerObject::refreshMaterials()  {  	setChanged(TEXTURE); diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 9444c4f788..250c4ac328 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -768,12 +768,7 @@ protected:  	void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id, bool legacy);  	void deleteParticleSource();  	void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id); - -    // Helper function to modify alpha mask provided to render according to image (ex: RGB image will drop alpha mask) -    void updateDiffuseMatParams(const U8 te, LLMaterial* mat, LLViewerTexture *imagep, bool baked_texture); -    // Shared part of code from setTEImage and setTETextureCore -    S32 setDiffuseImageAndParams(const U8 te, LLViewerTexture *imagep); - +	  private:  	void setNameValueList(const std::string& list);		// clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string  	void deleteTEImages(); // correctly deletes list of images @@ -906,27 +901,10 @@ public:      LLJointRiggingInfoTab mJointRiggingInfoTab; -    bool notifyAboutCreatingTexture(LLViewerTexture *texture); -    bool notifyAboutMissingAsset(LLViewerTexture *texture); -  private:  	LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory.  	EObjectUpdateType	mLastUpdateType;  	BOOL	mLastUpdateCached; - -    struct material_info -    { -        LLRender::eTexIndex map; -        U8 te; - -        material_info(LLRender::eTexIndex map_, U8 te_) -            : map(map_) -            , te(te_) -        {} -    }; - -    typedef std::multimap<LLUUID, material_info> uuid_material_mmap_t; -    uuid_material_mmap_t mWaitingTextureInfo;  };  /////////////////// diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 2037aca7e9..878d7287ed 100644 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -209,14 +209,7 @@ void LLSkyTex::create()  void LLSkyTex::createGLImage(S32 which)  {	 -    if (mIsShiny) -    { -        mTexture[which]->setExplicitFormat(GL_RGBA8, GL_RGBA); -    } -    else -    { -        mTexture[which]->setExplicitFormat(GL_SRGB8_ALPHA8, GL_RGBA); -    } +	mTexture[which]->setExplicitFormat(GL_RGBA8, GL_RGBA);  	mTexture[which]->createGLTexture(0, mImageRaw[which], 0, TRUE, LLGLTexture::LOCAL);  	mTexture[which]->setAddressMode(LLTexUnit::TAM_CLAMP);  } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2d1a882a7e..3bdb8a2981 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2295,11 +2295,243 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)  	return res;  } +bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture) +{ //Ok, here we have confirmation about texture creation, check our wait-list +  //and make changes, or return false + +	std::pair<mmap_UUID_MAP_t::iterator, mmap_UUID_MAP_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID()); + +	typedef std::map<U8, LLMaterialPtr> map_te_material; +	map_te_material new_material; + +	for(mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it) +	{ +		LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); + +		//here we just interesting in DIFFUSE_MAP only! +		if(NULL != cur_material.get() && LLRender::DIFFUSE_MAP == range_it->second.map && GL_RGBA != texture->getPrimaryFormat()) +		{ //ok let's check the diffuse mode +			switch(cur_material->getDiffuseAlphaMode()) +			{ +			case LLMaterial::DIFFUSE_ALPHA_MODE_BLEND: +			case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE: +			case LLMaterial::DIFFUSE_ALPHA_MODE_MASK: +				{ //uups... we have non 32 bit texture with LLMaterial::DIFFUSE_ALPHA_MODE_* => LLMaterial::DIFFUSE_ALPHA_MODE_NONE + +					LLMaterialPtr mat = NULL; +					map_te_material::iterator it = new_material.find(range_it->second.te); +					if(new_material.end() == it) { +						mat = new LLMaterial(cur_material->asLLSD()); +						new_material.insert(map_te_material::value_type(range_it->second.te, mat)); +					} else { +						mat = it->second; +					} + +					mat->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); + +				} break; +			} //switch +		} //if +	} //for + +	//setup new materials +	for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) +	{ +		LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second); +		LLViewerObject::setTEMaterialParams(it->first, it->second); +	} + +	//clear wait-list +	mWaitingTextureInfo.erase(range.first, range.second); + +	return 0 != new_material.size(); +} + +bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture) +{ //Ok, here if we wait information about texture and it's missing +  //then depending from the texture map (diffuse, normal, or specular) +  //make changes in material and confirm it. If not return false. +	std::pair<mmap_UUID_MAP_t::iterator, mmap_UUID_MAP_t::iterator> range = mWaitingTextureInfo.equal_range(texture->getID()); +	if(range.first == range.second) return false; + +	typedef std::map<U8, LLMaterialPtr> map_te_material; +	map_te_material new_material; +	 +	for(mmap_UUID_MAP_t::iterator range_it = range.first; range_it != range.second; ++range_it) +	{ +		LLMaterialPtr cur_material = getTEMaterialParams(range_it->second.te); +		if (cur_material.isNull()) +			continue; + +		switch(range_it->second.map) +		{ +		case LLRender::DIFFUSE_MAP: +			{ +				if(LLMaterial::DIFFUSE_ALPHA_MODE_NONE != cur_material->getDiffuseAlphaMode()) +				{ //missing texture + !LLMaterial::DIFFUSE_ALPHA_MODE_NONE => LLMaterial::DIFFUSE_ALPHA_MODE_NONE +					LLMaterialPtr mat = NULL; +					map_te_material::iterator it = new_material.find(range_it->second.te); +					if(new_material.end() == it) { +						mat = new LLMaterial(cur_material->asLLSD()); +						new_material.insert(map_te_material::value_type(range_it->second.te, mat)); +					} else { +						mat = it->second; +					} + +					mat->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); +				} +			} break; +		case LLRender::NORMAL_MAP: +			{ //missing texture => reset material texture id +				LLMaterialPtr mat = NULL; +				map_te_material::iterator it = new_material.find(range_it->second.te); +				if(new_material.end() == it) { +					mat = new LLMaterial(cur_material->asLLSD()); +					new_material.insert(map_te_material::value_type(range_it->second.te, mat)); +				} else { +					mat = it->second; +				} + +				mat->setNormalID(LLUUID::null); +			} break; +		case LLRender::SPECULAR_MAP: +			{ //missing texture => reset material texture id +				LLMaterialPtr mat = NULL; +				map_te_material::iterator it = new_material.find(range_it->second.te); +				if(new_material.end() == it) { +					mat = new LLMaterial(cur_material->asLLSD()); +					new_material.insert(map_te_material::value_type(range_it->second.te, mat)); +				} else { +					mat = it->second; +				} + +				mat->setSpecularID(LLUUID::null); +			} break; +		case LLRender::NUM_TEXTURE_CHANNELS: +				//nothing to do, make compiler happy +			break; +		} //switch +	} //for + +	//setup new materials +	for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it) +	{ +		LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), it->second); +		LLViewerObject::setTEMaterialParams(it->first, it->second); +	} + +	//clear wait-list +	mWaitingTextureInfo.erase(range.first, range.second); + +	return 0 != new_material.size(); +} +  S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)  { -	S32 res = LLViewerObject::setTEMaterialParams(te, pMaterialParams); +	LLMaterialPtr pMaterial = const_cast<LLMaterialPtr&>(pMaterialParams); + +	if(pMaterialParams) +	{ //check all of them according to material settings + +		LLViewerTexture *img_diffuse = getTEImage(te); +		LLViewerTexture *img_normal = getTENormalMap(te); +		LLViewerTexture *img_specular = getTESpecularMap(te); + +		llassert(NULL != img_diffuse); + +		LLMaterialPtr new_material = NULL; + +		//diffuse +		if(NULL != img_diffuse) +		{ //guard +			if(0 == img_diffuse->getPrimaryFormat() && !img_diffuse->isMissingAsset()) +			{ //ok here we don't have information about texture, let's belief and leave material settings +			  //but we remember this case +				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(img_diffuse->getID(), material_info(LLRender::DIFFUSE_MAP, te))); +			} +			else +			{ +				bool bSetDiffuseNone = false; +				if(img_diffuse->isMissingAsset()) +				{ +					bSetDiffuseNone = true; +				} +				else +				{ +					switch(pMaterialParams->getDiffuseAlphaMode()) +					{ +					case LLMaterial::DIFFUSE_ALPHA_MODE_BLEND: +					case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE: +					case LLMaterial::DIFFUSE_ALPHA_MODE_MASK: +						{ //all of them modes available only for 32 bit textures +							LLTextureEntry* tex_entry = getTE(te); +							bool bIsBakedImageId = false; +							if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID())) +							{ +								bIsBakedImageId = true; +							} +							if (GL_RGBA != img_diffuse->getPrimaryFormat() && !bIsBakedImageId) +							{ +								bSetDiffuseNone = true; +							} +						} break; +					} +				} //else + + +				if(bSetDiffuseNone) +				{ //upps... we should substitute this material with LLMaterial::DIFFUSE_ALPHA_MODE_NONE +					new_material = new LLMaterial(pMaterialParams->asLLSD()); +					new_material->setDiffuseAlphaMode(LLMaterial::DIFFUSE_ALPHA_MODE_NONE); +				} +			} +		} + +		//normal +		if(LLUUID::null != pMaterialParams->getNormalID()) +		{ +			if(img_normal && img_normal->isMissingAsset() && img_normal->getID() == pMaterialParams->getNormalID()) +			{ +				if(!new_material) { +					new_material = new LLMaterial(pMaterialParams->asLLSD()); +				} +				new_material->setNormalID(LLUUID::null); +			} +			else if(NULL == img_normal || 0 == img_normal->getPrimaryFormat()) +			{ //ok here we don't have information about texture, let's belief and leave material settings +				//but we remember this case +				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(pMaterialParams->getNormalID(), material_info(LLRender::NORMAL_MAP,te))); +			} + +		} + + +		//specular +		if(LLUUID::null != pMaterialParams->getSpecularID()) +		{ +			if(img_specular && img_specular->isMissingAsset() && img_specular->getID() == pMaterialParams->getSpecularID()) +			{ +				if(!new_material) { +					new_material = new LLMaterial(pMaterialParams->asLLSD()); +				} +				new_material->setSpecularID(LLUUID::null); +			} +			else if(NULL == img_specular || 0 == img_specular->getPrimaryFormat()) +			{ //ok here we don't have information about texture, let's belief and leave material settings +				//but we remember this case +				mWaitingTextureInfo.insert(mmap_UUID_MAP_t::value_type(pMaterialParams->getSpecularID(), material_info(LLRender::SPECULAR_MAP, te))); +			} +		} + +		if(new_material) { +			pMaterial = new_material; +			LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), pMaterial); +		} +	} + +	S32 res = LLViewerObject::setTEMaterialParams(te, pMaterial); -	LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterialParams) ? pMaterialParams->asLLSD() : LLSD("null")) << " res " << res +	LL_DEBUGS("MaterialTEs") << "te " << (S32)te << " material " << ((pMaterial) ? pMaterial->asLLSD() : LLSD("null")) << " res " << res  							 << ( LLSelectMgr::getInstance()->getSelection()->contains(const_cast<LLVOVolume*>(this), te) ? " selected" : " not selected" )  							 << LL_ENDL;  	setChanged(ALL_CHANGED); @@ -4366,7 +4598,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&  					LLMaterial* mat = te->getMaterialParams();  					if (mat)  					{ -						U8 mode = mat->getDiffuseAlphaModeRender(); +						U8 mode = mat->getDiffuseAlphaMode();  						if (mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE  							|| mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE @@ -5012,7 +5244,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  			}  			draw_info->mAlphaMaskCutoff = mat->getAlphaMaskCutoff() * (1.f / 255.f); -			draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaModeRender(); +			draw_info->mDiffuseAlphaMode = mat->getDiffuseAlphaMode();  			draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTEOffset());  		}  		else  @@ -5374,7 +5606,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						if (mat && LLPipeline::sRenderDeferred)  						{ -							U8 alpha_mode = mat->getDiffuseAlphaModeRender(); +							U8 alpha_mode = mat->getDiffuseAlphaMode();  							bool is_alpha = type == LLDrawPool::POOL_ALPHA &&  								(alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND || @@ -5403,7 +5635,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  						else if (mat)  						{							  							bool is_alpha = type == LLDrawPool::POOL_ALPHA; -							U8 mode = mat->getDiffuseAlphaModeRender(); +							U8 mode = mat->getDiffuseAlphaMode();  							bool can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||  												mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE; @@ -6301,7 +6533,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  			bool can_be_shiny = true;  			if (mat)  			{ -				U8 mode = mat->getDiffuseAlphaModeRender(); +				U8 mode = mat->getDiffuseAlphaMode();  				can_be_shiny = mode == LLMaterial::DIFFUSE_ALPHA_MODE_NONE ||  								mode == LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE;  			} @@ -6323,7 +6555,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  				//  				if (te->getFullbright())  				{ -					if (mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +					if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  					{  						if (opaque)  						{ @@ -6408,7 +6640,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  			}  			else if (mat)  			{ -				U8 mode = mat->getDiffuseAlphaModeRender(); +				U8 mode = mat->getDiffuseAlphaMode();                  is_alpha = (is_alpha || (mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND)); @@ -6507,7 +6739,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  				}  				else if (fullbright || bake_sunlight)  				{ //fullbright -					if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +					if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  					{  						registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);  					} @@ -6529,7 +6761,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace  					else  					{ //all around simple  						llassert(mask & LLVertexBuffer::MAP_NORMAL); -						if (mat && mat->getDiffuseAlphaModeRender() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) +						if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)  						{ //material alpha mask can be respected in non-deferred  							registerFace(group, facep, LLRenderPass::PASS_ALPHA_MASK);  						} diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 97888ed869..ce400a3498 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -441,6 +441,26 @@ protected:  	static S32 sNumLODChanges;  	friend class LLVolumeImplFlexible; + +public: +	bool notifyAboutCreatingTexture(LLViewerTexture *texture); +	bool notifyAboutMissingAsset(LLViewerTexture *texture); + +private: +	struct material_info  +	{ +		LLRender::eTexIndex map; +		U8 te; + +		material_info(LLRender::eTexIndex map_, U8 te_) +			: map(map_) +			, te(te_) +		{} +	}; + +	typedef std::multimap<LLUUID, material_info> mmap_UUID_MAP_t; +	mmap_UUID_MAP_t	mWaitingTextureInfo; +  };  #endif // LL_LLVOVOLUME_H diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b5baa777bc..9924b02a95 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1668,7 +1668,7 @@ U32 LLPipeline::getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* ima  	if (alpha && mat)  	{ -		switch (mat->getDiffuseAlphaModeRender()) +		switch (mat->getDiffuseAlphaMode())  		{  			case 1:  				alpha = true; // Material's alpha mode is set to blend.  Toss it into the alpha draw pool. diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index a1c73d12d0..cc0dc5c3cc 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -9588,6 +9588,12 @@ You do not appear to have the proper hardware requirements for [APP_NAME]. [APP_  If you continue to have problems, please visit the [SUPPORT_SITE].    </global> +  <global name="UnsupportedIntelDriver"> +The installed Intel graphics driver for [GPUNAME], version [VERSION], is significantly out of date and is known to cause excessive rates of program crashes. You are strongly advised to update to a current Intel driver + +Do you want to check the Intel driver website? +  </global> +    <global name="UnsupportedCPUAmount">  796    </global>  | 
