HlslIntrinsicOp.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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_AcceptHitAndEndSearch,
  22. IOP_AddUint64,
  23. IOP_AllMemoryBarrier,
  24. IOP_AllMemoryBarrierWithGroupSync,
  25. IOP_AllocateRayQuery,
  26. IOP_CallShader,
  27. IOP_CheckAccessFullyMapped,
  28. IOP_CreateResourceFromHeap,
  29. IOP_D3DCOLORtoUBYTE4,
  30. IOP_DeviceMemoryBarrier,
  31. IOP_DeviceMemoryBarrierWithGroupSync,
  32. IOP_DispatchMesh,
  33. IOP_DispatchRaysDimensions,
  34. IOP_DispatchRaysIndex,
  35. IOP_EvaluateAttributeAtSample,
  36. IOP_EvaluateAttributeCentroid,
  37. IOP_EvaluateAttributeSnapped,
  38. IOP_GeometryIndex,
  39. IOP_GetAttributeAtVertex,
  40. IOP_GetRenderTargetSampleCount,
  41. IOP_GetRenderTargetSamplePosition,
  42. IOP_GroupMemoryBarrier,
  43. IOP_GroupMemoryBarrierWithGroupSync,
  44. IOP_HitKind,
  45. IOP_IgnoreHit,
  46. IOP_InstanceID,
  47. IOP_InstanceIndex,
  48. IOP_InterlockedAdd,
  49. IOP_InterlockedAnd,
  50. IOP_InterlockedCompareExchange,
  51. IOP_InterlockedCompareStore,
  52. IOP_InterlockedExchange,
  53. IOP_InterlockedMax,
  54. IOP_InterlockedMin,
  55. IOP_InterlockedOr,
  56. IOP_InterlockedXor,
  57. IOP_NonUniformResourceIndex,
  58. IOP_ObjectRayDirection,
  59. IOP_ObjectRayOrigin,
  60. IOP_ObjectToWorld,
  61. IOP_ObjectToWorld3x4,
  62. IOP_ObjectToWorld4x3,
  63. IOP_PrimitiveIndex,
  64. IOP_Process2DQuadTessFactorsAvg,
  65. IOP_Process2DQuadTessFactorsMax,
  66. IOP_Process2DQuadTessFactorsMin,
  67. IOP_ProcessIsolineTessFactors,
  68. IOP_ProcessQuadTessFactorsAvg,
  69. IOP_ProcessQuadTessFactorsMax,
  70. IOP_ProcessQuadTessFactorsMin,
  71. IOP_ProcessTriTessFactorsAvg,
  72. IOP_ProcessTriTessFactorsMax,
  73. IOP_ProcessTriTessFactorsMin,
  74. IOP_QuadReadAcrossDiagonal,
  75. IOP_QuadReadAcrossX,
  76. IOP_QuadReadAcrossY,
  77. IOP_QuadReadLaneAt,
  78. IOP_RayFlags,
  79. IOP_RayTCurrent,
  80. IOP_RayTMin,
  81. IOP_ReportHit,
  82. IOP_SetMeshOutputCounts,
  83. IOP_TraceRay,
  84. IOP_WaveActiveAllEqual,
  85. IOP_WaveActiveAllTrue,
  86. IOP_WaveActiveAnyTrue,
  87. IOP_WaveActiveBallot,
  88. IOP_WaveActiveBitAnd,
  89. IOP_WaveActiveBitOr,
  90. IOP_WaveActiveBitXor,
  91. IOP_WaveActiveCountBits,
  92. IOP_WaveActiveMax,
  93. IOP_WaveActiveMin,
  94. IOP_WaveActiveProduct,
  95. IOP_WaveActiveSum,
  96. IOP_WaveGetLaneCount,
  97. IOP_WaveGetLaneIndex,
  98. IOP_WaveIsFirstLane,
  99. IOP_WaveMatch,
  100. IOP_WaveMultiPrefixBitAnd,
  101. IOP_WaveMultiPrefixBitOr,
  102. IOP_WaveMultiPrefixBitXor,
  103. IOP_WaveMultiPrefixCountBits,
  104. IOP_WaveMultiPrefixProduct,
  105. IOP_WaveMultiPrefixSum,
  106. IOP_WavePrefixCountBits,
  107. IOP_WavePrefixProduct,
  108. IOP_WavePrefixSum,
  109. IOP_WaveReadLaneAt,
  110. IOP_WaveReadLaneFirst,
  111. IOP_WorldRayDirection,
  112. IOP_WorldRayOrigin,
  113. IOP_WorldToObject,
  114. IOP_WorldToObject3x4,
  115. IOP_WorldToObject4x3,
  116. IOP_abort,
  117. IOP_abs,
  118. IOP_acos,
  119. IOP_all,
  120. IOP_any,
  121. IOP_asdouble,
  122. IOP_asfloat,
  123. IOP_asfloat16,
  124. IOP_asin,
  125. IOP_asint,
  126. IOP_asint16,
  127. IOP_asuint,
  128. IOP_asuint16,
  129. IOP_atan,
  130. IOP_atan2,
  131. IOP_ceil,
  132. IOP_clamp,
  133. IOP_clip,
  134. IOP_cos,
  135. IOP_cosh,
  136. IOP_countbits,
  137. IOP_cross,
  138. IOP_ddx,
  139. IOP_ddx_coarse,
  140. IOP_ddx_fine,
  141. IOP_ddy,
  142. IOP_ddy_coarse,
  143. IOP_ddy_fine,
  144. IOP_degrees,
  145. IOP_determinant,
  146. IOP_distance,
  147. IOP_dot,
  148. IOP_dot2add,
  149. IOP_dot4add_i8packed,
  150. IOP_dot4add_u8packed,
  151. IOP_dst,
  152. IOP_exp,
  153. IOP_exp2,
  154. IOP_f16tof32,
  155. IOP_f32tof16,
  156. IOP_faceforward,
  157. IOP_firstbithigh,
  158. IOP_firstbitlow,
  159. IOP_floor,
  160. IOP_fma,
  161. IOP_fmod,
  162. IOP_frac,
  163. IOP_frexp,
  164. IOP_fwidth,
  165. IOP_isfinite,
  166. IOP_isinf,
  167. IOP_isnan,
  168. IOP_ldexp,
  169. IOP_length,
  170. IOP_lerp,
  171. IOP_lit,
  172. IOP_log,
  173. IOP_log10,
  174. IOP_log2,
  175. IOP_mad,
  176. IOP_max,
  177. IOP_min,
  178. IOP_modf,
  179. IOP_msad4,
  180. IOP_mul,
  181. IOP_normalize,
  182. IOP_pow,
  183. IOP_printf,
  184. IOP_radians,
  185. IOP_rcp,
  186. IOP_reflect,
  187. IOP_refract,
  188. IOP_reversebits,
  189. IOP_round,
  190. IOP_rsqrt,
  191. IOP_saturate,
  192. IOP_sign,
  193. IOP_sin,
  194. IOP_sincos,
  195. IOP_sinh,
  196. IOP_smoothstep,
  197. IOP_source_mark,
  198. IOP_sqrt,
  199. IOP_step,
  200. IOP_tan,
  201. IOP_tanh,
  202. IOP_tex1D,
  203. IOP_tex1Dbias,
  204. IOP_tex1Dgrad,
  205. IOP_tex1Dlod,
  206. IOP_tex1Dproj,
  207. IOP_tex2D,
  208. IOP_tex2Dbias,
  209. IOP_tex2Dgrad,
  210. IOP_tex2Dlod,
  211. IOP_tex2Dproj,
  212. IOP_tex3D,
  213. IOP_tex3Dbias,
  214. IOP_tex3Dgrad,
  215. IOP_tex3Dlod,
  216. IOP_tex3Dproj,
  217. IOP_texCUBE,
  218. IOP_texCUBEbias,
  219. IOP_texCUBEgrad,
  220. IOP_texCUBElod,
  221. IOP_texCUBEproj,
  222. IOP_transpose,
  223. IOP_trunc,
  224. MOP_Append,
  225. MOP_RestartStrip,
  226. MOP_CalculateLevelOfDetail,
  227. MOP_CalculateLevelOfDetailUnclamped,
  228. MOP_GetDimensions,
  229. MOP_Load,
  230. MOP_Sample,
  231. MOP_SampleBias,
  232. MOP_SampleCmp,
  233. MOP_SampleCmpLevelZero,
  234. MOP_SampleGrad,
  235. MOP_SampleLevel,
  236. MOP_Gather,
  237. MOP_GatherAlpha,
  238. MOP_GatherBlue,
  239. MOP_GatherCmp,
  240. MOP_GatherCmpAlpha,
  241. MOP_GatherCmpBlue,
  242. MOP_GatherCmpGreen,
  243. MOP_GatherCmpRed,
  244. MOP_GatherGreen,
  245. MOP_GatherRed,
  246. MOP_GetSamplePosition,
  247. MOP_Load2,
  248. MOP_Load3,
  249. MOP_Load4,
  250. MOP_InterlockedAdd,
  251. MOP_InterlockedAnd,
  252. MOP_InterlockedCompareExchange,
  253. MOP_InterlockedCompareStore,
  254. MOP_InterlockedExchange,
  255. MOP_InterlockedMax,
  256. MOP_InterlockedMin,
  257. MOP_InterlockedOr,
  258. MOP_InterlockedXor,
  259. MOP_Store,
  260. MOP_Store2,
  261. MOP_Store3,
  262. MOP_Store4,
  263. MOP_DecrementCounter,
  264. MOP_IncrementCounter,
  265. MOP_Consume,
  266. MOP_WriteSamplerFeedback,
  267. MOP_WriteSamplerFeedbackBias,
  268. MOP_WriteSamplerFeedbackGrad,
  269. MOP_WriteSamplerFeedbackLevel,
  270. MOP_Abort,
  271. MOP_CandidateGeometryIndex,
  272. MOP_CandidateInstanceContributionToHitGroupIndex,
  273. MOP_CandidateInstanceID,
  274. MOP_CandidateInstanceIndex,
  275. MOP_CandidateObjectRayDirection,
  276. MOP_CandidateObjectRayOrigin,
  277. MOP_CandidateObjectToWorld3x4,
  278. MOP_CandidateObjectToWorld4x3,
  279. MOP_CandidatePrimitiveIndex,
  280. MOP_CandidateProceduralPrimitiveNonOpaque,
  281. MOP_CandidateTriangleBarycentrics,
  282. MOP_CandidateTriangleFrontFace,
  283. MOP_CandidateTriangleRayT,
  284. MOP_CandidateType,
  285. MOP_CandidateWorldToObject3x4,
  286. MOP_CandidateWorldToObject4x3,
  287. MOP_CommitNonOpaqueTriangleHit,
  288. MOP_CommitProceduralPrimitiveHit,
  289. MOP_CommittedGeometryIndex,
  290. MOP_CommittedInstanceContributionToHitGroupIndex,
  291. MOP_CommittedInstanceID,
  292. MOP_CommittedInstanceIndex,
  293. MOP_CommittedObjectRayDirection,
  294. MOP_CommittedObjectRayOrigin,
  295. MOP_CommittedObjectToWorld3x4,
  296. MOP_CommittedObjectToWorld4x3,
  297. MOP_CommittedPrimitiveIndex,
  298. MOP_CommittedRayT,
  299. MOP_CommittedStatus,
  300. MOP_CommittedTriangleBarycentrics,
  301. MOP_CommittedTriangleFrontFace,
  302. MOP_CommittedWorldToObject3x4,
  303. MOP_CommittedWorldToObject4x3,
  304. MOP_Proceed,
  305. MOP_RayFlags,
  306. MOP_RayTMin,
  307. MOP_TraceRayInline,
  308. MOP_WorldRayDirection,
  309. MOP_WorldRayOrigin,
  310. #ifdef ENABLE_SPIRV_CODEGEN
  311. MOP_SubpassLoad,
  312. #endif // ENABLE_SPIRV_CODEGEN
  313. // unsigned
  314. IOP_InterlockedUMax,
  315. IOP_InterlockedUMin,
  316. IOP_WaveActiveUMax,
  317. IOP_WaveActiveUMin,
  318. IOP_WaveActiveUProduct,
  319. IOP_WaveActiveUSum,
  320. IOP_WaveMultiPrefixUProduct,
  321. IOP_WaveMultiPrefixUSum,
  322. IOP_WavePrefixUProduct,
  323. IOP_WavePrefixUSum,
  324. IOP_uabs,
  325. IOP_uclamp,
  326. IOP_ufirstbithigh,
  327. IOP_umad,
  328. IOP_umax,
  329. IOP_umin,
  330. IOP_umul,
  331. IOP_usign,
  332. MOP_InterlockedUMax,
  333. MOP_InterlockedUMin,
  334. Num_Intrinsics,
  335. // HLSL-INTRINSICS:END
  336. };
  337. inline bool HasUnsignedIntrinsicOpcode(IntrinsicOp opcode) {
  338. switch (opcode) {
  339. /* <py>
  340. import hctdb_instrhelp
  341. </py> */
  342. /* <py::lines('HLSL-HAS-UNSIGNED-INTRINSICS')>hctdb_instrhelp.has_unsigned_hlsl_intrinsics()</py>*/
  343. // HLSL-HAS-UNSIGNED-INTRINSICS:BEGIN
  344. case IntrinsicOp::IOP_InterlockedMax:
  345. case IntrinsicOp::IOP_InterlockedMin:
  346. case IntrinsicOp::IOP_WaveActiveMax:
  347. case IntrinsicOp::IOP_WaveActiveMin:
  348. case IntrinsicOp::IOP_WaveActiveProduct:
  349. case IntrinsicOp::IOP_WaveActiveSum:
  350. case IntrinsicOp::IOP_WaveMultiPrefixProduct:
  351. case IntrinsicOp::IOP_WaveMultiPrefixSum:
  352. case IntrinsicOp::IOP_WavePrefixProduct:
  353. case IntrinsicOp::IOP_WavePrefixSum:
  354. case IntrinsicOp::IOP_abs:
  355. case IntrinsicOp::IOP_clamp:
  356. case IntrinsicOp::IOP_firstbithigh:
  357. case IntrinsicOp::IOP_mad:
  358. case IntrinsicOp::IOP_max:
  359. case IntrinsicOp::IOP_min:
  360. case IntrinsicOp::IOP_mul:
  361. case IntrinsicOp::IOP_sign:
  362. case IntrinsicOp::MOP_InterlockedMax:
  363. case IntrinsicOp::MOP_InterlockedMin:
  364. // HLSL-HAS-UNSIGNED-INTRINSICS:END
  365. return true;
  366. default:
  367. return false;
  368. }
  369. }
  370. inline unsigned GetUnsignedIntrinsicOpcode(IntrinsicOp opcode) {
  371. switch (opcode) {
  372. /* <py>
  373. import hctdb_instrhelp
  374. </py> */
  375. /* <py::lines('HLSL-GET-UNSIGNED-INTRINSICS')>hctdb_instrhelp.get_unsigned_hlsl_intrinsics()</py>*/
  376. // HLSL-GET-UNSIGNED-INTRINSICS:BEGIN
  377. case IntrinsicOp::IOP_InterlockedMax:
  378. return static_cast<unsigned>(IntrinsicOp::IOP_InterlockedUMax);
  379. case IntrinsicOp::IOP_InterlockedMin:
  380. return static_cast<unsigned>(IntrinsicOp::IOP_InterlockedUMin);
  381. case IntrinsicOp::IOP_WaveActiveMax:
  382. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUMax);
  383. case IntrinsicOp::IOP_WaveActiveMin:
  384. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUMin);
  385. case IntrinsicOp::IOP_WaveActiveProduct:
  386. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUProduct);
  387. case IntrinsicOp::IOP_WaveActiveSum:
  388. return static_cast<unsigned>(IntrinsicOp::IOP_WaveActiveUSum);
  389. case IntrinsicOp::IOP_WaveMultiPrefixProduct:
  390. return static_cast<unsigned>(IntrinsicOp::IOP_WaveMultiPrefixUProduct);
  391. case IntrinsicOp::IOP_WaveMultiPrefixSum:
  392. return static_cast<unsigned>(IntrinsicOp::IOP_WaveMultiPrefixUSum);
  393. case IntrinsicOp::IOP_WavePrefixProduct:
  394. return static_cast<unsigned>(IntrinsicOp::IOP_WavePrefixUProduct);
  395. case IntrinsicOp::IOP_WavePrefixSum:
  396. return static_cast<unsigned>(IntrinsicOp::IOP_WavePrefixUSum);
  397. case IntrinsicOp::IOP_abs:
  398. return static_cast<unsigned>(IntrinsicOp::IOP_uabs);
  399. case IntrinsicOp::IOP_clamp:
  400. return static_cast<unsigned>(IntrinsicOp::IOP_uclamp);
  401. case IntrinsicOp::IOP_firstbithigh:
  402. return static_cast<unsigned>(IntrinsicOp::IOP_ufirstbithigh);
  403. case IntrinsicOp::IOP_mad:
  404. return static_cast<unsigned>(IntrinsicOp::IOP_umad);
  405. case IntrinsicOp::IOP_max:
  406. return static_cast<unsigned>(IntrinsicOp::IOP_umax);
  407. case IntrinsicOp::IOP_min:
  408. return static_cast<unsigned>(IntrinsicOp::IOP_umin);
  409. case IntrinsicOp::IOP_mul:
  410. return static_cast<unsigned>(IntrinsicOp::IOP_umul);
  411. case IntrinsicOp::IOP_sign:
  412. return static_cast<unsigned>(IntrinsicOp::IOP_usign);
  413. case IntrinsicOp::MOP_InterlockedMax:
  414. return static_cast<unsigned>(IntrinsicOp::MOP_InterlockedUMax);
  415. case IntrinsicOp::MOP_InterlockedMin:
  416. return static_cast<unsigned>(IntrinsicOp::MOP_InterlockedUMin);
  417. // HLSL-GET-UNSIGNED-INTRINSICS:END
  418. default:
  419. return static_cast<unsigned>(opcode);
  420. }
  421. }
  422. }