spirv: Handle the SpvDecorationStream decoration
authorNeil Roberts <nroberts@igalia.com>
Wed, 17 Jan 2018 15:35:56 +0000 (16:35 +0100)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Tue, 31 Jul 2018 11:18:28 +0000 (13:18 +0200)
From SPIR-V 1.0 spec, section 3.20, "Decoration":

   "Stream
    Apply to an object or a member of a structure type. Indicates the
    stream number to put an output on."

Note the "or", so that means that it is allowed for both a full struct
or a membef or a struct (although the wording is not really ideal, and
somewhat error-prone, imho).

We found this with some Geometry Streams tests for ARB_gl_spirv, where
the full gl_PerVertex is assigned Stream 0 (default value on OpenGL
for gl_PerVertex).

So this commit allows structs to have this Decoration, and sets the
stream at the nir variable if needed.

Signed-off-by: Neil Roberts <nroberts@igalia.com>
Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
v2: squash two Decoration Stream patches (Jason)

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/spirv/spirv_to_nir.c
src/compiler/spirv/vtn_variables.c

index 4013d2ddd0ec77dddecb20f1e88a7c09d900b5df..7e3a6d6e88224577717df9409ca404cdbff76053 100644 (file)
@@ -847,7 +847,6 @@ type_decoration_cb(struct vtn_builder *b,
    case SpvDecorationNonWritable:
    case SpvDecorationNonReadable:
    case SpvDecorationUniform:
-   case SpvDecorationStream:
    case SpvDecorationLocation:
    case SpvDecorationComponent:
    case SpvDecorationOffset:
@@ -857,6 +856,14 @@ type_decoration_cb(struct vtn_builder *b,
                spirv_decoration_to_string(dec->decoration));
       break;
 
+   case SpvDecorationStream:
+      /* We don't need to do anything here, as stream is filled up when
+       * aplying the decoration to a variable, just check that if it is not a
+       * struct member, it should be a struct.
+       */
+      vtn_assert(type->base_type == vtn_base_type_struct);
+      break;
+
    case SpvDecorationRelaxedPrecision:
    case SpvDecorationSpecId:
    case SpvDecorationInvariant:
index 6ff2e83515a389637fa7af0e7fb4d61638943be9..8dab86abd74d131f623038b7bfeb17679a0de2f9 100644 (file)
@@ -1298,7 +1298,6 @@ apply_var_decoration(struct vtn_builder *b,
    case SpvDecorationMatrixStride:
    case SpvDecorationAliased:
    case SpvDecorationUniform:
-   case SpvDecorationStream:
    case SpvDecorationLinkageAttributes:
       break; /* Do nothing with these here */
 
@@ -1337,6 +1336,10 @@ apply_var_decoration(struct vtn_builder *b,
       var_data->offset = dec->literals[0];
       break;
 
+   case SpvDecorationStream:
+      var_data->stream = dec->literals[0];
+      break;
+
    case SpvDecorationCPacked:
    case SpvDecorationSaturatedConversion:
    case SpvDecorationFuncParamAttr: