HlslIntrinsicOp.h 12 KB

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