[llvm] [DirectX] Get resource information via TargetExtType (PR #119772)

Helena Kotas via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 13 21:29:56 PST 2024


================
@@ -197,184 +258,128 @@ bool ResourceInfo::isMultiSample() const {
          Kind == ResourceKind::Texture2DMSArray;
 }
 
-ResourceInfo ResourceInfo::SRV(Value *Symbol, StringRef Name,
-                               ElementType ElementTy, uint32_t ElementCount,
-                               ResourceKind Kind) {
-  ResourceInfo RI(ResourceClass::SRV, Kind, Symbol, Name);
-  assert(RI.isTyped() && !(RI.isStruct() || RI.isMultiSample()) &&
-         "Invalid ResourceKind for SRV constructor.");
-  RI.setTyped(ElementTy, ElementCount);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::RawBuffer(Value *Symbol, StringRef Name) {
-  ResourceInfo RI(ResourceClass::SRV, ResourceKind::RawBuffer, Symbol, Name);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::StructuredBuffer(Value *Symbol, StringRef Name,
-                                            uint32_t Stride,
-                                            MaybeAlign Alignment) {
-  ResourceInfo RI(ResourceClass::SRV, ResourceKind::StructuredBuffer, Symbol,
-                  Name);
-  RI.setStruct(Stride, Alignment);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::Texture2DMS(Value *Symbol, StringRef Name,
-                                       ElementType ElementTy,
-                                       uint32_t ElementCount,
-                                       uint32_t SampleCount) {
-  ResourceInfo RI(ResourceClass::SRV, ResourceKind::Texture2DMS, Symbol, Name);
-  RI.setTyped(ElementTy, ElementCount);
-  RI.setMultiSample(SampleCount);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::Texture2DMSArray(Value *Symbol, StringRef Name,
-                                            ElementType ElementTy,
-                                            uint32_t ElementCount,
-                                            uint32_t SampleCount) {
-  ResourceInfo RI(ResourceClass::SRV, ResourceKind::Texture2DMSArray, Symbol,
-                  Name);
-  RI.setTyped(ElementTy, ElementCount);
-  RI.setMultiSample(SampleCount);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::UAV(Value *Symbol, StringRef Name,
-                               ElementType ElementTy, uint32_t ElementCount,
-                               bool GloballyCoherent, bool IsROV,
-                               ResourceKind Kind) {
-  ResourceInfo RI(ResourceClass::UAV, Kind, Symbol, Name);
-  assert(RI.isTyped() && !(RI.isStruct() || RI.isMultiSample()) &&
-         "Invalid ResourceKind for UAV constructor.");
-  RI.setTyped(ElementTy, ElementCount);
-  RI.setUAV(GloballyCoherent, /*HasCounter=*/false, IsROV);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::RWRawBuffer(Value *Symbol, StringRef Name,
-                                       bool GloballyCoherent, bool IsROV) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::RawBuffer, Symbol, Name);
-  RI.setUAV(GloballyCoherent, /*HasCounter=*/false, IsROV);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::RWStructuredBuffer(Value *Symbol, StringRef Name,
-                                              uint32_t Stride,
-                                              MaybeAlign Alignment,
-                                              bool GloballyCoherent, bool IsROV,
-                                              bool HasCounter) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::StructuredBuffer, Symbol,
-                  Name);
-  RI.setStruct(Stride, Alignment);
-  RI.setUAV(GloballyCoherent, HasCounter, IsROV);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::RWTexture2DMS(Value *Symbol, StringRef Name,
-                                         ElementType ElementTy,
-                                         uint32_t ElementCount,
-                                         uint32_t SampleCount,
-                                         bool GloballyCoherent) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::Texture2DMS, Symbol, Name);
-  RI.setTyped(ElementTy, ElementCount);
-  RI.setUAV(GloballyCoherent, /*HasCounter=*/false, /*IsROV=*/false);
-  RI.setMultiSample(SampleCount);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::RWTexture2DMSArray(Value *Symbol, StringRef Name,
-                                              ElementType ElementTy,
-                                              uint32_t ElementCount,
-                                              uint32_t SampleCount,
-                                              bool GloballyCoherent) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::Texture2DMSArray, Symbol,
-                  Name);
-  RI.setTyped(ElementTy, ElementCount);
-  RI.setUAV(GloballyCoherent, /*HasCounter=*/false, /*IsROV=*/false);
-  RI.setMultiSample(SampleCount);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::FeedbackTexture2D(Value *Symbol, StringRef Name,
-                                             SamplerFeedbackType FeedbackTy) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::FeedbackTexture2D, Symbol,
-                  Name);
-  RI.setUAV(/*GloballyCoherent=*/false, /*HasCounter=*/false, /*IsROV=*/false);
-  RI.setFeedback(FeedbackTy);
-  return RI;
-}
-
-ResourceInfo
-ResourceInfo::FeedbackTexture2DArray(Value *Symbol, StringRef Name,
-                                     SamplerFeedbackType FeedbackTy) {
-  ResourceInfo RI(ResourceClass::UAV, ResourceKind::FeedbackTexture2DArray,
-                  Symbol, Name);
-  RI.setUAV(/*GloballyCoherent=*/false, /*HasCounter=*/false, /*IsROV=*/false);
-  RI.setFeedback(FeedbackTy);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::CBuffer(Value *Symbol, StringRef Name,
-                                   uint32_t Size) {
-  ResourceInfo RI(ResourceClass::CBuffer, ResourceKind::CBuffer, Symbol, Name);
-  RI.setCBuffer(Size);
-  return RI;
-}
-
-ResourceInfo ResourceInfo::Sampler(Value *Symbol, StringRef Name,
-                                   SamplerType SamplerTy) {
-  ResourceInfo RI(ResourceClass::Sampler, ResourceKind::Sampler, Symbol, Name);
-  RI.setSampler(SamplerTy);
-  return RI;
+static bool isROV(dxil::ResourceKind Kind, TargetExtType *Ty) {
+  switch (Kind) {
+  case ResourceKind::Texture1D:
+  case ResourceKind::Texture2D:
+  case ResourceKind::Texture3D:
+  case ResourceKind::TextureCube:
+  case ResourceKind::Texture1DArray:
+  case ResourceKind::Texture2DArray:
+  case ResourceKind::TextureCubeArray:
+    return cast<TextureExtType>(Ty)->isROV();
+  case ResourceKind::TypedBuffer:
+    return cast<TypedBufferExtType>(Ty)->isROV();
+  case ResourceKind::RawBuffer:
+  case ResourceKind::StructuredBuffer:
+    return cast<RawBufferExtType>(Ty)->isROV();
+  case ResourceKind::Texture2DMS:
+  case ResourceKind::Texture2DMSArray:
+  case ResourceKind::FeedbackTexture2D:
+  case ResourceKind::FeedbackTexture2DArray:
+    return false;
+  case ResourceKind::CBuffer:
+  case ResourceKind::Sampler:
+  case ResourceKind::TBuffer:
+  case ResourceKind::RTAccelerationStructure:
+  case ResourceKind::Invalid:
+  case ResourceKind::NumEntries:
+    llvm_unreachable("Resource cannot be ROV");
+  }
+  llvm_unreachable("Unhandled ResourceKind enum");
 }
 
-bool ResourceInfo::operator==(const ResourceInfo &RHS) const {
-  if (std::tie(Symbol, Name, Binding, RC, Kind) !=
-      std::tie(RHS.Symbol, RHS.Name, RHS.Binding, RHS.RC, RHS.Kind))
-    return false;
-  if (isCBuffer() && RHS.isCBuffer() && CBufferSize != RHS.CBufferSize)
-    return false;
-  if (isSampler() && RHS.isSampler() && SamplerTy != RHS.SamplerTy)
-    return false;
-  if (isUAV() && RHS.isUAV() && UAVFlags != RHS.UAVFlags)
-    return false;
-  if (isStruct() && RHS.isStruct() && Struct != RHS.Struct)
-    return false;
-  if (isFeedback() && RHS.isFeedback() && Feedback != RHS.Feedback)
-    return false;
-  if (isTyped() && RHS.isTyped() && Typed != RHS.Typed)
-    return false;
-  if (isMultiSample() && RHS.isMultiSample() && MultiSample != RHS.MultiSample)
-    return false;
-  return true;
+ResourceInfo::UAVInfo ResourceInfo::getUAV() const {
+  assert(isUAV() && "Not a UAV");
+  return {GloballyCoherent, HasCounter, isROV(Kind, HandleTy)};
 }
 
-bool ResourceInfo::operator<(const ResourceInfo &RHS) const {
-  // Skip the symbol to avoid non-determinism, and the name to keep a consistent
-  // ordering even when we strip reflection data.
-  if (std::tie(Binding, RC, Kind) < std::tie(RHS.Binding, RHS.RC, RHS.Kind))
-    return true;
-  if (isCBuffer() && RHS.isCBuffer() && CBufferSize < RHS.CBufferSize)
-    return true;
-  if (isSampler() && RHS.isSampler() && SamplerTy < RHS.SamplerTy)
-    return true;
-  if (isUAV() && RHS.isUAV() && UAVFlags < RHS.UAVFlags)
-    return true;
-  if (isStruct() && RHS.isStruct() && Struct < RHS.Struct)
-    return true;
-  if (isFeedback() && RHS.isFeedback() && Feedback < RHS.Feedback)
-    return true;
-  if (isTyped() && RHS.isTyped() && Typed < RHS.Typed)
-    return true;
-  if (isMultiSample() && RHS.isMultiSample() && MultiSample < RHS.MultiSample)
-    return true;
-  return false;
+uint32_t ResourceInfo::getCBufferSize(const DataLayout &DL) const {
+  assert(isCBuffer() && "Not a CBuffer");
+  Type *Ty = cast<CBufferExtType>(HandleTy)->getResourceType();
+  return DL.getTypeSizeInBits(Ty) / 8;
+}
----------------
hekota wrote:

```suggestion
uint32_t ResourceInfo::getCBufferSize() const {
  assert(isCBuffer() && "Not a CBuffer");
  return cast<CBufferExtType>(HandleTy)->getCBufferSize();
}
```

https://github.com/llvm/llvm-project/pull/119772


More information about the llvm-commits mailing list