HlslIntrinsicOp.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // HlslIntrinsicOp.h //
  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. // Enumeration for HLSL intrinsics operations. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #pragma once
  12. namespace hlsl
  13. {
  14. enum class IntrinsicOp
  15. {
  16. /* <py>
  17. import hctdb_instrhelp
  18. </py> */
  19. /* <py::lines('HLSL-INTRINSICS')>hctdb_instrhelp.enum_hlsl_intrinsics()</py>*/
  20. // HLSL-INTRINSICS:BEGIN
  21. IOP_AddUint64,
  22. IOP_AllMemoryBarrier,
  23. IOP_AllMemoryBarrierWithGroupSync,
  24. IOP_CheckAccessFullyMapped,
  25. IOP_D3DCOLORtoUBYTE4,
  26. IOP_DeviceMemoryBarrier,
  27. IOP_DeviceMemoryBarrierWithGroupSync,
  28. IOP_EvaluateAttributeAtSample,
  29. IOP_EvaluateAttributeCentroid,
  30. IOP_EvaluateAttributeSnapped,
  31. IOP_GetAttributeAtVertex,
  32. IOP_GetRenderTargetSampleCount,
  33. IOP_GetRenderTargetSamplePosition,
  34. IOP_GroupMemoryBarrier,
  35. IOP_GroupMemoryBarrierWithGroupSync,
  36. IOP_InterlockedAdd,
  37. IOP_InterlockedAnd,
  38. IOP_InterlockedCompareExchange,
  39. IOP_InterlockedCompareStore,
  40. IOP_InterlockedExchange,
  41. IOP_InterlockedMax,
  42. IOP_InterlockedMin,
  43. IOP_InterlockedOr,
  44. IOP_InterlockedXor,
  45. IOP_NonUniformResourceIndex,
  46. IOP_Process2DQuadTessFactorsAvg,
  47. IOP_Process2DQuadTessFactorsMax,
  48. IOP_Process2DQuadTessFactorsMin,
  49. IOP_ProcessIsolineTessFactors,
  50. IOP_ProcessQuadTessFactorsAvg,
  51. IOP_ProcessQuadTessFactorsMax,
  52. IOP_ProcessQuadTessFactorsMin,
  53. IOP_ProcessTriTessFactorsAvg,
  54. IOP_ProcessTriTessFactorsMax,
  55. IOP_ProcessTriTessFactorsMin,
  56. IOP_QuadReadAcrossDiagonal,
  57. IOP_QuadReadAcrossX,
  58. IOP_QuadReadAcrossY,
  59. IOP_QuadReadLaneAt,
  60. IOP_WaveActiveAllEqual,
  61. IOP_WaveActiveAllTrue,
  62. IOP_WaveActiveAnyTrue,
  63. IOP_WaveActiveBallot,
  64. IOP_WaveActiveBitAnd,
  65. IOP_WaveActiveBitOr,
  66. IOP_WaveActiveBitXor,
  67. IOP_WaveActiveCountBits,
  68. IOP_WaveActiveMax,
  69. IOP_WaveActiveMin,
  70. IOP_WaveActiveProduct,
  71. IOP_WaveActiveSum,
  72. IOP_WaveGetLaneCount,
  73. IOP_WaveGetLaneIndex,
  74. IOP_WaveIsFirstLane,
  75. IOP_WavePrefixCountBits,
  76. IOP_WavePrefixProduct,
  77. IOP_WavePrefixSum,
  78. IOP_WaveReadLaneAt,
  79. IOP_WaveReadLaneFirst,
  80. IOP_abort,
  81. IOP_abs,
  82. IOP_acos,
  83. IOP_all,
  84. IOP_any,
  85. IOP_asdouble,
  86. IOP_asfloat,
  87. IOP_asfloat16,
  88. IOP_asin,
  89. IOP_asint,
  90. IOP_asint16,
  91. IOP_asuint,
  92. IOP_asuint16,
  93. IOP_atan,
  94. IOP_atan2,
  95. IOP_ceil,
  96. IOP_clamp,
  97. IOP_clip,
  98. IOP_cos,
  99. IOP_cosh,
  100. IOP_countbits,
  101. IOP_cross,
  102. IOP_ddx,
  103. IOP_ddx_coarse,
  104. IOP_ddx_fine,
  105. IOP_ddy,
  106. IOP_ddy_coarse,
  107. IOP_ddy_fine,
  108. IOP_degrees,
  109. IOP_determinant,
  110. IOP_distance,
  111. IOP_dot,
  112. IOP_dst,
  113. IOP_exp,
  114. IOP_exp2,
  115. IOP_f16tof32,
  116. IOP_f32tof16,
  117. IOP_faceforward,
  118. IOP_firstbithigh,
  119. IOP_firstbitlow,
  120. IOP_floor,
  121. IOP_fma,
  122. IOP_fmod,
  123. IOP_frac,
  124. IOP_frexp,
  125. IOP_fwidth,
  126. IOP_isfinite,
  127. IOP_isinf,
  128. IOP_isnan,
  129. IOP_ldexp,
  130. IOP_length,
  131. IOP_lerp,
  132. IOP_lit,
  133. IOP_log,
  134. IOP_log10,
  135. IOP_log2,
  136. IOP_mad,
  137. IOP_max,
  138. IOP_min,
  139. IOP_modf,
  140. IOP_msad4,
  141. IOP_mul,
  142. IOP_normalize,
  143. IOP_pow,
  144. IOP_radians,
  145. IOP_rcp,
  146. IOP_reflect,
  147. IOP_refract,
  148. IOP_reversebits,
  149. IOP_round,
  150. IOP_rsqrt,
  151. IOP_saturate,
  152. IOP_sign,
  153. IOP_sin,
  154. IOP_sincos,
  155. IOP_sinh,
  156. IOP_smoothstep,
  157. IOP_source_mark,
  158. IOP_sqrt,
  159. IOP_step,
  160. IOP_tan,
  161. IOP_tanh,
  162. IOP_tex1D,
  163. IOP_tex1Dbias,
  164. IOP_tex1Dgrad,
  165. IOP_tex1Dlod,
  166. IOP_tex1Dproj,
  167. IOP_tex2D,
  168. IOP_tex2Dbias,
  169. IOP_tex2Dgrad,
  170. IOP_tex2Dlod,
  171. IOP_tex2Dproj,
  172. IOP_tex3D,
  173. IOP_tex3Dbias,
  174. IOP_tex3Dgrad,
  175. IOP_tex3Dlod,
  176. IOP_tex3Dproj,
  177. IOP_texCUBE,
  178. IOP_texCUBEbias,
  179. IOP_texCUBEgrad,
  180. IOP_texCUBElod,
  181. IOP_texCUBEproj,
  182. IOP_transpose,
  183. IOP_trunc,
  184. MOP_Append,
  185. MOP_RestartStrip,
  186. MOP_CalculateLevelOfDetail,
  187. MOP_CalculateLevelOfDetailUnclamped,
  188. MOP_GetDimensions,
  189. MOP_Load,
  190. MOP_Sample,
  191. MOP_SampleBias,
  192. MOP_SampleCmp,
  193. MOP_SampleCmpLevelZero,
  194. MOP_SampleGrad,
  195. MOP_SampleLevel,
  196. MOP_Gather,
  197. MOP_GatherAlpha,
  198. MOP_GatherBlue,
  199. MOP_GatherCmp,
  200. MOP_GatherCmpAlpha,
  201. MOP_GatherCmpBlue,
  202. MOP_GatherCmpGreen,
  203. MOP_GatherCmpRed,
  204. MOP_GatherGreen,
  205. MOP_GatherRed,
  206. MOP_GetSamplePosition,
  207. MOP_Load2,
  208. MOP_Load3,
  209. MOP_Load4,
  210. MOP_InterlockedAdd,
  211. MOP_InterlockedAnd,
  212. MOP_InterlockedCompareExchange,
  213. MOP_InterlockedCompareStore,
  214. MOP_InterlockedExchange,
  215. MOP_InterlockedMax,
  216. MOP_InterlockedMin,
  217. MOP_InterlockedOr,
  218. MOP_InterlockedXor,
  219. MOP_Store,
  220. MOP_Store2,
  221. MOP_Store3,
  222. MOP_Store4,
  223. MOP_DecrementCounter,
  224. MOP_IncrementCounter,
  225. MOP_Consume,
  226. #ifdef ENABLE_SPIRV_CODEGEN
  227. MOP_SubpassLoad,
  228. #endif // ENABLE_SPIRV_CODEGEN
  229. // unsigned
  230. IOP_InterlockedUMax,
  231. IOP_InterlockedUMin,
  232. IOP_WaveActiveUMax,
  233. IOP_WaveActiveUMin,
  234. IOP_WaveActiveUProduct,
  235. IOP_WaveActiveUSum,
  236. IOP_WavePrefixUProduct,
  237. IOP_WavePrefixUSum,
  238. IOP_uclamp,
  239. IOP_ufirstbithigh,
  240. IOP_umad,
  241. IOP_umax,
  242. IOP_umin,
  243. IOP_umul,
  244. MOP_InterlockedUMax,
  245. MOP_InterlockedUMin,
  246. Num_Intrinsics,
  247. // HLSL-INTRINSICS:END
  248. };
  249. inline bool HasUnsignedIntrinsicOpcode(IntrinsicOp opcode) {
  250. switch (opcode) {
  251. /* <py>
  252. import hctdb_instrhelp
  253. </py> */
  254. /* <py::lines('HLSL-HAS-UNSIGNED-INTRINSICS')>hctdb_instrhelp.has_unsigned_hlsl_intrinsics()</py>*/
  255. // HLSL-HAS-UNSIGNED-INTRINSICS:BEGIN
  256. case IntrinsicOp::IOP_InterlockedMax:
  257. case IntrinsicOp::IOP_InterlockedMin:
  258. case IntrinsicOp::IOP_WaveActiveMax:
  259. case IntrinsicOp::IOP_WaveActiveMin:
  260. case IntrinsicOp::IOP_WaveActiveProduct:
  261. case IntrinsicOp::IOP_WaveActiveSum:
  262. case IntrinsicOp::IOP_WavePrefixProduct:
  263. case IntrinsicOp::IOP_WavePrefixSum:
  264. case IntrinsicOp::IOP_clamp:
  265. case IntrinsicOp::IOP_firstbithigh:
  266. case IntrinsicOp::IOP_mad:
  267. case IntrinsicOp::IOP_max:
  268. case IntrinsicOp::IOP_min:
  269. case IntrinsicOp::IOP_mul:
  270. case IntrinsicOp::MOP_InterlockedMax:
  271. case IntrinsicOp::MOP_InterlockedMin:
  272. // HLSL-HAS-UNSIGNED-INTRINSICS:END
  273. return true;
  274. default:
  275. return false;
  276. }
  277. }
  278. inline unsigned GetUnsignedIntrinsicOpcode(IntrinsicOp opcode) {
  279. switch (opcode) {
  280. /* <py>
  281. import hctdb_instrhelp
  282. </py> */
  283. /* <py::lines('HLSL-GET-UNSIGNED-INTRINSICS')>hctdb_instrhelp.get_unsigned_hlsl_intrinsics()</py>*/
  284. // HLSL-GET-UNSIGNED-INTRINSICS:BEGIN
  285. case IntrinsicOp::IOP_InterlockedMax:
  286. return static_cast<unsigned>(IntrinsicOp::IOP_InterlockedUMax);
  287. case IntrinsicOp::IOP_InterlockedMin:
  288. return static_cast<unsigned>(IntrinsicOp::IOP_InterlockedUMin);
  289. case IntrinsicOp::IOP_WaveActiveMax:
  290. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUMax);
  291. case IntrinsicOp::IOP_WaveActiveMin:
  292. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUMin);
  293. case IntrinsicOp::IOP_WaveActiveProduct:
  294. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUProduct);
  295. case IntrinsicOp::IOP_WaveActiveSum:
  296. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUSum);
  297. case IntrinsicOp::IOP_WavePrefixProduct:
  298. return static_cast<unsigned>(IntrinsicOp::IOP_WavePrefixUProduct);
  299. case IntrinsicOp::IOP_WavePrefixSum:
  300. return static_cast<unsigned>(IntrinsicOp::IOP_WavePrefixUSum);
  301. case IntrinsicOp::IOP_clamp:
  302. return static_cast<unsigned>(IntrinsicOp::IOP_uclamp);
  303. case IntrinsicOp::IOP_firstbithigh:
  304. return static_cast<unsigned>(IntrinsicOp::IOP_ufirstbithigh);
  305. case IntrinsicOp::IOP_mad:
  306. return static_cast<unsigned>(IntrinsicOp::IOP_umad);
  307. case IntrinsicOp::IOP_max:
  308. return static_cast<unsigned>(IntrinsicOp::IOP_umax);
  309. case IntrinsicOp::IOP_min:
  310. return static_cast<unsigned>(IntrinsicOp::IOP_umin);
  311. case IntrinsicOp::IOP_mul:
  312. return static_cast<unsigned>(IntrinsicOp::IOP_umul);
  313. case IntrinsicOp::MOP_InterlockedMax:
  314. return static_cast<unsigned>(IntrinsicOp::MOP_InterlockedUMax);
  315. case IntrinsicOp::MOP_InterlockedMin:
  316. return static_cast<unsigned>(IntrinsicOp::MOP_InterlockedUMin);
  317. // HLSL-GET-UNSIGNED-INTRINSICS:END
  318. default:
  319. return static_cast<unsigned>(opcode);
  320. }
  321. }
  322. }