[gtk/ngl-tweaks: 1/4] Add shader statistics again




commit a041c18676eee6fca1a90e039bdc7287d7013f9b
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Mar 9 20:43:25 2021 -0500

    Add shader statistics again
    
    This roughly counts how many pixels we feed through
    each fragment shader.

 gsk/ngl/gsknglrenderer.c  |  4 +++
 gsk/ngl/gsknglrenderjob.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+)
---
diff --git a/gsk/ngl/gsknglrenderer.c b/gsk/ngl/gsknglrenderer.c
index 66edc98d5d..c16fc8ca62 100644
--- a/gsk/ngl/gsknglrenderer.c
+++ b/gsk/ngl/gsknglrenderer.c
@@ -286,6 +286,8 @@ gsk_ngl_renderer_dispose (GObject *object)
   G_OBJECT_CLASS (gsk_ngl_renderer_parent_class)->dispose (object);
 }
 
+extern void dump_program_counters (void);
+
 static void
 gsk_ngl_renderer_class_init (GskNglRendererClass *klass)
 {
@@ -298,6 +300,8 @@ gsk_ngl_renderer_class_init (GskNglRendererClass *klass)
   renderer_class->unrealize = gsk_ngl_renderer_unrealize;
   renderer_class->render = gsk_ngl_renderer_render;
   renderer_class->render_texture = gsk_ngl_renderer_render_texture;
+
+  g_atexit (dump_program_counters);
 }
 
 static void
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 93ca180133..820c5d5321 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -874,6 +874,9 @@ gsk_ngl_render_job_update_clip (GskNglRenderJob     *job,
   return TRUE;
 }
 
+static void update_program_counters (GskNglRenderJob *job,
+                                     float width, float height);
+
 /* load_vertex_data_with_region */
 static inline void
 gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *job,
@@ -888,6 +891,8 @@ gsk_ngl_render_job_load_vertices_from_offscreen (GskNglRenderJob             *jo
   float y1 = offscreen->was_offscreen ? offscreen->area.y2 : offscreen->area.y;
   float y2 = offscreen->was_offscreen ? offscreen->area.y : offscreen->area.y2;
 
+  update_program_counters (job, max_x - min_x, max_y - min_y);
+
   vertices[0].position[0] = min_x;
   vertices[0].position[1] = min_y;
   vertices[0].uv[0] = offscreen->area.x;
@@ -933,6 +938,8 @@ gsk_ngl_render_job_draw (GskNglRenderJob *job,
   float max_x = min_x + width;
   float max_y = min_y + height;
 
+  update_program_counters (job, width, height);
+
   vertices[0].position[0] = min_x;
   vertices[0].position[1] = min_y;
   vertices[0].uv[0] = 0;
@@ -986,6 +993,8 @@ gsk_ngl_render_job_draw_coords (GskNglRenderJob *job,
 {
   GskNglDrawVertex *vertices = gsk_ngl_command_queue_add_vertices (job->command_queue);
 
+  update_program_counters (job, max_x - min_x, max_y - min_y);
+
   vertices[0].position[0] = min_x;
   vertices[0].position[1] = min_y;
   vertices[0].uv[0] = 0;
@@ -1030,6 +1039,68 @@ gsk_ngl_render_job_draw_offscreen_rect (GskNglRenderJob       *job,
   gsk_ngl_render_job_draw_coords (job, min_x, min_y, max_x, max_y);
 }
 
+typedef struct {
+#define GSK_NGL_NO_UNIFORMS
+#define GSK_NGL_ADD_UNIFORM(pos, KEY, name)
+#define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) \
+  guint64 name ## _no_clip; \
+  guint64 name ## _rect_clip; \
+  guint64 name;
+# include "gsknglprograms.defs"
+#undef GSK_NGL_NO_UNIFORMS
+#undef GSK_NGL_ADD_UNIFORM
+#undef GSK_NGL_DEFINE_PROGRAM
+} ProgramCounters;
+
+static ProgramCounters counters;
+
+void dump_program_counters (void);
+
+void
+dump_program_counters (void)
+{
+#define GSK_NGL_NO_UNIFORMS
+#define GSK_NGL_ADD_UNIFORM(pos, KEY, name)
+#define PRINT_ONE(name) \
+  g_print ("%lu " #name "\n", counters.name);
+#define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) \
+  PRINT_ONE(name ## _no_clip) \
+  PRINT_ONE(name ## _rect_clip) \
+  PRINT_ONE(name)
+# include "gsknglprograms.defs"
+#undef GSK_NGL_NO_UNIFORMS
+#undef GSK_NGL_ADD_UNIFORM
+#undef GSK_NGL_DEFINE_PROGRAM
+}
+
+static void
+update_prog_counters (GskNglRenderJob *job,
+                      GskNglProgram    *program,
+                      float width, float height)
+{
+  guint64 pixels = ceilf (width) * ceilf (height);
+#define GSK_NGL_NO_UNIFORMS
+#define GSK_NGL_ADD_UNIFORM(pos, KEY, name)
+#define GSK_NGL_DEFINE_PROGRAM(name, resource, uniforms) \
+  if (program == job->driver->name) \
+    counters.name += pixels; \
+  else if (program == job->driver->name ## _no_clip) \
+    counters.name ## _no_clip += pixels; \
+  else if (program == job->driver->name ## _rect_clip) \
+    counters.name ## _rect_clip += pixels;
+# include "gsknglprograms.defs"
+#undef GSK_NGL_NO_UNIFORMS
+#undef GSK_NGL_ADD_UNIFORM
+#undef GSK_NGL_DEFINE_PROGRAM
+}
+
+static void
+update_program_counters (GskNglRenderJob *job,
+                         float width, float height)
+{
+  update_prog_counters (job, job->current_program, width, height);
+}
+
 static inline void
 gsk_ngl_render_job_begin_draw (GskNglRenderJob *job,
                                GskNglProgram   *program)
@@ -1869,6 +1940,11 @@ gsk_ngl_render_job_visit_border_node (GskNglRenderJob     *job,
 
     program = CHOOSE_PROGRAM (job, border);
 
+    update_prog_counters (job, program, max_x - min_x, widths[0]);
+    update_prog_counters (job, program, max_y - min_y, widths[1]);
+    update_prog_counters (job, program, max_x - min_x, widths[2]);
+    update_prog_counters (job, program, max_y - min_y, widths[3]);
+
     gsk_ngl_program_set_uniform4fv (program,
                                     UNIFORM_BORDER_WIDTHS, 0,
                                     1,
@@ -2831,6 +2907,8 @@ gsk_ngl_render_job_visit_text_node (GskNglRenderJob     *job,
       glyph_x2 = glyph_x + glyph->ink_rect.width;
       glyph_y2 = glyph_y + glyph->ink_rect.height;
 
+      update_program_counters (job, glyph->ink_rect.width, glyph->ink_rect.height);
+
       vertices[base+0].position[0] = glyph_x;
       vertices[base+0].position[1] = glyph_y;
       vertices[base+0].uv[0] = tx;


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