Nicolas Winkler 5 years ago
parent
commit
1106aec279

+ 1 - 0
Almond.qrc

@@ -4,5 +4,6 @@
         <file alias="clouds">gradients/clouds.xml</file>
         <file alias="rainbow">gradients/rainbow.xml</file>
         <file alias="grayscale">gradients/grayscale.xml</file>
+        <file alias="peach">gradients/peach.xml</file>
     </qresource>
 </RCC>

+ 1 - 0
gradientchoosedialog.cpp

@@ -16,6 +16,7 @@ GradientChooseDialog::GradientChooseDialog()
     gcd.presets->addItem("clouds");
     gcd.presets->addItem("rainbow");
     gcd.presets->addItem("grayscale");
+    gcd.presets->addItem("peach");
 }
 
 

+ 1 - 1
libmandel/include/IterationGenerator.h

@@ -15,7 +15,7 @@ class mnd::IterationGenerator : public mnd::MandelGenerator
 {
     IterationFormula itf;
 public:
-    IterationGenerator(const IterationFormula& itf, const mnd::Real& prec);
+    IterationGenerator(IterationFormula itf, const mnd::Real& prec);
 };
 
 

+ 1 - 0
libmandel/include/OpenClCode.h

@@ -4,6 +4,7 @@
 namespace mnd
 {
     const char* getFloat_cl();
+    const char* getDouble_cl();
     const char* getDoubleFloat_cl();
     const char* getDoubleDouble_cl();
     const char* getQuadDouble_cl();

+ 1 - 70
libmandel/src/ClGenerators.cpp

@@ -143,75 +143,6 @@ ClGeneratorFloat::ClGeneratorFloat(cl::Device device) :
 std::string ClGeneratorFloat::getKernelCode(bool smooth) const
 {
     return mnd::getFloat_cl();
-        /*
-//        "#pragma OPENCL EXTENSION cl_khr_fp64 : enable"
-        "__kernel void iterate(__global float* A, const int width, float xl, float yt, float pixelScaleX, float pixelScaleY, int max, int smooth) {"
-        "   int index = get_global_id(0) * 4;\n"
-        "   int x = index % width;"
-        "   int y = index / width;"
-        "   float4 a = (float4) (x * pixelScaleX + xl, (x + 1) * pixelScaleX + xl, (x + 2) * pixelScaleX + xl, (x + 3) * pixelScaleX + xl);"
-        "   float4 b = (float4) (y * pixelScaleY + yt);"
-        "   float4 ca = a;"
-        "   float4 cb = b;"
-        "   float4 resa = a;"
-        "   float4 resb = b;"
-        "   int4 count = (int4)(0);"
-        ""
-        "   int n = 0;"
-        "   while (n < max) {"
-//        "       float aa = a * a;"
-//        "       float bb = b * b;"
-        "       float4 ab = a * b;\n"
-        "       float4 cmpVal = fma(a, a, b * b);\n"
-        "       int4 cmp = isless(cmpVal, (float4)(16.0f));\n"
-        "       if (!any(cmp)) break;\n"
-        "       a = fma(a, a, -fma(b, b, -ca));\n"
-        "       b = fma(2, ab, cb);\n"
-        "       if (smooth) {\n"
-        "           resa = as_float4(as_int4(a) & cmp | (as_int4(resa) & ~cmp));"
-        "           resb = as_float4(as_int4(b) & cmp | (as_int4(resb) & ~cmp));"
-        "       }\n"
-        "       count += cmp & (int4)(1);\n"
-        "       n++;"
-        "   }\n"
-        "   for (int i = 0; i < 4 && i + x < width; i++) {"
-        "       if (smooth != 0)\n"
-        "           A[index + i] = ((float) count[i]) + 1 - log(log(fma(resa[i], resa[i], resb[i] * resb[i])) / 2) / log(2.0f);\n"
-        "      else\n"
-        "          A[index + i] = ((float) count[i]);\n"
-        "   }"
-        "}";*/
-        /*
-//        "#pragma OPENCL EXTENSION cl_khr_fp64 : enable"
-        "__kernel void iterate(__global float* A, const int width, float xl, float yt, float pixelScaleX, float pixelScaleY, int max, int smooth) {"
-        "   int index = get_global_id(0);\n"
-        "   int x = index % width;"
-        "   int y = index / width;"
-        "   float a = x * pixelScaleX + xl;"
-        "   float b = y * pixelScaleY + yt;"
-        "   float ca = a;"
-        "   float cb = b;"
-        ""
-        "   int n = 0;"
-        "   while (n < max - 1) {"
-//        "       float aa = a * a;"
-//        "       float bb = b * b;"
-        "       float ab = a * b;"
-        "       if (fma(a, a, b * b) > 16) break;"
-        "       a = fma(a, a, -fma(b, b, -ca));"
-        "       b = fma(2, ab, cb);"
-        "       n++;"
-        "   }\n"
-        "   if (n >= max - 1)\n"
-        "       A[index] = max;\n"
-        "   else {"
-        "       if (smooth != 0)\n"
-        "           A[index] = ((float)n) + 1 - log(log(a * a + b * b) / 2) / log(2.0f);\n"
-        "       else\n"
-        "           A[index] = ((float)n);\n"
-        "   }"
-        "}";
-        */
 }
 
 
@@ -385,7 +316,7 @@ ClGeneratorDouble::ClGeneratorDouble(cl::Device device) :
     context = Context{ device };
     Program::Sources sources;
 
-    std::string kcode = this->getKernelCode(false);
+    std::string kcode = getDouble_cl();
 
     sources.push_back({ kcode.c_str(), kcode.length() });
 

+ 3 - 3
libmandel/src/IterationGenerator.cpp

@@ -5,10 +5,10 @@ using mnd::IterationGenerator;
 using mnd::IterationFormula;
 
 
-IterationGenerator::IterationGenerator(const IterationFormula& itf,
+IterationGenerator::IterationGenerator(IterationFormula itf,
                                        const mnd::Real& prec) :
-    mnd::MandelGenrator{ prec },
-    itf{ itf }
+    mnd::MandelGenerator{ prec },
+    itf{ std::move(itf) }
 {
 }
 

+ 5 - 0
libmandel/src/OpenClCode.cpp

@@ -1,6 +1,7 @@
 #include "OpenClCode.h"
 
 #include "opencl/float.h"
+#include "opencl/double.h"
 #include "opencl/doublefloat.h"
 #include "opencl/doubledouble.h"
 #include "opencl/quaddouble.h"
@@ -15,6 +16,10 @@ namespace mnd
         return (char*) float_cl;
     }
 
+    const char* getDouble_cl() {
+        return (char*) float_cl;
+    }
+
     const char* getDoubleFloat_cl() {
         return (char*) doublefloat_cl;
     }

+ 30 - 29
libmandel/src/opencl/double.cl

@@ -1,30 +1,31 @@
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n"
-__kernel void iterate(__global float* A, const int width, double xl, double yt, double pixelScaleX, double pixelScaleY, int max, int smooth) {\n"
-   int index = get_global_id(0);\n"
-   int x = index % width;"
-   int y = index / width;"
-   double a = x * pixelScaleX + xl;"
-   double b = y * pixelScaleY + yt;"
-   double ca = a;"
-   double cb = b;"
-"
-   int n = 0;"
-   while (n < max - 1) {"
-       double aa = a * a;"
-       double bb = b * b;"
-       double ab = a * b;"
-       if (aa + bb > 16) break;"
-       a = aa - bb + ca;"
-       b = ab + ab + cb;"
-       n++;"
-   }\n"
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+__kernel void iterate(__global float* A, const int width, double xl, double yt, double pixelScaleX, double pixelScaleY, int max, int smooth) {
+   int index = get_global_id(0);
+   int x = index % width;
+   int y = index / width;
+   double a = x * pixelScaleX + xl;
+   double b = y * pixelScaleY + yt;
+   double ca = a;
+   double cb = b;
+
+   int n = 0;
+   while (n < max - 1) {
+       double aa = a * a;
+       double bb = b * b;
+       double ab = a * b;
+       if (aa + bb > 16) break;
+       a = aa - bb + ca;
+       b = ab + ab + cb;
+       n++;
+   }
 // N + 1 - log (log  |Z(N)|) / log 2
-   if (n >= max - 1)\n"
-       A[index] = max;\n"
-   else {"
-       if (smooth != 0)\n"
-           A[index] = ((float)n) + 1 - log(log((float)(a * a + b * b)) / 2) / log(2.0f);\n"
-       else\n"
-           A[index] = ((float)n);\n"
-   }"
-}";
+   if (n >= max - 1)
+       A[index] = max;
+   else {
+       if (smooth != 0)
+           A[index] = ((float)n) + 1 - log(log((float)(a * a + b * b)) / 2) / log(2.0f);
+       else
+           A[index] = ((float)n);
+   }
+}
+