DxilResourceProperties.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilResourceProperites.cpp //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. ///////////////////////////////////////////////////////////////////////////////
  9. #include "dxc/DXIL/DxilResourceProperties.h"
  10. #include "llvm/IR/Constant.h"
  11. #include "dxc/DXIL/DxilShaderModel.h"
  12. #include "llvm/IR/DerivedTypes.h"
  13. #include "llvm/IR/Constants.h"
  14. #include "dxc/DXIL/DxilResourceBase.h"
  15. #include "dxc/DXIL/DxilResource.h"
  16. #include "dxc/DXIL/DxilCBuffer.h"
  17. #include "dxc/DXIL/DxilSampler.h"
  18. #include "dxc/DXIL/DxilOperations.h"
  19. #include "dxc/DXIL/DxilInstructions.h"
  20. #include "dxc/DXIL/DxilUtil.h"
  21. using namespace llvm;
  22. namespace hlsl {
  23. DxilResourceProperties::DxilResourceProperties() {
  24. RawDword0 = 0;
  25. RawDword1 = 0;
  26. Basic.ResourceKind = (uint8_t)DXIL::ResourceKind::Invalid;
  27. }
  28. bool DxilResourceProperties::isUAV() const { return Basic.IsUAV; }
  29. bool DxilResourceProperties::isValid() const {
  30. return getResourceKind() != DXIL::ResourceKind::Invalid;
  31. }
  32. DXIL::ResourceClass DxilResourceProperties::getResourceClass() const {
  33. switch (static_cast<DXIL::ResourceKind>(Basic.ResourceKind)) {
  34. default:
  35. return Basic.IsUAV ? DXIL::ResourceClass::UAV : DXIL::ResourceClass::SRV;
  36. case DXIL::ResourceKind::CBuffer:
  37. return DXIL::ResourceClass::CBuffer;
  38. case DXIL::ResourceKind::Sampler:
  39. return DXIL::ResourceClass::Sampler;
  40. case DXIL::ResourceKind::Invalid:
  41. return DXIL::ResourceClass::Invalid;
  42. }
  43. }
  44. DXIL::ResourceKind DxilResourceProperties::getResourceKind() const {
  45. return static_cast<DXIL::ResourceKind>(Basic.ResourceKind);
  46. }
  47. void DxilResourceProperties::setResourceKind(DXIL::ResourceKind RK) {
  48. Basic.ResourceKind = (uint8_t)RK;
  49. }
  50. DXIL::ComponentType DxilResourceProperties::getCompType() const {
  51. return static_cast<DXIL::ComponentType>(Typed.CompType);
  52. }
  53. unsigned DxilResourceProperties::getElementStride() const {
  54. switch (getResourceKind()) {
  55. default:
  56. return CompType(getCompType()).GetSizeInBits() / 8;
  57. case DXIL::ResourceKind::RawBuffer:
  58. return 1;
  59. case DXIL::ResourceKind::StructuredBuffer:
  60. return StructStrideInBytes;
  61. case DXIL::ResourceKind::CBuffer:
  62. case DXIL::ResourceKind::Sampler:
  63. return 0;
  64. }
  65. }
  66. bool DxilResourceProperties::operator==(const DxilResourceProperties &RP) const {
  67. return RawDword0 == RP.RawDword0 &&
  68. RawDword1 == RP.RawDword1;
  69. }
  70. bool DxilResourceProperties::operator!=(const DxilResourceProperties &RP) const {
  71. return !(*this == RP) ;
  72. }
  73. namespace resource_helper {
  74. // The constant is as struct with int32 fields.
  75. // ShaderModel 6.6 has 2 fileds.
  76. Constant *getAsConstant(const DxilResourceProperties &RP, Type *Ty,
  77. const ShaderModel &) {
  78. StructType *ST = cast<StructType>(Ty);
  79. switch (ST->getNumElements()) {
  80. case 2: {
  81. Constant *RawDwords[] = {
  82. ConstantInt::get(ST->getElementType(0), RP.RawDword0),
  83. ConstantInt::get(ST->getElementType(1), RP.RawDword1)};
  84. return ConstantStruct::get(ST, RawDwords);
  85. } break;
  86. default:
  87. return nullptr;
  88. break;
  89. }
  90. return nullptr;
  91. }
  92. DxilResourceProperties loadPropsFromConstant(const Constant &C) {
  93. DxilResourceProperties RP;
  94. // Ty Should match C.getType().
  95. Type *Ty = C.getType();
  96. StructType *ST = cast<StructType>(Ty);
  97. switch (ST->getNumElements()) {
  98. case 2: {
  99. if (isa<ConstantAggregateZero>(&C)) {
  100. RP.RawDword0 = 0;
  101. RP.RawDword1 = 0;
  102. } else {
  103. const ConstantStruct *CS = cast<ConstantStruct>(&C);
  104. const Constant *RawDword0 = CS->getOperand(0);
  105. const Constant *RawDword1 = CS->getOperand(1);
  106. RP.RawDword0 = cast<ConstantInt>(RawDword0)->getLimitedValue();
  107. RP.RawDword1 = cast<ConstantInt>(RawDword1)->getLimitedValue();
  108. }
  109. } break;
  110. default:
  111. break;
  112. }
  113. return RP;
  114. }
  115. DxilResourceProperties
  116. loadPropsFromAnnotateHandle(DxilInst_AnnotateHandle &annotateHandle,
  117. const ShaderModel &SM) {
  118. Constant *ResProp = cast<Constant>(annotateHandle.get_props());
  119. return loadPropsFromConstant(*ResProp);
  120. }
  121. DxilResourceProperties loadPropsFromResourceBase(const DxilResourceBase *Res) {
  122. DxilResourceProperties RP;
  123. if (!Res) {
  124. return RP;
  125. }
  126. auto SetResProperties = [&RP](const DxilResource &Res) {
  127. switch (Res.GetKind()) {
  128. default:
  129. break;
  130. case DXIL::ResourceKind::FeedbackTexture2D:
  131. case DXIL::ResourceKind::FeedbackTexture2DArray:
  132. RP.SamplerFeedbackType = Res.GetSamplerFeedbackType();
  133. break;
  134. case DXIL::ResourceKind::RTAccelerationStructure:
  135. break;
  136. case DXIL::ResourceKind::StructuredBuffer:
  137. {
  138. RP.StructStrideInBytes = Res.GetElementStride();
  139. RP.Basic.BaseAlignLog2 = Res.GetBaseAlignLog2();
  140. break;
  141. }
  142. case DXIL::ResourceKind::Texture2DMS:
  143. case DXIL::ResourceKind::Texture2DMSArray:
  144. case DXIL::ResourceKind::TypedBuffer:
  145. case DXIL::ResourceKind::Texture1D:
  146. case DXIL::ResourceKind::Texture2D:
  147. case DXIL::ResourceKind::TextureCube:
  148. case DXIL::ResourceKind::Texture1DArray:
  149. case DXIL::ResourceKind::Texture2DArray:
  150. case DXIL::ResourceKind::TextureCubeArray:
  151. case DXIL::ResourceKind::Texture3D:
  152. Type *Ty = Res.GetRetType();
  153. RP.Typed.CompCount = dxilutil::GetResourceComponentCount(Ty);
  154. RP.Typed.CompType = (uint8_t)Res.GetCompType().GetKind();
  155. break;
  156. }
  157. };
  158. switch (Res->GetClass()) { case DXIL::ResourceClass::Invalid: return RP;
  159. case DXIL::ResourceClass::SRV: {
  160. const DxilResource *SRV = (const DxilResource*)(Res);
  161. RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
  162. SetResProperties(*SRV);
  163. } break;
  164. case DXIL::ResourceClass::UAV: {
  165. const DxilResource *UAV = (const DxilResource *)(Res);
  166. RP.Basic.IsUAV = true;
  167. RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
  168. RP.Basic.IsGloballyCoherent = UAV->IsGloballyCoherent();
  169. RP.Basic.SamplerCmpOrHasCounter = UAV->HasCounter();
  170. RP.Basic.IsROV = UAV->IsROV();
  171. SetResProperties(*UAV);
  172. } break;
  173. case DXIL::ResourceClass::Sampler: {
  174. RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
  175. const DxilSampler *Sampler = (const DxilSampler*)Res;
  176. if (Sampler->GetSamplerKind() == DXIL::SamplerKind::Comparison)
  177. RP.Basic.SamplerCmpOrHasCounter = true;
  178. else if (Sampler->GetSamplerKind() == DXIL::SamplerKind::Invalid)
  179. RP.Basic.ResourceKind = (uint8_t)DXIL::ResourceKind::Invalid;
  180. } break;
  181. case DXIL::ResourceClass::CBuffer: {
  182. RP.Basic.ResourceKind = (uint8_t)Res->GetKind();
  183. const DxilCBuffer *CB = (const DxilCBuffer *)Res;
  184. RP.CBufferSizeInBytes = CB->GetSize();
  185. } break;
  186. }
  187. return RP;
  188. }
  189. } // namespace resource_helper
  190. } // namespace hlsl