diff options
Diffstat (limited to 'indra/llrender')
39 files changed, 132 insertions, 86 deletions
diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 331f988382..331f988382 100755..100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index af4e3fdda0..af4e3fdda0 100755..100644 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp diff --git a/indra/llrender/llcubemap.h b/indra/llrender/llcubemap.h index ee2c41e026..ee2c41e026 100755..100644 --- a/indra/llrender/llcubemap.h +++ b/indra/llrender/llcubemap.h diff --git a/indra/llrender/llfontbitmapcache.cpp b/indra/llrender/llfontbitmapcache.cpp index f128636ab2..f128636ab2 100755..100644 --- a/indra/llrender/llfontbitmapcache.cpp +++ b/indra/llrender/llfontbitmapcache.cpp diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index 75df3a94a7..75df3a94a7 100755..100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index de26d19efc..de26d19efc 100755..100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index a5ece42b88..a5ece42b88 100755..100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 53ca080d66..0e2946632a 100755..100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -94,26 +94,33 @@ BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, F32 vert_dp static LLTrace::BlockTimerStatHandle FTM_RENDER_FONTS("Fonts"); -S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, +S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, + ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const +{ + LLRectf rect_float(rect.mLeft, rect.mTop, rect.mRight, rect.mBottom); + return render(wstr, begin_offset, rect_float, color, halign, valign, style, shadow, max_chars, right_x, use_ellipses); +} + +S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const { - F32 x = (F32)rect.mLeft; + F32 x = rect.mLeft; F32 y = 0.f; switch(valign) { case TOP: - y = (F32)rect.mTop; + y = rect.mTop; break; case VCENTER: - y = (F32)rect.getCenterY(); + y = rect.getCenterY(); break; case BASELINE: case BOTTOM: - y = (F32)rect.mBottom; + y = rect.mBottom; break; default: - y = (F32)rect.mBottom; + y = rect.mBottom; break; } return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses); @@ -357,7 +364,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons if (right_x) { - *right_x = (cur_x - origin.mV[VX]) / sScaleX; + F32 cr_x = (cur_x - origin.mV[VX]) / sScaleX; + if (*right_x < cr_x) + { + // rightmost edge of previously drawn text, don't draw over previous text + *right_x = cr_x; + } } //FIXME: add underline as glyph? diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 0988e99deb..7d0e53f60f 100755..100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -99,6 +99,15 @@ public: BOOL use_ellipses = FALSE) const; S32 render(const LLWString &text, S32 begin_offset, + const LLRectf& rect, + const LLColor4 &color, + HAlign halign = LEFT, VAlign valign = BASELINE, + U8 style = NORMAL, ShadowType shadow = NO_SHADOW, + S32 max_chars = S32_MAX, + F32* right_x=NULL, + BOOL use_ellipses = FALSE) const; + + S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign = LEFT, VAlign valign = BASELINE, diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index d003687415..d003687415 100755..100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h index 177eb6c8a5..177eb6c8a5 100755..100644 --- a/indra/llrender/llfontregistry.h +++ b/indra/llrender/llfontregistry.h diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index e24d3bb5ba..e24d3bb5ba 100755..100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 75e5fe86ec..75e5fe86ec 100755..100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h diff --git a/indra/llrender/llgldbg.cpp b/indra/llrender/llgldbg.cpp index 0f1d4ae742..0f1d4ae742 100755..100644 --- a/indra/llrender/llgldbg.cpp +++ b/indra/llrender/llgldbg.cpp diff --git a/indra/llrender/llgldbg.h b/indra/llrender/llgldbg.h index 963579cb82..963579cb82 100755..100644 --- a/indra/llrender/llgldbg.h +++ b/indra/llrender/llgldbg.h diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index a95872e883..a95872e883 100755..100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index f9f7d07c89..b30bc1aed6 100755..100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -325,42 +325,44 @@ LLGLSLShader::~LLGLSLShader() void LLGLSLShader::unload() { + mShaderFiles.clear(); + mDefines.clear(); + + unloadInternal(); +} + +void LLGLSLShader::unloadInternal() +{ sInstances.erase(this); stop_glerror(); mAttribute.clear(); mTexture.clear(); mUniform.clear(); - mShaderFiles.clear(); - mDefines.clear(); if (mProgramObject) { GLhandleARB obj[1024]; GLsizei count; - glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj); + glGetAttachedObjectsARB(mProgramObject, sizeof(obj)/sizeof(obj[0]), &count, obj); for (GLsizei i = 0; i < count; i++) { -#if !LL_DARWIN - if (glIsProgramARB(obj[i])) -#endif - { - glDeleteObjectARB(obj[i]); - } + glDetachObjectARB(mProgramObject, obj[i]); + glDeleteObjectARB(obj[i]); } glDeleteObjectARB(mProgramObject); mProgramObject = 0; } - + if (mTimerQuery) { glDeleteQueriesARB(1, &mTimerQuery); mTimerQuery = 0; } - + if (mSamplesQuery) { glDeleteQueriesARB(1, &mSamplesQuery); @@ -369,7 +371,7 @@ void LLGLSLShader::unload() //hack to make apple not complain glGetError(); - + stop_glerror(); } @@ -378,6 +380,8 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes, U32 varying_count, const char** varyings) { + unloadInternal(); + sInstances.insert(this); //reloading, reset matrix hash values @@ -702,77 +706,102 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms) { - BOOL res = TRUE; - - mTotalUniformSize = 0; - mActiveTextureChannels = 0; - mUniform.clear(); - mUniformMap.clear(); - mUniformNameMap.clear(); - mTexture.clear(); - mValue.clear(); - //initialize arrays - U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size(); - mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); - mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); - - bind(); - - //get the number of active uniforms - GLint activeCount; - glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); + BOOL res = TRUE; + + mTotalUniformSize = 0; + mActiveTextureChannels = 0; + mUniform.clear(); + mUniformMap.clear(); + mUniformNameMap.clear(); + mTexture.clear(); + mValue.clear(); + //initialize arrays + U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size(); + mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); + mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1); + + bind(); + + //get the number of active uniforms + GLint activeCount; + glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount); //........................................................................................................................................ //........................................................................................ /* EXPLANATION: - This is part of code is temporary because as the final result the mapUniform() should be rewrited. - But it's a huge a volume of work which is need to be a more carefully performed for avoid possible + This is part of code is temporary because as the final result the mapUniform() should be rewrited. + But it's a huge a volume of work which is need to be a more carefully performed for avoid possible regression's (i.e. it should be formalized a separate ticket in JIRA). RESON: - The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear - first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels) + The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear + first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels) it influence to which is texture matrix will be updated during rendering. But, order of indexe's of uniform variables is not defined and GLSL compiler can change it as want , even if the "diffuseMap" will be appear and use first in shader code. As example where this situation appear see: "Deferred Material Shader 28/29/30/31" - And tickets: MAINT-4165, MAINT-4839 + And tickets: MAINT-4165, MAINT-4839, MAINT-3568 */ - + S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap"); S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap"); + S32 environmentMap = glGetUniformLocationARB(mProgramObject, "environmentMap"); std::set<S32> skip_index; - if(diffuseMap != -1 && bumpMap != -1) + if (-1 != diffuseMap && (-1 != bumpMap || -1 != environmentMap)) { GLenum type; GLsizei length; GLint size = -1; - char name[1024]; + char name[1024]; + + diffuseMap = bumpMap = environmentMap = -1; - //diffuse map for (S32 i = 0; i < activeCount; i++) { - name[0] = 0; - + name[0] = '\0'; + glGetActiveUniformARB(mProgramObject, i, 1024, &length, &size, &type, (GLcharARB *)name); - if(std::string(name) == "diffuseMap") { + if (-1 == diffuseMap && std::string(name) == "diffuseMap") + { diffuseMap = i; + continue; } - if(std::string(name) == "bumpMap") { + if (-1 == bumpMap && std::string(name) == "bumpMap") + { bumpMap = i; + continue; + } + + if (-1 == environmentMap && std::string(name) == "environmentMap") + { + environmentMap = i; + continue; } } - - if(bumpMap < diffuseMap) + + bool bumpLessDiff = bumpMap < diffuseMap && -1 != bumpMap; + bool envLessDiff = environmentMap < diffuseMap && -1 != environmentMap; + + if (bumpLessDiff && envLessDiff) + { + mapUniform(diffuseMap, uniforms); + mapUniform(bumpMap, uniforms); + mapUniform(environmentMap, uniforms); + + skip_index.insert(diffuseMap); + skip_index.insert(bumpMap); + skip_index.insert(environmentMap); + } + else if (bumpLessDiff) { mapUniform(diffuseMap, uniforms); mapUniform(bumpMap, uniforms); @@ -780,26 +809,35 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms) skip_index.insert(diffuseMap); skip_index.insert(bumpMap); } + else if (envLessDiff) + { + mapUniform(diffuseMap, uniforms); + mapUniform(environmentMap, uniforms); + + skip_index.insert(diffuseMap); + skip_index.insert(environmentMap); + } } //........................................................................................ - - for (S32 i = 0; i < activeCount; i++) - { + + for (S32 i = 0; i < activeCount; i++) + { //........................................................................................ - if(skip_index.end() != skip_index.find(i)) continue; + if (skip_index.end() != skip_index.find(i)) continue; //........................................................................................ - - mapUniform(i, uniforms); - } + + mapUniform(i, uniforms); + } //........................................................................................................................................ - unbind(); + unbind(); - LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL; - return res; + LL_DEBUGS("ShaderLoading") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL; + return res; } + BOOL LLGLSLShader::link(BOOL suppress_errors) { BOOL success = LLShaderMgr::instance()->linkProgramObject(mProgramObject, suppress_errors); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 5abddf274b..0746e8760a 100755..100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -198,7 +198,9 @@ public: bool mTextureStateFetched; std::vector<U32> mTextureMagFilter; std::vector<U32> mTextureMinFilter; - + +private: + void unloadInternal(); }; //UI shader (declared here so llui_libtest will link properly) diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h index 0e2c3bcb44..0e2c3bcb44 100755..100644 --- a/indra/llrender/llglstates.h +++ b/indra/llrender/llglstates.h diff --git a/indra/llrender/llgltexture.cpp b/indra/llrender/llgltexture.cpp index 56e263c5f1..3a6eebebba 100644 --- a/indra/llrender/llgltexture.cpp +++ b/indra/llrender/llgltexture.cpp @@ -112,7 +112,8 @@ void LLGLTexture::setBoostLevel(S32 level) if(mBoostLevel != level) { mBoostLevel = level ; - if(mBoostLevel != LLGLTexture::BOOST_NONE) + if(mBoostLevel != LLGLTexture::BOOST_NONE + && mBoostLevel != LLGLTexture::BOOST_ICON) { setNoDelete() ; } diff --git a/indra/llrender/llgltypes.h b/indra/llrender/llgltypes.h index 6c217ef727..6c217ef727 100755..100644 --- a/indra/llrender/llgltypes.h +++ b/indra/llrender/llgltypes.h diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index ebed454271..ebed454271 100755..100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 21982eab1d..21982eab1d 100755..100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index b6ea5aa7f1..b6ea5aa7f1 100755..100644 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp diff --git a/indra/llrender/llpostprocess.h b/indra/llrender/llpostprocess.h index ce17b6693d..ce17b6693d 100755..100644 --- a/indra/llrender/llpostprocess.h +++ b/indra/llrender/llpostprocess.h diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 69420dd0bb..69420dd0bb 100755..100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index a67fb8da52..a67fb8da52 100755..100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h diff --git a/indra/llrender/llrendernavprim.cpp b/indra/llrender/llrendernavprim.cpp index ca72964832..ca72964832 100755..100644 --- a/indra/llrender/llrendernavprim.cpp +++ b/indra/llrender/llrendernavprim.cpp diff --git a/indra/llrender/llrendernavprim.h b/indra/llrender/llrendernavprim.h index a3a5dfec3a..a3a5dfec3a 100755..100644 --- a/indra/llrender/llrendernavprim.h +++ b/indra/llrender/llrendernavprim.h diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp index 26bfe036e8..26bfe036e8 100755..100644 --- a/indra/llrender/llrendersphere.cpp +++ b/indra/llrender/llrendersphere.cpp diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h index f8e9e86e7f..f8e9e86e7f 100755..100644 --- a/indra/llrender/llrendersphere.h +++ b/indra/llrender/llrendersphere.h diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index cd484b4fe9..cd484b4fe9 100755..100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 6dc84d978d..6dc84d978d 100755..100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index b2be3cc3b6..b297223c2e 100755..100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -515,29 +515,13 @@ void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns, const std::string& if (log.length() > 0 || warns) { + LL_DEBUGS("ShaderLoading") << "Shader loading "; + if (!filename.empty()) { - if (warns) - { - LL_WARNS("ShaderLoading") << "From " << filename << ":" << LL_ENDL; - } - else - { - LL_INFOS("ShaderLoading") << "From " << filename << ":" << LL_ENDL; - } - } - } - - if ( log.length() > 0 ) - { - if (warns) - { - LL_WARNS("ShaderLoading") << log << LL_ENDL; - } - else - { - LL_INFOS("ShaderLoading") << log << LL_ENDL; - } + LL_CONT << "From " << filename << ":\n"; + } + LL_CONT << log << LL_ENDL; } } diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 394b38f832..394b38f832 100755..100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h diff --git a/indra/llrender/lltexture.cpp b/indra/llrender/lltexture.cpp index 90fbcec2be..90fbcec2be 100755..100644 --- a/indra/llrender/lltexture.cpp +++ b/indra/llrender/lltexture.cpp diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h index 9fca8b8cd3..9fca8b8cd3 100755..100644 --- a/indra/llrender/lltexture.h +++ b/indra/llrender/lltexture.h diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 0fae600a90..0fae600a90 100755..100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index c05fd01595..c05fd01595 100755..100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h |