Compare commits

...

2 Commits

Author SHA1 Message Date
Matthias Clasen
9122671ee1 Hack: glyph cache debugging
Color the padding in the cache, and warn if glyphs extrude into it.
2024-02-17 08:24:55 -05:00
Matthias Clasen
58c3b2e3f7 Hack: Download atlases
Make ngl save its current atlas every frame.
2024-02-17 08:24:55 -05:00
7 changed files with 81 additions and 2 deletions

View File

@@ -131,6 +131,47 @@ gsk_gl_device_make_current (GskGpuDevice *device)
gdk_gl_context_make_current (gdk_display_get_gl_context (gsk_gpu_device_get_display (device)));
}
static void
save_texture_to_png (GdkDisplay *display,
int texture_id,
int width,
int height,
const char *filename)
{
GdkGLTextureBuilder *builder;
GdkTexture *texture;
builder = gdk_gl_texture_builder_new ();
gdk_gl_texture_builder_set_context (builder, gdk_display_get_gl_context (display));
gdk_gl_texture_builder_set_id (builder, texture_id);
gdk_gl_texture_builder_set_width (builder, width);
gdk_gl_texture_builder_set_height (builder, height);
texture = gdk_gl_texture_builder_build (builder, NULL, NULL);
gdk_texture_save_to_png (texture, filename);
g_object_unref (texture);
g_object_unref (builder);
}
static void
gsk_gl_device_end_frame (GskGpuDevice *device)
{
GskGpuImage *image;
static int count = 0;
char *filename;
image = gsk_gpu_device_get_atlas_image (device);
filename = g_strdup_printf ("atlas%d.png", count++);
save_texture_to_png (gsk_gpu_device_get_display (device),
gsk_gl_image_peek_texture (GSK_GL_IMAGE (image)),
gsk_gpu_image_get_width (image),
gsk_gpu_image_get_height (image),
filename);
g_free (filename);
}
static void
gsk_gl_device_finalize (GObject *object)
{
@@ -158,6 +199,7 @@ gsk_gl_device_class_init (GskGLDeviceClass *klass)
gpu_device_class->create_upload_image = gsk_gl_device_create_upload_image;
gpu_device_class->create_download_image = gsk_gl_device_create_download_image;
gpu_device_class->make_current = gsk_gl_device_make_current;
gpu_device_class->end_frame = gsk_gl_device_end_frame;
object_class->finalize = gsk_gl_device_finalize;
}
@@ -691,4 +733,3 @@ gsk_gl_device_find_gl_format (GskGLDevice *self,
/* fallbacks will always fallback to a supported format */
g_assert_not_reached ();
}

View File

@@ -316,3 +316,9 @@ gsk_gl_image_steal_texture (GskGLImage *self)
return self->texture_id;
}
GLuint
gsk_gl_image_peek_texture (GskGLImage *self)
{
return self->texture_id;
}

View File

@@ -39,4 +39,7 @@ GLenum gsk_gl_image_get_gl_type (GskGLIm
GLuint gsk_gl_image_steal_texture (GskGLImage *self);
GLuint gsk_gl_image_peek_texture (GskGLImage *self);
G_END_DECLS

View File

@@ -976,5 +976,12 @@ gsk_gpu_device_lookup_glyph_image (GskGpuDevice *self,
return cache->image;
}
void
gsk_gpu_device_end_frame (GskGpuDevice *self)
{
if (GSK_GPU_DEVICE_GET_CLASS (self))
GSK_GPU_DEVICE_GET_CLASS (self)->end_frame (self);
}
/* }}} */
/* vim:set foldmethod=marker expandtab: */

View File

@@ -42,7 +42,7 @@ struct _GskGpuDeviceClass
gsize width,
gsize height);
void (* make_current) (GskGpuDevice *self);
void (* end_frame) (GskGpuDevice *self);
};
GType gsk_gpu_device_get_type (void) G_GNUC_CONST;
@@ -99,6 +99,8 @@ GskGpuImage * gsk_gpu_device_lookup_glyph_image (GskGpuD
graphene_point_t *out_origin);
void gsk_gpu_device_end_frame (GskGpuDevice *self);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskGpuDevice, g_object_unref)
G_END_DECLS

View File

@@ -428,6 +428,7 @@ gsk_gpu_renderer_render (GskRenderer *renderer,
gsk_gpu_device_queue_gc (priv->device);
gdk_draw_context_end_frame (priv->context);
gsk_gpu_device_end_frame (priv->device);
g_clear_pointer (&render_region, cairo_region_destroy);
}

View File

@@ -555,6 +555,25 @@ gsk_gpu_upload_glyph_op_draw (GskGpuOp *op,
} }
});
for (int y = 0; y < self->area.height; y++)
{
int *row = (int *) (data + y * stride);
if (row[0] != 0 || row[self->area.width - 1] != 0)
g_warning ("glyph %u overflow", self->glyph);
row[0] = 0xff0000ff;
row[self->area.width - 1] = 0xff0000ff;
}
for (int x = 0; x < self->area.width; x++)
{
int *row0 = (int *) data;
int * row1 = (int *) (data + (self->area.height - 1) * stride);
if (row0[x] != 0 || row1[x] != 0)
g_warning ("glyph %u overflow", self->glyph);
row0[x] = 0xff0000ff;
row1[x] = 0xff0000ff;
}
cairo_destroy (cr);
cairo_surface_finish (surface);