diff options
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/integrator/path_trace.cpp | 7 | ||||
-rw-r--r-- | intern/cycles/integrator/path_trace_work.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/integrator/work_balancer.cpp | 3 | ||||
-rw-r--r-- | intern/cycles/session/session.cpp | 4 |
4 files changed, 16 insertions, 2 deletions
diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp index 3ec7b601d9f..ae03ee0b9a5 100644 --- a/intern/cycles/integrator/path_trace.cpp +++ b/intern/cycles/integrator/path_trace.cpp @@ -43,8 +43,11 @@ PathTrace::PathTrace(Device *device, /* Create path tracing work in advance, so that it can be reused by incremental sampling as much * as possible. */ device_->foreach_device([&](Device *path_trace_device) { - path_trace_works_.emplace_back(PathTraceWork::create( - path_trace_device, film, device_scene, &render_cancel_.is_requested)); + unique_ptr<PathTraceWork> work = PathTraceWork::create( + path_trace_device, film, device_scene, &render_cancel_.is_requested); + if (work) { + path_trace_works_.emplace_back(std::move(work)); + } }); work_balance_infos_.resize(path_trace_works_.size()); diff --git a/intern/cycles/integrator/path_trace_work.cpp b/intern/cycles/integrator/path_trace_work.cpp index bb5c6e1a61a..a5f98b5475a 100644 --- a/intern/cycles/integrator/path_trace_work.cpp +++ b/intern/cycles/integrator/path_trace_work.cpp @@ -23,6 +23,10 @@ unique_ptr<PathTraceWork> PathTraceWork::create(Device *device, if (device->info.type == DEVICE_CPU) { return make_unique<PathTraceWorkCPU>(device, film, device_scene, cancel_requested_flag); } + if (device->info.type == DEVICE_DUMMY) { + /* Dummy devices can't perform any work. */ + return nullptr; + } return make_unique<PathTraceWorkGPU>(device, film, device_scene, cancel_requested_flag); } diff --git a/intern/cycles/integrator/work_balancer.cpp b/intern/cycles/integrator/work_balancer.cpp index 5f1c6c92b9d..0fe170b2791 100644 --- a/intern/cycles/integrator/work_balancer.cpp +++ b/intern/cycles/integrator/work_balancer.cpp @@ -17,6 +17,9 @@ void work_balance_do_initial(vector<WorkBalanceInfo> &work_balance_infos) work_balance_infos[0].weight = 1.0; return; } + else if (num_infos == 0) { + return; + } /* There is no statistics available, so start with an equal distribution. */ const double weight = 1.0 / num_infos; diff --git a/intern/cycles/session/session.cpp b/intern/cycles/session/session.cpp index de685a47003..15bb93b0385 100644 --- a/intern/cycles/session/session.cpp +++ b/intern/cycles/session/session.cpp @@ -43,6 +43,10 @@ Session::Session(const SessionParams ¶ms_, const SceneParams &scene_params) device = Device::create(params.device, stats, profiler); + if (device->have_error()) { + progress.set_error(device->error_message()); + } + scene = new Scene(scene_params, device); /* Configure path tracer. */ |