[gtk+/wip/otte/shader: 128/150] gskslfunction: Move native function details to native function code
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/otte/shader: 128/150] gskslfunction: Move native function details to native function code
- Date: Sat, 21 Oct 2017 02:36:56 +0000 (UTC)
commit 9d514d507cb78b8838ce52e0a6888217b7f13611
Author: Benjamin Otte <otte redhat com>
Date: Fri Oct 13 20:24:17 2017 +0200
gskslfunction: Move native function details to native function code
Instead of specifying the GskSlNativeFunction struct as the interface,
just have a more verbose constructor for native functins.
This will allow refactoring at will in the native function code.
gsk/gskslfunction.c | 65 +++++++++++++++++++++++++++++++------
gsk/gskslfunctionprivate.h | 7 +++-
gsk/gskslnativefunction.c | 51 +++++++++++++++++++++++++++++-
gsk/gskslnativefunctionprivate.h | 8 -----
4 files changed, 110 insertions(+), 21 deletions(-)
---
diff --git a/gsk/gskslfunction.c b/gsk/gskslfunction.c
index 122e810..6f7964a 100644
--- a/gsk/gskslfunction.c
+++ b/gsk/gskslfunction.c
@@ -189,7 +189,12 @@ typedef struct _GskSlFunctionNative GskSlFunctionNative;
struct _GskSlFunctionNative {
GskSlFunction parent;
- const GskSlNativeFunction *native;
+ char *name;
+ GskSlFunctionType *type;
+ void (* get_constant) (gpointer *retval, gpointer *arguments, gpointer user_data);
+ guint32 (* write_spv) (GskSpvWriter *writer, guint32 *arguments, gpointer user_data);
+ gpointer user_data;
+ GDestroyNotify destroy;
};
static void
@@ -197,6 +202,12 @@ gsk_sl_function_native_free (GskSlFunction *function)
{
GskSlFunctionNative *native = (GskSlFunctionNative *) function;
+ if (native->destroy)
+ native->destroy (native->user_data);
+
+ gsk_sl_function_type_unref (native->type);
+ g_free (native->name);
+
g_slice_free (GskSlFunctionNative, native);
}
@@ -205,7 +216,7 @@ gsk_sl_function_native_get_return_type (const GskSlFunction *function)
{
const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
- return gsk_sl_type_get_builtin (native->native->return_type);
+ return gsk_sl_function_type_get_return_type (native->type);
}
static const char *
@@ -213,7 +224,7 @@ gsk_sl_function_native_get_name (const GskSlFunction *function)
{
const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
- return native->native->name;
+ return native->name;
}
static gsize
@@ -221,7 +232,7 @@ gsk_sl_function_native_get_n_arguments (const GskSlFunction *function)
{
const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
- return native->native->n_arguments;
+ return gsk_sl_function_type_get_n_arguments (native->type);
}
static GskSlType *
@@ -230,7 +241,7 @@ gsk_sl_function_native_get_argument_type (const GskSlFunction *function,
{
const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
- return gsk_sl_type_get_builtin (native->native->argument_types[i]);
+ return gsk_sl_function_type_get_argument_type (native->type, i);
}
static GskSlValue *
@@ -238,7 +249,26 @@ gsk_sl_function_native_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values)
{
- return NULL;
+ const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
+ gpointer data[gsk_sl_function_type_get_n_arguments (native->type)];
+ GskSlValue *result;
+ gsize i;
+
+ if (native->get_constant == NULL)
+ return NULL;
+
+ result = gsk_sl_value_new (gsk_sl_function_type_get_return_type (native->type));
+
+ for (i = 0; i < n_values; i++)
+ {
+ data[i] = gsk_sl_value_get_data (values[i]);
+ }
+
+ native->get_constant (gsk_sl_value_get_data (result),
+ data,
+ native->user_data);
+
+ return result;
}
static void
@@ -253,7 +283,7 @@ gsk_sl_function_native_write_spv (const GskSlFunction *function,
GskSpvWriterFunc initializer,
gpointer initializer_data)
{
- g_assert (initializer != NULL);
+ g_assert (initializer == NULL);
return 0;
}
@@ -263,9 +293,9 @@ gsk_sl_function_native_write_call_spv (GskSlFunction *function,
GskSpvWriter *writer,
guint32 *arguments)
{
- g_assert_not_reached ();
+ const GskSlFunctionNative *native = (const GskSlFunctionNative *) function;
- return 0;
+ return native->write_spv (writer, arguments, native->user_data);
}
static const GskSlFunctionClass GSK_SL_FUNCTION_NATIVE = {
@@ -511,13 +541,26 @@ gsk_sl_function_new_constructor (GskSlType *type)
}
GskSlFunction *
-gsk_sl_function_new_native (const GskSlNativeFunction *native)
+gsk_sl_function_new_native (const char *name,
+ GskSlFunctionType *type,
+ void (* get_constant) (gpointer *retval, gpointer *arguments,
gpointer user_data),
+ guint32 (* write_spv) (GskSpvWriter *writer, guint32 *arguments,
gpointer user_data),
+ gpointer user_data,
+ GDestroyNotify destroy)
{
GskSlFunctionNative *function;
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (write_spv != NULL, NULL);
+
function = gsk_sl_function_new (GskSlFunctionNative, &GSK_SL_FUNCTION_NATIVE);
- function->native = native;
+ function->name = g_strdup (name);
+ function->type = gsk_sl_function_type_ref (type);
+ function->get_constant = get_constant;
+ function->write_spv = write_spv;
+ function->user_data = user_data;
+ function->destroy = destroy;
return &function->parent;
}
diff --git a/gsk/gskslfunctionprivate.h b/gsk/gskslfunctionprivate.h
index 0890e4b..a81bdfd 100644
--- a/gsk/gskslfunctionprivate.h
+++ b/gsk/gskslfunctionprivate.h
@@ -26,7 +26,12 @@
G_BEGIN_DECLS
GskSlFunction * gsk_sl_function_new_constructor (GskSlType *type);
-GskSlFunction * gsk_sl_function_new_native (const GskSlNativeFunction *native);
+GskSlFunction * gsk_sl_function_new_native (const char *name,
+ GskSlFunctionType *type,
+ void (* get_constant)
(gpointer *retval, gpointer *arguments, gpointer user_data),
+ guint32 (* write_spv)
(GskSpvWriter *writer, guint32 *arguments, gpointer user_data),
+ gpointer user_data,
+ GDestroyNotify destroy);
GskSlFunction * gsk_sl_function_new_parse (GskSlScope *scope,
GskSlPreprocessor *stream,
GskSlType *return_type,
diff --git a/gsk/gskslnativefunction.c b/gsk/gskslnativefunction.c
index 3283a3e..426de0e 100644
--- a/gsk/gskslnativefunction.c
+++ b/gsk/gskslnativefunction.c
@@ -22,8 +22,18 @@
#include "gskslenvironmentprivate.h"
#include "gskslfunctionprivate.h"
+#include "gskslfunctiontypeprivate.h"
#include "gskslscopeprivate.h"
+#include "gsksltypeprivate.h"
+struct _GskSlNativeFunction
+{
+ const char *name;
+ GskSlBuiltinType return_type;
+ gsize n_arguments;
+ const GskSlBuiltinType *argument_types;
+};
+
#define NATIVE1(type, name, arg1) \
{ name, GSK_SL_BUILTIN_ ## type, 1, (GskSlBuiltinType[1]) { GSK_SL_BUILTIN_ ## arg1 } }
#define NATIVE2(type, name, arg1, arg2) \
@@ -419,6 +429,33 @@ static const GskSlNativeFunction gsk_glsl_functions_150[] = {
{ NULL }
};
+static GskSlFunctionType *
+gsk_sl_native_functions_construct_type (const GskSlNativeFunction *native)
+{
+ GskSlFunctionType *type;
+ gsize i;
+
+ type = gsk_sl_function_type_new (gsk_sl_type_get_builtin (native->return_type));
+ for (i = 0; i < native->n_arguments; i++)
+ {
+ type = gsk_sl_function_type_add_argument (type,
+ GSK_SL_STORAGE_PARAMETER_IN,
+ gsk_sl_type_get_builtin (native->argument_types[i]));
+ }
+
+ return type;
+}
+
+static guint32
+gsk_sl_native_functions_write_spv_unimplemented (GskSpvWriter *writer,
+ guint32 *arguments,
+ gpointer user_data)
+{
+ g_assert_not_reached ();
+
+ return 0;
+}
+
static void
gsk_sl_native_functions_add_list (GskSlScope *scope,
const GskSlNativeFunction *functions)
@@ -427,9 +464,21 @@ gsk_sl_native_functions_add_list (GskSlScope *scope,
for (i = 0; functions[i].name; i++)
{
- GskSlFunction *function = gsk_sl_function_new_native (&functions[i]);
+ GskSlFunctionType *type;
+ GskSlFunction *function;
+
+ type = gsk_sl_native_functions_construct_type (&functions[i]);
+
+ function = gsk_sl_function_new_native (functions[i].name,
+ type,
+ NULL,
+ gsk_sl_native_functions_write_spv_unimplemented,
+ (gpointer) &functions[i],
+ NULL);
gsk_sl_scope_add_function (scope, function);
+
gsk_sl_function_unref (function);
+ gsk_sl_function_type_unref (type);
}
}
diff --git a/gsk/gskslnativefunctionprivate.h b/gsk/gskslnativefunctionprivate.h
index 02a3ae3..53aa4bc 100644
--- a/gsk/gskslnativefunctionprivate.h
+++ b/gsk/gskslnativefunctionprivate.h
@@ -25,14 +25,6 @@
G_BEGIN_DECLS
-struct _GskSlNativeFunction
-{
- const char *name;
- GskSlBuiltinType return_type;
- gsize n_arguments;
- const GskSlBuiltinType *argument_types;
-};
-
void gsk_sl_native_functions_add (GskSlScope *scope,
GskSlEnvironment *environment);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]