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-30 20:36:54 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-01-30 20:36:54 +0300
commitf4b1f1f0beece897df0a9013adf2253e89a85975 (patch)
tree936e13ede178105f13396008076db7a955bc97a9 /intern/cycles/blender
parentab682b15582bfc2e550f979c34f2f2b27629ea3d (diff)
parent001414fb2f7346d2ff332bf851373522d87659d7 (diff)
Merge branch 'blender2.7'
Diffstat (limited to 'intern/cycles/blender')
-rw-r--r--intern/cycles/blender/addon/properties.py41
-rw-r--r--intern/cycles/blender/blender_python.cpp23
-rw-r--r--intern/cycles/blender/blender_sync.cpp47
3 files changed, 62 insertions, 49 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 8250100f204..c60db9ffc2b 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1453,7 +1453,7 @@ class CyclesPreferences(bpy.types.AddonPreferences):
def get_devices(self):
import _cycles
# Layout of the device tuples: (Name, Type, Persistent ID)
- device_list = _cycles.available_devices()
+ device_list = _cycles.available_devices(self.compute_device_type)
# Make sure device entries are up to date and not referenced before
# we know we don't add new devices. This way we guarantee to not
# hold pointers to a resized array.
@@ -1477,7 +1477,7 @@ class CyclesPreferences(bpy.types.AddonPreferences):
def get_num_gpu_devices(self):
import _cycles
- device_list = _cycles.available_devices()
+ device_list = _cycles.available_devices(self.compute_device_type)
num = 0
for device in device_list:
if device[1] != self.compute_device_type:
@@ -1490,25 +1490,32 @@ class CyclesPreferences(bpy.types.AddonPreferences):
def has_active_device(self):
return self.get_num_gpu_devices() > 0
- def draw_impl(self, layout, context):
- available_device_types = self.get_device_types(context)
- if len(available_device_types) == 1:
- layout.label(text="No compatible GPUs found", icon='INFO')
+ def _draw_devices(self, layout, device_type, devices):
+ box = layout.box()
+
+ found_device = False
+ for device in devices:
+ if device.type == device_type:
+ found_device = True
+ break
+
+ if not found_device:
+ box.label(text="No compatible GPUs found", icon='INFO')
return
- layout.row().prop(self, "compute_device_type", expand=True)
- cuda_devices, opencl_devices = self.get_devices()
- row = layout.row()
+ for device in devices:
+ box.prop(device, "use", text=device.name)
- if self.compute_device_type == 'CUDA' and cuda_devices:
- box = row.box()
- for device in cuda_devices:
- box.prop(device, "use", text=device.name)
+ def draw_impl(self, layout, context):
+ row = layout.row()
+ row.prop(self, "compute_device_type", expand=True)
- if self.compute_device_type == 'OPENCL' and opencl_devices:
- box = row.box()
- for device in opencl_devices:
- box.prop(device, "use", text=device.name)
+ cuda_devices, opencl_devices = self.get_devices()
+ row = layout.row()
+ if self.compute_device_type == 'CUDA':
+ self._draw_devices(row, 'CUDA', cuda_devices)
+ elif self.compute_device_type == 'OPENCL':
+ self._draw_devices(row, 'OPENCL', opencl_devices)
def draw(self, context):
self.draw_impl(self.layout, context)
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index bf5c2432bc7..d111a1c1f1d 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -388,9 +388,18 @@ static PyObject *sync_func(PyObject * /*self*/, PyObject *args)
Py_RETURN_NONE;
}
-static PyObject *available_devices_func(PyObject * /*self*/, PyObject * /*args*/)
+static PyObject *available_devices_func(PyObject * /*self*/, PyObject * args)
{
- vector<DeviceInfo>& devices = Device::available_devices();
+ const char *type_name;
+ if(!PyArg_ParseTuple(args, "s", &type_name)) {
+ return NULL;
+ }
+
+ DeviceType type = Device::type_from_string(type_name);
+ uint mask = (type == DEVICE_NONE) ? DEVICE_MASK_ALL : DEVICE_MASK(type);
+ mask |= DEVICE_MASK_CPU;
+
+ vector<DeviceInfo> devices = Device::available_devices(mask);
PyObject *ret = PyTuple_New(devices.size());
for(size_t i = 0; i < devices.size(); i++) {
@@ -746,11 +755,11 @@ static PyObject *enable_print_stats_func(PyObject * /*self*/, PyObject * /*args*
static PyObject *get_device_types_func(PyObject * /*self*/, PyObject * /*args*/)
{
- vector<DeviceInfo>& devices = Device::available_devices();
+ vector<DeviceType> device_types = Device::available_types();
bool has_cuda = false, has_opencl = false;
- for(int i = 0; i < devices.size(); i++) {
- has_cuda |= (devices[i].type == DEVICE_CUDA);
- has_opencl |= (devices[i].type == DEVICE_OPENCL);
+ foreach(DeviceType device_type, device_types) {
+ has_cuda |= (device_type == DEVICE_CUDA);
+ has_opencl |= (device_type == DEVICE_OPENCL);
}
PyObject *list = PyTuple_New(2);
PyTuple_SET_ITEM(list, 0, PyBool_FromLong(has_cuda));
@@ -772,7 +781,7 @@ static PyMethodDef methods[] = {
{"osl_update_node", osl_update_node_func, METH_VARARGS, ""},
{"osl_compile", osl_compile_func, METH_VARARGS, ""},
#endif
- {"available_devices", available_devices_func, METH_NOARGS, ""},
+ {"available_devices", available_devices_func, METH_VARARGS, ""},
{"system_info", system_info_func, METH_NOARGS, ""},
#ifdef WITH_OPENCL
{"opencl_disable", opencl_disable_func, METH_NOARGS, ""},
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 60192bfa8f8..e41a80a14a5 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -741,24 +741,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::Preferences::addons_iterator b_addon_iter;
@@ -769,6 +763,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,
@@ -782,15 +777,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) {
@@ -801,10 +801,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);