diff options
Diffstat (limited to 'intern/cycles/device/device_optix.cpp')
-rw-r--r-- | intern/cycles/device/device_optix.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/intern/cycles/device/device_optix.cpp b/intern/cycles/device/device_optix.cpp index cce11507fa1..01de0724cb2 100644 --- a/intern/cycles/device/device_optix.cpp +++ b/intern/cycles/device/device_optix.cpp @@ -193,6 +193,9 @@ class OptiXDevice : public CUDADevice { device_only_memory<unsigned char> denoiser_state; int denoiser_input_passes = 0; + vector<device_only_memory<char>> delayed_free_bvh_memory; + thread_mutex delayed_free_bvh_mutex; + public: OptiXDevice(DeviceInfo &info_, Stats &stats_, Profiler &profiler_, bool background_) : CUDADevice(info_, stats_, profiler_, background_), @@ -258,6 +261,8 @@ class OptiXDevice : public CUDADevice { // Make CUDA context current const CUDAContextScope scope(cuContext); + free_bvh_memory_delayed(); + sbt_data.free(); texture_info.free(); launch_params.free(); @@ -1297,6 +1302,8 @@ class OptiXDevice : public CUDADevice { return; } + free_bvh_memory_delayed(); + BVHOptiX *const bvh_optix = static_cast<BVHOptiX *>(bvh); progress.set_substatus("Building OptiX acceleration structure"); @@ -1767,6 +1774,24 @@ class OptiXDevice : public CUDADevice { } } + void release_optix_bvh(BVH *bvh) override + { + thread_scoped_lock lock(delayed_free_bvh_mutex); + /* Do delayed free of BVH memory, since geometry holding BVH might be deleted + * while GPU is still rendering. */ + BVHOptiX *const bvh_optix = static_cast<BVHOptiX *>(bvh); + + delayed_free_bvh_memory.emplace_back(std::move(bvh_optix->as_data)); + delayed_free_bvh_memory.emplace_back(std::move(bvh_optix->motion_transform_data)); + bvh_optix->traversable_handle = 0; + } + + void free_bvh_memory_delayed() + { + thread_scoped_lock lock(delayed_free_bvh_mutex); + delayed_free_bvh_memory.free_memory(); + } + void const_copy_to(const char *name, void *host, size_t size) override { // Set constant memory for CUDA module |