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/device/device.cpp')
-rw-r--r--intern/cycles/device/device.cpp40
1 files changed, 39 insertions, 1 deletions
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index bfbcdb20d5e..2b067d57158 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -27,6 +27,7 @@
#include "device/cuda/device.h"
#include "device/dummy/device.h"
#include "device/hip/device.h"
+#include "device/metal/device.h"
#include "device/multi/device.h"
#include "device/optix/device.h"
@@ -49,6 +50,7 @@ vector<DeviceInfo> Device::cuda_devices;
vector<DeviceInfo> Device::optix_devices;
vector<DeviceInfo> Device::cpu_devices;
vector<DeviceInfo> Device::hip_devices;
+vector<DeviceInfo> Device::metal_devices;
uint Device::devices_initialized_mask = 0;
/* Device */
@@ -105,6 +107,12 @@ Device *Device::create(const DeviceInfo &info, Stats &stats, Profiler &profiler)
break;
#endif
+#ifdef WITH_METAL
+ case DEVICE_METAL:
+ if (device_metal_init())
+ device = device_metal_create(info, stats, profiler);
+ break;
+#endif
default:
break;
}
@@ -128,6 +136,8 @@ DeviceType Device::type_from_string(const char *name)
return DEVICE_MULTI;
else if (strcmp(name, "HIP") == 0)
return DEVICE_HIP;
+ else if (strcmp(name, "METAL") == 0)
+ return DEVICE_METAL;
return DEVICE_NONE;
}
@@ -144,6 +154,8 @@ string Device::string_from_type(DeviceType type)
return "MULTI";
else if (type == DEVICE_HIP)
return "HIP";
+ else if (type == DEVICE_METAL)
+ return "METAL";
return "";
}
@@ -161,7 +173,9 @@ vector<DeviceType> Device::available_types()
#ifdef WITH_HIP
types.push_back(DEVICE_HIP);
#endif
-
+#ifdef WITH_METAL
+ types.push_back(DEVICE_METAL);
+#endif
return types;
}
@@ -227,6 +241,20 @@ vector<DeviceInfo> Device::available_devices(uint mask)
}
}
+#ifdef WITH_METAL
+ if (mask & DEVICE_MASK_METAL) {
+ if (!(devices_initialized_mask & DEVICE_MASK_METAL)) {
+ if (device_metal_init()) {
+ device_metal_info(metal_devices);
+ }
+ devices_initialized_mask |= DEVICE_MASK_METAL;
+ }
+ foreach (DeviceInfo &info, metal_devices) {
+ devices.push_back(info);
+ }
+ }
+#endif
+
return devices;
}
@@ -266,6 +294,15 @@ string Device::device_capabilities(uint mask)
}
#endif
+#ifdef WITH_METAL
+ if (mask & DEVICE_MASK_METAL) {
+ if (device_metal_init()) {
+ capabilities += "\nMetal device capabilities:\n";
+ capabilities += device_metal_capabilities();
+ }
+ }
+#endif
+
return capabilities;
}
@@ -354,6 +391,7 @@ void Device::free_memory()
optix_devices.free_memory();
hip_devices.free_memory();
cpu_devices.free_memory();
+ metal_devices.free_memory();
}
unique_ptr<DeviceQueue> Device::gpu_queue_create()