[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