Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-29 18:39:30 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-29 19:00:02 +0300
commit001414fb2f7346d2ff332bf851373522d87659d7 (patch)
tree366112462b869a31767d7439b04b900ba21044c1 /intern/cycles/blender/blender_sync.cpp
parente37b9b5d0d2664697de8f1c7614e88073dd8ff49 (diff)
Cycles: delay CUDA and OpenCL initialization to avoid driver crashes.
We've had many reported crashes on Windows where we suspect there is a corrupted OpenCL driver. The purpose here is to keep Blender generally usable in such cases. Now it always shows None / CUDA / OpenCL in the preferences, and only when selecting one will it reveal if there are any GPUs available. This should avoid crashes when opening the preferences or on startup. Differential Revision: https://developer.blender.org/D4265
Diffstat (limited to 'intern/cycles/blender/blender_sync.cpp')
-rw-r--r--intern/cycles/blender/blender_sync.cpp47
1 files changed, 22 insertions, 25 deletions
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 2b73c41fb19..703fcc2078b 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -766,24 +766,18 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
/* Background */
params.background = background;
- /* device type */
- vector<DeviceInfo>& devices = Device::available_devices();
-
- /* device default CPU */
- foreach(DeviceInfo& device, devices) {
- if(device.type == DEVICE_CPU) {
- params.device = device;
- break;
- }
- }
+ /* Default to CPU device. */
+ params.device = Device::available_devices(DEVICE_MASK_CPU).front();
if(get_enum(cscene, "device") == 2) {
- /* find network device */
- foreach(DeviceInfo& info, devices)
- if(info.type == DEVICE_NETWORK)
- params.device = info;
+ /* Find network device. */
+ vector<DeviceInfo> devices = Device::available_devices(DEVICE_MASK_NETWORK);
+ if(!devices.empty()) {
+ params.device = devices.front();
+ }
}
else if(get_enum(cscene, "device") == 1) {
+ /* Find cycles preferences. */
PointerRNA b_preferences;
BL::UserPreferences::addons_iterator b_addon_iter;
@@ -794,6 +788,7 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
}
}
+ /* Test if we are using GPU devices. */
enum ComputeDevice {
COMPUTE_DEVICE_CPU = 0,
COMPUTE_DEVICE_CUDA = 1,
@@ -807,15 +802,20 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
COMPUTE_DEVICE_CPU);
if(compute_device != COMPUTE_DEVICE_CPU) {
+ /* Query GPU devices with matching types. */
+ uint mask = DEVICE_MASK_CPU;
+ if(compute_device == COMPUTE_DEVICE_CUDA) {
+ mask |= DEVICE_MASK_CUDA;
+ }
+ else if(compute_device == COMPUTE_DEVICE_OPENCL) {
+ mask |= DEVICE_MASK_OPENCL;
+ }
+ vector<DeviceInfo> devices = Device::available_devices(mask);
+
+ /* Match device preferences and available devices. */
vector<DeviceInfo> used_devices;
RNA_BEGIN(&b_preferences, device, "devices") {
- ComputeDevice device_type = (ComputeDevice)get_enum(device,
- "type",
- COMPUTE_DEVICE_NUM,
- COMPUTE_DEVICE_CPU);
-
- if(get_boolean(device, "use") &&
- (device_type == compute_device || device_type == COMPUTE_DEVICE_CPU)) {
+ if(get_boolean(device, "use")) {
string id = get_string(device, "id");
foreach(DeviceInfo& info, devices) {
if(info.id == id) {
@@ -826,10 +826,7 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
}
} RNA_END;
- if(used_devices.size() == 1) {
- params.device = used_devices[0];
- }
- else if(used_devices.size() > 1) {
+ if(!used_devices.empty()) {
params.device = Device::get_multi_device(used_devices,
params.threads,
params.background);