diff options
author | Benjamin Otte <otte@redhat.com> | 2017-10-18 05:39:25 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2017-10-30 02:58:03 +0100 |
commit | 15cbfc83708ce4496dd6bcb5755c57880eefdaff (patch) | |
tree | c7e3ee9afb5db5c078216f5d8f12be9f5f052d0d | |
parent | caaf1845c3d712b485f4c734d083393cab6487b8 (diff) | |
download | gtk+-15cbfc83708ce4496dd6bcb5755c57880eefdaff.tar.gz |
gskslqualifier: Require type to determine storage class
Opaque type uniforms have a different storage class than regular
uniforms.
-rw-r--r-- | gsk/gskslqualifier.c | 22 | ||||
-rw-r--r-- | gsk/gskslqualifierprivate.h | 3 | ||||
-rw-r--r-- | gsk/gskslvariable.c | 6 | ||||
-rw-r--r-- | gsk/gskspvwriter.c | 3 |
4 files changed, 29 insertions, 5 deletions
diff --git a/gsk/gskslqualifier.c b/gsk/gskslqualifier.c index c859831649..1dcb66d11d 100644 --- a/gsk/gskslqualifier.c +++ b/gsk/gskslqualifier.c @@ -590,8 +590,26 @@ gsk_sl_qualifier_get_location (const GskSlQualifier *qualifier) } } +static gboolean +type_contains_opaque (const GskSlType *type) +{ + gsize i; + + if (gsk_sl_type_is_opaque (type)) + return TRUE; + + for (i = 0; i < gsk_sl_type_get_n_members (type); i++) + { + if (type_contains_opaque (gsk_sl_type_get_member_type (type, i))) + return TRUE; + } + + return FALSE; +} + GskSpvStorageClass -gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier) +gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier, + const GskSlType *type) { switch (qualifier->storage) { @@ -613,6 +631,8 @@ gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier) case GSK_SL_STORAGE_GLOBAL_UNIFORM: if (qualifier->layout.push_constant) return GSK_SPV_STORAGE_CLASS_PUSH_CONSTANT; + else if (type_contains_opaque (type)) + return GSK_SPV_STORAGE_CLASS_UNIFORM_CONSTANT; else return GSK_SPV_STORAGE_CLASS_UNIFORM; diff --git a/gsk/gskslqualifierprivate.h b/gsk/gskslqualifierprivate.h index a21841b858..393dd0b9d5 100644 --- a/gsk/gskslqualifierprivate.h +++ b/gsk/gskslqualifierprivate.h @@ -72,7 +72,8 @@ gboolean gsk_sl_qualifier_print (const G gboolean gsk_sl_qualifier_is_constant (const GskSlQualifier *qualifier); GskSlQualifierLocation gsk_sl_qualifier_get_location (const GskSlQualifier *qualifier); -GskSpvStorageClass gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier); +GskSpvStorageClass gsk_sl_qualifier_get_storage_class (const GskSlQualifier *qualifier, + const GskSlType *type); gboolean gsk_sl_qualifier_check_type (const GskSlQualifier *qualifier, GskSlPreprocessor *preproc, diff --git a/gsk/gskslvariable.c b/gsk/gskslvariable.c index 1a4fbe33ae..a9fde6ee6b 100644 --- a/gsk/gskslvariable.c +++ b/gsk/gskslvariable.c @@ -94,6 +94,7 @@ gsk_sl_variable_standard_write_spv (const GskSlVariable *variable, guint32 result_id; guint32 value_id; GskSlQualifierLocation location; + GskSpvStorageClass storage_class; location = gsk_sl_qualifier_get_location (&variable->qualifier); @@ -102,11 +103,12 @@ gsk_sl_variable_standard_write_spv (const GskSlVariable *variable, else value_id = 0; + storage_class = gsk_sl_qualifier_get_storage_class (&variable->qualifier, variable->type); result_id = gsk_spv_writer_variable (writer, location == GSK_SL_QUALIFIER_GLOBAL ? GSK_SPV_WRITER_SECTION_DEFINE : GSK_SPV_WRITER_SECTION_DECLARE, variable->type, - gsk_sl_qualifier_get_storage_class (&variable->qualifier), - gsk_sl_qualifier_get_storage_class (&variable->qualifier), + storage_class, + storage_class, value_id); if (variable->name) diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c index 69ad24840c..8f7ef8616b 100644 --- a/gsk/gskspvwriter.c +++ b/gsk/gskspvwriter.c @@ -890,7 +890,8 @@ gsk_spv_access_get_variable (GskSpvAccessChain *chain) if (chain->chain) variable_id = gsk_spv_writer_access_chain (chain->writer, chain->type, - gsk_sl_qualifier_get_storage_class (gsk_sl_variable_get_qualifier (chain->variable)), + gsk_sl_qualifier_get_storage_class (gsk_sl_variable_get_qualifier (chain->variable), + gsk_sl_variable_get_type (chain->variable)), variable_id, (guint32 *) chain->chain->data, chain->chain->len); |