[gtk/wip/matthiasc/shared-glyph-cache: 2/3] Attempt to share the glyph cache
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/matthiasc/shared-glyph-cache: 2/3] Attempt to share the glyph cache
- Date: Mon, 3 Jun 2019 22:19:45 +0000 (UTC)
commit 1c47d864a9d27eb63820347a087bf78a31617aae
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Jun 3 19:48:10 2019 +0000
Attempt to share the glyph cache
This doesn't work yet.
gsk/gl/gskglglyphcache.c | 12 ++++++++++--
gsk/gl/gskglrenderer.c | 28 ++++++++++++++++++++++------
2 files changed, 32 insertions(+), 8 deletions(-)
---
diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c
index b1338d9e58..1699d227d2 100644
--- a/gsk/gl/gskglglyphcache.c
+++ b/gsk/gl/gskglglyphcache.c
@@ -259,6 +259,15 @@ render_glyph (const GskGLTextureAtlas *atlas,
return TRUE;
}
+static void
+upload_region_or_else (guint texture_id,
+ GskImageRegion *region)
+{
+ glTextureSubImage2D (texture_id, 0, region->x, region->y, region->width, region->height,
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, region->data);
+
+}
+
static void
upload_dirty_glyph (GskGLGlyphCache *self,
GskGLTextureAtlas *atlas,
@@ -273,8 +282,7 @@ upload_dirty_glyph (GskGLGlyphCache *self,
if (render_glyph (atlas, (DirtyGlyph *)atlas->user_data, ®ion))
{
-
- gsk_gl_image_upload_region (&atlas->image, driver, ®ion);
+ upload_region_or_else (atlas->image.texture_id, ®ion);
g_free (region.data);
}
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index c2f5e0abde..b97111cd0e 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -335,7 +335,7 @@ struct _GskGLRenderer
RenderOpBuilder op_builder;
GArray *render_ops;
- GskGLGlyphCache glyph_cache;
+ GskGLGlyphCache *glyph_cache;
GskGLIconCache icon_cache;
GskGLShadowCache shadow_cache;
@@ -580,7 +580,7 @@ render_text_node (GskGLRenderer *self,
if (gi->glyph == PANGO_GLYPH_EMPTY)
continue;
- glyph = gsk_gl_glyph_cache_lookup (&self->glyph_cache,
+ glyph = gsk_gl_glyph_cache_lookup (self->glyph_cache,
TRUE,
(PangoFont *)font,
gi->glyph,
@@ -593,7 +593,7 @@ render_text_node (GskGLRenderer *self,
cx = (double)(x_position + gi->geometry.x_offset) / PANGO_SCALE;
cy = (double)(gi->geometry.y_offset) / PANGO_SCALE;
- ops_set_texture (builder, gsk_gl_glyph_cache_get_glyph_texture_id (&self->glyph_cache,
+ ops_set_texture (builder, gsk_gl_glyph_cache_get_glyph_texture_id (self->glyph_cache,
self->gl_driver,
glyph));
@@ -2466,6 +2466,22 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
return TRUE;
}
+static GskGLGlyphCache *
+get_glyph_cache_for_display (GdkDisplay *display)
+{
+ GskGLGlyphCache *glyph_cache;
+
+ glyph_cache = (GskGLGlyphCache*)g_object_get_data (G_OBJECT (display), "gl-glyph-cache");
+ if (glyph_cache == NULL)
+ {
+ glyph_cache = g_new0 (GskGLGlyphCache, 1);
+ gsk_gl_glyph_cache_init (glyph_cache);
+ g_object_set_data (G_OBJECT (display), "gl-glyph-cache", glyph_cache);
+ }
+
+ return glyph_cache;
+}
+
static gboolean
gsk_gl_renderer_realize (GskRenderer *renderer,
GdkSurface *surface,
@@ -2496,7 +2512,7 @@ gsk_gl_renderer_realize (GskRenderer *renderer,
if (!gsk_gl_renderer_create_programs (self, error))
return FALSE;
- gsk_gl_glyph_cache_init (&self->glyph_cache);
+ self->glyph_cache = get_glyph_cache_for_display (gdk_surface_get_display (surface));
gsk_gl_icon_cache_init (&self->icon_cache, renderer, self->gl_driver);
gsk_gl_shadow_cache_init (&self->shadow_cache);
@@ -2522,7 +2538,7 @@ gsk_gl_renderer_unrealize (GskRenderer *renderer)
for (i = 0; i < GL_N_PROGRAMS; i ++)
glDeleteProgram (self->programs[i].id);
- gsk_gl_glyph_cache_free (&self->glyph_cache, self->gl_driver);
+ self->glyph_cache = NULL;
gsk_gl_icon_cache_free (&self->icon_cache);
gsk_gl_shadow_cache_free (&self->shadow_cache, self->gl_driver);
@@ -3089,7 +3105,7 @@ gsk_gl_renderer_do_render (GskRenderer *renderer,
ORTHO_FAR_PLANE);
graphene_matrix_scale (&projection, 1, -1, 1);
- gsk_gl_glyph_cache_begin_frame (&self->glyph_cache, self->gl_driver);
+ gsk_gl_glyph_cache_begin_frame (self->glyph_cache, self->gl_driver);
gsk_gl_icon_cache_begin_frame (&self->icon_cache);
gsk_gl_shadow_cache_begin_frame (&self->shadow_cache, self->gl_driver);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]