DxilCompType.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilCompType.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/HLSL/DxilCompType.h"
  10. #include "dxc/Support/Global.h"
  11. #include "llvm/IR/LLVMContext.h"
  12. #include "llvm/IR/Type.h"
  13. #include "llvm/IR/DerivedTypes.h"
  14. using namespace llvm;
  15. namespace hlsl {
  16. //------------------------------------------------------------------------------
  17. //
  18. // CompType class methods.
  19. //
  20. CompType::CompType()
  21. : m_Kind(Kind::Invalid) {
  22. }
  23. CompType::CompType(Kind K)
  24. : m_Kind(K) {
  25. DXASSERT(m_Kind >= Kind::Invalid && m_Kind < Kind::LastEntry, "otherwise the caller passed out-of-range value");
  26. }
  27. CompType::CompType(unsigned int K) : CompType((Kind)K) {}
  28. bool CompType::operator==(const CompType &o) const {
  29. return m_Kind == o.m_Kind;
  30. }
  31. CompType::Kind CompType::GetKind() const {
  32. return m_Kind;
  33. }
  34. uint8_t CompType::GetSizeInBits() const {
  35. switch (m_Kind) {
  36. case Kind::Invalid:
  37. return 0;
  38. case Kind::I1:
  39. return 1;
  40. case Kind::SNormF16:
  41. case Kind::UNormF16:
  42. case Kind::I16:
  43. case Kind::F16:
  44. case Kind::U16:
  45. return 16;
  46. case Kind::SNormF32:
  47. case Kind::UNormF32:
  48. case Kind::I32:
  49. case Kind::U32:
  50. case Kind::F32:
  51. return 32;
  52. case Kind::I64:
  53. case Kind::U64:
  54. case Kind::SNormF64:
  55. case Kind::UNormF64:
  56. case Kind::F64:
  57. return 64;
  58. default:
  59. DXASSERT(false, "invalid type kind");
  60. }
  61. return 0;
  62. }
  63. CompType CompType::getInvalid() {
  64. return CompType();
  65. }
  66. CompType CompType::getF16() {
  67. return CompType(Kind::F16);
  68. }
  69. CompType CompType::getF32() {
  70. return CompType(Kind::F32);
  71. }
  72. CompType CompType::getF64() {
  73. return CompType(Kind::F64);
  74. }
  75. CompType CompType::getI16() {
  76. return CompType(Kind::I16);
  77. }
  78. CompType CompType::getI32() {
  79. return CompType(Kind::I32);
  80. }
  81. CompType CompType::getI64() {
  82. return CompType(Kind::I64);
  83. }
  84. CompType CompType::getU16() {
  85. return CompType(Kind::U16);
  86. }
  87. CompType CompType::getU32() {
  88. return CompType(Kind::U32);
  89. }
  90. CompType CompType::getU64() {
  91. return CompType(Kind::U64);
  92. }
  93. CompType CompType::getI1() {
  94. return CompType(Kind::I1);
  95. }
  96. CompType CompType::getSNormF16() {
  97. return CompType(Kind::SNormF16);
  98. }
  99. CompType CompType::getUNormF16() {
  100. return CompType(Kind::UNormF16);
  101. }
  102. CompType CompType::getSNormF32() {
  103. return CompType(Kind::SNormF32);
  104. }
  105. CompType CompType::getUNormF32() {
  106. return CompType(Kind::UNormF32);
  107. }
  108. CompType CompType::getSNormF64() {
  109. return CompType(Kind::SNormF64);
  110. }
  111. CompType CompType::getUNormF64() {
  112. return CompType(Kind::UNormF64);
  113. }
  114. bool CompType::IsInvalid() const {
  115. return m_Kind == Kind::Invalid;
  116. }
  117. bool CompType::IsFloatTy() const {
  118. return m_Kind == Kind::F16 || m_Kind == Kind::F32 || m_Kind == Kind::F64;
  119. }
  120. bool CompType::IsIntTy() const {
  121. return IsSIntTy() || IsUIntTy();
  122. }
  123. bool CompType::IsSIntTy() const {
  124. return m_Kind == Kind::I16 || m_Kind == Kind::I32 || m_Kind == Kind::I64;
  125. }
  126. bool CompType::IsUIntTy() const {
  127. return m_Kind == Kind::U16 || m_Kind == Kind::U32 || m_Kind == Kind::U64;
  128. }
  129. bool CompType::IsBoolTy() const {
  130. return m_Kind == Kind::I1;
  131. }
  132. bool CompType::IsSNorm() const {
  133. return m_Kind == Kind::SNormF16 || m_Kind == Kind::SNormF32 || m_Kind == Kind::SNormF64;
  134. }
  135. bool CompType::IsUNorm() const {
  136. return m_Kind == Kind::UNormF16 || m_Kind == Kind::UNormF32 || m_Kind == Kind::UNormF64;
  137. }
  138. bool CompType::Is64Bit() const {
  139. switch (m_Kind) {
  140. case DXIL::ComponentType::F64:
  141. case DXIL::ComponentType::SNormF64:
  142. case DXIL::ComponentType::UNormF64:
  143. case DXIL::ComponentType::I64:
  144. case DXIL::ComponentType::U64:
  145. return true;
  146. default:
  147. return false;
  148. }
  149. }
  150. bool CompType::Is16Bit() const {
  151. switch (m_Kind) {
  152. case DXIL::ComponentType::F16:
  153. case DXIL::ComponentType::I16:
  154. case DXIL::ComponentType::SNormF16:
  155. case DXIL::ComponentType::UNormF16:
  156. case DXIL::ComponentType::U16:
  157. return true;
  158. default:
  159. return false;
  160. }
  161. }
  162. CompType CompType::GetBaseCompType() const {
  163. switch (m_Kind) {
  164. case Kind::I1: return CompType(Kind::I1);
  165. case Kind::I16: __fallthrough;
  166. case Kind::I32: return CompType(Kind::I32);
  167. case Kind::I64: return CompType(Kind::I64);
  168. case Kind::U16: __fallthrough;
  169. case Kind::U32: return CompType(Kind::U32);
  170. case Kind::U64: return CompType(Kind::U64);
  171. case Kind::SNormF16: __fallthrough;
  172. case Kind::UNormF16: __fallthrough;
  173. case Kind::F16: __fallthrough;
  174. case Kind::SNormF32: __fallthrough;
  175. case Kind::UNormF32: __fallthrough;
  176. case Kind::F32: return CompType(Kind::F32);
  177. case Kind::SNormF64: __fallthrough;
  178. case Kind::UNormF64: __fallthrough;
  179. case Kind::F64: return CompType(Kind::F64);
  180. default:
  181. DXASSERT(false, "invalid type kind");
  182. }
  183. return CompType();
  184. }
  185. bool CompType::HasMinPrec() const {
  186. switch (m_Kind) {
  187. case Kind::I16:
  188. case Kind::U16:
  189. case Kind::F16:
  190. case Kind::SNormF16:
  191. case Kind::UNormF16:
  192. return true;
  193. case Kind::I1:
  194. case Kind::I32:
  195. case Kind::U32:
  196. case Kind::I64:
  197. case Kind::U64:
  198. case Kind::F32:
  199. case Kind::F64:
  200. case Kind::SNormF32:
  201. case Kind::UNormF32:
  202. case Kind::SNormF64:
  203. case Kind::UNormF64:
  204. break;
  205. default:
  206. DXASSERT(false, "invalid comp type");
  207. }
  208. return false;
  209. }
  210. Type *CompType::GetLLVMType(LLVMContext &Ctx) const {
  211. switch (m_Kind) {
  212. case Kind::I1: return (Type*)Type::getInt1Ty(Ctx);
  213. case Kind::I16:
  214. case Kind::U16: return (Type*)Type::getInt16Ty(Ctx);
  215. case Kind::I32:
  216. case Kind::U32: return (Type*)Type::getInt32Ty(Ctx);
  217. case Kind::I64:
  218. case Kind::U64: return (Type*)Type::getInt64Ty(Ctx);
  219. case Kind::SNormF16:
  220. case Kind::UNormF16:
  221. case Kind::F16: return Type::getHalfTy(Ctx);
  222. case Kind::SNormF32:
  223. case Kind::UNormF32:
  224. case Kind::F32: return Type::getFloatTy(Ctx);
  225. case Kind::SNormF64:
  226. case Kind::UNormF64:
  227. case Kind::F64: return Type::getDoubleTy(Ctx);
  228. default:
  229. DXASSERT(false, "invalid type kind");
  230. }
  231. return nullptr;
  232. }
  233. PointerType *CompType::GetLLVMPtrType(LLVMContext &Ctx, const unsigned AddrSpace) const {
  234. switch (m_Kind) {
  235. case Kind::I1: return Type::getInt1PtrTy (Ctx, AddrSpace);
  236. case Kind::I16:
  237. case Kind::U16: return Type::getInt16PtrTy (Ctx, AddrSpace);
  238. case Kind::I32:
  239. case Kind::U32: return Type::getInt32PtrTy (Ctx, AddrSpace);
  240. case Kind::I64:
  241. case Kind::U64: return Type::getInt64PtrTy (Ctx, AddrSpace);
  242. case Kind::SNormF16:
  243. case Kind::UNormF16:
  244. case Kind::F16: return Type::getHalfPtrTy (Ctx, AddrSpace);
  245. case Kind::SNormF32:
  246. case Kind::UNormF32:
  247. case Kind::F32: return Type::getFloatPtrTy (Ctx, AddrSpace);
  248. case Kind::SNormF64:
  249. case Kind::UNormF64:
  250. case Kind::F64: return Type::getDoublePtrTy(Ctx, AddrSpace);
  251. default:
  252. DXASSERT(false, "invalid type kind");
  253. }
  254. return nullptr;
  255. }
  256. Type *CompType::GetLLVMBaseType(llvm::LLVMContext &Ctx) const {
  257. return GetBaseCompType().GetLLVMType(Ctx);
  258. }
  259. CompType CompType::GetCompType(Type *type) {
  260. LLVMContext &Ctx = type->getContext();
  261. if (type == Type::getInt1Ty(Ctx)) return CompType(Kind::I1);
  262. if (type == Type::getInt16Ty(Ctx)) return CompType(Kind::I16);
  263. if (type == Type::getInt32Ty(Ctx)) return CompType(Kind::I32);
  264. if (type == Type::getInt64Ty(Ctx)) return CompType(Kind::I64);
  265. if (type == Type::getHalfTy(Ctx)) return CompType(Kind::F16);
  266. if (type == Type::getFloatTy(Ctx)) return CompType(Kind::F32);
  267. if (type == Type::getDoubleTy(Ctx)) return CompType(Kind::F64);
  268. DXASSERT(false, "invalid type kind");
  269. return CompType();
  270. }
  271. static const char *s_TypeKindNames[(unsigned)CompType::Kind::LastEntry] = {
  272. "invalid",
  273. "i1", "i16", "u16", "i32", "u32", "i64", "u64",
  274. "f16", "f32", "f64",
  275. "snorm_f16", "unorm_f16", "snorm_f32", "unorm_f32", "snorm_f64", "unorm_f64",
  276. };
  277. const char *CompType::GetName() const {
  278. return s_TypeKindNames[(unsigned)m_Kind];
  279. }
  280. static const char *s_TypeKindHLSLNames[(unsigned)CompType::Kind::LastEntry] = {
  281. "unknown",
  282. "bool", "int16_t", "uint16_t", "int", "uint", "int64_t", "uint64_t",
  283. "half", "float", "double",
  284. "snorm_half", "unorm_half", "snorm_float", "unorm_float", "snorm_double", "unorm_double",
  285. };
  286. static const char *s_TypeKindHLSLNamesMinPrecision[(unsigned)CompType::Kind::LastEntry] = {
  287. "unknown",
  288. "bool", "min16i", "min16ui", "int", "uint", "int64_t", "uint64_t",
  289. "min16float", "float", "double",
  290. "snorm_min16f", "unorm_min16f", "snorm_float", "unorm_float", "snorm_double", "unorm_double",
  291. };
  292. const char *CompType::GetHLSLName(bool MinPrecision) const {
  293. return MinPrecision ? s_TypeKindHLSLNamesMinPrecision[(unsigned)m_Kind] : s_TypeKindHLSLNames[(unsigned)m_Kind];
  294. }
  295. } // namespace hlsl