diff options
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llfontvertexbuffer.cpp | 15 | ||||
| -rw-r--r-- | indra/llrender/llfontvertexbuffer.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 24 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 1 | ||||
| -rw-r--r-- | indra/newview/llpreviewtexture.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llviewertexture.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llviewertexturelist.cpp | 5 | 
8 files changed, 63 insertions, 6 deletions
| diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 94daba0817..4c9a062246 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -404,7 +404,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons      {          // recursively render ellipses at end of string          // we've already reserved enough room -        gGL.pushUIMatrix();          static LLWString elipses_wstr(utf8string_to_wstring(std::string("...")));          render(elipses_wstr,                  0, @@ -417,7 +416,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons                  right_x,                  false,                  use_color); -        gGL.popUIMatrix();      }      gGL.popUIMatrix(); diff --git a/indra/llrender/llfontvertexbuffer.cpp b/indra/llrender/llfontvertexbuffer.cpp index f5d6b03cd6..5bd1ca5eed 100644 --- a/indra/llrender/llfontvertexbuffer.cpp +++ b/indra/llrender/llfontvertexbuffer.cpp @@ -144,6 +144,8 @@ S32 LLFontVertexBuffer::render(               || mLastShadow != shadow // ex: buttons change shadow state               || mLastScaleX != LLFontGL::sScaleX               || mLastScaleY != LLFontGL::sScaleY +             || mLastVertDPI != LLFontGL::sVertDPI +             || mLastHorizDPI != LLFontGL::sHorizDPI               || mLastOrigin != LLFontGL::sCurOrigin)      {          genBuffers(fontp, text, begin_offset, x, y, color, halign, valign, @@ -196,6 +198,8 @@ void LLFontVertexBuffer::genBuffers(      mLastScaleX = LLFontGL::sScaleX;      mLastScaleY = LLFontGL::sScaleY; +    mLastVertDPI = LLFontGL::sVertDPI; +    mLastHorizDPI = LLFontGL::sHorizDPI;      mLastOrigin = LLFontGL::sCurOrigin;      if (right_x) @@ -209,6 +213,17 @@ void LLFontVertexBuffer::renderBuffers()      gGL.flush(); // deliberately empty pending verts      gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);      gGL.pushUIMatrix(); + +    gGL.loadUIIdentity(); + +    // Depth translation, so that floating text appears 'in-world' +    // and is correctly occluded. +    gGL.translatef(0.f, 0.f, LLFontGL::sCurDepth); +    gGL.setSceneBlendType(LLRender::BT_ALPHA); + +    // Note: ellipses should technically be covered by push/load/translate of their own +    // but it's more complexity, values do not change, skipping doesn't appear to break +    // anything, so we can skip that until it proves to cause issues.      for (LLVertexBufferData& buffer : mBufferList)      {          buffer.draw(); diff --git a/indra/llrender/llfontvertexbuffer.h b/indra/llrender/llfontvertexbuffer.h index 59cb536b74..af195dfff9 100644 --- a/indra/llrender/llfontvertexbuffer.h +++ b/indra/llrender/llfontvertexbuffer.h @@ -115,6 +115,8 @@ private:      // LLFontGL's statics      F32 mLastScaleX = 1.f;      F32 mLastScaleY = 1.f; +    F32 mLastVertDPI = 0.f; +    F32 mLastHorizDPI = 0.f;      LLCoordGL mLastOrigin;      static bool sEnableBufferCollection; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 6f4828397a..12ae36f4bb 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -604,7 +604,7 @@ public:  static LLVBOPool* sVBOPool = nullptr; -void LLVertexBufferData::draw() +void LLVertexBufferData::drawWithMatrix()  {      if (!mVB)      { @@ -642,6 +642,28 @@ void LLVertexBufferData::draw()      gGL.popMatrix();  } +void LLVertexBufferData::draw() +{ +    if (!mVB) +    { +        llassert(false); +        // Not supposed to happen, check buffer generation +        return; +    } + +    if (mTexName) +    { +        gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTexName); +    } +    else +    { +        gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +    } + +    mVB->setBuffer(); +    mVB->drawArrays(mMode, 0, mCount); +} +  //============================================================================  //static diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index d4c6fbaf18..375ad76fb8 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -77,6 +77,7 @@ public:          , mModelView(projection)          , mTexture0(texture0)      {} +    void drawWithMatrix();      void draw();      LLPointer<LLVertexBuffer> mVB;      U8 mMode; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 1b657d9ea1..800fc7ec0c 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -441,6 +441,16 @@ void LLPreviewTexture::onFileLoadedForSave(bool success,              self->getWindow()->decBusyCount();              self->mLoadingFullImage = false;          } +        if (!success) +        { +            LL_WARNS("FileSaveAs") << "Failed to download file " << *item_uuid << " for saving." +                << " Is missing: " << (src_vi->isMissingAsset() ? "true" : "false") +                << " Discard: " << src_vi->getDiscardLevel() +                << " Raw discard: " << discard_level +                << " Size: " << src_vi->getWidth() << "x" << src_vi->getHeight() +                << " Has GL texture: " << (src_vi->hasGLTexture() ? "true" : "false") +                << " Has saved raw image: " << (src_vi->hasSavedRawImage() ? "true" : "false") << LL_ENDL; +        }      }      if( self && final && success ) diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 0f9c65893d..f1c0a4f0fc 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -505,8 +505,12 @@ void LLViewerTexture::updateClass()      F32 budget = max_vram_budget == 0 ? (F32)gGLManager.mVRAM : (F32)max_vram_budget; -    // try to leave half a GB for everyone else, but keep at least 768MB for ourselves -    F32 target = llmax(budget - 512.f, MIN_VRAM_BUDGET); +    // Try to leave at least half a GB for everyone else and for bias, +    // but keep at least 768MB for ourselves +    // Viewer can 'overshoot' target when scene changes, if viewer goes over budget it +    // can negatively impact performance, so leave 20% of a breathing room for +    // 'bias' calculation to kick in. +    F32 target = llmax(llmin(budget - 512.f, budget * 0.8f), MIN_VRAM_BUDGET);      sFreeVRAMMegabytes = target - used;      F32 over_pct = (used - target) / target; @@ -522,7 +526,7 @@ void LLViewerTexture::updateClass()          // slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately)          sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f); -        if (is_sys_low) +        if (is_sys_low || over_pct > 2.f)          { // if we're low on system memory, emergency purge off screen textures to avoid a death spiral              LL_WARNS() << "Low system memory detected, emergency downrezzing off screen textures" << LL_ENDL;              for (auto& image : gTextureList) diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 08e9151940..0d609b8084 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1169,6 +1169,11 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)      //update MIN_UPDATE_COUNT or 5% of other textures, whichever is greater      update_count = llmax((U32) MIN_UPDATE_COUNT, (U32) mUUIDMap.size()/20); +    if (LLViewerTexture::sDesiredDiscardBias > 1.f) +    { +        // we are over memory target, update more agresively +        update_count = (S32)(update_count * LLViewerTexture::sDesiredDiscardBias); +    }      update_count = llmin(update_count, (U32) mUUIDMap.size());      { // copy entries out of UUID map to avoid iterator invalidation from deletion inside updateImageDecodeProiroty or updateFetch below | 
