1b365dbbdSJustin Bogner //===- DXILResourceTest.cpp - Unit tests for DXILResource -----------------===// 2b365dbbdSJustin Bogner // 3b365dbbdSJustin Bogner // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4b365dbbdSJustin Bogner // See https://llvm.org/LICENSE.txt for license information. 5b365dbbdSJustin Bogner // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b365dbbdSJustin Bogner // 7b365dbbdSJustin Bogner //===----------------------------------------------------------------------===// 8b365dbbdSJustin Bogner 9b365dbbdSJustin Bogner #include "llvm/Analysis/DXILResource.h" 10b365dbbdSJustin Bogner #include "llvm/IR/Constants.h" 11482237e8SJustin Bogner #include "llvm/IR/DataLayout.h" 12482237e8SJustin Bogner #include "llvm/IR/GlobalVariable.h" 13482237e8SJustin Bogner #include "llvm/IR/Module.h" 14b365dbbdSJustin Bogner #include "gtest/gtest.h" 15b365dbbdSJustin Bogner 16b365dbbdSJustin Bogner using namespace llvm; 17b365dbbdSJustin Bogner using namespace dxil; 18b365dbbdSJustin Bogner 19b365dbbdSJustin Bogner namespace { 20b365dbbdSJustin Bogner // Helper to succinctly build resource shaped metadata for tests. 21b365dbbdSJustin Bogner struct MDBuilder { 22b365dbbdSJustin Bogner LLVMContext &Context; 23b365dbbdSJustin Bogner Type *Int32Ty; 24b365dbbdSJustin Bogner Type *Int1Ty; 25b365dbbdSJustin Bogner 26b365dbbdSJustin Bogner MDBuilder(LLVMContext &Context, Type *Int32Ty, Type *Int1Ty) 27b365dbbdSJustin Bogner : Context(Context), Int32Ty(Int32Ty), Int1Ty(Int1Ty) {} 28b365dbbdSJustin Bogner 2965d2177aSJustin Bogner Metadata *toMD(unsigned int V) { 3065d2177aSJustin Bogner return ConstantAsMetadata::get( 3165d2177aSJustin Bogner Constant::getIntegerValue(Int32Ty, APInt(32, V))); 32b365dbbdSJustin Bogner } 3365d2177aSJustin Bogner Metadata *toMD(int V) { return toMD(static_cast<unsigned int>(V)); } 3465d2177aSJustin Bogner Metadata *toMD(bool V) { 3565d2177aSJustin Bogner return ConstantAsMetadata::get( 3665d2177aSJustin Bogner Constant::getIntegerValue(Int32Ty, APInt(1, V))); 37b365dbbdSJustin Bogner } 3865d2177aSJustin Bogner Metadata *toMD(Value *V) { return ValueAsMetadata::get(V); } 3965d2177aSJustin Bogner Metadata *toMD(const char *V) { return MDString::get(Context, V); } 4065d2177aSJustin Bogner Metadata *toMD(StringRef V) { return MDString::get(Context, V); } 4165d2177aSJustin Bogner Metadata *toMD(std::nullptr_t V) { return nullptr; } 4265d2177aSJustin Bogner Metadata *toMD(MDTuple *V) { return V; } 43b365dbbdSJustin Bogner 4465d2177aSJustin Bogner template <typename... Ts> MDTuple *get(Ts... Vs) { 4565d2177aSJustin Bogner std::array<Metadata *, sizeof...(Vs)> MDs{toMD(std::forward<Ts>(Vs))...}; 46b365dbbdSJustin Bogner return MDNode::get(Context, MDs); 47b365dbbdSJustin Bogner } 48b365dbbdSJustin Bogner }; 49b365dbbdSJustin Bogner 50b365dbbdSJustin Bogner testing::AssertionResult MDTupleEq(const char *LHSExpr, const char *RHSExpr, 51b365dbbdSJustin Bogner MDTuple *LHS, MDTuple *RHS) { 52b365dbbdSJustin Bogner if (LHS == RHS) 53b365dbbdSJustin Bogner return testing::AssertionSuccess(); 54b365dbbdSJustin Bogner std::string LHSRepr, RHSRepr; 55b365dbbdSJustin Bogner raw_string_ostream LHSS(LHSRepr), RHSS(RHSRepr); 56b365dbbdSJustin Bogner LHS->printTree(LHSS); 57b365dbbdSJustin Bogner RHS->printTree(RHSS); 58b365dbbdSJustin Bogner 59b365dbbdSJustin Bogner return testing::AssertionFailure() << "Expected equality:\n" 60b365dbbdSJustin Bogner << " " << LHSExpr << "\n" 61b365dbbdSJustin Bogner << "Which is:\n" 6252b48a70SJOE1994 << " " << LHSRepr << "\n\n" 63b365dbbdSJustin Bogner << " " << RHSExpr << "\n" 64b365dbbdSJustin Bogner << "Which is:\n" 6552b48a70SJOE1994 << " " << RHSRepr; 66b365dbbdSJustin Bogner } 67b365dbbdSJustin Bogner #define EXPECT_MDEQ(X, Y) EXPECT_PRED_FORMAT2(MDTupleEq, X, Y) 68b365dbbdSJustin Bogner } // namespace 69b365dbbdSJustin Bogner 70b365dbbdSJustin Bogner TEST(DXILResource, AnnotationsAndMetadata) { 71482237e8SJustin Bogner // TODO: How am I supposed to get this? 72482237e8SJustin Bogner DataLayout DL("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-" 73482237e8SJustin Bogner "f64:64-n8:16:32:64-v96:32"); 74482237e8SJustin Bogner 75b365dbbdSJustin Bogner LLVMContext Context; 76482237e8SJustin Bogner Module M("AnnotationsAndMetadata", Context); 77482237e8SJustin Bogner M.setDataLayout(DL); 78482237e8SJustin Bogner 79b365dbbdSJustin Bogner Type *Int1Ty = Type::getInt1Ty(Context); 80482237e8SJustin Bogner Type *Int8Ty = Type::getInt8Ty(Context); 81b365dbbdSJustin Bogner Type *Int32Ty = Type::getInt32Ty(Context); 82b365dbbdSJustin Bogner Type *FloatTy = Type::getFloatTy(Context); 83b365dbbdSJustin Bogner Type *DoubleTy = Type::getDoubleTy(Context); 84b365dbbdSJustin Bogner Type *Floatx4Ty = FixedVectorType::get(FloatTy, 4); 85b365dbbdSJustin Bogner Type *Floatx3Ty = FixedVectorType::get(FloatTy, 3); 86b365dbbdSJustin Bogner Type *Int32x2Ty = FixedVectorType::get(Int32Ty, 2); 87b365dbbdSJustin Bogner 88b365dbbdSJustin Bogner MDBuilder TestMD(Context, Int32Ty, Int1Ty); 89b365dbbdSJustin Bogner 90482237e8SJustin Bogner // ByteAddressBuffer Buffer; 913eca15cbSJustin Bogner ResourceTypeInfo RTI(llvm::TargetExtType::get( 923eca15cbSJustin Bogner Context, "dx.RawBuffer", Int8Ty, {/*IsWriteable=*/0, /*IsROV=*/0})); 933eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::SRV); 943eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::RawBuffer); 95482237e8SJustin Bogner 963eca15cbSJustin Bogner ResourceBindingInfo RBI( 973eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 983eca15cbSJustin Bogner RTI.getHandleTy()); 99*0e2466f6SJustin Bogner GlobalVariable *GV = RBI.createSymbol(M, RTI.createElementStruct(), "Buffer"); 1003eca15cbSJustin Bogner std::pair<uint32_t, uint32_t> Props = RBI.getAnnotateProps(M, RTI); 101b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000000bU); 102b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0U); 1033eca15cbSJustin Bogner MDTuple *MD = RBI.getAsMetadata(M, RTI); 104*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "Buffer", 0, 0, 1, 11, 0, nullptr)); 105b365dbbdSJustin Bogner 106b365dbbdSJustin Bogner // RWByteAddressBuffer BufferOut : register(u3, space2); 1073eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 1083eca15cbSJustin Bogner Context, "dx.RawBuffer", Int8Ty, {/*IsWriteable=*/1, /*IsROV=*/0})); 1093eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 1103eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().GloballyCoherent, false); 1113eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().HasCounter, false); 1123eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().IsROV, false); 1133eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::RawBuffer); 114482237e8SJustin Bogner 1153eca15cbSJustin Bogner RBI = ResourceBindingInfo( 1163eca15cbSJustin Bogner /*RecordID=*/1, /*Space=*/2, /*LowerBound=*/3, /*Size=*/1, 1173eca15cbSJustin Bogner RTI.getHandleTy()); 118*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "BufferOut"); 1193eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 120b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000100bU); 121b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0U); 1223eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 123*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(1, GV, "BufferOut", 2, 3, 1, 11, false, false, 124*0e2466f6SJustin Bogner false, nullptr)); 125b365dbbdSJustin Bogner 126b365dbbdSJustin Bogner // struct BufType0 { int i; float f; double d; }; 127b365dbbdSJustin Bogner // StructuredBuffer<BufType0> Buffer0 : register(t0); 128b365dbbdSJustin Bogner StructType *BufType0 = 129b365dbbdSJustin Bogner StructType::create(Context, {Int32Ty, FloatTy, DoubleTy}, "BufType0"); 1303eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 1313eca15cbSJustin Bogner Context, "dx.RawBuffer", BufType0, {/*IsWriteable=*/0, /*IsROV=*/0})); 1323eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::SRV); 1333eca15cbSJustin Bogner ASSERT_EQ(RTI.isStruct(), true); 1343eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).Stride, 16u); 1353eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).AlignLog2, Log2(Align(8))); 1363eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::StructuredBuffer); 137482237e8SJustin Bogner 1383eca15cbSJustin Bogner RBI = ResourceBindingInfo( 1393eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 1403eca15cbSJustin Bogner RTI.getHandleTy()); 141*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "Buffer0"); 1423eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 143b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000030cU); 144b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000010U); 1453eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 146482237e8SJustin Bogner EXPECT_MDEQ(MD, 147*0e2466f6SJustin Bogner TestMD.get(0, GV, "Buffer0", 0, 0, 1, 12, 0, TestMD.get(1, 16))); 148b365dbbdSJustin Bogner 1496992ebcbSJustin Bogner // StructuredBuffer<float3> Buffer1 : register(t1); 1503eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 1513eca15cbSJustin Bogner Context, "dx.RawBuffer", Floatx3Ty, {/*IsWriteable=*/0, /*IsROV=*/0})); 1523eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::SRV); 1533eca15cbSJustin Bogner ASSERT_EQ(RTI.isStruct(), true); 1543eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).Stride, 12u); 1553eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).AlignLog2, 0u); 1563eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::StructuredBuffer); 157482237e8SJustin Bogner 1583eca15cbSJustin Bogner RBI = ResourceBindingInfo( 1593eca15cbSJustin Bogner /*RecordID=*/1, /*Space=*/0, /*LowerBound=*/1, /*Size=*/1, 1603eca15cbSJustin Bogner RTI.getHandleTy()); 161*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "Buffer1"); 1623eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 1636992ebcbSJustin Bogner EXPECT_EQ(Props.first, 0x0000000cU); 1646992ebcbSJustin Bogner EXPECT_EQ(Props.second, 0x0000000cU); 1653eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 166482237e8SJustin Bogner EXPECT_MDEQ(MD, 167*0e2466f6SJustin Bogner TestMD.get(1, GV, "Buffer1", 0, 1, 1, 12, 0, TestMD.get(1, 12))); 1686992ebcbSJustin Bogner 169b365dbbdSJustin Bogner // Texture2D<float4> ColorMapTexture : register(t2); 1703eca15cbSJustin Bogner RTI = ResourceTypeInfo( 171482237e8SJustin Bogner llvm::TargetExtType::get(Context, "dx.Texture", Floatx4Ty, 172482237e8SJustin Bogner {/*IsWriteable=*/0, /*IsROV=*/0, /*IsSigned=*/0, 1733eca15cbSJustin Bogner llvm::to_underlying(ResourceKind::Texture2D)})); 1743eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::SRV); 1753eca15cbSJustin Bogner ASSERT_EQ(RTI.isTyped(), true); 1763eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementTy, ElementType::F32); 1773eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementCount, 4u); 1783eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Texture2D); 179482237e8SJustin Bogner 1803eca15cbSJustin Bogner RBI = ResourceBindingInfo( 1813eca15cbSJustin Bogner /*RecordID=*/2, /*Space=*/0, /*LowerBound=*/2, /*Size=*/1, 1823eca15cbSJustin Bogner RTI.getHandleTy()); 183*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "ColorMapTexture"); 1843eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 185b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00000002U); 186b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000409U); 1873eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 188*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(2, GV, "ColorMapTexture", 0, 2, 1, 2, 0, 189*0e2466f6SJustin Bogner TestMD.get(0, 9))); 190b365dbbdSJustin Bogner 191b365dbbdSJustin Bogner // Texture2DMS<float, 8> DepthBuffer : register(t0); 1923eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 193482237e8SJustin Bogner Context, "dx.MSTexture", FloatTy, 194482237e8SJustin Bogner {/*IsWriteable=*/0, /*SampleCount=*/8, 1953eca15cbSJustin Bogner /*IsSigned=*/0, llvm::to_underlying(ResourceKind::Texture2DMS)})); 1963eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::SRV); 1973eca15cbSJustin Bogner ASSERT_EQ(RTI.isTyped(), true); 1983eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementTy, ElementType::F32); 1993eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementCount, 1u); 2003eca15cbSJustin Bogner ASSERT_EQ(RTI.isMultiSample(), true); 2013eca15cbSJustin Bogner EXPECT_EQ(RTI.getMultiSampleCount(), 8u); 2023eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Texture2DMS); 203482237e8SJustin Bogner 2043eca15cbSJustin Bogner RBI = ResourceBindingInfo( 2053eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 2063eca15cbSJustin Bogner RTI.getHandleTy()); 207*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "DepthBuffer"); 2083eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 209b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00000003U); 210b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00080109U); 2113eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 212*0e2466f6SJustin Bogner EXPECT_MDEQ( 213*0e2466f6SJustin Bogner MD, TestMD.get(0, GV, "DepthBuffer", 0, 0, 1, 3, 8, TestMD.get(0, 9))); 214b365dbbdSJustin Bogner 215b365dbbdSJustin Bogner // FeedbackTexture2D<SAMPLER_FEEDBACK_MIN_MIP> feedbackMinMip; 2163eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 217482237e8SJustin Bogner Context, "dx.FeedbackTexture", {}, 218482237e8SJustin Bogner {llvm::to_underlying(SamplerFeedbackType::MinMip), 2193eca15cbSJustin Bogner llvm::to_underlying(ResourceKind::FeedbackTexture2D)})); 2203eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 2213eca15cbSJustin Bogner ASSERT_EQ(RTI.isFeedback(), true); 2223eca15cbSJustin Bogner EXPECT_EQ(RTI.getFeedbackType(), SamplerFeedbackType::MinMip); 2233eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::FeedbackTexture2D); 224482237e8SJustin Bogner 2253eca15cbSJustin Bogner RBI = ResourceBindingInfo( 2263eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 2273eca15cbSJustin Bogner RTI.getHandleTy()); 228*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "feedbackMinMip"); 2293eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 230b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00001011U); 231b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0U); 2323eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 233*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "feedbackMinMip", 0, 0, 1, 17, false, false, 234*0e2466f6SJustin Bogner false, TestMD.get(2, 0))); 235b365dbbdSJustin Bogner 236b365dbbdSJustin Bogner // FeedbackTexture2DArray<SAMPLER_FEEDBACK_MIP_REGION_USED> feedbackMipRegion; 2373eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 238482237e8SJustin Bogner Context, "dx.FeedbackTexture", {}, 239482237e8SJustin Bogner {llvm::to_underlying(SamplerFeedbackType::MipRegionUsed), 2403eca15cbSJustin Bogner llvm::to_underlying(ResourceKind::FeedbackTexture2DArray)})); 2413eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 2423eca15cbSJustin Bogner ASSERT_EQ(RTI.isFeedback(), true); 2433eca15cbSJustin Bogner EXPECT_EQ(RTI.getFeedbackType(), SamplerFeedbackType::MipRegionUsed); 2443eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::FeedbackTexture2DArray); 245482237e8SJustin Bogner 2463eca15cbSJustin Bogner RBI = ResourceBindingInfo( 2473eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 2483eca15cbSJustin Bogner RTI.getHandleTy()); 249*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "feedbackMipRegion"); 2503eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 251b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00001012U); 252b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000001U); 2533eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 254*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "feedbackMipRegion", 0, 0, 1, 18, false, 255*0e2466f6SJustin Bogner false, false, TestMD.get(2, 1))); 256b365dbbdSJustin Bogner 257b365dbbdSJustin Bogner // globallycoherent RWTexture2D<int2> OutputTexture : register(u0, space2); 2583eca15cbSJustin Bogner RTI = ResourceTypeInfo( 259482237e8SJustin Bogner llvm::TargetExtType::get(Context, "dx.Texture", Int32x2Ty, 260482237e8SJustin Bogner {/*IsWriteable=*/1, 261482237e8SJustin Bogner /*IsROV=*/0, /*IsSigned=*/1, 2623eca15cbSJustin Bogner llvm::to_underlying(ResourceKind::Texture2D)}), 263482237e8SJustin Bogner /*GloballyCoherent=*/true, /*HasCounter=*/false); 264482237e8SJustin Bogner 2653eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 2663eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().GloballyCoherent, true); 2673eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().HasCounter, false); 2683eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().IsROV, false); 2693eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Texture2D); 270482237e8SJustin Bogner 2713eca15cbSJustin Bogner RBI = ResourceBindingInfo( 2723eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/2, /*LowerBound=*/0, /*Size=*/1, 2733eca15cbSJustin Bogner RTI.getHandleTy()); 274*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "OutputTexture"); 2753eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 276b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00005002U); 277b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000204U); 2783eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 279*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "OutputTexture", 2, 0, 1, 2, true, false, 280*0e2466f6SJustin Bogner false, TestMD.get(0, 4))); 281b365dbbdSJustin Bogner 282b365dbbdSJustin Bogner // RasterizerOrderedBuffer<float4> ROB; 2833eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 284482237e8SJustin Bogner Context, "dx.TypedBuffer", Floatx4Ty, 2853eca15cbSJustin Bogner {/*IsWriteable=*/1, /*IsROV=*/1, /*IsSigned=*/0})); 2863eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 2873eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().GloballyCoherent, false); 2883eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().HasCounter, false); 2893eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().IsROV, true); 2903eca15cbSJustin Bogner ASSERT_EQ(RTI.isTyped(), true); 2913eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementTy, ElementType::F32); 2923eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementCount, 4u); 2933eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::TypedBuffer); 294482237e8SJustin Bogner 2953eca15cbSJustin Bogner RBI = ResourceBindingInfo( 2963eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 2973eca15cbSJustin Bogner RTI.getHandleTy()); 298*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "ROB"); 2993eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 300b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000300aU); 301b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000409U); 3023eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 303*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "ROB", 0, 0, 1, 10, false, false, true, 304b365dbbdSJustin Bogner TestMD.get(0, 9))); 305b365dbbdSJustin Bogner 306b365dbbdSJustin Bogner // RWStructuredBuffer<ParticleMotion> g_OutputBuffer : register(u2); 307b365dbbdSJustin Bogner StructType *BufType1 = StructType::create( 308b365dbbdSJustin Bogner Context, {Floatx3Ty, FloatTy, Int32Ty}, "ParticleMotion"); 3093eca15cbSJustin Bogner RTI = ResourceTypeInfo( 3103eca15cbSJustin Bogner llvm::TargetExtType::get(Context, "dx.RawBuffer", BufType1, 3113eca15cbSJustin Bogner {/*IsWriteable=*/1, /*IsROV=*/0}), 312482237e8SJustin Bogner /*GloballyCoherent=*/false, /*HasCounter=*/true); 3133eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 3143eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().GloballyCoherent, false); 3153eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().HasCounter, true); 3163eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().IsROV, false); 3173eca15cbSJustin Bogner ASSERT_EQ(RTI.isStruct(), true); 3183eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).Stride, 20u); 3193eca15cbSJustin Bogner EXPECT_EQ(RTI.getStruct(DL).AlignLog2, Log2(Align(4))); 3203eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::StructuredBuffer); 321482237e8SJustin Bogner 3223eca15cbSJustin Bogner RBI = ResourceBindingInfo( 3233eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/2, /*Size=*/1, 3243eca15cbSJustin Bogner RTI.getHandleTy()); 325*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "g_OutputBuffer"); 3263eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 327b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000920cU); 328b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000014U); 3293eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 330*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "g_OutputBuffer", 0, 2, 1, 12, false, true, 331*0e2466f6SJustin Bogner false, TestMD.get(1, 20))); 332b365dbbdSJustin Bogner 333b365dbbdSJustin Bogner // RWTexture2DMSArray<uint, 8> g_rw_t2dmsa; 3343eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 335482237e8SJustin Bogner Context, "dx.MSTexture", Int32Ty, 336482237e8SJustin Bogner {/*IsWriteable=*/1, /*SampleCount=*/8, /*IsSigned=*/0, 3373eca15cbSJustin Bogner llvm::to_underlying(ResourceKind::Texture2DMSArray)})); 3383eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::UAV); 3393eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().GloballyCoherent, false); 3403eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().HasCounter, false); 3413eca15cbSJustin Bogner EXPECT_EQ(RTI.getUAV().IsROV, false); 3423eca15cbSJustin Bogner ASSERT_EQ(RTI.isTyped(), true); 3433eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementTy, ElementType::U32); 3443eca15cbSJustin Bogner EXPECT_EQ(RTI.getTyped().ElementCount, 1u); 3453eca15cbSJustin Bogner ASSERT_EQ(RTI.isMultiSample(), true); 3463eca15cbSJustin Bogner EXPECT_EQ(RTI.getMultiSampleCount(), 8u); 3473eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Texture2DMSArray); 348482237e8SJustin Bogner 3493eca15cbSJustin Bogner RBI = ResourceBindingInfo( 3503eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 3513eca15cbSJustin Bogner RTI.getHandleTy()); 352*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "g_rw_t2dmsa"); 3533eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 354b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x00001008U); 355b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00080105U); 3563eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 357*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "g_rw_t2dmsa", 0, 0, 1, 8, false, false, 358*0e2466f6SJustin Bogner false, TestMD.get(0, 5))); 359b365dbbdSJustin Bogner 360b365dbbdSJustin Bogner // cbuffer cb0 { float4 g_X; float4 g_Y; } 361482237e8SJustin Bogner StructType *CBufType0 = 362482237e8SJustin Bogner StructType::create(Context, {Floatx4Ty, Floatx4Ty}, "cb0"); 3633eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get(Context, "dx.CBuffer", 3643eca15cbSJustin Bogner CBufType0, {/*Size=*/32})); 3653eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::CBuffer); 3663eca15cbSJustin Bogner EXPECT_EQ(RTI.getCBufferSize(DL), 32u); 3673eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::CBuffer); 368482237e8SJustin Bogner 3693eca15cbSJustin Bogner RBI = ResourceBindingInfo( 3703eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 3713eca15cbSJustin Bogner RTI.getHandleTy()); 372*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), ""); 3733eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 374b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000000dU); 375b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0x00000020U); 3763eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 377*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "", 0, 0, 1, 32, nullptr)); 378b365dbbdSJustin Bogner 379b365dbbdSJustin Bogner // SamplerState ColorMapSampler : register(s0); 3803eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 381482237e8SJustin Bogner Context, "dx.Sampler", {}, 3823eca15cbSJustin Bogner {llvm::to_underlying(dxil::SamplerType::Default)})); 3833eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::Sampler); 3843eca15cbSJustin Bogner EXPECT_EQ(RTI.getSamplerType(), dxil::SamplerType::Default); 3853eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Sampler); 386482237e8SJustin Bogner 3873eca15cbSJustin Bogner RBI = ResourceBindingInfo( 3883eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 3893eca15cbSJustin Bogner RTI.getHandleTy()); 390*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "ColorMapSampler"); 3913eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 392b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000000eU); 393b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0U); 3943eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 395*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "ColorMapSampler", 0, 0, 1, 0, nullptr)); 396b365dbbdSJustin Bogner 3973eca15cbSJustin Bogner RTI = ResourceTypeInfo(llvm::TargetExtType::get( 398482237e8SJustin Bogner Context, "dx.Sampler", {}, 3993eca15cbSJustin Bogner {llvm::to_underlying(dxil::SamplerType::Comparison)})); 4003eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceClass(), ResourceClass::Sampler); 4013eca15cbSJustin Bogner EXPECT_EQ(RTI.getSamplerType(), dxil::SamplerType::Comparison); 4023eca15cbSJustin Bogner EXPECT_EQ(RTI.getResourceKind(), ResourceKind::Sampler); 403482237e8SJustin Bogner 4043eca15cbSJustin Bogner RBI = ResourceBindingInfo( 4053eca15cbSJustin Bogner /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, 4063eca15cbSJustin Bogner RTI.getHandleTy()); 407*0e2466f6SJustin Bogner GV = RBI.createSymbol(M, RTI.createElementStruct(), "CmpSampler"); 4083eca15cbSJustin Bogner Props = RBI.getAnnotateProps(M, RTI); 409b365dbbdSJustin Bogner EXPECT_EQ(Props.first, 0x0000800eU); 410b365dbbdSJustin Bogner EXPECT_EQ(Props.second, 0U); 4113eca15cbSJustin Bogner MD = RBI.getAsMetadata(M, RTI); 412*0e2466f6SJustin Bogner EXPECT_MDEQ(MD, TestMD.get(0, GV, "CmpSampler", 0, 0, 1, 1, nullptr)); 413b365dbbdSJustin Bogner } 414