@@ -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,11 +257,46 @@ 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" " " 
260+                            bool  IsWriteable , bool  IsROV ) {
261+   Dest = IsWriteable  ? (IsROV  ? " RasterizerOrdered" " RW" " " 
224262  Dest += Name;
225263}
226264
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 << " <" getNumElements () << " >" 
288+     else 
289+       DestStream << " <" " >" 
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+ 
227300StructType *ResourceTypeInfo::createElementStruct () {
228301  SmallString<64 > TypeName;
229302
@@ -237,51 +310,56 @@ StructType *ResourceTypeInfo::createElementStruct() {
237310  case  ResourceKind::TextureCubeArray: {
238311    auto  *RTy = cast<TextureExtType>(HandleTy);
239312    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);
242315  }
243316  case  ResourceKind::Texture2DMS:
244317  case  ResourceKind::Texture2DMSArray: {
245318    auto  *RTy = cast<MSTextureExtType>(HandleTy);
246319    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);
249322  }
250323  case  ResourceKind::TypedBuffer: {
251324    auto  *RTy = cast<TypedBufferExtType>(HandleTy);
252325    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);
255328  }
256329  case  ResourceKind::RawBuffer: {
257330    auto  *RTy = cast<RawBufferExtType>(HandleTy);
258331    formatTypeName (TypeName, " ByteAddressBuffer" isWriteable (),
259332                   RTy->isROV ());
260-     return  StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
261-                               TypeName);
333+     return  getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
334+                                      TypeName);
262335  }
263336  case  ResourceKind::StructuredBuffer: {
264337    auto  *RTy = cast<RawBufferExtType>(HandleTy);
338+     Type *Ty = RTy->getResourceType ();
265339    formatTypeName (TypeName, " StructuredBuffer" isWriteable (),
266-                    RTy->isROV ());
267-     return  StructType::create (RTy-> getResourceType () , TypeName);
340+                    RTy->isROV (), RTy-> getResourceType (),  true );
341+     return  getOrCreateElementStruct (Ty , TypeName);
268342  }
269343  case  ResourceKind::FeedbackTexture2D:
270344  case  ResourceKind::FeedbackTexture2DArray: {
271345    auto  *RTy = cast<FeedbackTextureExtType>(HandleTy);
272346    TypeName = formatv (" {0}<{1}>" getResourceKindName (Kind),
273347                       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));
276356  }
277-   case  ResourceKind::CBuffer:
278-     return  StructType::create (HandleTy->getContext (), " cbuffer" 
279357  case  ResourceKind::Sampler: {
280358    auto  *RTy = cast<SamplerExtType>(HandleTy);
281359    TypeName = formatv (" SamplerState<{0}>" 
282360                       llvm::to_underlying (RTy->getSamplerType ()));
283-     return  StructType::create (Type::getInt32Ty (HandleTy->getContext ()),
284-                               TypeName);
361+     return  getOrCreateElementStruct (Type::getInt32Ty (HandleTy->getContext ()),
362+                                      TypeName);
285363  }
286364  case  ResourceKind::TBuffer:
287365  case  ResourceKind::RTAccelerationStructure:
0 commit comments