float.cl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. __kernel void iterate(__global float* A, const int width, float xl, float yt, float pixelScaleX, float pixelScaleY, int max, int smooth, int julia, float juliaX, float juliaY) {
  2. int index = get_global_id(0);
  3. int x = index % width;
  4. int y = index / width;
  5. float a = x * pixelScaleX + xl;
  6. float b = y * pixelScaleY + yt;
  7. float ca = julia != 0 ? juliaX : a;
  8. float cb = julia != 0 ? juliaY : b;
  9. int n = 0;
  10. while (n < max - 1) {
  11. float aa = a * a;
  12. float bb = b * b;
  13. float ab = a * b;
  14. a = aa - bb + ca;
  15. b = ab + ab + cb;
  16. if (aa + bb > 16) break;
  17. n++;
  18. }
  19. if (n >= max - 1) {
  20. A[index] = max;
  21. }
  22. else {
  23. if (smooth != 0)
  24. A[index] = ((float)n) + 1 - log(log(a * a + b * b) / 2) / log(2.0f);
  25. else
  26. A[index] = ((float)n);
  27. }
  28. }
  29. __kernel void iterate_vec4(__global float* A, const int width, float xl, float yt, float pixelScaleX, float pixelScaleY, int max, int smooth, int julia, float juliaX, float juliaY) {
  30. int index = get_global_id(0) * 4;
  31. int x = index % width;
  32. int y = index / width;
  33. float4 a = (float4) (x * pixelScaleX + xl, (x + 1) * pixelScaleX + xl, (x + 2) * pixelScaleX + xl, (x + 3) * pixelScaleX + xl);
  34. float4 b = (float4) (y * pixelScaleY + yt);
  35. float4 ca = julia ? ((float4)(juliaX)) : a;
  36. float4 cb = julia ? ((float4)(juliaY)) : b;
  37. float4 resa = (float4)(0);
  38. float4 resb = (float4)(0);
  39. float4 count = (float4)(0);
  40. int n = 0;
  41. if (smooth) {
  42. int4 cmp = isless((float4)(16.0f), (float4)(16.0f));
  43. while (n < max) {
  44. float4 ab = a * b;
  45. float4 cmpVal = fma(a, a, b * b);
  46. a = fma(a, a, -fma(b, b, -ca));
  47. b = fma(2, ab, cb);
  48. resa = as_float4((as_int4(a) & cmp) | (as_int4(resa) & ~cmp));
  49. resb = as_float4((as_int4(b) & cmp) | (as_int4(resb) & ~cmp));
  50. cmp = isless(cmpVal, (float4)(16.0f));
  51. if (!any(cmp)) break;
  52. count += as_float4(cmp & as_int4((float4)(1)));
  53. n++;
  54. }
  55. }
  56. else {
  57. while (n < max) {
  58. float4 ab = a * b;
  59. float4 cmpVal = fma(a, a, b * b);
  60. a = fma(a, a, -fma(b, b, -ca));
  61. b = fma(2, ab, cb);
  62. int4 cmp = isless(cmpVal, (float4)(16.0f));
  63. if (!any(cmp)) break;
  64. count += as_float4(cmp & as_int4((float4)(1)));
  65. n++;
  66. }
  67. }
  68. for (int i = 0; i < 4 && i + x < width; i++) {
  69. if (smooth != 0) {
  70. if (count[i] != 0)
  71. A[index + i] = ((float) count[i]) + 1 - log(log(fma(resa[i], resa[i], resb[i] * resb[i])) / 2) / log(2.0f);
  72. }
  73. else
  74. A[index + i] = ((float) count[i]);
  75. }
  76. }