Fix T53692: OpenCL multi GPU rendering not using all GPUs.

Ensure each OpenCL device has a unique ID even if the hardware ID is not
unique for some reason.
This commit is contained in:
Brecht Van Lommel 2018-01-04 23:29:06 +01:00
parent 2ca933f457
commit 30a0459f2c
Notes: blender-bot 2023-02-14 06:17:13 +01:00
Referenced by issue #53683, 2.79a release
1 changed files with 12 additions and 1 deletions

View File

@ -22,6 +22,7 @@
#include "util/util_foreach.h"
#include "util/util_logging.h"
#include "util/util_set.h"
CCL_NAMESPACE_BEGIN
@ -79,7 +80,9 @@ void device_opencl_info(vector<DeviceInfo>& devices)
OpenCLInfo::get_usable_devices(&usable_devices);
/* Devices are numbered consecutively across platforms. */
int num_devices = 0;
set<string> unique_ids;
foreach(OpenCLPlatformDevice& platform_device, usable_devices) {
/* Compute unique ID for persistent user preferences. */
const string& platform_name = platform_device.platform_name;
const cl_device_type device_type = platform_device.device_type;
const string& device_name = platform_device.device_name;
@ -87,7 +90,15 @@ void device_opencl_info(vector<DeviceInfo>& devices)
if(hardware_id == "") {
hardware_id = string_printf("ID_%d", num_devices);
}
string id = string("OPENCL_") + platform_name + "_" + device_name + "_" + hardware_id;
/* Hardware ID might not be unique, add device number in that case. */
if(unique_ids.find(id) != unique_ids.end()) {
id += string_printf("_ID_%d", num_devices);
}
unique_ids.insert(id);
/* Create DeviceInfo. */
DeviceInfo info;
info.type = DEVICE_OPENCL;
info.description = string_remove_trademark(string(device_name));
@ -98,7 +109,7 @@ void device_opencl_info(vector<DeviceInfo>& devices)
info.pack_images = true;
info.use_split_kernel = OpenCLInfo::kernel_use_split(platform_name,
device_type);
info.id = string("OPENCL_") + platform_name + "_" + device_name + "_" + hardware_id;
info.id = id;
devices.push_back(info);
num_devices++;
}