@@ -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,11 +257,46 @@ 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" ) : " " ;
260
+ bool IsWriteable , bool IsROV ) {
261
+ Dest = IsWriteable ? (IsROV ? " RasterizerOrdered" : " RW" ) : " " ;
224
262
Dest += Name;
225
263
}
226
264
265
+ static void formatTypeName (SmallString<64 > &Dest, StringRef Name,
266
+ bool IsWriteable, bool IsROV, Type *ContainedType,
267
+ bool IsSigned) {
268
+ raw_svector_ostream DestStream (Dest);
269
+ if (IsWriteable)
270
+ DestStream << (IsROV ? " RasterizerOrdered" : " RW" );
271
+ DestStream << Name;
272
+
273
+ if (ContainedType) {
274
+ StringRef ElementName;
275
+ ElementType ET = toDXILElementType (ContainedType, IsSigned);
276
+ if (ET != ElementType::Invalid) {
277
+ ElementName = getElementTypeNameForTemplate (ET);
278
+ } else if (StructType *ST = dyn_cast<StructType>(ContainedType)) {
279
+ if (!ST->hasName ())
280
+ return ;
281
+ ElementName = ST->getStructName ();
282
+ } else {
283
+ llvm_unreachable (" invalid element type for raw buffer" );
284
+ }
285
+
286
+ if (const FixedVectorType *VTy = dyn_cast<FixedVectorType>(ContainedType))
287
+ DestStream << " <" << ElementName << VTy->getNumElements () << " >" ;
288
+ else
289
+ DestStream << " <" << ElementName << " >" ;
290
+ }
291
+ }
292
+
293
+ static StructType *getOrCreateElementStruct (Type *ElemType, StringRef Name) {
294
+ StructType *Ty = StructType::getTypeByName (ElemType->getContext (), Name);
295
+ if (Ty && Ty->getNumElements () == 1 && Ty->getElementType (0 ) == ElemType)
296
+ return Ty;
297
+ return StructType::create (ElemType, Name);
298
+ }
299
+
227
300
StructType *ResourceTypeInfo::createElementStruct () {
228
301
SmallString<64 > TypeName;
229
302
@@ -237,51 +310,56 @@ StructType *ResourceTypeInfo::createElementStruct() {
237
310
case ResourceKind::TextureCubeArray: {
238
311
auto *RTy = cast<TextureExtType>(HandleTy);
239
312
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
240
- RTy->isROV ());
241
- return StructType::create (RTy->getResourceType (), TypeName);
313
+ RTy->isROV (), RTy-> getResourceType (), RTy-> isSigned () );
314
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
242
315
}
243
316
case ResourceKind::Texture2DMS:
244
317
case ResourceKind::Texture2DMSArray: {
245
318
auto *RTy = cast<MSTextureExtType>(HandleTy);
246
319
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
247
- /* IsROV=*/ false );
248
- return StructType::create (RTy->getResourceType (), TypeName);
320
+ /* IsROV=*/ false , RTy-> getResourceType (), RTy-> isSigned () );
321
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
249
322
}
250
323
case ResourceKind::TypedBuffer: {
251
324
auto *RTy = cast<TypedBufferExtType>(HandleTy);
252
325
formatTypeName (TypeName, getResourceKindName (Kind), RTy->isWriteable (),
253
- RTy->isROV ());
254
- return StructType::create (RTy->getResourceType (), TypeName);
326
+ RTy->isROV (), RTy-> getResourceType (), RTy-> isSigned () );
327
+ return getOrCreateElementStruct (RTy->getResourceType (), TypeName);
255
328
}
256
329
case ResourceKind::RawBuffer: {
257
330
auto *RTy = cast<RawBufferExtType>(HandleTy);
258
331
formatTypeName (TypeName, " ByteAddressBuffer" , RTy->isWriteable (),
259
332
RTy->isROV ());
260
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
261
- TypeName);
333
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
334
+ TypeName);
262
335
}
263
336
case ResourceKind::StructuredBuffer: {
264
337
auto *RTy = cast<RawBufferExtType>(HandleTy);
338
+ Type *Ty = RTy->getResourceType ();
265
339
formatTypeName (TypeName, " StructuredBuffer" , RTy->isWriteable (),
266
- RTy->isROV ());
267
- return StructType::create (RTy-> getResourceType () , TypeName);
340
+ RTy->isROV (), RTy-> getResourceType (), true );
341
+ return getOrCreateElementStruct (Ty , TypeName);
268
342
}
269
343
case ResourceKind::FeedbackTexture2D:
270
344
case ResourceKind::FeedbackTexture2DArray: {
271
345
auto *RTy = cast<FeedbackTextureExtType>(HandleTy);
272
346
TypeName = formatv (" {0}<{1}>" , getResourceKindName (Kind),
273
347
llvm::to_underlying (RTy->getFeedbackType ()));
274
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
275
- TypeName);
348
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
349
+ TypeName);
350
+ }
351
+ case ResourceKind::CBuffer: {
352
+ auto *RTy = cast<CBufferExtType>(HandleTy);
353
+ LayoutExtType *LayoutType = cast<LayoutExtType>(RTy->getResourceType ());
354
+ StructType *Ty = cast<StructType>(LayoutType->getWrappedType ());
355
+ return StructType::create (Ty->elements (), getResourceKindName (Kind));
276
356
}
277
- case ResourceKind::CBuffer:
278
- return StructType::create (HandleTy->getContext (), " cbuffer" );
279
357
case ResourceKind::Sampler: {
280
358
auto *RTy = cast<SamplerExtType>(HandleTy);
281
359
TypeName = formatv (" SamplerState<{0}>" ,
282
360
llvm::to_underlying (RTy->getSamplerType ()));
283
- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
284
- TypeName);
361
+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
362
+ TypeName);
285
363
}
286
364
case ResourceKind::TBuffer:
287
365
case ResourceKind::RTAccelerationStructure:
0 commit comments