From 0c7d22207bcc832a1e02959ced39f1fe930ba4a5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 19 Jan 2024 18:25:26 -0500 Subject: [PATCH] Hack: Download atlases Make ngl save its current atlas every frame. --- gsk/gpu/gskgldevice.c | 43 ++++++++++++++++++++++++++++++++++- gsk/gpu/gskglimage.c | 6 +++++ gsk/gpu/gskglimageprivate.h | 3 +++ gsk/gpu/gskgpudevice.c | 7 ++++++ gsk/gpu/gskgpudeviceprivate.h | 4 +++- gsk/gpu/gskgpurenderer.c | 1 + 6 files changed, 62 insertions(+), 2 deletions(-) diff --git a/gsk/gpu/gskgldevice.c b/gsk/gpu/gskgldevice.c index f33c172d54..46d99619bc 100644 --- a/gsk/gpu/gskgldevice.c +++ b/gsk/gpu/gskgldevice.c @@ -132,6 +132,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) { @@ -159,6 +200,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; } @@ -698,4 +740,3 @@ gsk_gl_device_find_gl_format (GskGLDevice *self, /* fallbacks will always fallback to a supported format */ g_assert_not_reached (); } - diff --git a/gsk/gpu/gskglimage.c b/gsk/gpu/gskglimage.c index 4613a0287a..2447a9c1a1 100644 --- a/gsk/gpu/gskglimage.c +++ b/gsk/gpu/gskglimage.c @@ -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; +} diff --git a/gsk/gpu/gskglimageprivate.h b/gsk/gpu/gskglimageprivate.h index 9f7a959ece..fca620a41b 100644 --- a/gsk/gpu/gskglimageprivate.h +++ b/gsk/gpu/gskglimageprivate.h @@ -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 diff --git a/gsk/gpu/gskgpudevice.c b/gsk/gpu/gskgpudevice.c index 00dad93a05..8e52e00764 100644 --- a/gsk/gpu/gskgpudevice.c +++ b/gsk/gpu/gskgpudevice.c @@ -986,5 +986,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: */ diff --git a/gsk/gpu/gskgpudeviceprivate.h b/gsk/gpu/gskgpudeviceprivate.h index 3424a26402..24cd189fe9 100644 --- a/gsk/gpu/gskgpudeviceprivate.h +++ b/gsk/gpu/gskgpudeviceprivate.h @@ -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 diff --git a/gsk/gpu/gskgpurenderer.c b/gsk/gpu/gskgpurenderer.c index b23142a140..848c81b729 100644 --- a/gsk/gpu/gskgpurenderer.c +++ b/gsk/gpu/gskgpurenderer.c @@ -423,6 +423,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); }