xref: /llvm-project/llvm/unittests/Analysis/DXILResourceTest.cpp (revision 0e2466f62491a2623e61a81f17e4c0f2c15cb8ba)
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