diff options
| author | Erik Kundiman <erik@megapahit.org> | 2025-01-20 16:00:28 +0800 | 
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2025-01-20 16:00:28 +0800 | 
| commit | ad3694fd4b6bfaf5621a12eb4536a1eb6a10f8f2 (patch) | |
| tree | bc343dc4a0f8a469ecab34e64b5c5dfe76ea1297 /indra/llrender | |
| parent | 45249de1ca418324c4077312eefc7edc7e22c401 (diff) | |
| parent | 306e9e6d0293ed6470db19c0882930fff0cd145f (diff) | |
Merge remote-tracking branch 'secondlife/release/2024.12-ForeverFPS' into 2024.12-ForeverFPS
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llcubemaparray.cpp | 6 | ||||
| -rw-r--r-- | indra/llrender/llcubemaparray.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.cpp | 25 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.h | 2 | 
4 files changed, 28 insertions, 7 deletions
| diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index 4e7fa7316e..253286fb1c 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -109,7 +109,7 @@ LLCubeMapArray::~LLCubeMapArray()  {  } -void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips) +void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool use_mips, bool hdr)  {      U32 texname = 0;      mWidth = resolution; @@ -128,6 +128,10 @@ void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool us      free_cur_tex_image();      U32 format = components == 4 ? GL_RGBA16F : GL_RGB16F; +    if (!hdr) +    { +        format = components == 4 ? GL_RGBA8 : GL_RGB8; +    }      U32 mip = 0;      U32 mip_resolution = resolution;      while (mip_resolution >= 1) diff --git a/indra/llrender/llcubemaparray.h b/indra/llrender/llcubemaparray.h index 675aaaf07c..bfc72a321d 100644 --- a/indra/llrender/llcubemaparray.h +++ b/indra/llrender/llcubemaparray.h @@ -52,7 +52,7 @@ public:      // components - number of components per pixel      // count - number of cube maps in the array      // use_mips - if true, mipmaps will be allocated for this cube map array and anisotropic filtering will be used -    void allocate(U32 res, U32 components, U32 count, bool use_mips = true); +    void allocate(U32 res, U32 components, U32 count, bool use_mips = true, bool hdr = true);      void bind(S32 stage);      void unbind(); diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index fa76669258..1ca4c8c079 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -554,7 +554,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l          return NULL;      llassert(!mIsFallback); -    fontp->renderGlyph(requested_glyph_type, glyph_index); +    fontp->renderGlyph(requested_glyph_type, glyph_index, wch);      EFontGlyphType bitmap_glyph_type = EFontGlyphType::Unspecified;      switch (fontp->mFTFace->glyph->bitmap.pixel_mode) @@ -699,7 +699,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const      }  } -void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const +void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const  {      if (mFTFace == NULL)          return; @@ -714,11 +714,28 @@ void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) co      FT_Error error = FT_Load_Glyph(mFTFace, glyph_index, load_flags);      if (FT_Err_Ok != error)      { +        if (error == FT_Err_Out_Of_Memory) +        { +            LLError::LLUserWarningMsg::showOutOfMemory(); +            LL_ERRS() << "Out of memory loading glyph for character " << wch << LL_ENDL; +        } +          std::string message = llformat( -            "Error %d (%s) loading glyph %u: bitmap_type=%u, load_flags=%d", -            error, FT_Error_String(error), glyph_index, bitmap_type, load_flags); +            "Error %d (%s) loading wchar %u glyph %u/%u: bitmap_type=%u, load_flags=%d", +            error, FT_Error_String(error), wch, glyph_index, mFTFace->num_glyphs, bitmap_type, load_flags);          LL_WARNS_ONCE() << message << LL_ENDL;          error = FT_Load_Glyph(mFTFace, glyph_index, load_flags ^ FT_LOAD_COLOR); +        if (FT_Err_Invalid_Outline == error +            || FT_Err_Invalid_Composite == error +            || (FT_Err_Ok != error && LLStringOps::isEmoji(wch))) +        { +            glyph_index = FT_Get_Char_Index(mFTFace, '?'); +            // if '?' is not present, potentially can use last index, that's supposed to be null glyph +            if (glyph_index > 0) +            { +                error = FT_Load_Glyph(mFTFace, glyph_index, load_flags ^ FT_LOAD_COLOR); +            } +        }          llassert_always_msg(FT_Err_Ok == error, message.c_str());      } diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index eba89f5def..1ad795060a 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -156,7 +156,7 @@ private:      bool hasGlyph(llwchar wch) const;       // Has a glyph for this character      LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const;        // Add a new character to the font if necessary      LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const; // Add a glyph from this font to the other (returns the glyph_index, 0 if not found) -    void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const; +    void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const;      void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const;      std::string mName; | 
