summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2017-10-18 05:39:25 +0200
committerBenjamin Otte <otte@redhat.com>2017-10-30 02:58:03 +0100
commit15cbfc83708ce4496dd6bcb5755c57880eefdaff (patch)
treec7e3ee9afb5db5c078216f5d8f12be9f5f052d0d
parentcaaf1845c3d712b485f4c734d083393cab6487b8 (diff)
downloadgtk+-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.c22
-rw-r--r--gsk/gskslqualifierprivate.h3
-rw-r--r--gsk/gskslvariable.c6
-rw-r--r--gsk/gskspvwriter.c3
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);