Pārlūkot izejas kodu

Add getElementStride to DxilResourceProperties. (#3312)

* Add getElementStride to DxilResourceProperties.
Xiang Li 4 gadi atpakaļ
vecāks
revīzija
4dd6ff6b83

+ 1 - 1
include/dxc/DXIL/DxilResourceBinding.h

@@ -45,7 +45,7 @@ llvm::Constant *getAsConstant(const DxilResourceBinding &, llvm::Type *Ty,
                               const ShaderModel &);
 DxilResourceBinding loadBindingFromConstant(const llvm::Constant &C);
 DxilResourceBinding
-loadBindingFromCreateHandleFromBinding(DxilInst_CreateHandleFromBinding &createHandle, llvm::Type *Ty,
+loadBindingFromCreateHandleFromBinding(const DxilInst_CreateHandleFromBinding &createHandle, llvm::Type *Ty,
                        const ShaderModel &);
 DxilResourceBinding loadBindingFromResourceBase(DxilResourceBase *);
 

+ 2 - 1
include/dxc/DXIL/DxilResourceProperties.h

@@ -68,6 +68,7 @@ struct DxilResourceProperties {
   DXIL::ResourceClass getResourceClass() const;
   DXIL::ResourceKind  getResourceKind() const;
   DXIL::ComponentType getCompType() const;
+  unsigned getElementStride() const;
   void setResourceKind(DXIL::ResourceKind RK);
   bool isUAV() const;
   bool operator==(const DxilResourceProperties &) const;
@@ -90,7 +91,7 @@ DxilResourceProperties loadPropsFromConstant(const llvm::Constant &C);
 DxilResourceProperties
 loadPropsFromAnnotateHandle(DxilInst_AnnotateHandle &annotateHandle, llvm::Type *Ty,
                        const ShaderModel &);
-DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *);
+DxilResourceProperties loadPropsFromResourceBase(const DxilResourceBase *);
 
 } // namespace resource_helper
 

+ 1 - 1
lib/DXIL/DxilResourceBinding.cpp

@@ -88,7 +88,7 @@ DxilResourceBinding loadBindingFromConstant(const llvm::Constant &C) {
   return B;
 }
 DxilResourceBinding loadBindingFromCreateHandleFromBinding(
-    DxilInst_CreateHandleFromBinding &createHandle, llvm::Type *Ty,
+    const DxilInst_CreateHandleFromBinding &createHandle, llvm::Type *Ty,
     const ShaderModel &) {
   Constant *B = cast<Constant>(createHandle.get_bind());
   return loadBindingFromConstant(*B);

+ 20 - 6
lib/DXIL/DxilResourceProperties.cpp

@@ -59,6 +59,20 @@ DXIL::ComponentType DxilResourceProperties::getCompType() const {
   return static_cast<DXIL::ComponentType>(Typed.CompType);
 }
 
+unsigned DxilResourceProperties::getElementStride() const {
+  switch (getResourceKind()) {
+  default:
+    return CompType(getCompType()).GetSizeInBits() / 8;
+  case DXIL::ResourceKind::RawBuffer:
+    return 1;
+  case DXIL::ResourceKind::StructuredBuffer:
+    return StructStrideInBytes;
+  case DXIL::ResourceKind::CBuffer:
+  case DXIL::ResourceKind::Sampler:
+    return 0;
+  }
+}
+
 bool DxilResourceProperties::operator==(const DxilResourceProperties &RP) const {
   return RawDword0 == RP.RawDword0 &&
          RawDword1 == RP.RawDword1;
@@ -121,7 +135,7 @@ loadPropsFromAnnotateHandle(DxilInst_AnnotateHandle &annotateHandle,
   return loadPropsFromConstant(*ResProp);
 }
 
-DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *Res) {
+DxilResourceProperties loadPropsFromResourceBase(const DxilResourceBase *Res) {
 
   DxilResourceProperties RP;
   if (!Res) {
@@ -129,7 +143,7 @@ DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *Res) {
   }
 
 
-  auto SetResProperties = [&RP](DxilResource &Res) {
+  auto SetResProperties = [&RP](const DxilResource &Res) {
     switch (Res.GetKind()) {
     default:
       break;
@@ -163,12 +177,12 @@ DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *Res) {
 
   switch (Res->GetClass()) { case DXIL::ResourceClass::Invalid: return RP;
   case DXIL::ResourceClass::SRV: {
-    DxilResource *SRV = (DxilResource*)(Res);
+    const DxilResource *SRV = (const DxilResource*)(Res);
     RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
     SetResProperties(*SRV);
   } break;
   case DXIL::ResourceClass::UAV: {
-    DxilResource *UAV = (DxilResource *)(Res);
+    const DxilResource *UAV = (const DxilResource *)(Res);
     RP.Basic.IsUAV = true;
     RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
     RP.Basic.IsGloballyCoherent = UAV->IsGloballyCoherent();
@@ -178,7 +192,7 @@ DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *Res) {
   } break;
   case DXIL::ResourceClass::Sampler: {
     RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
-    DxilSampler *Sampler = (DxilSampler*)Res;
+    const DxilSampler *Sampler = (const DxilSampler*)Res;
     if (Sampler->GetSamplerKind() == DXIL::SamplerKind::Comparison)
       RP.Basic.SamplerCmpOrHasCounter = true;
     else if (Sampler->GetSamplerKind() == DXIL::SamplerKind::Invalid)
@@ -186,7 +200,7 @@ DxilResourceProperties loadPropsFromResourceBase(DxilResourceBase *Res) {
   } break;
   case DXIL::ResourceClass::CBuffer: {
     RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
-    DxilCBuffer *CB = (DxilCBuffer *)Res;
+    const DxilCBuffer *CB = (const DxilCBuffer *)Res;
     RP.CBufferSizeInBytes = CB->GetSize();
   } break;
   }