rendernodeparser: Handle shader nodes better
authorMatthias Clasen <mclasen@redhat.com>
Sat, 6 May 2023 18:33:30 +0000 (14:33 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 6 May 2023 18:33:45 +0000 (14:33 -0400)
Avoid criticals when editing shader nodes in
the node editor.

gsk/gskrendernodeparser.c

index b704a4c19338e479532221028bec3e2e12eecba6..5c29ce0918e0a5ad5b1cd7c27cfe37ba91dfc24a 100644 (file)
@@ -1371,7 +1371,10 @@ parse_shader (GtkCssParser *parser,
   GskGLShader *shader;
 
   if (!parse_string (parser, context, &sourcecode))
-    return FALSE;
+    {
+      gtk_css_parser_error_value (parser, "Not a string");
+      return FALSE;
+    }
 
   bytes = g_bytes_new_take (sourcecode, strlen (sourcecode));
   shader = gsk_gl_shader_new_from_bytes (bytes);
@@ -1500,6 +1503,29 @@ parse_shader_args (GtkCssParser *parser,
   return TRUE;
 }
 
+static const char default_glsl[] =
+  "void\n"
+  "mainImage(out vec4 fragColor,\n"
+  "          in vec2 fragCoord,\n"
+  "          in vec2 resolution,\n"
+  "          in vec2 uv)\n"
+  "{\n"
+  "  fragColor = vec4(1.0, 105.0/255.0, 180.0/255.0, 1.0);\n"
+  "}";
+
+static GskGLShader *
+get_default_glshader (void)
+{
+  GBytes *bytes;
+  GskGLShader *shader;
+
+  bytes = g_bytes_new (default_glsl, strlen (default_glsl) + 1);
+  shader = gsk_gl_shader_new_from_bytes (bytes);
+  g_bytes_unref (bytes);
+
+  return shader;
+}
+
 static GskRenderNode *
 parse_glshader_node (GtkCssParser *parser,
                      Context      *context)
@@ -1520,6 +1546,7 @@ parse_glshader_node (GtkCssParser *parser,
     { "child4", parse_node, clear_node, &child[3] },
   };
   GskGLShader *shader;
+  GskShaderArgsBuilder *builder;
   GskRenderNode *node;
   GBytes *args = NULL;
   int len, i;
@@ -1532,8 +1559,17 @@ parse_glshader_node (GtkCssParser *parser,
         break;
     }
 
-  shader = shader_info.shader;
-  args = gsk_shader_args_builder_free_to_args (shader_info.args);
+  if (shader_info.shader)
+    shader = shader_info.shader;
+  else
+    shader = get_default_glshader ();
+
+  if (shader_info.args)
+    builder = shader_info.args;
+  else
+    builder = gsk_shader_args_builder_new (shader, NULL);
+
+  args = gsk_shader_args_builder_free_to_args (builder);
 
   node = gsk_gl_shader_node_new (shader, &bounds, args, child, len);