gskslfunction: Add gsk_sl_function_get_constant()

Also, call it from the function call expression.

It's completely unimplemented so far, so it's not that useful.
This commit is contained in:
Benjamin Otte
2017-10-03 02:43:53 +02:00
parent 0c567d6c28
commit 0a9f758c36
3 changed files with 69 additions and 2 deletions

View File

@@ -995,8 +995,31 @@ gsk_sl_expression_function_call_get_return_type (const GskSlExpression *expressi
static GskSlValue *
gsk_sl_expression_function_call_get_constant (const GskSlExpression *expression)
{
/* FIXME: some functions are constant */
return NULL;
const GskSlExpressionFunctionCall *function_call = (const GskSlExpressionFunctionCall *) expression;
GskSlValue *values[function_call->n_arguments];
GskSlValue *result, *tmp;
guint i;
for (i = 0; i < function_call->n_arguments; i++)
{
tmp = gsk_sl_expression_get_constant (function_call->arguments[i]);
if (tmp == NULL)
{
guint j;
for (j = 0; j < i; j++)
gsk_sl_value_free (values[j]);
return NULL;
}
values[i] = gsk_sl_value_new_convert (tmp, gsk_sl_function_get_argument_type (function_call->function, i));
gsk_sl_value_free (tmp);
}
result = gsk_sl_function_get_constant (function_call->function, values, function_call->n_arguments);
for (i = 0; i < function_call->n_arguments; i++)
gsk_sl_value_free (values[i]);
return result;
}
static guint32

View File

@@ -29,6 +29,7 @@
#include "gskslscopeprivate.h"
#include "gsksltokenizerprivate.h"
#include "gsksltypeprivate.h"
#include "gskslvalueprivate.h"
#include "gskslvariableprivate.h"
#include "gskspvwriterprivate.h"
@@ -49,6 +50,9 @@ struct _GskSlFunctionClass {
gsize (* get_n_arguments) (const GskSlFunction *function);
GskSlType * (* get_argument_type) (const GskSlFunction *function,
gsize i);
GskSlValue * (* get_constant) (const GskSlFunction *function,
GskSlValue **values,
gsize n_values);
void (* print) (const GskSlFunction *function,
GskSlPrinter *printer);
guint32 (* write_spv) (const GskSlFunction *function,
@@ -123,6 +127,14 @@ gsk_sl_function_constructor_get_argument_type (const GskSlFunction *function,
return gsk_sl_type_get_member_type (constructor->type, i);
}
static GskSlValue *
gsk_sl_function_constructor_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values)
{
return NULL;
}
static void
gsk_sl_function_constructor_print (const GskSlFunction *function,
GskSlPrinter *printer)
@@ -142,6 +154,7 @@ static const GskSlFunctionClass GSK_SL_FUNCTION_CONSTRUCTOR = {
gsk_sl_function_constructor_get_name,
gsk_sl_function_constructor_get_n_arguments,
gsk_sl_function_constructor_get_argument_type,
gsk_sl_function_constructor_get_constant,
gsk_sl_function_constructor_print,
gsk_sl_function_constructor_write_spv,
};
@@ -196,6 +209,15 @@ gsk_sl_function_native_get_argument_type (const GskSlFunction *function,
return gsk_sl_type_get_builtin (native->native->argument_types[i]);
}
static GskSlValue *
gsk_sl_function_native_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values)
{
return NULL;
}
static void
gsk_sl_function_native_print (const GskSlFunction *function,
GskSlPrinter *printer)
@@ -215,6 +237,7 @@ static const GskSlFunctionClass GSK_SL_FUNCTION_NATIVE = {
gsk_sl_function_native_get_name,
gsk_sl_function_native_get_n_arguments,
gsk_sl_function_native_get_argument_type,
gsk_sl_function_native_get_constant,
gsk_sl_function_native_print,
gsk_sl_function_native_write_spv
};
@@ -286,6 +309,15 @@ gsk_sl_function_declared_get_argument_type (const GskSlFunction *function,
return gsk_sl_pointer_type_get_type (gsk_sl_variable_get_type (declared->arguments[i]));
}
static GskSlValue *
gsk_sl_function_declared_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values)
{
return NULL;
}
static void
gsk_sl_function_declared_print (const GskSlFunction *function,
GskSlPrinter *printer)
@@ -380,6 +412,7 @@ static const GskSlFunctionClass GSK_SL_FUNCTION_DECLARED = {
gsk_sl_function_declared_get_name,
gsk_sl_function_declared_get_n_arguments,
gsk_sl_function_declared_get_argument_type,
gsk_sl_function_declared_get_constant,
gsk_sl_function_declared_print,
gsk_sl_function_declared_write_spv,
};
@@ -575,6 +608,14 @@ gsk_sl_function_get_argument_type (const GskSlFunction *function,
return function->class->get_argument_type (function, i);
}
GskSlValue *
gsk_sl_function_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values)
{
return function->class->get_constant (function, values, n_values);
}
void
gsk_sl_function_print (const GskSlFunction *function,
GskSlPrinter *printer)

View File

@@ -43,6 +43,9 @@ GskSlType * gsk_sl_function_get_return_type (const GskSlFunc
gsize gsk_sl_function_get_n_arguments (const GskSlFunction *function);
GskSlType * gsk_sl_function_get_argument_type (const GskSlFunction *function,
gsize i);
GskSlValue * gsk_sl_function_get_constant (const GskSlFunction *function,
GskSlValue **values,
gsize n_values);
guint32 gsk_sl_function_write_spv (const GskSlFunction *function,
GskSpvWriter *writer);