spv.float64.frag 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #version 450
  2. #extension GL_KHX_shader_explicit_arithmetic_types: enable
  3. #extension GL_KHX_shader_explicit_arithmetic_types_int8: require
  4. #extension GL_KHX_shader_explicit_arithmetic_types_int16: require
  5. #extension GL_KHX_shader_explicit_arithmetic_types_int32: require
  6. #extension GL_KHX_shader_explicit_arithmetic_types_int64: require
  7. #extension GL_KHX_shader_explicit_arithmetic_types_float16: require
  8. #extension GL_KHX_shader_explicit_arithmetic_types_float32: require
  9. #extension GL_KHX_shader_explicit_arithmetic_types_float64: require
  10. void main()
  11. {
  12. }
  13. // Single float literals
  14. void literal()
  15. {
  16. const float64_t f64c = 0.000001LF;
  17. const f64vec2 f64cv = f64vec2(-0.25lF, 0.03Lf);
  18. f64vec2 f64v;
  19. f64v.x = f64c;
  20. f64v += f64cv;
  21. }
  22. // Block memory layout
  23. struct S
  24. {
  25. float64_t x;
  26. f64vec2 y;
  27. f64vec3 z;
  28. };
  29. layout(column_major, std140) uniform B1
  30. {
  31. float64_t a;
  32. f64vec2 b;
  33. f64vec3 c;
  34. float64_t d[2];
  35. f64mat2x3 e;
  36. f64mat2x3 f[2];
  37. S g;
  38. S h[2];
  39. };
  40. // Specialization constant
  41. layout(constant_id = 100) const float16_t sf16 = 0.125hf;
  42. layout(constant_id = 101) const float32_t sf = 0.25;
  43. layout(constant_id = 102) const float64_t sd = 0.5lf;
  44. const float f16_to_f = float(sf16);
  45. const double f16_to_d = float(sf16);
  46. const float16_t f_to_f16 = float16_t(sf);
  47. const float16_t d_to_f16 = float16_t(sd);
  48. void operators()
  49. {
  50. float64_t f64;
  51. f64vec2 f64v;
  52. f64mat2x2 f64m;
  53. bool b;
  54. // Arithmetic
  55. f64v += f64v;
  56. f64v -= f64v;
  57. f64v *= f64v;
  58. f64v /= f64v;
  59. f64v++;
  60. f64v--;
  61. ++f64m;
  62. --f64m;
  63. f64v = -f64v;
  64. f64m = -f64m;
  65. f64 = f64v.x + f64v.y;
  66. f64 = f64v.x - f64v.y;
  67. f64 = f64v.x * f64v.y;
  68. f64 = f64v.x / f64v.y;
  69. // Relational
  70. b = (f64v.x != f64);
  71. b = (f64v.y == f64);
  72. b = (f64v.x > f64);
  73. b = (f64v.y < f64);
  74. b = (f64v.x >= f64);
  75. b = (f64v.y <= f64);
  76. // Vector/matrix operations
  77. f64v = f64v * f64;
  78. f64m = f64m * f64;
  79. f64v = f64m * f64v;
  80. f64v = f64v * f64m;
  81. f64m = f64m * f64m;
  82. }
  83. void typeCast()
  84. {
  85. bvec3 bv;
  86. f32vec3 f32v;
  87. f64vec3 f64v;
  88. i8vec3 i8v;
  89. u8vec3 u8v;
  90. i16vec3 i16v;
  91. u16vec3 u16v;
  92. i32vec3 i32v;
  93. u32vec3 u32v;
  94. i64vec3 i64v;
  95. u64vec3 u64v;
  96. f16vec3 f16v;
  97. f64v = f64vec3(bv); // bool -> float64
  98. bv = bvec3(f64v); // float64 -> bool
  99. f64v = f64vec3(f16v); // float16 -> float64
  100. f16v = f16vec3(f64v); // float64 -> float16
  101. i8v = i8vec3(f64v); // float64 -> int8
  102. i16v = i16vec3(f64v); // float64 -> int16
  103. i32v = i32vec3(f64v); // float64 -> int32
  104. i64v = i64vec3(f64v); // float64 -> int64
  105. u8v = u8vec3(f64v); // float64 -> uint8
  106. u16v = u16vec3(f64v); // float64 -> uint16
  107. u32v = u32vec3(f64v); // float64 -> uint32
  108. u64v = u64vec3(f64v); // float64 -> uint64
  109. }
  110. void builtinAngleTrigFuncs()
  111. {
  112. f64vec4 f64v1, f64v2;
  113. f64v2 = radians(f64v1);
  114. f64v2 = degrees(f64v1);
  115. f64v2 = sin(f64v1);
  116. f64v2 = cos(f64v1);
  117. f64v2 = tan(f64v1);
  118. f64v2 = asin(f64v1);
  119. f64v2 = acos(f64v1);
  120. f64v2 = atan(f64v1, f64v2);
  121. f64v2 = atan(f64v1);
  122. f64v2 = sinh(f64v1);
  123. f64v2 = cosh(f64v1);
  124. f64v2 = tanh(f64v1);
  125. f64v2 = asinh(f64v1);
  126. f64v2 = acosh(f64v1);
  127. f64v2 = atanh(f64v1);
  128. }
  129. void builtinExpFuncs()
  130. {
  131. f64vec2 f64v1, f64v2;
  132. f64v2 = pow(f64v1, f64v2);
  133. f64v2 = exp(f64v1);
  134. f64v2 = log(f64v1);
  135. f64v2 = exp2(f64v1);
  136. f64v2 = log2(f64v1);
  137. f64v2 = sqrt(f64v1);
  138. f64v2 = inversesqrt(f64v1);
  139. }
  140. void builtinCommonFuncs()
  141. {
  142. f64vec3 f64v1, f64v2, f64v3;
  143. float64_t f64;
  144. bool b;
  145. bvec3 bv;
  146. ivec3 iv;
  147. f64v2 = abs(f64v1);
  148. f64v2 = sign(f64v1);
  149. f64v2 = floor(f64v1);
  150. f64v2 = trunc(f64v1);
  151. f64v2 = round(f64v1);
  152. f64v2 = roundEven(f64v1);
  153. f64v2 = ceil(f64v1);
  154. f64v2 = fract(f64v1);
  155. f64v2 = mod(f64v1, f64v2);
  156. f64v2 = mod(f64v1, f64);
  157. f64v3 = modf(f64v1, f64v2);
  158. f64v3 = min(f64v1, f64v2);
  159. f64v3 = min(f64v1, f64);
  160. f64v3 = max(f64v1, f64v2);
  161. f64v3 = max(f64v1, f64);
  162. f64v3 = clamp(f64v1, f64, f64v2.x);
  163. f64v3 = clamp(f64v1, f64v2, f64vec3(f64));
  164. f64v3 = mix(f64v1, f64v2, f64);
  165. f64v3 = mix(f64v1, f64v2, f64v3);
  166. f64v3 = mix(f64v1, f64v2, bv);
  167. f64v3 = step(f64v1, f64v2);
  168. f64v3 = step(f64, f64v3);
  169. f64v3 = smoothstep(f64v1, f64v2, f64v3);
  170. f64v3 = smoothstep(f64, f64v1.x, f64v2);
  171. b = isnan(f64);
  172. bv = isinf(f64v1);
  173. f64v3 = fma(f64v1, f64v2, f64v3);
  174. f64v2 = frexp(f64v1, iv);
  175. f64v2 = ldexp(f64v1, iv);
  176. }
  177. void builtinGeometryFuncs()
  178. {
  179. float64_t f64;
  180. f64vec3 f64v1, f64v2, f64v3;
  181. f64 = length(f64v1);
  182. f64 = distance(f64v1, f64v2);
  183. f64 = dot(f64v1, f64v2);
  184. f64v3 = cross(f64v1, f64v2);
  185. f64v2 = normalize(f64v1);
  186. f64v3 = faceforward(f64v1, f64v2, f64v3);
  187. f64v3 = reflect(f64v1, f64v2);
  188. f64v3 = refract(f64v1, f64v2, f64);
  189. }
  190. void builtinMatrixFuncs()
  191. {
  192. f64mat2x3 f64m1, f64m2, f64m3;
  193. f64mat3x2 f64m4;
  194. f64mat3 f64m5;
  195. f64mat4 f64m6, f64m7;
  196. f64vec3 f64v1;
  197. f64vec2 f64v2;
  198. float64_t f64;
  199. f64m3 = matrixCompMult(f64m1, f64m2);
  200. f64m1 = outerProduct(f64v1, f64v2);
  201. f64m4 = transpose(f64m1);
  202. f64 = determinant(f64m5);
  203. f64m6 = inverse(f64m7);
  204. }
  205. void builtinVecRelFuncs()
  206. {
  207. f64vec3 f64v1, f64v2;
  208. bvec3 bv;
  209. bv = lessThan(f64v1, f64v2);
  210. bv = lessThanEqual(f64v1, f64v2);
  211. bv = greaterThan(f64v1, f64v2);
  212. bv = greaterThanEqual(f64v1, f64v2);
  213. bv = equal(f64v1, f64v2);
  214. bv = notEqual(f64v1, f64v2);
  215. }
  216. in flat f64vec3 if64v;
  217. void builtinFragProcFuncs()
  218. {
  219. f64vec3 f64v;
  220. // Derivative
  221. f64v.x = dFdx(if64v.x);
  222. f64v.y = dFdy(if64v.y);
  223. f64v.xy = dFdxFine(if64v.xy);
  224. f64v.xy = dFdyFine(if64v.xy);
  225. f64v = dFdxCoarse(if64v);
  226. f64v = dFdxCoarse(if64v);
  227. f64v.x = fwidth(if64v.x);
  228. f64v.xy = fwidthFine(if64v.xy);
  229. f64v = fwidthCoarse(if64v);
  230. // Interpolation
  231. f64v.x = interpolateAtCentroid(if64v.x);
  232. f64v.xy = interpolateAtSample(if64v.xy, 1);
  233. f64v = interpolateAtOffset(if64v, f64vec2(0.5f));
  234. }