diff --git a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp --- a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp +++ b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp @@ -715,6 +715,8 @@ break; case spirv::Decoration::Block: case spirv::Decoration::BufferBlock: + case spirv::Decoration::Flat: + case spirv::Decoration::NoPerspective: if (words.size() != 2) { return emitError(unknownLoc, "OpDecoration with ") << decorationName << "needs a single target "; @@ -725,6 +727,7 @@ // it is needed for many validation rules. decorations[words[0]].set(symbol, opBuilder.getUnitAttr()); break; + case spirv::Decoration::Location: case spirv::Decoration::SpecId: if (words.size() != 3) { return emitError(unknownLoc, "OpDecoration with ") diff --git a/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp b/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp --- a/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp +++ b/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp @@ -672,8 +672,9 @@ } SmallVector args; switch (decoration.getValue()) { - case spirv::Decoration::DescriptorSet: case spirv::Decoration::Binding: + case spirv::Decoration::DescriptorSet: + case spirv::Decoration::Location: if (auto intAttr = attr.second.dyn_cast()) { args.push_back(intAttr.getValue().getZExtValue()); break; @@ -690,6 +691,13 @@ << attrName << " attribute " << strAttr.getValue(); } return emitError(loc, "expected string attribute for ") << attrName; + case spirv::Decoration::Flat: + case spirv::Decoration::NoPerspective: + if (auto unitAttr = attr.second.dyn_cast()) { + // For unit attributes, the args list has no values so we do nothing + break; + } + return emitError(loc, "expected unit attribute for ") << attrName; default: return emitError(loc, "unhandled decoration ") << decorationName; } diff --git a/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir b/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Dialect/SPIRV/Serialization/decorations.mlir @@ -0,0 +1,21 @@ +// RUN: mlir-translate -split-input-file -test-spirv-roundtrip %s | FileCheck %s + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: location = 0 : i32 + spv.globalVariable @var1 {location = 0 : i32} : !spv.ptr, Input> +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: no_perspective + spv.globalVariable @var1 {no_perspective} : !spv.ptr, Input> +} + +// ----- + +spv.module Logical GLSL450 requires #spv.vce { + // CHECK: flat + spv.globalVariable @var2 {flat} : !spv.ptr +} +