summaryrefslogtreecommitdiff
path: root/indra/llrender/llfontgl.cpp
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-08-30 18:51:48 +0300
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2024-09-04 10:16:46 +0300
commit5c64e5e13d9a75cac510aac3128fc6ee780ab243 (patch)
treed517f35e1adcf8a2f0f624bbb180cf58fa73d6cd /indra/llrender/llfontgl.cpp
parenta638d9610d9f369eca6dff74e8860ca466c253c7 (diff)
viewer#2411 LLFontGL::render optimizations #3
Diffstat (limited to 'indra/llrender/llfontgl.cpp')
-rw-r--r--indra/llrender/llfontgl.cpp118
1 files changed, 13 insertions, 105 deletions
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 701ab4d060..7d74bb3e46 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -42,7 +42,6 @@
#include "lltexture.h"
#include "lldir.h"
#include "llstring.h"
-#include "llvertexbuffer.h"
// Third party library includes
#include <boost/tokenizer.hpp>
@@ -145,8 +144,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rec
S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,
- ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, bool use_ellipses, bool use_color,
- std::list<LLVertexBufferData> *buffer_list) const
+ ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, bool use_ellipses, bool use_color) const
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
@@ -160,7 +158,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
return 0;
}
- gGL.flush(); // deliberately empty pending verts
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
S32 scaled_max_pixels = max_pixels == S32_MAX ? S32_MAX : llceil((F32)max_pixels * sScaleX);
@@ -286,9 +283,6 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
std::pair<EFontGlyphType, S32> bitmap_entry = std::make_pair(EFontGlyphType::Grayscale, -1);
S32 glyph_count = 0;
- S32 buffer_count = 0;
- LLVertexBuffer* vb;
- LLImageGL* font_image = nullptr;
for (i = begin_offset; i < begin_offset + length; i++)
{
llwchar wch = wstr[i];
@@ -312,35 +306,16 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
// otherwise the queued glyphs will be taken from wrong textures.
if (glyph_count > 0)
{
- if (buffer_list)
+ gGL.begin(LLRender::QUADS);
{
- vb = gGL.beginNoCache(LLRender::QUADS, buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
-
gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
-
- vb = gGL.getBuffer(buffer_count); // instead of endNoCache to draw now
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
- }
- else
- {
- gGL.begin(LLRender::QUADS);
- {
- gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
- }
- gGL.end();
}
+ gGL.end();
glyph_count = 0;
}
bitmap_entry = next_bitmap_entry;
- font_image = font_bitmap_cache->getImageGL(bitmap_entry.first, bitmap_entry.second);
+ LLImageGL* font_image = font_bitmap_cache->getImageGL(bitmap_entry.first, bitmap_entry.second);
gGL.getTexUnit(0)->bind(font_image);
}
@@ -364,28 +339,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
if (glyph_count >= GLYPH_BATCH_SIZE)
{
- if (buffer_list)
+ gGL.begin(LLRender::QUADS);
{
- vb = gGL.beginNoCache(LLRender::QUADS, buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
- vb = gGL.endNoCache(buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
- }
- else
- {
- gGL.begin(LLRender::QUADS);
- {
- gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
- }
- gGL.end();
}
+ gGL.end();
glyph_count = 0;
}
@@ -418,29 +376,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
cur_render_x = cur_x;
cur_render_y = cur_y;
}
-
- if (buffer_list)
+ gGL.begin(LLRender::QUADS);
{
- vb = gGL.beginNoCache(LLRender::QUADS, buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
- vb = gGL.endNoCache(buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, LLRender::QUADS, buffer_count);
- }
- }
- else
- {
- gGL.begin(LLRender::QUADS);
- {
- gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4);
- }
- gGL.end();
}
+ gGL.end();
if (right_x)
@@ -454,45 +394,14 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
F32 descender = (F32)llfloor(mFontFreetype->getDescenderHeight());
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- if (buffer_list)
- {
- vb = gGL.beginNoCache(LLRender::LINES, buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, nullptr, LLRender::QUADS, buffer_count);
- }
-
- gGL.vertex2f(start_x, cur_y - descender);
- gGL.vertex2f(cur_x, cur_y - descender);
-
- vb = gGL.getBuffer(buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, nullptr, LLRender::LINES, buffer_count);
- }
- }
- else
- {
- gGL.begin(LLRender::LINES);
- gGL.vertex2f(start_x, cur_y - descender);
- gGL.vertex2f(cur_x, cur_y - descender);
- gGL.end();
- }
- }
- else if (buffer_list)
- {
- vb = gGL.getBuffer(buffer_count);
- if (vb)
- {
- buffer_list->emplace_back(vb, font_image, gGL.getMode(), buffer_count);
- }
+ gGL.begin(LLRender::LINES);
+ gGL.vertex2f(start_x, cur_y - descender);
+ gGL.vertex2f(cur_x, cur_y - descender);
+ gGL.end();
}
if (draw_ellipses)
{
- // signal a separate context
- buffer_list->emplace_back(nullptr, nullptr, 0, 0);
-
// recursively render ellipses at end of string
// we've already reserved enough room
gGL.pushUIMatrix();
@@ -507,8 +416,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32_MAX, max_pixels,
right_x,
false,
- use_color,
- buffer_list);
+ use_color);
gGL.popUIMatrix();
}