diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-22 18:04:44 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-10-22 18:04:44 +0400 |
commit | 57b7f405a4306d6c8b29fc6cdfc16ab9eb58279a (patch) | |
tree | 4306382df42e32b559024cefcfaffae5fe3074ee /intern/cycles | |
parent | b5e85cae705f47ae5a32c97564e1942a95e75bb4 (diff) |
Fix related to #32929: update list of available devices for cycles rendering
while Blender is running, not only on load. It might help a case when Blender
is started before the CUDA driver is fully initialized.
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/device/device.cpp | 14 | ||||
-rw-r--r-- | intern/cycles/util/util_task.h | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index 9a4d364a9b8..5d3f23d954a 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -28,6 +28,7 @@ #include "util_math.h" #include "util_opencl.h" #include "util_opengl.h" +#include "util_time.h" #include "util_types.h" #include "util_vector.h" @@ -188,6 +189,18 @@ vector<DeviceInfo>& Device::available_devices() { static vector<DeviceInfo> devices; static bool devices_init = false; + static double device_update_time = 0.0; + + /* only update device list if we're not actively rendering already, things + * could go very wrong if a device suddenly becomes (un)available. also do + * it only every 5 seconds. it not super cpu intensive but don't want to do + * it on every redraw. */ + if(devices_init) { + if(!TaskScheduler::active() && (time_dt() > device_update_time + 5.0)) { + devices.clear(); + devices_init = false; + } + } if(!devices_init) { #ifdef WITH_CUDA @@ -211,6 +224,7 @@ vector<DeviceInfo>& Device::available_devices() #endif devices_init = true; + device_update_time = time_dt(); } return devices; diff --git a/intern/cycles/util/util_task.h b/intern/cycles/util/util_task.h index 401a503f540..a2f284479c7 100644 --- a/intern/cycles/util/util_task.h +++ b/intern/cycles/util/util_task.h @@ -95,6 +95,7 @@ public: static void exit(); static int num_threads() { return threads.size(); } + static bool active() { return users != 0; } protected: friend class TaskPool; |