Browse Source

[spirv] Use OpDecorateStringGOOGLE where necessary.

Ehsan Nasiri 6 years ago
parent
commit
168ae2ec92

+ 4 - 0
tools/clang/include/clang/SPIRV/SpirvInstruction.h

@@ -412,6 +412,10 @@ public:
   bool isMemberDecoration() const { return index.hasValue(); }
   uint32_t getMemberIndex() const { return index.getValue(); }
 
+private:
+  spv::Op getDecorateOpcode(spv::Decoration,
+                            const llvm::Optional<uint32_t> &memberIndex);
+
 private:
   SpirvInstruction *target;
   spv::Decoration decoration;

+ 2 - 1
tools/clang/lib/SPIRV/CapabilityVisitor.cpp

@@ -289,7 +289,8 @@ bool CapabilityVisitor::visit(SpirvDecoration *decor) {
                                 "SV_ViewPortArrayIndex", loc);
         spvBuilder.requireCapability(
             spv::Capability::ShaderViewportIndexLayerEXT);
-      } else if (shaderModel == spv::ExecutionModel::Fragment) {
+      } else if (shaderModel == spv::ExecutionModel::Fragment ||
+                 shaderModel == spv::ExecutionModel::Geometry) {
         // SV_ViewportArrayIndex can be used as PSIn.
         spvBuilder.requireCapability(spv::Capability::MultiViewport);
       }

+ 1 - 1
tools/clang/lib/SPIRV/DeclResultIdMapper.cpp

@@ -1756,7 +1756,7 @@ bool DeclResultIdMapper::createStageVars(
                                                   astContext.FloatTy, x, y);
         const auto z =
             spvBuilder.createBinaryOp(spv::Op::OpFSub, astContext.FloatTy,
-                                      spvBuilder.getConstantInt32(1), xy);
+                                      spvBuilder.getConstantFloat32(1), xy);
         *value = spvBuilder.createCompositeConstruct(
             astContext.getExtVectorType(astContext.FloatTy, 3), {x, y, z});
       }

+ 12 - 6
tools/clang/lib/SPIRV/SpirvInstruction.cpp

@@ -160,9 +160,7 @@ SpirvDecoration::SpirvDecoration(SourceLocation loc,
                                  spv::Decoration decor,
                                  llvm::ArrayRef<uint32_t> p,
                                  llvm::Optional<uint32_t> idx)
-    : SpirvInstruction(IK_Decoration,
-                       idx.hasValue() ? spv::Op::OpMemberDecorate
-                                      : spv::Op::OpDecorate,
+    : SpirvInstruction(IK_Decoration, getDecorateOpcode(decor, idx),
                        /*type*/ {}, /*id*/ 0, loc),
       target(targetInst), decoration(decor), index(idx),
       params(p.begin(), p.end()), idParams() {}
@@ -172,9 +170,7 @@ SpirvDecoration::SpirvDecoration(SourceLocation loc,
                                  spv::Decoration decor,
                                  llvm::StringRef strParam,
                                  llvm::Optional<uint32_t> idx)
-    : SpirvInstruction(IK_Decoration,
-                       idx.hasValue() ? spv::Op::OpMemberDecorate
-                                      : spv::Op::OpDecorate,
+    : SpirvInstruction(IK_Decoration, getDecorateOpcode(decor, idx),
                        /*type*/ {}, /*id*/ 0, loc),
       target(targetInst), decoration(decor), index(idx), params(), idParams() {
   const auto &stringWords = string::encodeSPIRVString(strParam);
@@ -190,6 +186,16 @@ SpirvDecoration::SpirvDecoration(SourceLocation loc,
       target(targetInst), decoration(decor), index(llvm::None), params(),
       idParams(ids.begin(), ids.end()) {}
 
+spv::Op SpirvDecoration::getDecorateOpcode(
+    spv::Decoration decoration, const llvm::Optional<uint32_t> &memberIndex) {
+  if (decoration == spv::Decoration::HlslSemanticGOOGLE)
+    return memberIndex.hasValue() ? spv::Op::OpMemberDecorateStringGOOGLE
+                                  : spv::Op::OpDecorateStringGOOGLE;
+
+  return memberIndex.hasValue() ? spv::Op::OpMemberDecorate
+                                : spv::Op::OpDecorate;
+}
+
 SpirvVariable::SpirvVariable(QualType resultType, uint32_t resultId,
                              SourceLocation loc, spv::StorageClass sc,
                              SpirvInstruction *initializerInst)

+ 1 - 1
tools/clang/test/CodeGenSPIRV/spirv.interface.ds.hlsl

@@ -1,8 +1,8 @@
 // Run: %dxc -T ds_6_0 -E main -fspv-reflect
 
+// CHECK: OpCapability Tessellation
 // CHECK: OpCapability ClipDistance
 // CHECK: OpCapability CullDistance
-// CHECK: OpCapability Tessellation
 
 // CHECK: OpExtension "SPV_GOOGLE_hlsl_functionality1"
 

+ 1 - 1
tools/clang/test/CodeGenSPIRV/spirv.interface.gs.hlsl

@@ -1,8 +1,8 @@
 // Run: %dxc -T gs_6_0 -E main -fspv-reflect
 
+// CHECK: OpCapability Geometry
 // CHECK: OpCapability ClipDistance
 // CHECK: OpCapability CullDistance
-// CHECK: OpCapability Geometry
 
 // CHECK: OpExtension "SPV_GOOGLE_hlsl_functionality1"
 

+ 1 - 1
tools/clang/test/CodeGenSPIRV/spirv.interface.hs.hlsl

@@ -2,9 +2,9 @@
 
 #define NumOutPoints 2
 
+// CHECK: OpCapability Tessellation
 // CHECK: OpCapability ClipDistance
 // CHECK: OpCapability CullDistance
-// CHECK: OpCapability Tessellation
 
 // CHECK: OpExtension "SPV_GOOGLE_hlsl_functionality1"