summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-10-17 16:56:54 +0200
committerBenjamin Otte <otte@redhat.com>2017-10-30 02:58:03 +0100
commitfe4d17fee1882c840c15f56fcbebb12298b63082 (patch)
tree636f91dd6ee4bb5802893ac0dedd5b4253ed821d
parent6a95433046c8501f8d7daad5b26c8bfcbb13542a (diff)
downloadgtk+-fe4d17fee1882c840c15f56fcbebb12298b63082.tar.gz
gskspvwriter: Change get_id_for_zero/one() functions
Accept a basic GskSlType instead of a scalar. That way, we can return 0/1 for vectors and matrices, which is kinda common.
-rw-r--r--gsk/gskslbinary.c4
-rw-r--r--gsk/gskslexpression.c6
-rw-r--r--gsk/gskspvwriter.c66
-rw-r--r--gsk/gskspvwriterprivate.h4
4 files changed, 46 insertions, 34 deletions
diff --git a/gsk/gskslbinary.c b/gsk/gskslbinary.c
index 220f3cf658..e157483c0c 100644
--- a/gsk/gskslbinary.c
+++ b/gsk/gskslbinary.c
@@ -671,7 +671,7 @@ gsk_sl_division_write_spv (GskSpvWriter *writer,
tmp_id = gsk_spv_writer_f_div (writer,
rtype,
- gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (type)),
+ gsk_spv_writer_get_id_for_one (writer, ltype),
right_id);
return gsk_spv_writer_matrix_times_scalar (writer,
@@ -691,7 +691,7 @@ gsk_sl_division_write_spv (GskSpvWriter *writer,
tmp_id = gsk_spv_writer_f_div (writer,
ltype,
- gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (type)),
+ gsk_spv_writer_get_id_for_one (writer, ltype),
left_id);
return gsk_spv_writer_matrix_times_scalar (writer,
type,
diff --git a/gsk/gskslexpression.c b/gsk/gskslexpression.c
index 550d5e08b5..231d9ada14 100644
--- a/gsk/gskslexpression.c
+++ b/gsk/gskslexpression.c
@@ -908,7 +908,7 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
gsize c;
scalar_id = gsk_spv_writer_convert (writer, value_id, value_type, scalar_type);
- zero_id = gsk_spv_writer_get_id_for_zero (writer, gsk_sl_type_get_scalar_type (scalar_type));
+ zero_id = gsk_spv_writer_get_id_for_zero (writer, scalar_type);
for (c = 0; c < cols; c++)
{
@@ -953,8 +953,8 @@ gsk_sl_expression_constructor_write_spv (const GskSlExpression *expression,
}
value = gsk_sl_value_new (scalar_type);
- zero_id = gsk_spv_writer_get_id_for_zero (writer, gsk_sl_type_get_scalar_type (scalar_type));
- one_id = gsk_spv_writer_get_id_for_one (writer, gsk_sl_type_get_scalar_type (scalar_type));
+ zero_id = gsk_spv_writer_get_id_for_zero (writer, scalar_type);
+ one_id = gsk_spv_writer_get_id_for_one (writer, scalar_type);
gsk_sl_value_free (value);
for (c = 0; c < cols; c++)
diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c
index ce307bbdcb..69ad24840c 100644
--- a/gsk/gskspvwriter.c
+++ b/gsk/gskspvwriter.c
@@ -447,13 +447,15 @@ gsk_spv_writer_get_id_for_value (GskSpvWriter *writer,
}
guint32
-gsk_spv_writer_get_id_for_zero (GskSpvWriter *writer,
- GskSlScalarType scalar)
+gsk_spv_writer_get_id_for_zero (GskSpvWriter *writer,
+ GskSlType *type)
{
GskSlValue *value;
guint32 result_id;
- value = gsk_sl_value_new (gsk_sl_type_get_scalar (scalar));
+ g_return_val_if_fail (gsk_sl_type_is_basic (type), 0);
+
+ value = gsk_sl_value_new (type);
result_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
@@ -461,42 +463,52 @@ gsk_spv_writer_get_id_for_zero (GskSpvWriter *writer,
}
guint32
-gsk_spv_writer_get_id_for_one (GskSpvWriter *writer,
- GskSlScalarType scalar)
+gsk_spv_writer_get_id_for_one (GskSpvWriter *writer,
+ GskSlType *type)
{
GskSlValue *value;
guint32 result_id;
+ gpointer data;
+ gsize i;
+
+ g_return_val_if_fail (gsk_sl_type_is_basic (type), 0);
- value = gsk_sl_value_new (gsk_sl_type_get_scalar (scalar));
- switch (scalar)
+ value = gsk_sl_value_new (type);
+ data = gsk_sl_value_get_data (value);
+
+ for (i = 0; i < gsk_sl_type_get_n_components (type); i++)
{
- case GSK_SL_INT:
- *(gint32 *) gsk_sl_value_get_data (value) = 1;
- break;
+ switch (gsk_sl_type_get_scalar_type (type))
+ {
+ case GSK_SL_INT:
+ ((gint32 *) data)[i] = 1;
+ break;
- case GSK_SL_UINT:
- *(guint32 *) gsk_sl_value_get_data (value) = 1;
- break;
+ case GSK_SL_UINT:
+ ((guint32 *) data)[i] = 1;
+ break;
- case GSK_SL_FLOAT:
- *(float *) gsk_sl_value_get_data (value) = 1;
- break;
+ case GSK_SL_FLOAT:
+ ((float *) data)[i] = 1;
+ break;
- case GSK_SL_DOUBLE:
- *(double *) gsk_sl_value_get_data (value) = 1;
- break;
+ case GSK_SL_DOUBLE:
+ ((double *) data)[i] = 1;
+ break;
- case GSK_SL_BOOL:
- *(guint32 *) gsk_sl_value_get_data (value) = TRUE;
- break;
+ case GSK_SL_BOOL:
+ ((guint32 *) data)[i] = 1;
+ break;
- case GSK_SL_VOID:
- break;
+ case GSK_SL_VOID:
+ break;
- default:
- g_assert_not_reached ();
- break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
}
+
result_id = gsk_spv_writer_get_id_for_value (writer, value);
gsk_sl_value_free (value);
diff --git a/gsk/gskspvwriterprivate.h b/gsk/gskspvwriterprivate.h
index 74937dfce4..37342b24ff 100644
--- a/gsk/gskspvwriterprivate.h
+++ b/gsk/gskspvwriterprivate.h
@@ -67,9 +67,9 @@ guint32 gsk_spv_writer_get_id_for_pointer_type (GskSpvWriter
guint32 gsk_spv_writer_get_id_for_value (GskSpvWriter *writer,
GskSlValue *value);
guint32 gsk_spv_writer_get_id_for_zero (GskSpvWriter *writer,
- GskSlScalarType scalar);
+ GskSlType *type);
guint32 gsk_spv_writer_get_id_for_one (GskSpvWriter *writer,
- GskSlScalarType scalar);
+ GskSlType *type);
guint32 gsk_spv_writer_get_id_for_variable (GskSpvWriter *writer,
GskSlVariable *variable);
guint32 gsk_spv_writer_get_id_for_function (GskSpvWriter *writer,