tryAllOps.hlsl 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // RUN: %dxc -T cs_6_5 -E CS %s | FileCheck %s
  2. // CHECK: define void @CS()
  3. // RayQuery alloca should have been dead-code eliminated
  4. // CHECK-NOT: alloca
  5. // CHECK: %[[hAccelerationStructure:[^ ]+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false)
  6. // CHECK: %[[hRayQuery:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 178, i32 5)
  7. // CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[hRayQuery]], %dx.types.Handle %[[hAccelerationStructure]], i32 0, i32 255, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 9.999000e+03)
  8. // CHECK: call i1 @dx.op.rayQuery_Proceed.i1(i32 180, i32 %[[hRayQuery]])
  9. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 185, i32 %[[hRayQuery]])
  10. // CHECK: call void @dx.op.rayQuery_Abort(i32 181, i32 %[[hRayQuery]])
  11. // CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 186, i32 %[[hRayQuery]], i32 0, i8 0)
  12. // CHECK: call void @dx.op.rayQuery_CommitNonOpaqueTriangleHit(i32 182, i32 %[[hRayQuery]])
  13. // CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 191, i32 %[[hRayQuery]])
  14. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 193, i32 %[[hRayQuery]], i8 0)
  15. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 203, i32 %[[hRayQuery]])
  16. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 202, i32 %[[hRayQuery]])
  17. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 201, i32 %[[hRayQuery]])
  18. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 206, i32 %[[hRayQuery]], i8 0)
  19. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 205, i32 %[[hRayQuery]], i8 1)
  20. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 204, i32 %[[hRayQuery]])
  21. // CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 199, i32 %[[hRayQuery]])
  22. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 214, i32 %[[hRayQuery]])
  23. // CHECK: call i1 @dx.op.rayQuery_Proceed.i1(i32 180, i32 %[[hRayQuery]])
  24. // CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 187, i32 %[[hRayQuery]], i32 0, i8 0)
  25. // CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 190, i32 %[[hRayQuery]])
  26. // CHECK: call void @dx.op.rayQuery_CommitProceduralPrimitiveHit(i32 183, i32 %[[hRayQuery]], float 5.000000e-01)
  27. // CHECK: call void @dx.op.rayQuery_Abort(i32 181, i32 %[[hRayQuery]])
  28. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 184, i32 %[[hRayQuery]])
  29. // CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 188, i32 %[[hRayQuery]], i32 0, i8 0)
  30. // CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 189, i32 %[[hRayQuery]], i32 0, i8 0)
  31. // CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 192, i32 %[[hRayQuery]])
  32. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 194, i32 %[[hRayQuery]], i8 1)
  33. // CHECL: call i32 @dx.op.rayQuery_StateScalar.i32(i32 215, i32 %[[hRayQuery]])
  34. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 209, i32 %[[hRayQuery]])
  35. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 208, i32 %[[hRayQuery]])
  36. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 207, i32 %[[hRayQuery]])
  37. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 212, i32 %[[hRayQuery]], i8 2)
  38. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 211, i32 %[[hRayQuery]], i8 0)
  39. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 210, i32 %[[hRayQuery]])
  40. // CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 200, i32 %[[hRayQuery]])
  41. // CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 195, i32 %[[hRayQuery]])
  42. // CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 198, i32 %[[hRayQuery]])
  43. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 197, i32 %[[hRayQuery]], i8 0)
  44. // CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 196, i32 %[[hRayQuery]], i8 2)
  45. RaytracingAccelerationStructure AccelerationStructure : register(t0);
  46. RWByteAddressBuffer log : register(u0);
  47. RayDesc MakeRayDesc()
  48. {
  49. RayDesc desc;
  50. desc.Origin = float3(0,0,0);
  51. desc.Direction = float3(1,0,0);
  52. desc.TMin = 0.0f;
  53. desc.TMax = 9999.0;
  54. return desc;
  55. }
  56. void DoSomething()
  57. {
  58. log.Store(0,1);
  59. }
  60. [numThreads(1,1,1)]
  61. void CS()
  62. {
  63. RayQuery<RAY_FLAG_FORCE_OPAQUE|RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH> q;
  64. RayDesc ray = MakeRayDesc();
  65. q.TraceRayInline(AccelerationStructure,RAY_FLAG_NONE,0xFF,ray);
  66. float4x3 mat4x3;
  67. float3x4 mat3x4;
  68. while(q.Proceed())
  69. {
  70. switch(q.CandidateType())
  71. {
  72. case CANDIDATE_NON_OPAQUE_TRIANGLE:
  73. q.Abort();
  74. mat3x4 = q.CandidateObjectToWorld3x4();
  75. mat4x3 = q.CandidateObjectToWorld4x3();
  76. q.CommitNonOpaqueTriangleHit();
  77. if(q.CandidateTriangleFrontFace())
  78. {
  79. DoSomething();
  80. }
  81. if(q.CandidateTriangleBarycentrics().x == 0)
  82. {
  83. DoSomething();
  84. }
  85. if(q.CandidateGeometryIndex())
  86. {
  87. DoSomething();
  88. }
  89. if(q.CandidateInstanceID())
  90. {
  91. DoSomething();
  92. }
  93. if(q.CandidateInstanceIndex())
  94. {
  95. DoSomething();
  96. }
  97. if(q.CandidateObjectRayDirection().x)
  98. {
  99. DoSomething();
  100. }
  101. if(q.CandidateObjectRayOrigin().y)
  102. {
  103. DoSomething();
  104. }
  105. if(q.CandidatePrimitiveIndex())
  106. {
  107. DoSomething();
  108. }
  109. if(q.CandidateTriangleRayT())
  110. {
  111. DoSomething();
  112. }
  113. if(q.CandidateInstanceContributionToHitGroupIndex())
  114. {
  115. DoSomething();
  116. }
  117. break;
  118. case CANDIDATE_PROCEDURAL_PRIMITIVE:
  119. {
  120. mat3x4 = q.CandidateWorldToObject3x4();
  121. mat4x3 = q.CandidateWorldToObject4x3();
  122. if(q.CandidateProceduralPrimitiveNonOpaque())
  123. {
  124. DoSomething();
  125. }
  126. float t = 0.5;
  127. q.CommitProceduralPrimitiveHit(t);
  128. q.Abort();
  129. break;
  130. }
  131. }
  132. }
  133. if(mat3x4[0][0] == mat4x3[0][0])
  134. {
  135. DoSomething();
  136. }
  137. switch(q.CommittedStatus())
  138. {
  139. case COMMITTED_NOTHING:
  140. mat3x4 = q.CommittedObjectToWorld3x4();
  141. mat4x3 = q.CommittedObjectToWorld4x3();
  142. break;
  143. case COMMITTED_TRIANGLE_HIT:
  144. mat3x4 = q.CommittedWorldToObject3x4();
  145. mat4x3 = q.CommittedWorldToObject4x3();
  146. if(q.CommittedTriangleFrontFace())
  147. {
  148. DoSomething();
  149. }
  150. if(q.CommittedTriangleBarycentrics().y == 0)
  151. {
  152. DoSomething();
  153. }
  154. if(q.CommittedInstanceContributionToHitGroupIndex())
  155. {
  156. DoSomething();
  157. }
  158. break;
  159. case COMMITTED_PROCEDURAL_PRIMITIVE_HIT:
  160. if(q.CommittedGeometryIndex())
  161. {
  162. DoSomething();
  163. }
  164. if(q.CommittedInstanceID())
  165. {
  166. DoSomething();
  167. }
  168. if(q.CommittedInstanceIndex())
  169. {
  170. DoSomething();
  171. }
  172. if(q.CommittedObjectRayDirection().z)
  173. {
  174. DoSomething();
  175. }
  176. if(q.CommittedObjectRayOrigin().x)
  177. {
  178. DoSomething();
  179. }
  180. if(q.CommittedPrimitiveIndex())
  181. {
  182. DoSomething();
  183. }
  184. if(q.CommittedRayT())
  185. {
  186. DoSomething();
  187. }
  188. break;
  189. }
  190. if(mat3x4[0][0] == mat4x3[0][0])
  191. {
  192. DoSomething();
  193. }
  194. if(q.RayFlags())
  195. {
  196. DoSomething();
  197. }
  198. if(q.RayTMin())
  199. {
  200. DoSomething();
  201. }
  202. float3 o = q.WorldRayDirection();
  203. float3 d = q.WorldRayOrigin();
  204. if(o.x == d.z)
  205. {
  206. DoSomething();
  207. }
  208. }