@@ -64,7 +64,7 @@ static StringRef getResourceKindName(ResourceKind RK) {
64
64
case ResourceKind::TextureCubeArray:
65
65
return " TextureCubeArray" ;
66
66
case ResourceKind::TypedBuffer:
67
- return " TypedBuffer " ;
67
+ return " Buffer " ;
68
68
case ResourceKind::RawBuffer:
69
69
return " RawBuffer" ;
70
70
case ResourceKind::StructuredBuffer:
@@ -132,6 +132,44 @@ static StringRef getElementTypeName(ElementType ET) {
132
132
llvm_unreachable (" Unhandled ElementType" );
133
133
}
134
134
135
+ static StringRef getElementTypeNameForTemplate (ElementType ET) {
136
+ switch (ET) {
137
+ case ElementType::I1:
138
+ return " bool" ;
139
+ case ElementType::I16:
140
+ return " int16_t" ;
141
+ case ElementType::U16:
142
+ return " uint16_t" ;
143
+ case ElementType::I32:
144
+ return " int32_t" ;
145
+ case ElementType::U32:
146
+ return " uint32_t" ;
147
+ case ElementType::I64:
148
+ return " int64_t" ;
149
+ case ElementType::U64:
150
+ return " uint32_t" ;
151
+ case ElementType::F16:
152
+ case ElementType::SNormF16:
153
+ case ElementType::UNormF16:
154
+ return " half" ;
155
+ case ElementType::F32:
156
+ case ElementType::SNormF32:
157
+ case ElementType::UNormF32:
158
+ return " float" ;
159
+ case ElementType::F64:
160
+ case ElementType::SNormF64:
161
+ case ElementType::UNormF64:
162
+ return " double" ;
163
+ case ElementType::PackedS8x32:
164
+ return " int8_t4_packed" ;
165
+ case ElementType::PackedU8x32:
166
+ return " uint8_t4_packed" ;
167
+ case ElementType::Invalid:
168
+ return " <invalid>" ;
169
+ }
170
+ llvm_unreachable (" Unhandled ElementType" );
171
+ }
172
+
135
173
static StringRef getSamplerTypeName (SamplerType ST) {
136
174
switch (ST) {
137
175
case SamplerType::Default:
@@ -219,12 +257,44 @@ ResourceTypeInfo::ResourceTypeInfo(TargetExtType *HandleTy,
219
257
}
220
258
221
259
static void formatTypeName (SmallString<64 > &Dest, StringRef Name,
222
- bool isWriteable, bool isROV) {
223
- Dest = isWriteable ? (isROV ? " RasterizerOrdered" : " RW" ) : " " ;
224
- Dest += Name;
260
+ bool IsWriteable, bool IsROV,
261
+ Type *ContainedType = nullptr ,
262
+ bool IsSigned = true ) {
263
+ raw_svector_ostream DestStream (Dest);
264
+ if (IsWriteable)
265
+ DestStream << (IsROV ? " RasterizerOrdered" : " RW" );
266
+ DestStream << Name;
267
+
268
+ if (!ContainedType)
269
+ return ;
270
+
271
+ StringRef ElementName;
272
+ ElementType ET = toDXILElementType (ContainedType, IsSigned);
273
+ if (ET != ElementType::Invalid) {
274
+ ElementName = getElementTypeNameForTemplate (ET);
275
+ } else {
276
+ assert (isa<StructType>(ContainedType) &&
277
+ " invalid element type for raw buffer" );
278
+ StructType *ST = cast<StructType>(ContainedType);
279
+ if (!ST->hasName ())
280
+ return ;
281
+ ElementName = ST->getStructName ();
282
+ }
283
+
284
+ DestStream << " <" << ElementName;
285
+ if (const FixedVectorType *VTy = dyn_cast<FixedVectorType>(ContainedType))
286
+ DestStream << VTy->getNumElements ();
287
+ DestStream << " >" ;
288
+ }
289
+
290
+ static StructType *getOrCreateElementStruct (Type *ElemType, StringRef Name) {
291
+ StructType *Ty = StructType::getTypeByName (ElemType->getContext (), Name);
292
+ if (Ty && Ty->getNumElements () == 1 && Ty->getElementType (0 ) == ElemType)
293
+ return Ty;
294
+ return StructType::create (ElemType, Name);
225
295
}
226
296
227
- StructType *ResourceTypeInfo::createElementStruct () {
297
+ StructType *ResourceTypeInfo::createElementStruct (StringRef CBufferName ) {
228
298
SmallString<64 > TypeName;
229
299
230
300
switch (Kind) {
@@ -237,51 +307,61 @@ StructType *ResourceTypeInfo::createElementStruct() {
237
307
case ResourceKind::TextureCubeArray: {
238
308
auto *RTy = cast<TextureExtType>(HandleTy);
239
309
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
240
- RTy->isROV ());
241
- return StructType::create (RTy->getResourceType (), TypeName);
310
+ RTy->isROV (), RTy-> getResourceType (), RTy-> isSigned () );
311
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
242
312
}
243
313
case ResourceKind::Texture2DMS:
244
314
case ResourceKind::Texture2DMSArray: {
245
315
auto *RTy = cast<MSTextureExtType>(HandleTy);
246
316
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
247
- /* IsROV=*/ false );
248
- return StructType::create (RTy->getResourceType (), TypeName);
317
+ /* IsROV=*/ false , RTy-> getResourceType (), RTy-> isSigned () );
318
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
249
319
}
250
320
case ResourceKind::TypedBuffer: {
251
321
auto *RTy = cast<TypedBufferExtType>(HandleTy);
252
322
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
253
- RTy->isROV ());
254
- return StructType::create (RTy->getResourceType (), TypeName);
323
+ RTy->isROV (), RTy-> getResourceType (), RTy-> isSigned () );
324
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
255
325
}
256
326
case ResourceKind::RawBuffer: {
257
327
auto *RTy = cast<RawBufferExtType>(HandleTy);
258
328
formatTypeName (TypeName, " ByteAddressBuffer" , RTy->isWriteable (),
259
329
RTy->isROV ());
260
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
261
- TypeName);
330
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
331
+ TypeName);
262
332
}
263
333
case ResourceKind::StructuredBuffer: {
264
334
auto *RTy = cast<RawBufferExtType>(HandleTy);
335
+ Type *Ty = RTy->getResourceType ();
265
336
formatTypeName (TypeName, " StructuredBuffer" , RTy->isWriteable (),
266
- RTy->isROV ());
267
- return StructType::create (RTy-> getResourceType () , TypeName);
337
+ RTy->isROV (), RTy-> getResourceType (), true );
338
+ return getOrCreateElementStruct (Ty , TypeName);
268
339
}
269
340
case ResourceKind::FeedbackTexture2D:
270
341
case ResourceKind::FeedbackTexture2DArray: {
271
342
auto *RTy = cast<FeedbackTextureExtType>(HandleTy);
272
343
TypeName = formatv (" {0}<{1}>" , getResourceKindName (Kind),
273
344
llvm::to_underlying (RTy->getFeedbackType ()));
274
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
275
- TypeName);
345
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
346
+ TypeName);
347
+ }
348
+ case ResourceKind::CBuffer: {
349
+ auto *RTy = cast<CBufferExtType>(HandleTy);
350
+ LayoutExtType *LayoutType = cast<LayoutExtType>(RTy->getResourceType ());
351
+ StructType *Ty = cast<StructType>(LayoutType->getWrappedType ());
352
+ SmallString<64 > Name = getResourceKindName (Kind);
353
+ if (!CBufferName.empty ()) {
354
+ Name.append (" ." );
355
+ Name.append (CBufferName);
356
+ }
357
+ return StructType::create (Ty->elements (), Name);
276
358
}
277
- case ResourceKind::CBuffer:
278
- return StructType::create (HandleTy->getContext (), " cbuffer" );
279
359
case ResourceKind::Sampler: {
280
360
auto *RTy = cast<SamplerExtType>(HandleTy);
281
361
TypeName = formatv (" SamplerState<{0}>" ,
282
362
llvm::to_underlying (RTy->getSamplerType ()));
283
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
284
- TypeName);
363
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
364
+ TypeName);
285
365
}
286
366
case ResourceKind::TBuffer:
287
367
case ResourceKind::RTAccelerationStructure:
0 commit comments