IterationGenerator.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #ifndef MANDEL_ITERATIONGENERATOR_H
  2. #define MANDEL_ITERATIONGENERATOR_H
  3. #include "Generators.h"
  4. #include "ClGenerators.h"
  5. #include "IterationFormula.h"
  6. #include "IterationIR.h"
  7. #include <utility>
  8. #include <complex>
  9. namespace mnd
  10. {
  11. class IterationGenerator;
  12. class NaiveGenerator;
  13. class NaiveIRGenerator;
  14. class CompiledGenerator;
  15. class CompiledClGenerator;
  16. // forward declaration
  17. struct ExecData;
  18. class MandelDevice;
  19. }
  20. class mnd::IterationGenerator : public mnd::MandelGenerator
  21. {
  22. protected:
  23. IterationFormula z0;
  24. IterationFormula zi;
  25. public:
  26. IterationGenerator(IterationFormula z0, IterationFormula zi, const mnd::Real& prec);
  27. };
  28. class mnd::NaiveGenerator : public mnd::IterationGenerator
  29. {
  30. public:
  31. NaiveGenerator(IterationFormula z0, IterationFormula zi, const mnd::Real& prec);
  32. NaiveGenerator(NaiveGenerator&&) = default;
  33. virtual void generate(const MandelInfo& info, float* data);
  34. private:
  35. std::complex<double> iterate(std::complex<double> z, std::complex<double> c);
  36. std::complex<double> calc(mnd::Expression& expr, std::complex<double> z, std::complex<double> c);
  37. };
  38. class mnd::NaiveIRGenerator : public mnd::MandelGenerator
  39. {
  40. const ir::Formula& form;
  41. public:
  42. NaiveIRGenerator(const ir::Formula& irf, const mnd::Real& prec);
  43. NaiveIRGenerator(NaiveIRGenerator&&) = default;
  44. virtual void generate(const MandelInfo& info, float* data);
  45. double calc(ir::Node* expr, double a, double b, double x, double y);
  46. };
  47. #if defined(__x86_64__) || defined(_M_X64)
  48. class mnd::CompiledGenerator : public mnd::MandelGenerator
  49. {
  50. std::unique_ptr<ExecData> execData;
  51. public:
  52. CompiledGenerator(std::unique_ptr<ExecData> execData);
  53. CompiledGenerator(CompiledGenerator&&);
  54. virtual ~CompiledGenerator(void);
  55. virtual void generate(const MandelInfo& info, float* data);
  56. std::string dump(void) const;
  57. };
  58. #endif
  59. #ifdef WITH_OPENCL
  60. class mnd::CompiledClGenerator : public mnd::ClGeneratorFloat
  61. {
  62. public:
  63. CompiledClGenerator(const MandelDevice& device, const std::string& code);
  64. CompiledClGenerator(CompiledClGenerator&&) = default;
  65. //virtual ~CompiledGenerator(void);
  66. //virtual void generate(const MandelInfo& info, float* data);
  67. virtual std::string getKernelCode(bool smooth) const override;
  68. virtual void generate(const MandelInfo& info, float* data);
  69. //std::string dump(void) const;
  70. };
  71. #endif // WITH_OPENCL
  72. #endif // MANDEL_ITERATIONGENERATOR_H