[gtk/wip/chergert/glproto: 508/526] add text glyph vertices in one batch




commit 16c086457265f4d22df84953523ec1fa35e69025
Author: Christian Hergert <chergert redhat com>
Date:   Wed Feb 10 17:38:11 2021 -0800

    add text glyph vertices in one batch
    
    avoid repeated checks to grow/resize the buffer

 gsk/next/gskglrenderjob.c | 62 ++++++++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 27 deletions(-)
---
diff --git a/gsk/next/gskglrenderjob.c b/gsk/next/gskglrenderjob.c
index 69ed41ac3e..b7f6407169 100644
--- a/gsk/next/gskglrenderjob.c
+++ b/gsk/next/gskglrenderjob.c
@@ -2544,6 +2544,8 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
   int x_position = 0;
   GskGLGlyphKey lookup;
   guint last_texture = 0;
+  GskGLDrawVertex *vertices;
+  guint used = 0;
 
   if (num_glyphs == 0)
     return;
@@ -2564,10 +2566,11 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
 
   gsk_gl_render_job_begin_draw (job, program);
 
+  vertices = gsk_gl_command_queue_add_n_vertices (job->command_queue, num_glyphs);
+
   /* We use one quad per character */
   for (guint i = 0; i < num_glyphs; i++)
     {
-      GskGLDrawVertex *vertices;
       const PangoGlyphInfo *gi = &glyphs[i];
       const GskGLGlyphValue *glyph;
       float glyph_x, glyph_y, glyph_x2, glyph_y2;
@@ -2575,6 +2578,7 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
       float cx;
       float cy;
       guint texture_id;
+      guint base;
 
       if (gi->glyph == PANGO_GLYPH_EMPTY)
         continue;
@@ -2587,6 +2591,9 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
       if (!gsk_gl_glyph_library_lookup_or_add (library, &lookup, &glyph))
         goto next;
 
+      base = used * GSK_GL_N_VERTICES;
+      used++;
+
       texture_id = GSK_GL_TEXTURE_ATLAS_ENTRY_TEXTURE (glyph);
 
       g_assert (texture_id > 0);
@@ -2613,42 +2620,43 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
       glyph_x2 = glyph_x + glyph->ink_rect.width;
       glyph_y2 = glyph_y + glyph->ink_rect.height;
 
-      vertices = gsk_gl_command_queue_add_vertices (job->command_queue);
+      vertices[base+0].position[0] = glyph_x;
+      vertices[base+0].position[1] = glyph_y;
+      vertices[base+0].uv[0] = tx;
+      vertices[base+0].uv[1] = ty;
 
-      vertices[0].position[0] = glyph_x;
-      vertices[0].position[1] = glyph_y;
-      vertices[0].uv[0] = tx;
-      vertices[0].uv[1] = ty;
+      vertices[base+1].position[0] = glyph_x;
+      vertices[base+1].position[1] = glyph_y2;
+      vertices[base+1].uv[0] = tx;
+      vertices[base+1].uv[1] = ty2;
 
-      vertices[1].position[0] = glyph_x;
-      vertices[1].position[1] = glyph_y2;
-      vertices[1].uv[0] = tx;
-      vertices[1].uv[1] = ty2;
+      vertices[base+2].position[0] = glyph_x2;
+      vertices[base+2].position[1] = glyph_y;
+      vertices[base+2].uv[0] = tx2;
+      vertices[base+2].uv[1] = ty;
 
-      vertices[2].position[0] = glyph_x2;
-      vertices[2].position[1] = glyph_y;
-      vertices[2].uv[0] = tx2;
-      vertices[2].uv[1] = ty;
+      vertices[base+3].position[0] = glyph_x2;
+      vertices[base+3].position[1] = glyph_y2;
+      vertices[base+3].uv[0] = tx2;
+      vertices[base+3].uv[1] = ty2;
 
-      vertices[3].position[0] = glyph_x2;
-      vertices[3].position[1] = glyph_y2;
-      vertices[3].uv[0] = tx2;
-      vertices[3].uv[1] = ty2;
+      vertices[base+4].position[0] = glyph_x;
+      vertices[base+4].position[1] = glyph_y2;
+      vertices[base+4].uv[0] = tx;
+      vertices[base+4].uv[1] = ty2;
 
-      vertices[4].position[0] = glyph_x;
-      vertices[4].position[1] = glyph_y2;
-      vertices[4].uv[0] = tx;
-      vertices[4].uv[1] = ty2;
-
-      vertices[5].position[0] = glyph_x2;
-      vertices[5].position[1] = glyph_y;
-      vertices[5].uv[0] = tx2;
-      vertices[5].uv[1] = ty;
+      vertices[base+5].position[0] = glyph_x2;
+      vertices[base+5].position[1] = glyph_y;
+      vertices[base+5].uv[0] = tx2;
+      vertices[base+5].uv[1] = ty;
 
 next:
       x_position += gi->geometry.width;
     }
 
+  if (used != num_glyphs)
+    gsk_gl_command_queue_retract_n_vertices (job->command_queue, num_glyphs - used);
+
   gsk_gl_program_end_draw (program);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]