|
@@ -627,64 +627,100 @@ uint8_t GetResourceComponentCount(llvm::Type *Ty) {
|
|
|
}
|
|
|
|
|
|
bool IsHLSLResourceType(llvm::Type *Ty) {
|
|
|
+ return GetHLSLResourceProperties(Ty).first;
|
|
|
+}
|
|
|
+
|
|
|
+static DxilResourceProperties MakeResourceProperties(hlsl::DXIL::ResourceKind Kind, bool UAV, bool ROV, bool Cmp) {
|
|
|
+ DxilResourceProperties Ret = {};
|
|
|
+ Ret.Basic.IsROV = ROV;
|
|
|
+ Ret.Basic.SamplerCmpOrHasCounter = Cmp;
|
|
|
+ Ret.Basic.IsUAV = UAV;
|
|
|
+ Ret.Basic.ResourceKind = (uint8_t)Kind;
|
|
|
+ return Ret;
|
|
|
+}
|
|
|
+
|
|
|
+std::pair<bool, DxilResourceProperties> GetHLSLResourceProperties(llvm::Type *Ty)
|
|
|
+{
|
|
|
+ using RetType = std::pair<bool, DxilResourceProperties>;
|
|
|
+ RetType FalseRet(false, DxilResourceProperties{});
|
|
|
+
|
|
|
if (llvm::StructType *ST = dyn_cast<llvm::StructType>(Ty)) {
|
|
|
if (!ST->hasName())
|
|
|
- return false;
|
|
|
+ return FalseRet;
|
|
|
+
|
|
|
StringRef name = ST->getName();
|
|
|
ConsumePrefix(name, "class.");
|
|
|
ConsumePrefix(name, "struct.");
|
|
|
|
|
|
if (name == "SamplerState")
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Sampler, false, false, false));
|
|
|
+
|
|
|
if (name == "SamplerComparisonState")
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Sampler, false, false, /*cmp or counter*/true));
|
|
|
|
|
|
if (name.startswith("AppendStructuredBuffer<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::StructuredBuffer, false, false, /*cmp or counter*/true));
|
|
|
+
|
|
|
if (name.startswith("ConsumeStructuredBuffer<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::StructuredBuffer, false, false, /*cmp or counter*/true));
|
|
|
|
|
|
if (name == "RaytracingAccelerationStructure")
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::RTAccelerationStructure, false, false, false));
|
|
|
|
|
|
if (ConsumePrefix(name, "FeedbackTexture2D")) {
|
|
|
- ConsumePrefix(name, "Array");
|
|
|
- return name.startswith("<");
|
|
|
+ hlsl::DXIL::ResourceKind kind = hlsl::DXIL::ResourceKind::Invalid;
|
|
|
+ if (ConsumePrefix(name, "Array"))
|
|
|
+ kind = hlsl::DXIL::ResourceKind::FeedbackTexture2DArray;
|
|
|
+ else
|
|
|
+ kind = hlsl::DXIL::ResourceKind::FeedbackTexture2D;
|
|
|
+
|
|
|
+ if (name.startswith("<"))
|
|
|
+ return RetType(true, MakeResourceProperties(kind, false, false, false));
|
|
|
}
|
|
|
|
|
|
- ConsumePrefix(name, "RasterizerOrdered");
|
|
|
- ConsumePrefix(name, "RW");
|
|
|
+ bool ROV = ConsumePrefix(name, "RasterizerOrdered");
|
|
|
+ bool UAV = ConsumePrefix(name, "RW");
|
|
|
+
|
|
|
if (name == "ByteAddressBuffer")
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::RawBuffer, UAV, ROV, false));
|
|
|
|
|
|
if (name.startswith("Buffer<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::TypedBuffer, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("StructuredBuffer<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::StructuredBuffer, UAV, ROV, false));
|
|
|
|
|
|
if (ConsumePrefix(name, "Texture")) {
|
|
|
if (name.startswith("1D<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture1D, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("1DArray<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture1DArray, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("2D<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture2D, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("2DArray<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture2DArray, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("3D<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture3D, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("Cube<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::TextureCube, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("CubeArray<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::TextureCubeArray, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("2DMS<"))
|
|
|
- return true;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture2DMS, UAV, ROV, false));
|
|
|
+
|
|
|
if (name.startswith("2DMSArray<"))
|
|
|
- return true;
|
|
|
- return false;
|
|
|
+ return RetType(true, MakeResourceProperties(hlsl::DXIL::ResourceKind::Texture2DMSArray, UAV, ROV, false));
|
|
|
+ return FalseRet;
|
|
|
}
|
|
|
}
|
|
|
- return false;
|
|
|
+ return FalseRet;
|
|
|
}
|
|
|
|
|
|
bool IsHLSLObjectType(llvm::Type *Ty) {
|