cube_sample.hlsl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
  2. SamplerState samp : register(s0);
  3. SamplerComparisonState sampcmp : register(s1);
  4. TextureCube<float4> cube : register(t0);
  5. TextureCubeArray<float4> cubeArray : register(t1);
  6. #define LOD 11
  7. #define CMP 0.5
  8. float4 main(float4 a : A) : SV_Target
  9. {
  10. uint status;
  11. float4 r = 0;
  12. const float bias = 0.25;
  13. float4 dx = ddx_fine(a);
  14. float4 dy = ddy_fine(a);
  15. ///////////////////////////////////////////////
  16. // Sample
  17. ///////////////////////////////////////////////
  18. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  19. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  20. // CHECK: , i32 undef, i32 undef, i32 undef
  21. // CHECK: , float undef)
  22. r += cube.Sample(samp, a.xyz);
  23. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  24. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  25. // CHECK: , i32 undef, i32 undef, i32 undef
  26. // CHECK: , float 1.100000e+01)
  27. r += cube.Sample(samp, a.xyz, LOD);
  28. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  29. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  30. // CHECK: , i32 undef, i32 undef, i32 undef
  31. // CHECK: , float 1.200000e+01)
  32. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  33. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  34. r += cube.Sample(samp, a.xyz, LOD+1, status); r += CheckAccessFullyMapped(status);
  35. // TextureCubeArray
  36. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  37. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  38. // CHECK: , i32 undef, i32 undef, i32 undef
  39. // CHECK: , float undef)
  40. r += cubeArray.Sample(samp, a.xyzw);
  41. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  42. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  43. // CHECK: , i32 undef, i32 undef, i32 undef
  44. // CHECK: , float 1.100000e+01)
  45. r += cubeArray.Sample(samp, a.xyzw, LOD);
  46. // CHECK: call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
  47. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  48. // CHECK: , i32 undef, i32 undef, i32 undef
  49. // CHECK: , float 1.200000e+01)
  50. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  51. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  52. r += cubeArray.Sample(samp, a.xyzw, LOD+1, status); r += CheckAccessFullyMapped(status);
  53. ///////////////////////////////////////////////
  54. // SampleLevel
  55. ///////////////////////////////////////////////
  56. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
  57. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  58. // CHECK: , i32 undef, i32 undef, i32 undef
  59. // CHECK: , float 1.100000e+01)
  60. r += cube.SampleLevel(samp, a.xyz, LOD);
  61. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
  62. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  63. // CHECK: , i32 undef, i32 undef, i32 undef
  64. // CHECK: , float 1.200000e+01)
  65. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  66. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  67. r += cube.SampleLevel(samp, a.xyz, LOD+1, status); r += CheckAccessFullyMapped(status);
  68. // TextureCubeArray
  69. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
  70. // CHECK: , float 1.100000e+01)
  71. r += cubeArray.SampleLevel(samp, a.xyzw, LOD);
  72. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
  73. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  74. // CHECK: , i32 undef, i32 undef, i32 undef
  75. // CHECK: , float 1.200000e+01)
  76. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  77. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  78. r += cubeArray.SampleLevel(samp, a.xyzw, LOD+1, status); r += CheckAccessFullyMapped(status);
  79. ///////////////////////////////////////////////
  80. // SampleBias
  81. ///////////////////////////////////////////////
  82. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  83. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  84. // CHECK: , i32 undef, i32 undef, i32 undef
  85. // CHECK: , float 2.500000e-01, float undef)
  86. r += cube.SampleBias(samp, a.xyz, bias);
  87. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  88. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  89. // CHECK: , i32 undef, i32 undef, i32 undef
  90. // CHECK: , float 2.500000e-01, float 1.100000e+01)
  91. r += cube.SampleBias(samp, a.xyz, bias, LOD);
  92. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  93. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  94. // CHECK: , i32 undef, i32 undef, i32 undef
  95. // CHECK: , float 2.500000e-01, float 1.200000e+01)
  96. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  97. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  98. r += cube.SampleBias(samp, a.xyz, bias, LOD+1, status); r += CheckAccessFullyMapped(status);
  99. // TextureCubeArray
  100. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  101. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  102. // CHECK: , i32 undef, i32 undef, i32 undef
  103. // CHECK: , float 2.500000e-01, float undef)
  104. r += cubeArray.SampleBias(samp, a.xyzw, bias);
  105. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  106. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  107. // CHECK: , i32 undef, i32 undef, i32 undef
  108. // CHECK: , float 2.500000e-01, float 1.100000e+01)
  109. r += cubeArray.SampleBias(samp, a.xyzw, bias, LOD);
  110. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
  111. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  112. // CHECK: , i32 undef, i32 undef, i32 undef
  113. // CHECK: , float 2.500000e-01, float 1.200000e+01)
  114. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  115. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  116. r += cubeArray.SampleBias(samp, a.xyzw, bias, LOD+1, status); r += CheckAccessFullyMapped(status);
  117. ///////////////////////////////////////////////
  118. // SampleGrad
  119. ///////////////////////////////////////////////
  120. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  121. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  122. // CHECK: , i32 undef, i32 undef, i32 undef
  123. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  124. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  125. // CHECK: , float undef)
  126. r += cube.SampleGrad(samp, a.xyz, dx.xyz, dy.xyz);
  127. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  128. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  129. // CHECK: , i32 undef, i32 undef, i32 undef
  130. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  131. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  132. // CHECK: , float 1.100000e+01)
  133. r += cube.SampleGrad(samp, a.xyz, dx.xyz, dy.xyz, LOD);
  134. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  135. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  136. // CHECK: , i32 undef, i32 undef, i32 undef
  137. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  138. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  139. // CHECK: , float 1.200000e+01)
  140. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  141. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  142. r += cube.SampleGrad(samp, a.xyz, dx.xyz, dy.xyz, LOD+1, status); r += CheckAccessFullyMapped(status);
  143. // TextureCubeArray
  144. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  145. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  146. // CHECK: , i32 undef, i32 undef, i32 undef
  147. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  148. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  149. // CHECK: , float undef)
  150. r += cubeArray.SampleGrad(samp, a.xyzw, dx.xyz, dy.xyz);
  151. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  152. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  153. // CHECK: , i32 undef, i32 undef, i32 undef
  154. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  155. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  156. // CHECK: , float 1.100000e+01)
  157. r += cubeArray.SampleGrad(samp, a.xyzw, dx.xyz, dy.xyz, LOD);
  158. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
  159. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  160. // CHECK: , i32 undef, i32 undef, i32 undef
  161. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  162. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  163. // CHECK: , float 1.200000e+01)
  164. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  165. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  166. r += cubeArray.SampleGrad(samp, a.xyzw, dx.xyz, dy.xyz, LOD+1, status); r += CheckAccessFullyMapped(status);
  167. ///////////////////////////////////////////////
  168. // SampleCmp
  169. ///////////////////////////////////////////////
  170. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  171. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  172. // CHECK: , i32 undef, i32 undef, i32 undef
  173. // CHECK: , float 5.000000e-01, float undef)
  174. r += cube.SampleCmp(sampcmp, a.xyz, CMP);
  175. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  176. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  177. // CHECK: , i32 undef, i32 undef, i32 undef
  178. // CHECK: , float 5.000000e-01, float 1.100000e+01)
  179. r += cube.SampleCmp(sampcmp, a.xyz, CMP, LOD);
  180. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  181. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  182. // CHECK: , i32 undef, i32 undef, i32 undef
  183. // CHECK: , float 5.000000e-01, float 1.200000e+01)
  184. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  185. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  186. r += cube.SampleCmp(sampcmp, a.xyz, CMP, LOD+1, status); r += CheckAccessFullyMapped(status);
  187. // TextureCubeArray
  188. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  189. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  190. // CHECK: , i32 undef, i32 undef, i32 undef
  191. // CHECK: , float 5.000000e-01, float undef)
  192. r += cubeArray.SampleCmp(sampcmp, a.xyzw, CMP);
  193. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  194. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  195. // CHECK: , i32 undef, i32 undef, i32 undef
  196. // CHECK: , float 5.000000e-01, float 1.100000e+01)
  197. r += cubeArray.SampleCmp(sampcmp, a.xyzw, CMP, LOD);
  198. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
  199. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  200. // CHECK: , i32 undef, i32 undef, i32 undef
  201. // CHECK: , float 5.000000e-01, float 1.200000e+01)
  202. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  203. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  204. r += cubeArray.SampleCmp(sampcmp, a.xyzw, CMP, LOD+1, status); r += CheckAccessFullyMapped(status);
  205. ///////////////////////////////////////////////
  206. // SampleCmpLevelZero
  207. ///////////////////////////////////////////////
  208. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
  209. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  210. // CHECK: , i32 undef, i32 undef, i32 undef
  211. // CHECK: , float 5.000000e-01)
  212. r += cube.SampleCmpLevelZero(sampcmp, a.xyz, CMP);
  213. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
  214. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float undef
  215. // CHECK: , i32 undef, i32 undef, i32 undef
  216. // CHECK: , float 1.500000e+00)
  217. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  218. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  219. r += cube.SampleCmpLevelZero(sampcmp, a.xyz, CMP+1, status); r += CheckAccessFullyMapped(status);
  220. // TextureCubeArray
  221. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
  222. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  223. // CHECK: , i32 undef, i32 undef, i32 undef
  224. // CHECK: , float 5.000000e-01)
  225. r += cubeArray.SampleCmpLevelZero(sampcmp, a.xyzw, CMP);
  226. // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
  227. // CHECK: , float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}, float %{{[^,]+}}
  228. // CHECK: , i32 undef, i32 undef, i32 undef
  229. // CHECK: , float 1.500000e+00)
  230. // CHECK: extractvalue %dx.types.ResRet.f32 %{{[^,]+}}, 4
  231. // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
  232. r += cubeArray.SampleCmpLevelZero(sampcmp, a.xyzw, CMP+1, status); r += CheckAccessFullyMapped(status);
  233. return r;
  234. }