diff --git a/gsk/gskslvariable.c b/gsk/gskslvariable.c index ff01fe33cf..1a4fbe33ae 100644 --- a/gsk/gskslvariable.c +++ b/gsk/gskslvariable.c @@ -45,6 +45,7 @@ struct _GskSlVariableClass void (* free) (GskSlVariable *variable); + gboolean (* is_direct_access_spv) (const GskSlVariable *variable); guint32 (* write_spv) (const GskSlVariable *variable, GskSpvWriter *writer); guint32 (* load_spv) (GskSlVariable *variable, @@ -80,6 +81,12 @@ gsk_sl_variable_free (GskSlVariable *variable) /* STANDARD */ +static gboolean +gsk_sl_variable_standard_is_direct_access_spv (const GskSlVariable *variable) +{ + return TRUE; +} + static guint32 gsk_sl_variable_standard_write_spv (const GskSlVariable *variable, GskSpvWriter *writer) @@ -135,6 +142,7 @@ gsk_sl_variable_standard_store_spv (GskSlVariable *variable, static const GskSlVariableClass GSK_SL_VARIABLE_STANDARD = { sizeof (GskSlVariable), gsk_sl_variable_free, + gsk_sl_variable_standard_is_direct_access_spv, gsk_sl_variable_standard_write_spv, gsk_sl_variable_standard_load_spv, gsk_sl_variable_standard_store_spv, @@ -142,6 +150,12 @@ static const GskSlVariableClass GSK_SL_VARIABLE_STANDARD = { /* CONSTANT */ +static gboolean +gsk_sl_variable_constant_is_direct_access_spv (const GskSlVariable *variable) +{ + return FALSE; +} + static guint32 gsk_sl_variable_constant_write_spv (const GskSlVariable *variable, GskSpvWriter *writer) @@ -167,6 +181,7 @@ gsk_sl_variable_constant_store_spv (GskSlVariable *variable, static const GskSlVariableClass GSK_SL_VARIABLE_CONSTANT = { sizeof (GskSlVariable), gsk_sl_variable_free, + gsk_sl_variable_constant_is_direct_access_spv, gsk_sl_variable_constant_write_spv, gsk_sl_variable_constant_load_spv, gsk_sl_variable_constant_store_spv, @@ -174,6 +189,12 @@ static const GskSlVariableClass GSK_SL_VARIABLE_CONSTANT = { /* PARAMETER */ +static gboolean +gsk_sl_variable_parameter_is_direct_access_spv (const GskSlVariable *variable) +{ + return TRUE; +} + static guint32 gsk_sl_variable_parameter_write_spv (const GskSlVariable *variable, GskSpvWriter *writer) @@ -216,6 +237,7 @@ gsk_sl_variable_parameter_store_spv (GskSlVariable *variable, static const GskSlVariableClass GSK_SL_VARIABLE_PARAMETER = { sizeof (GskSlVariable), gsk_sl_variable_free, + gsk_sl_variable_parameter_is_direct_access_spv, gsk_sl_variable_parameter_write_spv, gsk_sl_variable_parameter_load_spv, gsk_sl_variable_parameter_store_spv, @@ -223,6 +245,12 @@ static const GskSlVariableClass GSK_SL_VARIABLE_PARAMETER = { /* CONST_PARAMETER */ +static gboolean +gsk_sl_variable_const_parameter_is_direct_access_spv (const GskSlVariable *variable) +{ + return FALSE; +} + static guint32 gsk_sl_variable_const_parameter_write_spv (const GskSlVariable *variable, GskSpvWriter *writer) @@ -256,6 +284,7 @@ gsk_sl_variable_const_parameter_store_spv (GskSlVariable *variable, static const GskSlVariableClass GSK_SL_VARIABLE_CONST_PARAMETER = { sizeof (GskSlVariable), gsk_sl_variable_free, + gsk_sl_variable_const_parameter_is_direct_access_spv, gsk_sl_variable_const_parameter_write_spv, gsk_sl_variable_const_parameter_load_spv, gsk_sl_variable_const_parameter_store_spv, @@ -405,6 +434,12 @@ gsk_sl_variable_is_constant (const GskSlVariable *variable) return gsk_sl_qualifier_is_constant (&variable->qualifier); } +gboolean +gsk_sl_variable_is_direct_access_spv (const GskSlVariable *variable) +{ + return variable->class->is_direct_access_spv (variable); +} + guint32 gsk_sl_variable_write_spv (const GskSlVariable *variable, GskSpvWriter *writer) diff --git a/gsk/gskslvariableprivate.h b/gsk/gskslvariableprivate.h index d414ad6665..2df9759194 100644 --- a/gsk/gskslvariableprivate.h +++ b/gsk/gskslvariableprivate.h @@ -42,6 +42,7 @@ const char * gsk_sl_variable_get_name (const GskSlVari const GskSlValue * gsk_sl_variable_get_initial_value (const GskSlVariable *variable); gboolean gsk_sl_variable_is_constant (const GskSlVariable *variable); +gboolean gsk_sl_variable_is_direct_access_spv (const GskSlVariable *variable); guint32 gsk_sl_variable_write_spv (const GskSlVariable *variable, GskSpvWriter *writer); guint32 gsk_sl_variable_load_spv (GskSlVariable *variable, diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c index 625d1eb06d..57e5b38b00 100644 --- a/gsk/gskspvwriter.c +++ b/gsk/gskspvwriter.c @@ -754,6 +754,9 @@ gsk_spv_access_chain_new (GskSpvWriter *writer, { GskSpvAccessChain *chain; + if (!gsk_sl_variable_is_direct_access_spv (variable)) + return NULL; + chain = g_slice_new0 (GskSpvAccessChain); chain->writer = gsk_spv_writer_ref (writer);