فهرست منبع

[spirv] Do not assign descriptors to Workgroup variables (#1100)

Also fix missing row-major-ness for external matrices that need
struct wrapping.
Lei Zhang 7 سال پیش
والد
کامیت
1e410c0b54
2فایلهای تغییر یافته به همراه14 افزوده شده و 2 حذف شده
  1. 8 2
      tools/clang/lib/SPIRV/DeclResultIdMapper.cpp
  2. 6 0
      tools/clang/test/CodeGenSPIRV/cs.groupshared.hlsl

+ 8 - 2
tools/clang/lib/SPIRV/DeclResultIdMapper.cpp

@@ -383,8 +383,8 @@ uint32_t DeclResultIdMapper::createFileVar(const VarDecl *var,
 uint32_t DeclResultIdMapper::createExternVar(const VarDecl *var) {
   auto storageClass = spv::StorageClass::UniformConstant;
   auto rule = LayoutRule::Void;
-  bool isMatType = false;     // Whether this var is of matrix type
-  bool isACRWSBuffer = false; // Whether its {Append|Consume|RW}StructuredBuffer
+  bool isMatType = false;     // Whether is matrix that needs struct wrap
+  bool isACRWSBuffer = false; // Whether is {Append|Consume|RW}StructuredBuffer
 
   if (var->getAttr<HLSLGroupSharedAttr>()) {
     // For CS groupshared variables
@@ -435,8 +435,14 @@ uint32_t DeclResultIdMapper::createExternVar(const VarDecl *var) {
     // We have wrapped the stand-alone matrix inside a struct. Mark it as
     // needing an extra index to access.
     astDecls[var].indexInCTBuffer = 0;
+    astDecls[var].isRowMajor =
+        typeTranslator.isRowMajorMatrix(var->getType(), var);
   }
 
+  // Variables in Workgroup do not need descriptor decorations.
+  if (storageClass == spv::StorageClass::Workgroup)
+    return id;
+
   const auto *regAttr = getResourceBinding(var);
   const auto *bindingAttr = var->getAttr<VKBindingAttr>();
   const auto *counterBindingAttr = var->getAttr<VKCounterBindingAttr>();

+ 6 - 0
tools/clang/test/CodeGenSPIRV/cs.groupshared.hlsl

@@ -5,6 +5,12 @@ struct S {
     float3 f2;
 };
 
+// CHECK-NOT: OpDecorate %a DescriptorSet
+// CHECK-NOT: OpDecorate %b DescriptorSet
+// CHECK-NOT: OpDecorate %c DescriptorSet
+// CHECK-NOT: OpDecorate %d DescriptorSet
+// CHECK-NOT: OpDecorate %s DescriptorSet
+
 // CHECK: %a = OpVariable %_ptr_Workgroup_float Workgroup
 groupshared              float    a;
 // CHECK: %b = OpVariable %_ptr_Workgroup_v3float Workgroup