[gtk/matthiasc/glshader-node: 14/18] GskShaderArgBuilder: Use standard builder-like API




commit 59c8c75ede0935cbfd759b3f8f2fb216a21a0a9e
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Sep 28 16:38:23 2020 +0200

    GskShaderArgBuilder: Use standard builder-like API
    
    Primarily this is ref/unref vs copy, and ne wfree_to_args() method. But
    also some minor renames.

 docs/reference/gsk/gsk4-sections.txt |  9 ++--
 gsk/gskglshader.c                    | 86 ++++++++++++++++++++++++++++--------
 gsk/gskglshader.h                    | 13 +++---
 gsk/gskrendernodeparser.c            |  6 +--
 testsuite/gsk/shader.c               |  6 +--
 5 files changed, 85 insertions(+), 35 deletions(-)
---
diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt
index c36920dd43..3757a49a67 100644
--- a/docs/reference/gsk/gsk4-sections.txt
+++ b/docs/reference/gsk/gsk4-sections.txt
@@ -303,10 +303,11 @@ gsk_gl_shader_format_args
 <SUBSECTION Shader Args Builder>
 GskShaderArgsBuilder
 
-gsk_gl_shader_build_args
-gsk_shader_args_builder_finish
-gsk_shader_args_builder_free
-gsk_shader_args_builder_copy
+gsk_shader_args_builder_new
+gsk_shader_args_builder_to_args
+gsk_shader_args_builder_free_to_args
+gsk_shader_args_builder_unref
+gsk_shader_args_builder_ref
 
 gsk_shader_args_builder_set_float
 gsk_shader_args_builder_set_int
diff --git a/gsk/gskglshader.c b/gsk/gskglshader.c
index 59c443bf7c..b2efdbce62 100644
--- a/gsk/gskglshader.c
+++ b/gsk/gskglshader.c
@@ -1008,13 +1008,14 @@ gsk_gl_shader_format_args (GskGLShader *shader,
 }
 
 struct _GskShaderArgsBuilder {
+  guint ref_count;
   GskGLShader *shader;
   guchar *data;
 };
 
 G_DEFINE_BOXED_TYPE (GskShaderArgsBuilder, gsk_shader_args_builder,
-                     gsk_shader_args_builder_copy,
-                     gsk_shader_args_builder_free);
+                     gsk_shader_args_builder_ref,
+                     gsk_shader_args_builder_unref);
 
 
 /**
@@ -1027,9 +1028,10 @@ G_DEFINE_BOXED_TYPE (GskShaderArgsBuilder, gsk_shader_args_builder,
  * Returns: (transfer full): The newly allocated builder, free with gsk_shader_args_builder_free()
  */
 GskShaderArgsBuilder *
-gsk_gl_shader_build_args (GskGLShader *shader)
+gsk_shader_args_builder_new (GskGLShader *shader)
 {
   GskShaderArgsBuilder *builder = g_new0 (GskShaderArgsBuilder, 1);
+  builder->ref_count = 1;
   builder->shader = g_object_ref (shader);
   builder->data = g_malloc0 (shader->uniforms_size);
 
@@ -1037,50 +1039,91 @@ gsk_gl_shader_build_args (GskGLShader *shader)
 }
 
 /**
- * gsk_shader_args_builder_finish:
+ * gsk_shader_args_builder_to_args:
  * @builder: A #GskShaderArgsBuilder
  *
- * Finishes building the uniform data and returns it as a GBytes. Once this
- * is called the builder can not be used anymore.
+ * Creates a new #GBytes args from the current state of the
+ * given @builder
+ *
+ * The given #GskShaderArgsBuilder is reset once this function returns;
+ * you cannot call this function multiple times on the same @builder instance.
+ *
+ * This function is intended primarily for bindings. C code should use
+ * gsk_shader_args_builder_free_to_args().
+ *
  *
  * Returns: (transfer full): The newly allocated builder, free with gsk_shader_args_builder_free()
  */
 GBytes *
-gsk_shader_args_builder_finish (GskShaderArgsBuilder *builder)
+gsk_shader_args_builder_to_args (GskShaderArgsBuilder *builder)
 {
   return g_bytes_new_take (g_steal_pointer (&builder->data),
                            builder->shader->uniforms_size);
 }
 
 /**
- * gsk_shader_args_builder_free:
+ * gdk_content_formats_builder_free_to_formats: (skip)
+ * @builder: a #GdkContentFormatsBuilder
+ *
+ * Creates a new #GBytes args from the current state of the
+ * given @builder, and frees the @builder instance.
+ *
+ * Returns: (transfer full): the newly created #GBytes
+ *   with all the args added to @builder
+ */
+GBytes *
+gsk_shader_args_builder_free_to_args (GskShaderArgsBuilder *builder)
+{
+  GBytes *res;
+
+  g_return_val_if_fail (builder != NULL, NULL);
+
+  res = gsk_shader_args_builder_to_args (builder);
+
+  gsk_shader_args_builder_unref (builder);
+
+  return res;
+}
+
+
+/**
+ * gsk_shader_args_builder_unref:
  * @builder: A #GskShaderArgsBuilder
  *
- * Frees the builder.
+ * Decreases the reference count of a #GskShaderArgBuilder by one.
+ * If the resulting reference count is zero, frees the builder.
  */
 void
-gsk_shader_args_builder_free (GskShaderArgsBuilder *builder)
+gsk_shader_args_builder_unref (GskShaderArgsBuilder *builder)
+
 {
+  g_return_if_fail (builder != NULL);
+  g_return_if_fail (builder->ref_count > 0);
+
+  builder->ref_count--;
+  if (builder->ref_count > 0)
+    return;
+
   g_object_unref (builder->shader);
   g_free (builder->data);
   g_free (builder);
 }
 
 /**
- * gsk_shader_args_builder_copy:
+ * gsk_shader_args_builder_ref:
  * @builder: A #GskShaderArgsBuilder
  *
- * Makes a copy of the builder.
+ * Increases the reference count of a #GskShaderArgsBuilder by one.
  *
- * Returns: (transfer full): A copy of the builder, free with gsk_shader_args_builder_free().
+ * Returns: the passed in #GskShaderArgsBuilder.
  */
 GskShaderArgsBuilder *
-gsk_shader_args_builder_copy (GskShaderArgsBuilder *builder)
+gsk_shader_args_builder_ref (GskShaderArgsBuilder *builder)
 {
-  GskShaderArgsBuilder *new = g_new0 (GskShaderArgsBuilder, 1);
-  new->data = g_memdup (builder->data, builder->shader->uniforms_size);
-  new->shader = g_object_ref (builder->shader);
-  return new;
+  g_return_val_if_fail (builder != NULL, NULL);
+
+  builder->ref_count++;
+  return builder;
 }
 
 /**
@@ -1101,6 +1144,7 @@ gsk_shader_args_builder_set_float (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_FLOAT);
@@ -1127,6 +1171,7 @@ gsk_shader_args_builder_set_int (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_INT);
@@ -1153,6 +1198,7 @@ gsk_shader_args_builder_set_uint (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_UINT);
@@ -1179,6 +1225,7 @@ gsk_shader_args_builder_set_bool (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_BOOL);
@@ -1205,6 +1252,7 @@ gsk_shader_args_builder_set_vec2 (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_VEC2);
@@ -1231,6 +1279,7 @@ gsk_shader_args_builder_set_vec3 (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_VEC3);
@@ -1257,6 +1306,7 @@ gsk_shader_args_builder_set_vec4 (GskShaderArgsBuilder *builder,
   const GskGLUniform *u;
   guchar *args_dest;
 
+  g_assert (builder->data != NULL);
   g_assert (idx < shader->uniforms->len);
   u = &g_array_index (shader->uniforms, GskGLUniform, idx);
   g_assert (u->type == GSK_GL_UNIFORM_TYPE_VEC4);
diff --git a/gsk/gskglshader.h b/gsk/gskglshader.h
index 6401c3b535..05774ca02a 100644
--- a/gsk/gskglshader.h
+++ b/gsk/gskglshader.h
@@ -110,18 +110,19 @@ void     gsk_gl_shader_get_arg_vec4  (GskGLShader     *shader,
                                       int              idx,
                                       graphene_vec4_t *out_value);
 
-GDK_AVAILABLE_IN_ALL
-GskShaderArgsBuilder *gsk_gl_shader_build_args (GskGLShader *shader);
-
 GDK_AVAILABLE_IN_ALL
 GType   gsk_shader_args_builder_get_type  (void) G_GNUC_CONST;
 
 GDK_AVAILABLE_IN_ALL
-GBytes *               gsk_shader_args_builder_finish (GskShaderArgsBuilder *builder);
+GskShaderArgsBuilder *gsk_shader_args_builder_new           (GskGLShader *shader);
+GDK_AVAILABLE_IN_ALL
+GBytes *               gsk_shader_args_builder_to_args      (GskShaderArgsBuilder *builder);
+GDK_AVAILABLE_IN_ALL
+GBytes *               gsk_shader_args_builder_free_to_args (GskShaderArgsBuilder *builder);
 GDK_AVAILABLE_IN_ALL
-void                   gsk_shader_args_builder_free   (GskShaderArgsBuilder *builder);
+GskShaderArgsBuilder  *gsk_shader_args_builder_ref          (GskShaderArgsBuilder *builder);
 GDK_AVAILABLE_IN_ALL
-GskShaderArgsBuilder  *gsk_shader_args_builder_copy   (GskShaderArgsBuilder *builder);
+void                   gsk_shader_args_builder_unref        (GskShaderArgsBuilder *builder);
 
 GDK_AVAILABLE_IN_ALL
 void    gsk_shader_args_builder_set_float (GskShaderArgsBuilder *builder,
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index ecf0675c26..1746354ec7 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -1243,7 +1243,7 @@ parse_glshader_node (GtkCssParser *parser)
 
   shader = shader_info.shader;
 
-  builder = gsk_gl_shader_build_args (shader);
+  builder = gsk_shader_args_builder_new (shader);
   for (i = 0; i < shader_info.uniform_values->len; i++)
     {
       GskGLUniformType uniform_type = gsk_gl_shader_get_uniform_type (shader, i);
@@ -1297,9 +1297,7 @@ parse_glshader_node (GtkCssParser *parser)
         }
     }
 
-  args = gsk_shader_args_builder_finish (builder);
-  gsk_shader_args_builder_free (builder);
-
+  args = gsk_shader_args_builder_free_to_args (builder);
   node = gsk_gl_shader_node_new (shader, &bounds, args,
                                  child, len);
 
diff --git a/testsuite/gsk/shader.c b/testsuite/gsk/shader.c
index 4a398b9eb2..fa413a0d1b 100644
--- a/testsuite/gsk/shader.c
+++ b/testsuite/gsk/shader.c
@@ -119,7 +119,7 @@ test_create_data (void)
   g_assert_nonnull (shader);
   g_clear_pointer (&bytes, g_bytes_unref);
 
-  builder = gsk_gl_shader_build_args (shader);
+  builder = gsk_shader_args_builder_new (shader);
   g_assert_nonnull (builder);
 
   graphene_vec2_init (&v2, 20, 30);
@@ -134,7 +134,7 @@ test_create_data (void)
   gsk_shader_args_builder_set_vec3 (builder, 6, &v3);
   gsk_shader_args_builder_set_vec4 (builder, 7, &v4);
 
-  bytes = gsk_shader_args_builder_finish (builder);
+  bytes = gsk_shader_args_builder_to_args (builder);
 
   g_assert_cmpfloat (gsk_gl_shader_get_arg_float (shader, bytes, 0), ==, 0.5);
   g_assert_cmpfloat (gsk_gl_shader_get_arg_float (shader, bytes, 1), ==, 20.0);
@@ -152,7 +152,7 @@ test_create_data (void)
 
   g_bytes_unref (bytes);
 
-  gsk_shader_args_builder_free (builder);
+  gsk_shader_args_builder_unref (builder);
 
   g_object_unref (shader);
 }


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