@@ -216,6 +216,81 @@ ResourceTypeInfo::ResourceTypeInfo(TargetExtType *HandleTy,
216
216
llvm_unreachable (" Unknown handle type" );
217
217
}
218
218
219
+ static void formatTypeName (SmallString<64 > &Dest, StringRef Name,
220
+ bool isWriteable, bool isROV) {
221
+ Dest = isWriteable ? (isROV ? " RasterizerOrdered" : " RW" ) : " " ;
222
+ Dest += Name;
223
+ }
224
+
225
+ StructType *ResourceTypeInfo::createElementStruct () {
226
+ SmallString<64 > TypeName;
227
+
228
+ switch (Kind) {
229
+ case ResourceKind::Texture1D:
230
+ case ResourceKind::Texture2D:
231
+ case ResourceKind::Texture3D:
232
+ case ResourceKind::TextureCube:
233
+ case ResourceKind::Texture1DArray:
234
+ case ResourceKind::Texture2DArray:
235
+ case ResourceKind::TextureCubeArray: {
236
+ auto *RTy = cast<TextureExtType>(HandleTy);
237
+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
238
+ RTy->isROV ());
239
+ return StructType::create (RTy->getResourceType (), TypeName);
240
+ }
241
+ case ResourceKind::Texture2DMS:
242
+ case ResourceKind::Texture2DMSArray: {
243
+ auto *RTy = cast<MSTextureExtType>(HandleTy);
244
+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
245
+ /* IsROV=*/ false );
246
+ return StructType::create (RTy->getResourceType (), TypeName);
247
+ }
248
+ case ResourceKind::TypedBuffer: {
249
+ auto *RTy = cast<TypedBufferExtType>(HandleTy);
250
+ formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
251
+ RTy->isROV ());
252
+ return StructType::create (RTy->getResourceType (), TypeName);
253
+ }
254
+ case ResourceKind::RawBuffer: {
255
+ auto *RTy = cast<RawBufferExtType>(HandleTy);
256
+ formatTypeName (TypeName, " ByteAddressBuffer" , RTy->isWriteable (),
257
+ RTy->isROV ());
258
+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
259
+ TypeName);
260
+ }
261
+ case ResourceKind::StructuredBuffer: {
262
+ auto *RTy = cast<RawBufferExtType>(HandleTy);
263
+ formatTypeName (TypeName, " StructuredBuffer" , RTy->isWriteable (),
264
+ RTy->isROV ());
265
+ return StructType::create (RTy->getResourceType (), TypeName);
266
+ }
267
+ case ResourceKind::FeedbackTexture2D:
268
+ case ResourceKind::FeedbackTexture2DArray: {
269
+ auto *RTy = cast<FeedbackTextureExtType>(HandleTy);
270
+ TypeName = formatv (" {0}<{1}>" , getResourceKindName (Kind),
271
+ llvm::to_underlying (RTy->getFeedbackType ()));
272
+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
273
+ TypeName);
274
+ }
275
+ case ResourceKind::CBuffer:
276
+ return StructType::create (HandleTy->getContext (), " cbuffer" );
277
+ case ResourceKind::Sampler: {
278
+ auto *RTy = cast<SamplerExtType>(HandleTy);
279
+ TypeName = formatv (" SamplerState<{0}>" ,
280
+ llvm::to_underlying (RTy->getSamplerType ()));
281
+ return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
282
+ TypeName);
283
+ }
284
+ case ResourceKind::TBuffer:
285
+ case ResourceKind::RTAccelerationStructure:
286
+ llvm_unreachable (" Unhandled resource kind" );
287
+ case ResourceKind::Invalid:
288
+ case ResourceKind::NumEntries:
289
+ llvm_unreachable (" Invalid resource kind" );
290
+ }
291
+ llvm_unreachable (" Unhandled ResourceKind enum" );
292
+ }
293
+
219
294
bool ResourceTypeInfo::isUAV () const { return RC == ResourceClass::UAV; }
220
295
221
296
bool ResourceTypeInfo::isCBuffer () const {
@@ -449,6 +524,15 @@ void ResourceTypeInfo::print(raw_ostream &OS, const DataLayout &DL) const {
449
524
}
450
525
}
451
526
527
+ GlobalVariable *ResourceBindingInfo::createSymbol (Module &M, StructType *Ty,
528
+ StringRef Name) {
529
+ assert (!Symbol && " Symbol has already been created" );
530
+ Symbol = new GlobalVariable (M, Ty, /* isConstant=*/ true ,
531
+ GlobalValue::ExternalLinkage,
532
+ /* Initializer=*/ nullptr , Name);
533
+ return Symbol;
534
+ }
535
+
452
536
MDTuple *ResourceBindingInfo::getAsMetadata (Module &M,
453
537
dxil::ResourceTypeInfo &RTI) const {
454
538
LLVMContext &Ctx = M.getContext ();
@@ -468,13 +552,9 @@ MDTuple *ResourceBindingInfo::getAsMetadata(Module &M,
468
552
};
469
553
470
554
MDVals.push_back (getIntMD (Binding.RecordID ));
471
-
472
- // TODO: We need API to create a symbol of the appropriate type to emit here.
473
- // See https://github.com/llvm/llvm-project/issues/116849
474
- MDVals.push_back (
475
- ValueAsMetadata::get (UndefValue::get (PointerType::getUnqual (Ctx))));
476
- MDVals.push_back (MDString::get (Ctx, " " ));
477
-
555
+ assert (Symbol && " Cannot yet create useful resource metadata without symbol" );
556
+ MDVals.push_back (ValueAsMetadata::get (Symbol));
557
+ MDVals.push_back (MDString::get (Ctx, Symbol->getName ()));
478
558
MDVals.push_back (getIntMD (Binding.Space ));
479
559
MDVals.push_back (getIntMD (Binding.LowerBound ));
480
560
MDVals.push_back (getIntMD (Binding.Size ));
@@ -573,6 +653,12 @@ ResourceBindingInfo::getAnnotateProps(Module &M,
573
653
574
654
void ResourceBindingInfo::print (raw_ostream &OS, dxil::ResourceTypeInfo &RTI,
575
655
const DataLayout &DL) const {
656
+ if (Symbol) {
657
+ OS << " Symbol: " ;
658
+ Symbol->printAsOperand (OS);
659
+ OS << " \n " ;
660
+ }
661
+
576
662
OS << " Binding:\n "
577
663
<< " Record ID: " << Binding.RecordID << " \n "
578
664
<< " Space: " << Binding.Space << " \n "
0 commit comments