[gtk/wip/chergert/glproto] helper to dump framebuffer after each batch



commit d6f36c8edb22f44e202bb6d7fbc1d42b998f03c3
Author: Christian Hergert <chergert redhat com>
Date:   Sun Jan 10 09:22:10 2021 -0800

    helper to dump framebuffer after each batch
    
    it would be nice to integrate this later into the profiler so that we can
    debug what happened during the draw process (albeit at very slow overhead).

 gsk/next/gskglcommandqueue.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
---
diff --git a/gsk/next/gskglcommandqueue.c b/gsk/next/gskglcommandqueue.c
index 02b8e60b78..3c8f0eb415 100644
--- a/gsk/next/gskglcommandqueue.c
+++ b/gsk/next/gskglcommandqueue.c
@@ -165,6 +165,30 @@ G_STATIC_ASSERT (sizeof (GskGLCommandBatch) == 32);
 
 G_DEFINE_TYPE (GskGLCommandQueue, gsk_gl_command_queue, G_TYPE_OBJECT)
 
+static void
+gsk_gl_command_queue_capture_png (GskGLCommandQueue *self,
+                                  const char        *filename,
+                                  guint              width,
+                                  guint              height)
+{
+  cairo_surface_t *surface;
+  gpointer data;
+  guint stride;
+
+  g_assert (GSK_IS_GL_COMMAND_QUEUE (self));
+  g_assert (filename != NULL);
+
+  stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, width);
+  data = g_malloc_n (height, stride);
+
+  glReadPixels (0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, data);
+  surface = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_ARGB32, width, height, stride);
+  cairo_surface_write_to_png (surface, filename);
+
+  cairo_surface_destroy (surface);
+  g_free (data);
+}
+
 static void
 gsk_gl_command_queue_save (GskGLCommandQueue *self)
 {
@@ -631,6 +655,7 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self)
   guint program = 0;
   guint16 width = 0;
   guint16 height = 0;
+  guint count = 0;
 
   g_return_if_fail (GSK_IS_GL_COMMAND_QUEUE (self));
   g_return_if_fail (self->in_draw == FALSE);
@@ -676,6 +701,8 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self)
 
       g_assert (batch->any.next_batch_index != next_batch_index);
 
+      count++;
+
       switch (batch->any.kind)
         {
         case GSK_GL_COMMAND_KIND_CLEAR:
@@ -752,6 +779,18 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self)
           g_assert_not_reached ();
         }
 
+#if 0
+      if (batch->any.kind == GSK_GL_COMMAND_KIND_DRAW ||
+          batch->any.kind == GSK_GL_COMMAND_KIND_CLEAR)
+        {
+          char filename[32];
+          g_snprintf (filename, sizeof filename,
+                      "capture%u_batch%d_kind%u.png",
+                      count++, next_batch_index, batch->any.kind);
+          gsk_gl_command_queue_capture_png (self, filename, width, height);
+        }
+#endif
+
       next_batch_index = batch->any.next_batch_index;
     }
 


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