Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/blender/addon/properties.py
| Show First 20 Lines • Show All 1,323 Lines • ▼ Show 20 Lines | |||||
| class CyclesPreferences(bpy.types.AddonPreferences): | class CyclesPreferences(bpy.types.AddonPreferences): | ||||
| bl_idname = __package__ | bl_idname = __package__ | ||||
| def get_device_types(self, context): | def get_device_types(self, context): | ||||
| import _cycles | import _cycles | ||||
| has_cuda, has_opencl = _cycles.get_device_types() | has_cuda, has_opencl = _cycles.get_device_types() | ||||
| list = [('NONE', "None", "Don't use compute device", 0)] | list = [('CPU', "CPU", "Use only CPU for rendering", 0)] | ||||
| if has_cuda: | if has_cuda or has_opencl: | ||||
| list.append(('CUDA', "CUDA", "Use CUDA for GPU acceleration", 1)) | list.append(('GPU', "GPU Compute", "Use GPU acceleration for rendering", 1)) | ||||
| if has_opencl: | |||||
| list.append(('OPENCL', "OpenCL", "Use OpenCL for GPU acceleration", 2)) | |||||
| return list | return list | ||||
| compute_device_type = EnumProperty( | compute_device_type = EnumProperty( | ||||
| name="Compute Device Type", | name="Compute Device Type", | ||||
| description="Device to use for computation (rendering with Cycles)", | description="Device to use for computation (rendering with Cycles)", | ||||
| items=get_device_types, | items=get_device_types, | ||||
| ) | ) | ||||
| devices = bpy.props.CollectionProperty(type=CyclesDeviceSettings) | devices = bpy.props.CollectionProperty(type=CyclesDeviceSettings) | ||||
| def get_devices(self): | def get_devices(self): | ||||
| import _cycles | import _cycles | ||||
| # Layout of the device tuples: (Name, Type, Persistent ID) | # Layout of the device tuples: (Name, Type, Persistent ID) | ||||
| device_list = _cycles.available_devices() | device_list = _cycles.available_devices() | ||||
| cuda_devices = [] | devices = [] | ||||
| opencl_devices = [] | |||||
| cpu_devices = [] | |||||
| for device in device_list: | for device in device_list: | ||||
| if not device[1] in {'CUDA', 'OPENCL', 'CPU'}: | if not device[1] in {'CUDA', 'OPENCL', 'CPU'}: | ||||
| continue | continue | ||||
| entry = None | entry = None | ||||
| # Try to find existing Device entry | # Try to find existing Device entry | ||||
| for dev in self.devices: | for dev in self.devices: | ||||
| if dev.id == device[2] and dev.type == device[1]: | if dev.id == device[2] and dev.type == device[1]: | ||||
| entry = dev | entry = dev | ||||
| break | break | ||||
| if not entry: | if not entry: | ||||
| # Create new entry if no existing one was found | # Create new entry if no existing one was found | ||||
| entry = self.devices.add() | entry = self.devices.add() | ||||
| entry.id = device[2] | entry.id = device[2] | ||||
| entry.name = device[0] | entry.name = device[0] | ||||
| entry.type = device[1] | entry.type = device[1] | ||||
| entry.use = entry.type != 'CPU' | entry.use = entry.type != 'CPU' | ||||
| elif entry.name != device[0]: | elif entry.name != device[0]: | ||||
| # Update name in case it changed | # Update name in case it changed | ||||
| entry.name = device[0] | entry.name = device[0] | ||||
| # Sort entries into lists | devices.append(entry) | ||||
| if entry.type == 'CUDA': | |||||
| cuda_devices.append(entry) | |||||
| elif entry.type == 'OPENCL': | |||||
| opencl_devices.append(entry) | |||||
| else: | |||||
| cpu_devices.append(entry) | |||||
| cuda_devices.extend(cpu_devices) | return devices | ||||
| opencl_devices.extend(cpu_devices) | |||||
| return cuda_devices, opencl_devices | |||||
| def has_active_device(self): | |||||
| if self.compute_device_type != 'GPU': | |||||
| return False | |||||
| def get_num_gpu_devices(self): | |||||
| import _cycles | import _cycles | ||||
| device_list = _cycles.available_devices() | device_list = _cycles.available_devices() | ||||
| num = 0 | num = 0 | ||||
| for device in device_list: | for device in device_list: | ||||
| if device[1] != self.compute_device_type: | if device[1] == 'CPU': | ||||
| continue | continue | ||||
| for dev in self.devices: | for dev in self.devices: | ||||
| if dev.use and dev.id == device[2]: | if dev.use and dev.id == device[2]: | ||||
| num += 1 | num += 1 | ||||
| return num | return num > 0 | ||||
| def has_active_device(self): | |||||
| return self.get_num_gpu_devices() > 0 | |||||
| def draw_impl(self, layout, context): | def draw_impl(self, layout, context): | ||||
| layout.label(text="Cycles Compute Device:") | layout.label(text="Cycles Devices:") | ||||
| layout.row().prop(self, "compute_device_type", expand=True) | layout.row().prop(self, "compute_device_type", expand=True) | ||||
| cuda_devices, opencl_devices = self.get_devices() | devices = self.get_devices() | ||||
| row = layout.row() | row = layout.row() | ||||
| if self.compute_device_type == 'CUDA' and cuda_devices: | if self.compute_device_type == 'GPU': | ||||
| box = row.box() | |||||
| for device in cuda_devices: | |||||
| box.prop(device, "use", text=device.name) | |||||
| if self.compute_device_type == 'OPENCL' and opencl_devices: | |||||
| box = row.box() | box = row.box() | ||||
| for device in opencl_devices: | for device in devices: | ||||
| box.prop(device, "use", text=device.name) | box.prop(device, "use", text=device.name) | ||||
| def draw(self, context): | def draw(self, context): | ||||
| self.draw_impl(self.layout, context) | self.draw_impl(self.layout, context) | ||||
| def register(): | def register(): | ||||
| Show All 29 Lines | |||||