@@ -62,6 +62,13 @@ class HardwareDeviceRange {
6262
6363class HardwareDeviceKernel {
6464public:
65+
66+ // Prevent copying:
67+ // Device kernels contain allocated resources which are not trivially
68+ // copyable
69+ HardwareDeviceKernel (const HardwareDeviceKernel&) = delete ;
70+ HardwareDeviceKernel& operator =(const HardwareDeviceKernel&) = delete ;
71+
6572 virtual ~HardwareDeviceKernel () { }
6673
6774 virtual bool IsNull () const = 0;
@@ -93,20 +100,20 @@ class HardwareDeviceProgram {
93100
94101// Create a unique_ptr on a derived type, but with base handler, and
95102// provide a reference to the derived managed object
96- template <typename Derived>
97- std::tuple<HardwareDeviceProgramUPtr , Derived&>
98- CreateHDProgram ( ) {
103+ template <typename Base, typename Derived>
104+ std::tuple<std::unique_ptr<Base> , Derived&>
105+ CreateUniquePtr ( auto &&... args ) {
99106
100107 static_assert (
101- std::is_base_of<HardwareDeviceProgram , Derived>::value,
108+ std::is_base_of<Base , Derived>::value,
102109 " Derived must be a subclass of Base"
103110 );
104- auto derivedProgram = std::make_unique<Derived>();
105- auto derivedProgramRef = std::ref (*derivedProgram ); // We must capture ref before
111+ auto derivedPtr = std::make_unique<Derived>(std::forward< decltype (args)>(args)... );
112+ auto derivedRef = std::ref (*derivedPtr ); // We must capture ref before
106113 // derivedProgram is moved...
107- auto baseProgram = static_cast <HardwareDeviceProgramUPtr> (std::move (derivedProgram ));
114+ auto basePtr = static_cast <std::unique_ptr<Base>> (std::move (derivedPtr ));
108115
109- auto res = std::make_tuple (std::move (baseProgram ), derivedProgramRef );
116+ auto res = std::make_tuple (std::move (basePtr ), derivedRef );
110117 return res;
111118}
112119
@@ -153,25 +160,24 @@ class HardwareDevice : virtual public Device {
153160 const std::string &programName
154161 ) = 0;
155162
156- virtual void GetKernel (
163+ virtual HardwareDeviceKernelUPtr GetKernel (
157164 HardwareDeviceProgramRef program,
158- HardwareDeviceKernel **kernel,
159165 const std::string &kernelName
160166 ) = 0;
161- virtual u_int GetKernelWorkGroupSize (HardwareDeviceKernel * kernel) = 0;
167+ virtual u_int GetKernelWorkGroupSize (HardwareDeviceKernelRPtr kernel) = 0;
162168
163- virtual void SetKernelArg (HardwareDeviceKernel * kernel,
169+ virtual void SetKernelArg (HardwareDeviceKernelRPtr kernel,
164170 const u_int index, const size_t size, const void *arg) = 0;
165171protected:
166- virtual void SetKernelArgBuffer (HardwareDeviceKernel * kernel,
172+ virtual void SetKernelArgBuffer (HardwareDeviceKernelRPtr kernel,
167173 const u_int index, const HardwareDeviceBuffer *buff) = 0;
168174public:
169175 template <typename T>
170- void SetKernelArg (HardwareDeviceKernel * kernel, const u_int index, const T &arg) {
176+ void SetKernelArg (HardwareDeviceKernelRPtr kernel, const u_int index, const T &arg) {
171177 SetKernelArg (kernel, index, KernelArgumentHandler<T>::Size (arg), KernelArgumentHandler<T>::Ptr (arg));
172178 }
173179
174- virtual void EnqueueKernel (HardwareDeviceKernel * kernel,
180+ virtual void EnqueueKernel (HardwareDeviceKernelRPtr kernel,
175181 const HardwareDeviceRange &globalSize,
176182 const HardwareDeviceRange &workGroupSize) = 0;
177183 virtual void EnqueueReadBuffer (const HardwareDeviceBuffer *buff,
@@ -207,7 +213,7 @@ class HardwareDevice : virtual public Device {
207213 };
208214
209215 HardwareDevice ();
210-
216+
211217 void AllocMemory (const size_t s) { usedMemory += s; }
212218 void FreeMemory (const size_t s) { usedMemory -= s; }
213219
@@ -216,7 +222,7 @@ class HardwareDevice : virtual public Device {
216222};
217223
218224typedef HardwareDeviceBuffer * HardwareDeviceBufferRPtr;
219- template <> void HardwareDevice::SetKernelArg<HardwareDeviceBufferRPtr>(HardwareDeviceKernel * kernel, const u_int index, const HardwareDeviceBufferRPtr &buff);
225+ template <> void HardwareDevice::SetKernelArg<HardwareDeviceBufferRPtr>(HardwareDeviceKernelRPtr kernel, const u_int index, const HardwareDeviceBufferRPtr &buff);
220226
221227}
222228
0 commit comments