spv.int64.frag 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. #version 450
  2. #extension GL_ARB_gpu_shader_int64: enable
  3. #extension GL_KHX_shader_explicit_arithmetic_types_int64: require
  4. layout(binding = 0) uniform Uniforms
  5. {
  6. uint index;
  7. };
  8. layout(std140, binding = 1) uniform Block
  9. {
  10. i64vec3 i64v;
  11. uint64_t u64;
  12. } block;
  13. void main()
  14. {
  15. }
  16. void literal()
  17. {
  18. const int64_t i64Const[3] =
  19. {
  20. -0x1111111111111111l, // Hex
  21. -1l, // Dec
  22. 040000000000l, // Oct
  23. };
  24. int64_t i64 = i64Const[index];
  25. const uint64_t u64Const[] =
  26. {
  27. 0xFFFFFFFFFFFFFFFFul, // Hex
  28. 4294967296UL, // Dec
  29. 077777777777ul, // Oct
  30. };
  31. uint64_t u64 = u64Const[index];
  32. }
  33. void typeCast()
  34. {
  35. bvec2 bv;
  36. ivec2 iv;
  37. uvec2 uv;
  38. vec2 fv;
  39. dvec2 dv;
  40. i64vec2 i64v;
  41. u64vec2 u64v;
  42. i64v = i64vec2(bv); // bool -> int64
  43. u64v = u64vec2(bv); // bool -> uint64
  44. i64v = iv; // int -> int64
  45. iv = ivec2(i64v); // int64 -> int
  46. u64v = uv; // uint -> uint64
  47. uv = uvec2(u64v); // uint64 -> uint
  48. fv = vec2(i64v); // int64 -> float
  49. dv = i64v; // int64 -> double
  50. fv = vec2(u64v); // uint64 -> float
  51. dv = u64v; // uint64 -> double
  52. i64v = i64vec2(fv); // float -> int64
  53. i64v = i64vec2(dv); // double -> int64
  54. u64v = u64vec2(fv); // float -> uint64
  55. u64v = u64vec2(dv); // double -> uint64
  56. bv = bvec2(i64v); // int64 -> bool
  57. bv = bvec2(u64v); // uint64 -> bool
  58. u64v = i64v; // int64 -> uint64
  59. i64v = i64vec2(u64v); // uint64 -> int64
  60. uv = uvec2(i64v); // int64 -> uint
  61. i64v = i64vec2(uv); // uint -> int64
  62. iv = ivec2(u64v); // uint64 -> int
  63. u64v = iv; // int -> uint64
  64. }
  65. void operators()
  66. {
  67. u64vec3 u64v;
  68. int64_t i64;
  69. uvec3 uv;
  70. int i;
  71. bool b;
  72. // Unary
  73. u64v++;
  74. i64--;
  75. ++i64;
  76. --u64v;
  77. u64v = ~u64v;
  78. i64 = +i64;
  79. u64v = -u64v;
  80. // Arithmetic
  81. i64 += i64;
  82. u64v -= u64v;
  83. i64 *= i;
  84. u64v /= uv;
  85. u64v %= i;
  86. u64v = u64v + uv;
  87. i64 = i64 - i;
  88. u64v = u64v * uv;
  89. i64 = i64 * i;
  90. i64 = i64 % i;
  91. // Shift
  92. u64v = u64v << i;
  93. i64 = i64 >> uv.y;
  94. u64v <<= i;
  95. i64 >>= uv.y;
  96. i64 = i64 << u64v.z;
  97. u64v = u64v << i64;
  98. // Relational
  99. b = (u64v.x != i64);
  100. b = (i64 == u64v.x);
  101. b = (u64v.x > uv.y);
  102. b = (i64 < i);
  103. b = (u64v.y >= uv.x);
  104. b = (i64 <= i);
  105. // Bitwise
  106. u64v |= i;
  107. i64 = i64 | i;
  108. i64 &= i;
  109. u64v = u64v & uv;
  110. u64v ^= i64;
  111. u64v = u64v ^ i64;
  112. }
  113. void builtinFuncs()
  114. {
  115. i64vec2 i64v;
  116. u64vec3 u64v;
  117. dvec3 dv;
  118. bvec3 bv;
  119. int64_t i64;
  120. uint64_t u64;
  121. // abs()
  122. i64v = abs(i64v);
  123. // sign()
  124. i64 = sign(i64);
  125. // min()
  126. i64v = min(i64v, i64);
  127. i64v = min(i64v, i64vec2(-1));
  128. u64v = min(u64v, u64);
  129. u64v = min(u64v, u64vec3(0));
  130. // max()
  131. i64v = max(i64v, i64);
  132. i64v = max(i64v, i64vec2(-1));
  133. u64v = max(u64v, u64);
  134. u64v = max(u64v, u64vec3(0));
  135. // clamp()
  136. i64v = clamp(i64v, -i64, i64);
  137. i64v = clamp(i64v, -i64v, i64v);
  138. u64v = clamp(u64v, -u64, u64);
  139. u64v = clamp(u64v, -u64v, u64v);
  140. // mix()
  141. i64 = mix(i64v.x, i64v.y, true);
  142. i64v = mix(i64vec2(i64), i64vec2(-i64), bvec2(false));
  143. u64 = mix(u64v.x, u64v.y, true);
  144. u64v = mix(u64vec3(u64), u64vec3(-u64), bvec3(false));
  145. // doubleBitsToInt64()
  146. i64v = doubleBitsToInt64(dv.xy);
  147. // doubleBitsToUint64()
  148. u64v.x = doubleBitsToUint64(dv.z);
  149. // int64BitsToDouble()
  150. dv.xy = int64BitsToDouble(i64v);
  151. // uint64BitsToDouble()
  152. dv = uint64BitsToDouble(u64v);
  153. // packInt2x32()
  154. i64 = packInt2x32(ivec2(1, 2));
  155. // unpackInt2x32()
  156. ivec2 iv = unpackInt2x32(i64);
  157. // packUint2x32()
  158. u64 = packUint2x32(uvec2(2, 3));
  159. // unpackUint2x32()
  160. uvec2 uv = unpackUint2x32(u64);
  161. // lessThan()
  162. bv = lessThan(u64v, u64vec3(u64));
  163. bv.xy = lessThan(i64v, i64vec2(i64));
  164. // lessThanEqual()
  165. bv = lessThanEqual(u64v, u64vec3(u64));
  166. bv.xy = lessThanEqual(i64v, i64vec2(i64));
  167. // greaterThan()
  168. bv = greaterThan(u64v, u64vec3(u64));
  169. bv.xy = greaterThan(i64v, i64vec2(i64));
  170. // greaterThanEqual()
  171. bv = greaterThanEqual(u64v, u64vec3(u64));
  172. bv.xy = greaterThanEqual(i64v, i64vec2(i64));
  173. // equal()
  174. bv = equal(u64v, u64vec3(u64));
  175. bv.xy = equal(i64v, i64vec2(i64));
  176. // notEqual()
  177. bv = notEqual(u64v, u64vec3(u64));
  178. bv.xy = notEqual(i64v, i64vec2(i64));
  179. }
  180. // Type conversion for specialization constant
  181. layout(constant_id = 100) const int64_t si64 = -10L;
  182. layout(constant_id = 101) const uint64_t su64 = 20UL;
  183. layout(constant_id = 102) const int si = -5;
  184. layout(constant_id = 103) const uint su = 4;
  185. layout(constant_id = 104) const bool sb = true;
  186. // bool <-> int64/uint64
  187. const bool i64_to_b = bool(si64);
  188. const bool u64_to_b = bool(su64);
  189. const int64_t b_to_i64 = int64_t(sb);
  190. const uint64_t b_to_u64 = uint64_t(sb);
  191. // int <-> int64
  192. const int i64_to_i = int(si64);
  193. const int64_t i_to_i64 = int64_t(si);
  194. // uint <-> uint64
  195. const uint u64_to_u = uint(su64);
  196. const uint64_t u_to_u64 = uint64_t(su);
  197. // int64 <-> uint64
  198. const int64_t u64_to_i64 = int64_t(su64);
  199. const uint64_t i64_to_u64 = uint64_t(si64);
  200. // int <-> uint64
  201. const int u64_to_i = int(su64);
  202. const uint64_t i_to_u64 = uint64_t(si);
  203. // uint <-> int64
  204. const uint i64_to_u = uint(si64);
  205. const int64_t u_to_i64 = int64_t(su);
  206. #define UINT64_MAX 18446744073709551615ul
  207. uint64_t u64Max = UINT64_MAX;