Skip to content

Commit 5be7e30

Browse files
committed
Refactor Kernels to smart pointers
1 parent 693c185 commit 5be7e30

46 files changed

Lines changed: 275 additions & 293 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

include/luxrays/core/hardwaredevice.h

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ class HardwareDeviceRange {
6262

6363
class HardwareDeviceKernel {
6464
public:
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;
165171
protected:
166-
virtual void SetKernelArgBuffer(HardwareDeviceKernel *kernel,
172+
virtual void SetKernelArgBuffer(HardwareDeviceKernelRPtr kernel,
167173
const u_int index, const HardwareDeviceBuffer *buff) = 0;
168174
public:
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

218224
typedef 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

include/luxrays/devices/cudadevice.h

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -182,24 +182,23 @@ class CUDADevice : virtual public HardwareDevice {
182182
const std::string &programName
183183
) override;
184184

185-
virtual void GetKernel(
185+
virtual HardwareDeviceKernelUPtr GetKernel(
186186
HardwareDeviceProgramRef program,
187-
HardwareDeviceKernel **kernel,
188187
const std::string &kernelName
189188
) override;
190-
virtual u_int GetKernelWorkGroupSize(HardwareDeviceKernel *kernel);
191-
virtual void SetKernelArg(HardwareDeviceKernel *kernel,
192-
const u_int index, const size_t size, const void *arg);
189+
virtual u_int GetKernelWorkGroupSize(HardwareDeviceKernelRPtr kernel) override;
190+
virtual void SetKernelArg(HardwareDeviceKernelRPtr kernel,
191+
const u_int index, const size_t size, const void *arg) override;
193192

194-
virtual void EnqueueKernel(HardwareDeviceKernel *kernel,
193+
virtual void EnqueueKernel(HardwareDeviceKernelRPtr kernel,
195194
const HardwareDeviceRange &globalSize,
196-
const HardwareDeviceRange &workGroupSize);
195+
const HardwareDeviceRange &workGroupSize) override;
197196
virtual void EnqueueReadBuffer(const HardwareDeviceBuffer *buff,
198-
const bool blocking, const size_t size, void *ptr);
197+
const bool blocking, const size_t size, void *ptr) override;
199198
virtual void EnqueueWriteBuffer(const HardwareDeviceBuffer *buff,
200-
const bool blocking, const size_t size, const void *ptr);
201-
virtual void FlushQueue();
202-
virtual void FinishQueue();
199+
const bool blocking, const size_t size, const void *ptr) override;
200+
virtual void FlushQueue() override;
201+
virtual void FinishQueue() override;
203202

204203
//--------------------------------------------------------------------------
205204
// Memory management for hardware (aka GPU) only applications
@@ -223,8 +222,10 @@ class CUDADevice : virtual public HardwareDevice {
223222
friend class Context;
224223

225224
protected:
226-
virtual void SetKernelArgBuffer(HardwareDeviceKernel *kernel,
227-
const u_int index, const HardwareDeviceBuffer *buff);
225+
virtual void SetKernelArgBuffer(
226+
HardwareDeviceKernelRPtr kernel,
227+
const u_int index, const HardwareDeviceBuffer *buff
228+
) override;
228229

229230
void AllocBuffer(CUdeviceptr *buff,
230231
void *src, const size_t size, const std::string &desc = "");

include/luxrays/devices/ocldevice.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -303,24 +303,24 @@ class OpenCLDevice : virtual public HardwareDevice {
303303
const std::string &programName
304304
) override;
305305

306-
virtual void GetKernel(
306+
virtual HardwareDeviceKernelUPtr GetKernel(
307307
HardwareDeviceProgramRef program,
308-
HardwareDeviceKernel **kernel,
309308
const std::string &kernelName
310309
) override;
311-
virtual u_int GetKernelWorkGroupSize(HardwareDeviceKernel *kernel);
312-
virtual void SetKernelArg(HardwareDeviceKernel *kernel,
313-
const u_int index, const size_t size, const void *arg);
310+
virtual u_int GetKernelWorkGroupSize(HardwareDeviceKernelRPtr kernel) override;
311+
virtual void SetKernelArg(
312+
HardwareDeviceKernelRPtr kernel,
313+
const u_int index, const size_t size, const void *arg) override;
314314

315-
virtual void EnqueueKernel(HardwareDeviceKernel *kernel,
315+
virtual void EnqueueKernel(HardwareDeviceKernelRPtr kernel,
316316
const HardwareDeviceRange &globalSize,
317-
const HardwareDeviceRange &workGroupSize);
317+
const HardwareDeviceRange &workGroupSize) override;
318318
virtual void EnqueueReadBuffer(const HardwareDeviceBuffer *buff,
319-
const bool blocking, const size_t size, void *ptr);
319+
const bool blocking, const size_t size, void *ptr) override;
320320
virtual void EnqueueWriteBuffer(const HardwareDeviceBuffer *buff,
321-
const bool blocking, const size_t size, const void *ptr);
322-
virtual void FlushQueue();
323-
virtual void FinishQueue();
321+
const bool blocking, const size_t size, const void *ptr) override;
322+
virtual void FlushQueue() override;
323+
virtual void FinishQueue() override;
324324

325325
//--------------------------------------------------------------------------
326326
// Memory management for hardware (aka GPU) only applications
@@ -334,8 +334,10 @@ class OpenCLDevice : virtual public HardwareDevice {
334334
friend class Context;
335335

336336
protected:
337-
virtual void SetKernelArgBuffer(HardwareDeviceKernel *kernel,
338-
const u_int index, const HardwareDeviceBuffer *buff);
337+
virtual void SetKernelArgBuffer(
338+
HardwareDeviceKernelRPtr kernel,
339+
const u_int index, const HardwareDeviceBuffer *buff
340+
) override;
339341

340342
void AllocBuffer(const cl_mem_flags clFlags, cl_mem *buff,
341343
void *src, const size_t size, const std::string &desc = "");

include/luxrays/usings.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,14 @@ DECLARE_SUBTYPES(Blob);
5757
DECLARE_SUBTYPES(BSphere);
5858
DECLARE_SUBTYPES(Context);
5959
DECLARE_SUBTYPES(CUDADevice);
60+
DECLARE_SUBTYPES(CUDADeviceKernel);
61+
DECLARE_SUBTYPES(CUDADeviceProgram);
6062
DECLARE_SUBTYPES(CUDADeviceDescription);
6163
DECLARE_SUBTYPES(DataSet);
6264
DECLARE_SUBTYPES(Device);
6365
DECLARE_SUBTYPES(DeviceDescription);
6466
DECLARE_SUBTYPES(HardwareDevice);
67+
DECLARE_SUBTYPES(HardwareDeviceKernel);
6568
DECLARE_SUBTYPES(HardwareDeviceProgram);
6669
DECLARE_SUBTYPES(HardwareIntersectionDevice)
6770
DECLARE_SUBTYPES(IntersectionDevice)
@@ -77,6 +80,7 @@ DECLARE_SUBTYPES(NativeIntersectionDeviceDescription);
7780
DECLARE_SUBTYPES(Normal);
7881
DECLARE_SUBTYPES(OpenCLDeviceDescription);
7982
DECLARE_SUBTYPES(OpenCLDeviceProgram);
83+
DECLARE_SUBTYPES(OpenCLDeviceKernel);
8084
DECLARE_SUBTYPES(OpenCLIntersectionDevice);
8185
DECLARE_SUBTYPES(Point);
8286
DECLARE_SUBTYPES(Ray);

include/slg/engines/pathoclbase/pathoclbaseoclthread.h

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,13 @@ class PathOCLBaseOCLRenderThread {
7575
const u_int threadFilmWidth, const u_int threadFilmHeight,
7676
const u_int *threadFilmSubRegion);
7777
void FreeAllOCLBuffers();
78-
u_int SetFilmKernelArgs(luxrays::HardwareIntersectionDeviceRef intersectionDevice,
79-
luxrays::HardwareDeviceKernel *filmClearKernel, u_int argIndex) const;
78+
u_int SetFilmKernelArgs(
79+
luxrays::HardwareIntersectionDeviceRef intersectionDevice,
80+
luxrays::HardwareDeviceKernelRPtr filmClearKernel,
81+
u_int argIndex) const;
8082
void ClearFilm(luxrays::HardwareIntersectionDeviceRef intersectionDevice,
81-
luxrays::HardwareDeviceKernel *filmClearKernel, const size_t filmClearWorkGroupSize);
83+
luxrays::HardwareDeviceKernelRPtr filmClearKernel,
84+
const size_t filmClearWorkGroupSize);
8285
void RecvFilm(luxrays::HardwareIntersectionDeviceRef intersectionDevice);
8386
void SendFilm(luxrays::HardwareIntersectionDeviceRef intersectionDevice);
8487

@@ -173,14 +176,16 @@ class PathOCLBaseOCLRenderThread {
173176
void InitSampleResultsBuffer();
174177

175178
void SetInitKernelArgs(const u_int filmIndex);
176-
void SetAdvancePathsKernelArgs(luxrays::HardwareDeviceKernel *advancePathsKernel, const u_int filmIndex);
179+
void SetAdvancePathsKernelArgs(luxrays::HardwareDeviceKernelRPtr advancePathsKernel, const u_int filmIndex);
177180
void SetAllAdvancePathsKernelArgs(const u_int filmIndex);
178181
void SetKernelArgs();
179182

180-
void CompileKernel(luxrays::HardwareIntersectionDeviceRef device,
181-
luxrays::HardwareDeviceProgramRef program,
182-
luxrays::HardwareDeviceKernel **kernel,
183-
size_t *workGroupSize, const std::string &name);
183+
184+
std::tuple<luxrays::HardwareDeviceKernelUPtr, size_t> CompileKernel(
185+
luxrays::HardwareIntersectionDeviceRef device,
186+
luxrays::HardwareDeviceProgramRef program,
187+
const std::string &name
188+
);
184189

185190
void EnqueueAdvancePathsKernel();
186191

@@ -197,7 +202,7 @@ class PathOCLBaseOCLRenderThread {
197202

198203
// OpenCL variables
199204
std::string kernelSrcHash;
200-
luxrays::HardwareDeviceKernel *filmClearKernel;
205+
luxrays::HardwareDeviceKernelUPtr filmClearKernel;
201206
size_t filmClearWorkGroupSize;
202207

203208
// Scene buffers
@@ -268,19 +273,19 @@ class PathOCLBaseOCLRenderThread {
268273
std::vector<std::shared_ptr<ThreadFilm> > threadFilms;
269274

270275
// OpenCL kernels
271-
luxrays::HardwareDeviceKernel *initSeedKernel;
272-
luxrays::HardwareDeviceKernel *initKernel;
276+
luxrays::HardwareDeviceKernelUPtr initSeedKernel;
277+
luxrays::HardwareDeviceKernelUPtr initKernel;
273278
size_t initWorkGroupSize;
274-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_RT_NEXT_VERTEX;
275-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_HIT_NOTHING;
276-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_HIT_OBJECT;
277-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_RT_DL;
278-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_DL_ILLUMINATE;
279-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_DL_SAMPLE_BSDF;
280-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_GENERATE_NEXT_VERTEX_RAY;
281-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_SPLAT_SAMPLE;
282-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_NEXT_SAMPLE;
283-
luxrays::HardwareDeviceKernel *advancePathsKernel_MK_GENERATE_CAMERA_RAY;
279+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_RT_NEXT_VERTEX;
280+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_HIT_NOTHING;
281+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_HIT_OBJECT;
282+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_RT_DL;
283+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_DL_ILLUMINATE;
284+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_DL_SAMPLE_BSDF;
285+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_GENERATE_NEXT_VERTEX_RAY;
286+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_SPLAT_SAMPLE;
287+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_NEXT_SAMPLE;
288+
luxrays::HardwareDeviceKernelUPtr advancePathsKernel_MK_GENERATE_CAMERA_RAY;
284289
size_t advancePathsWorkGroupSize;
285290

286291
slg::ocl::pathoclbase::GPUTaskStats *gpuTaskStats;

include/slg/film/film.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -476,10 +476,10 @@ class Film : public std::enable_shared_from_this<Film> {
476476

477477
luxrays::HardwareDeviceBuffer *hw_mergeBuffer;
478478

479-
luxrays::HardwareDeviceKernel *mergeInitializeKernel;
480-
luxrays::HardwareDeviceKernel *mergeRADIANCE_PER_PIXEL_NORMALIZEDKernel;
481-
luxrays::HardwareDeviceKernel *mergeRADIANCE_PER_SCREEN_NORMALIZEDKernel;
482-
luxrays::HardwareDeviceKernel *mergeFinalizeKernel;
479+
luxrays::HardwareDeviceKernelUPtr mergeInitializeKernel;
480+
luxrays::HardwareDeviceKernelUPtr mergeRADIANCE_PER_PIXEL_NORMALIZEDKernel;
481+
luxrays::HardwareDeviceKernelUPtr mergeRADIANCE_PER_SCREEN_NORMALIZEDKernel;
482+
luxrays::HardwareDeviceKernelUPtr mergeFinalizeKernel;
483483

484484
static FilmUPtr LoadSerialized(const std::string &fileName);
485485
static void SaveSerialized(const std::string &fileName, FilmRef film);

include/slg/film/imagepipeline/plugins/backgroundimg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class BackgroundImgPlugin : public ImagePipelinePlugin {
8181
luxrays::HardwareDeviceBuffer *hwFilmImageMapDesc;
8282
luxrays::HardwareDeviceBuffer *hwFilmImageMap;
8383

84-
luxrays::HardwareDeviceKernel *applyKernel;
84+
luxrays::HardwareDeviceKernelUPtr applyKernel;
8585
};
8686

8787
}

include/slg/film/imagepipeline/plugins/bloom.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ class BloomFilterPlugin : public ImagePipelinePlugin {
8181
luxrays::HardwareDeviceBuffer *hwBloomBufferTmp;
8282
luxrays::HardwareDeviceBuffer *hwBloomFilter;
8383

84-
luxrays::HardwareDeviceKernel *bloomFilterXKernel;
85-
luxrays::HardwareDeviceKernel *bloomFilterYKernel;
86-
luxrays::HardwareDeviceKernel *bloomFilterMergeKernel;
84+
luxrays::HardwareDeviceKernelUPtr bloomFilterXKernel;
85+
luxrays::HardwareDeviceKernelUPtr bloomFilterYKernel;
86+
luxrays::HardwareDeviceKernelUPtr bloomFilterMergeKernel;
8787
};
8888

8989
}

include/slg/film/imagepipeline/plugins/cameraresponse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class CameraResponsePlugin : public ImagePipelinePlugin {
8686
luxrays::HardwareDeviceBuffer *hwBlueI;
8787
luxrays::HardwareDeviceBuffer *hwBlueB;
8888

89-
luxrays::HardwareDeviceKernel *applyKernel;
89+
luxrays::HardwareDeviceKernelUPtr applyKernel;
9090
};
9191

9292
}

include/slg/film/imagepipeline/plugins/coloraberration.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ class ColorAberrationPlugin : public ImagePipelinePlugin {
7171
luxrays::HardwareDevice *hardwareDevice;
7272
luxrays::HardwareDeviceBuffer *hwTmpBuffer;
7373

74-
luxrays::HardwareDeviceKernel *applyKernel;
75-
luxrays::HardwareDeviceKernel *copyKernel;
74+
luxrays::HardwareDeviceKernelUPtr applyKernel;
75+
luxrays::HardwareDeviceKernelUPtr copyKernel;
7676
};
7777

7878
}

0 commit comments

Comments
 (0)