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:
Diffstat (limited to 'intern/cycles/blender/device.cpp')
-rw-r--r--intern/cycles/blender/device.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/intern/cycles/blender/device.cpp b/intern/cycles/blender/device.cpp
new file mode 100644
index 00000000000..9fabc33a96b
--- /dev/null
+++ b/intern/cycles/blender/device.cpp
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "blender/device.h"
+#include "blender/session.h"
+#include "blender/util.h"
+
+#include "util/foreach.h"
+
+CCL_NAMESPACE_BEGIN
+
+enum ComputeDevice {
+ COMPUTE_DEVICE_CPU = 0,
+ COMPUTE_DEVICE_CUDA = 1,
+ COMPUTE_DEVICE_OPTIX = 3,
+ COMPUTE_DEVICE_HIP = 4,
+
+ COMPUTE_DEVICE_NUM
+};
+
+int blender_device_threads(BL::Scene &b_scene)
+{
+ BL::RenderSettings b_r = b_scene.render();
+
+ if (b_r.threads_mode() == BL::RenderSettings::threads_mode_FIXED)
+ return b_r.threads();
+ else
+ return 0;
+}
+
+DeviceInfo blender_device_info(BL::Preferences &b_preferences, BL::Scene &b_scene, bool background)
+{
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+
+ /* Find cycles preferences. */
+ PointerRNA cpreferences;
+ for (BL::Addon &b_addon : b_preferences.addons) {
+ if (b_addon.module() == "cycles") {
+ cpreferences = b_addon.preferences().ptr;
+ break;
+ }
+ }
+
+ /* Default to CPU device. */
+ DeviceInfo device = Device::available_devices(DEVICE_MASK_CPU).front();
+
+ if (BlenderSession::device_override != DEVICE_MASK_ALL) {
+ vector<DeviceInfo> devices = Device::available_devices(BlenderSession::device_override);
+
+ if (devices.empty()) {
+ device = Device::dummy_device("Found no Cycles device of the specified type");
+ }
+ else {
+ int threads = blender_device_threads(b_scene);
+ device = Device::get_multi_device(devices, threads, background);
+ }
+ }
+ else if (get_enum(cscene, "device") == 1) {
+ /* Test if we are using GPU devices. */
+ ComputeDevice compute_device = (ComputeDevice)get_enum(
+ cpreferences, "compute_device_type", COMPUTE_DEVICE_NUM, 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_OPTIX) {
+ mask |= DEVICE_MASK_OPTIX;
+ }
+ else if (compute_device == COMPUTE_DEVICE_HIP) {
+ mask |= DEVICE_MASK_HIP;
+ }
+ vector<DeviceInfo> devices = Device::available_devices(mask);
+
+ /* Match device preferences and available devices. */
+ vector<DeviceInfo> used_devices;
+ RNA_BEGIN (&cpreferences, device, "devices") {
+ if (get_boolean(device, "use")) {
+ string id = get_string(device, "id");
+ foreach (DeviceInfo &info, devices) {
+ if (info.id == id) {
+ used_devices.push_back(info);
+ break;
+ }
+ }
+ }
+ }
+ RNA_END;
+
+ if (!used_devices.empty()) {
+ int threads = blender_device_threads(b_scene);
+ device = Device::get_multi_device(used_devices, threads, background);
+ }
+ /* Else keep using the CPU device that was set before. */
+ }
+ }
+
+ if (!get_boolean(cpreferences, "peer_memory")) {
+ device.has_peer_memory = false;
+ }
+
+ return device;
+}
+
+CCL_NAMESPACE_END