@@ -64,7 +64,7 @@ static StringRef getResourceKindName(ResourceKind RK) {
6464 case ResourceKind::TextureCubeArray:
6565 return " TextureCubeArray" ;
6666 case ResourceKind::TypedBuffer:
67- return " TypedBuffer " ;
67+ return " Buffer " ;
6868 case ResourceKind::RawBuffer:
6969 return " RawBuffer" ;
7070 case ResourceKind::StructuredBuffer:
@@ -132,6 +132,44 @@ static StringRef getElementTypeName(ElementType ET) {
132132 llvm_unreachable (" Unhandled ElementType" );
133133}
134134
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+
135173static StringRef getSamplerTypeName (SamplerType ST) {
136174 switch (ST) {
137175 case SamplerType::Default:
@@ -219,12 +257,44 @@ ResourceTypeInfo::ResourceTypeInfo(TargetExtType *HandleTy,
219257}
220258
221259static 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);
225295}
226296
227- StructType *ResourceTypeInfo::createElementStruct () {
297+ StructType *ResourceTypeInfo::createElementStruct (StringRef CBufferName ) {
228298 SmallString<64 > TypeName;
229299
230300 switch (Kind) {
@@ -237,51 +307,61 @@ StructType *ResourceTypeInfo::createElementStruct() {
237307 case ResourceKind::TextureCubeArray: {
238308 auto *RTy = cast<TextureExtType>(HandleTy);
239309 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);
242312 }
243313 case ResourceKind::Texture2DMS:
244314 case ResourceKind::Texture2DMSArray: {
245315 auto *RTy = cast<MSTextureExtType>(HandleTy);
246316 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);
249319 }
250320 case ResourceKind::TypedBuffer: {
251321 auto *RTy = cast<TypedBufferExtType>(HandleTy);
252322 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);
255325 }
256326 case ResourceKind::RawBuffer: {
257327 auto *RTy = cast<RawBufferExtType>(HandleTy);
258328 formatTypeName (TypeName, " ByteAddressBuffer" , RTy->isWriteable (),
259329 RTy->isROV ());
260- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
261- TypeName);
330+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
331+ TypeName);
262332 }
263333 case ResourceKind::StructuredBuffer: {
264334 auto *RTy = cast<RawBufferExtType>(HandleTy);
335+ Type *Ty = RTy->getResourceType ();
265336 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);
268339 }
269340 case ResourceKind::FeedbackTexture2D:
270341 case ResourceKind::FeedbackTexture2DArray: {
271342 auto *RTy = cast<FeedbackTextureExtType>(HandleTy);
272343 TypeName = formatv (" {0}<{1}>" , getResourceKindName (Kind),
273344 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);
276358 }
277- case ResourceKind::CBuffer:
278- return StructType::create (HandleTy->getContext (), " cbuffer" );
279359 case ResourceKind::Sampler: {
280360 auto *RTy = cast<SamplerExtType>(HandleTy);
281361 TypeName = formatv (" SamplerState<{0}>" ,
282362 llvm::to_underlying (RTy->getSamplerType ()));
283- return StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
284- TypeName);
363+ return getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
364+ TypeName);
285365 }
286366 case ResourceKind::TBuffer:
287367 case ResourceKind::RTAccelerationStructure:
0 commit comments