[gtk] gl renderer: Make creating render targets easier



commit fb86fd900ece6bbabaabcc3df4624424cadcdbf9
Author: Timm Bäder <mail baedert org>
Date:   Wed May 22 07:10:57 2019 +0200

    gl renderer: Make creating render targets easier

 gsk/gl/gskgldriver.c        | 57 +++++++++++++++++++++++++++++----------------
 gsk/gl/gskgldriverprivate.h | 15 ++++++------
 gsk/gl/gskglimage.c         |  3 ++-
 gsk/gl/gskglrenderer.c      | 20 +++++-----------
 4 files changed, 52 insertions(+), 43 deletions(-)
---
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c
index 19ad7b1a78..d73575da06 100644
--- a/gsk/gl/gskgldriver.c
+++ b/gsk/gl/gskgldriver.c
@@ -585,21 +585,6 @@ gsk_gl_driver_set_texture_for_pointer (GskGLDriver *self,
   g_hash_table_insert (self->pointer_textures, pointer, GINT_TO_POINTER (texture_id));
 }
 
-int
-gsk_gl_driver_create_permanent_texture (GskGLDriver *self,
-                                        float        width,
-                                        float        height)
-{
-  Texture *t;
-
-  g_return_val_if_fail (GSK_IS_GL_DRIVER (self), -1);
-
-  t = create_texture (self, width, height);
-  t->permanent = TRUE;
-
-  return t->texture_id;
-}
-
 int
 gsk_gl_driver_create_texture (GskGLDriver *self,
                               float        width,
@@ -614,11 +599,11 @@ gsk_gl_driver_create_texture (GskGLDriver *self,
   return t->texture_id;
 }
 
-int
-gsk_gl_driver_create_render_target (GskGLDriver *self,
-                                    int          texture_id,
-                                    gboolean     add_depth_buffer,
-                                    gboolean     add_stencil_buffer)
+static int
+create_render_target (GskGLDriver *self,
+                      int          texture_id,
+                      gboolean     add_depth_buffer,
+                      gboolean     add_stencil_buffer)
 {
   GLuint fbo_id, depth_stencil_buffer_id;
   Texture *t;
@@ -673,6 +658,38 @@ gsk_gl_driver_create_render_target (GskGLDriver *self,
   return fbo_id;
 }
 
+void
+gsk_gl_driver_create_render_target (GskGLDriver *self,
+                                    int          width,
+                                    int          height,
+                                    int         *out_texture_id,
+                                    int         *out_render_target_id)
+{
+  int texture_id, render_target;
+
+  texture_id = gsk_gl_driver_create_texture (self, width, height);
+  gsk_gl_driver_bind_source_texture (self, texture_id);
+  gsk_gl_driver_init_texture_empty (self, texture_id);
+
+  render_target = create_render_target (self, texture_id, FALSE, FALSE);
+
+  *out_texture_id = texture_id;
+  *out_render_target_id = render_target;
+}
+
+/* Mark the texture permanent, meaning it won'e be reused by the GLDriver.
+ * E.g. to store it in some other cache. */
+void
+gsk_gl_driver_mark_texture_permanent (GskGLDriver *self,
+                                      int          texture_id)
+{
+  Texture *t = gsk_gl_driver_get_texture (self, texture_id);
+
+  g_assert_nonnull (t);
+
+  t->permanent = TRUE;
+}
+
 void
 gsk_gl_driver_bind_source_texture (GskGLDriver *self,
                                    int          texture_id)
diff --git a/gsk/gl/gskgldriverprivate.h b/gsk/gl/gskgldriverprivate.h
index ee34ccd092..1e57a855f1 100644
--- a/gsk/gl/gskgldriverprivate.h
+++ b/gsk/gl/gskgldriverprivate.h
@@ -39,17 +39,16 @@ int             gsk_gl_driver_get_texture_for_pointer   (GskGLDriver     *driver
 void            gsk_gl_driver_set_texture_for_pointer   (GskGLDriver     *driver,
                                                          gpointer         pointer,
                                                          int              texture_id);
-int             gsk_gl_driver_create_permanent_texture  (GskGLDriver     *driver,
-                                                         float            width,
-                                                         float            height);
 int             gsk_gl_driver_create_texture            (GskGLDriver     *driver,
                                                          float            width,
                                                          float            height);
-int             gsk_gl_driver_create_render_target      (GskGLDriver     *driver,
-                                                         int              texture_id,
-                                                         gboolean         add_depth_buffer,
-                                                         gboolean         add_stencil_buffer);
-
+void            gsk_gl_driver_create_render_target      (GskGLDriver     *driver,
+                                                         int              width,
+                                                         int              height,
+                                                         int             *out_texture_id,
+                                                         int             *out_render_target_id);
+void            gsk_gl_driver_mark_texture_permanent    (GskGLDriver     *self,
+                                                         int              texture_id);
 void            gsk_gl_driver_bind_source_texture       (GskGLDriver     *driver,
                                                          int              texture_id);
 
diff --git a/gsk/gl/gskglimage.c b/gsk/gl/gskglimage.c
index 6d91b35568..0de2e75bdc 100644
--- a/gsk/gl/gskglimage.c
+++ b/gsk/gl/gskglimage.c
@@ -8,12 +8,13 @@ gsk_gl_image_create (GskGLImage  *self,
                      int          width,
                      int          height)
 {
-  self->texture_id = gsk_gl_driver_create_permanent_texture (gl_driver, width, height);
+  self->texture_id = gsk_gl_driver_create_texture (gl_driver, width, height);
   self->width = width;
   self->height = height;
 
   gsk_gl_driver_bind_source_texture (gl_driver, self->texture_id);
   gsk_gl_driver_init_texture_empty (gl_driver, self->texture_id);
+  gsk_gl_driver_mark_texture_permanent (gl_driver, self->texture_id);
 }
 
 void
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index fbc2c0a4e2..43b9b1caa5 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -1476,16 +1476,13 @@ render_outset_shadow_node (GskGLRenderer       *self,
       int prev_render_target;
       GskRoundedRect blit_clip;
 
-      texture_id = gsk_gl_driver_create_texture (self->gl_driver, texture_width, texture_height);
-      gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id);
-      gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id);
+      gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height,
+                                          &texture_id, &render_target);
       gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
                                           "Outset Shadow Temp %d", texture_id);
-      render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, FALSE, FALSE);
       gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                            "Outset Shadow FB Temp %d", render_target);
 
-
       graphene_matrix_init_ortho (&item_proj,
                                   0, texture_width, 0, texture_height,
                                   ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE);
@@ -1513,12 +1510,10 @@ render_outset_shadow_node (GskGLRenderer       *self,
         { { texture_width,                }, { 1, 1 }, },
       });
 
-      blurred_texture_id = gsk_gl_driver_create_permanent_texture (self->gl_driver, texture_width, 
texture_height);
-      gsk_gl_driver_bind_source_texture (self->gl_driver, blurred_texture_id);
-      gsk_gl_driver_init_texture_empty (self->gl_driver, blurred_texture_id);
+      gsk_gl_driver_create_render_target (self->gl_driver, texture_width, texture_height,
+                                          &blurred_texture_id, &blurred_render_target);
       gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, blurred_texture_id,
                                           "Outset Shadow Cache %d", blurred_texture_id);
-      blurred_render_target = gsk_gl_driver_create_render_target (self->gl_driver, blurred_texture_id, TRUE, 
TRUE);
       gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                            "Outset Shadow Cache FB %d", render_target);
 
@@ -1556,6 +1551,7 @@ render_outset_shadow_node (GskGLRenderer       *self,
       ops_set_projection (builder, &prev_projection);
       ops_set_render_target (builder, prev_render_target);
 
+      gsk_gl_driver_mark_texture_permanent (self->gl_driver, blurred_texture_id);
       gsk_gl_shadow_cache_commit (&self->shadow_cache,
                                   &offset_outline,
                                   blur_radius,
@@ -2773,13 +2769,9 @@ add_offscreen_ops (GskGLRenderer         *self,
       }
   }
 
-  texture_id = gsk_gl_driver_create_texture (self->gl_driver, width, height);
-  gsk_gl_driver_bind_source_texture (self->gl_driver, texture_id);
-  gsk_gl_driver_init_texture_empty (self->gl_driver, texture_id);
+  gsk_gl_driver_create_render_target (self->gl_driver, width, height, &texture_id, &render_target);
   gdk_gl_context_label_object_printf (self->gl_context, GL_TEXTURE, texture_id,
                                       "Offscreen<%s> %d", child_node->node_class->type_name, texture_id);
-
-  render_target = gsk_gl_driver_create_render_target (self->gl_driver, texture_id, TRUE, TRUE);
   gdk_gl_context_label_object_printf  (self->gl_context, GL_FRAMEBUFFER, render_target,
                                        "Offscreen<%s> FB %d", child_node->node_class->type_name, 
render_target);
 


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