ClGenerators.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #ifndef MANDEL_CLGENERATORS_H
  2. #define MANDEL_CLGENERATORS_H
  3. #ifdef WITH_OPENCL
  4. #include "Generators.h"
  5. #ifdef __APPLE__
  6. #include <OpenCL/cl.hpp>
  7. #else
  8. #include <CL/cl.hpp>
  9. #endif
  10. namespace mnd
  11. {
  12. class ClGenerator;
  13. class ClGeneratorFloat;
  14. class ClGeneratorDoubleFloat;
  15. class ClGeneratorDouble;
  16. class ClGeneratorDoubleDouble;
  17. class ClGeneratorQuadDouble;
  18. class ClGenerator128;
  19. class ClGenerator64;
  20. }
  21. class mnd::ClGenerator : public MandelGenerator
  22. {
  23. protected:
  24. cl::Device device;
  25. cl::Context context;
  26. cl::Program program;
  27. cl::CommandQueue queue;
  28. public:
  29. ClGenerator(cl::Device device, const mnd::Real& precision);
  30. virtual ~ClGenerator(void);
  31. virtual void generate(const MandelInfo& info, float* data);
  32. protected:
  33. virtual std::string getKernelCode(bool smooth) const = 0;
  34. };
  35. class mnd::ClGeneratorFloat : public ClGenerator
  36. {
  37. public:
  38. ClGeneratorFloat(cl::Device device, const std::string& code);
  39. virtual ~ClGeneratorFloat(void) = default;
  40. protected:
  41. virtual std::string getKernelCode(bool smooth) const;
  42. };
  43. class mnd::ClGeneratorDoubleFloat : public ClGenerator
  44. {
  45. public:
  46. ClGeneratorDoubleFloat(cl::Device device);
  47. virtual ~ClGeneratorDoubleFloat(void) = default;
  48. virtual void generate(const MandelInfo& info, float* data);
  49. protected:
  50. virtual std::string getKernelCode(bool smooth) const;
  51. };
  52. class mnd::ClGeneratorDouble : public ClGenerator
  53. {
  54. public:
  55. ClGeneratorDouble(cl::Device device);
  56. virtual ~ClGeneratorDouble(void) = default;
  57. virtual void generate(const MandelInfo& info, float* data);
  58. protected:
  59. virtual std::string getKernelCode(bool smooth) const;
  60. };
  61. class mnd::ClGeneratorDoubleDouble : public ClGenerator
  62. {
  63. bool smooth;
  64. public:
  65. ClGeneratorDoubleDouble(cl::Device device);
  66. virtual ~ClGeneratorDoubleDouble(void) = default;
  67. virtual void generate(const MandelInfo& info, float* data);
  68. protected:
  69. virtual std::string getKernelCode(bool smooth) const;
  70. };
  71. class mnd::ClGeneratorQuadDouble : public ClGenerator
  72. {
  73. bool smooth;
  74. public:
  75. ClGeneratorQuadDouble(cl::Device device);
  76. virtual ~ClGeneratorQuadDouble(void) = default;
  77. virtual void generate(const MandelInfo& info, float* data);
  78. protected:
  79. virtual std::string getKernelCode(bool smooth) const;
  80. };
  81. class mnd::ClGenerator128 : public ClGenerator
  82. {
  83. public:
  84. ClGenerator128(cl::Device device);
  85. virtual ~ClGenerator128(void) = default;
  86. virtual void generate(const MandelInfo& info, float* data);
  87. protected:
  88. virtual std::string getKernelCode(bool smooth) const;
  89. };
  90. class mnd::ClGenerator64 : public ClGenerator
  91. {
  92. public:
  93. ClGenerator64(cl::Device device);
  94. virtual ~ClGenerator64(void) = default;
  95. virtual void generate(const MandelInfo& info, float* data);
  96. protected:
  97. virtual std::string getKernelCode(bool smooth) const;
  98. };
  99. #endif // WITH_OPENCL
  100. #endif // MANDEL_CLGENERATORS_H