[Mlir-commits] [mlir] cc2349e - [MLIR][SPIRV] Support flat, location, and noperspective decorations

Lei Zhang llvmlistbot at llvm.org
Fri Jun 5 06:02:33 PDT 2020


Author: HazemAbdelhafez
Date: 2020-06-05T08:55:22-04:00
New Revision: cc2349e3cf0e1f492433941b359a03fc3f746410

URL: https://github.com/llvm/llvm-project/commit/cc2349e3cf0e1f492433941b359a03fc3f746410
DIFF: https://github.com/llvm/llvm-project/commit/cc2349e3cf0e1f492433941b359a03fc3f746410.diff

LOG: [MLIR][SPIRV] Support flat, location, and noperspective decorations

Add support for flat, location, and noperspective decorations in the
serializer and deserializer to be able to process basic shader files
for graphics applications.

Differential Revision: https://reviews.llvm.org/D80837

Added: 
    mlir/test/Dialect/SPIRV/Serialization/decorations.mlir

Modified: 
    mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp
    mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp
index fafb916460b8..ecd79d7153ab 100644
--- a/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp
+++ b/mlir/lib/Dialect/SPIRV/Serialization/Deserializer.cpp
@@ -717,6 +717,8 @@ LogicalResult Deserializer::processDecoration(ArrayRef<uint32_t> words) {
     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 <id>";
@@ -727,6 +729,7 @@ LogicalResult Deserializer::processDecoration(ArrayRef<uint32_t> words) {
     // 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
index a594c122ca0a..81f873281c63 100644
--- a/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp
+++ b/mlir/lib/Dialect/SPIRV/Serialization/Serializer.cpp
@@ -672,8 +672,9 @@ LogicalResult Serializer::processDecoration(Location loc, uint32_t resultID,
   }
   SmallVector<uint32_t, 1> 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<IntegerAttr>()) {
       args.push_back(intAttr.getValue().getZExtValue());
       break;
@@ -690,6 +691,13 @@ LogicalResult Serializer::processDecoration(Location loc, uint32_t resultID,
              << 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<UnitAttr>()) {
+      // 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
index 000000000000..427f03f69fea
--- /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<v1.0, [Shader], []> {
+  // CHECK: location = 0 : i32
+  spv.globalVariable @var1 {location = 0 : i32} : !spv.ptr<vector<4xf32>, Input>
+}
+
+// -----
+
+spv.module Logical GLSL450 requires #spv.vce<v1.0, [Shader], []> {
+  // CHECK: no_perspective
+  spv.globalVariable @var1 {no_perspective} : !spv.ptr<vector<4xf32>, Input>
+}
+
+// -----
+
+spv.module Logical GLSL450 requires #spv.vce<v1.0, [Shader], []> {
+  // CHECK: flat
+  spv.globalVariable @var2 {flat} : !spv.ptr<si32, Input>
+}
+


        


More information about the Mlir-commits mailing list