diff options
Diffstat (limited to 'intern/cycles/device/device.cpp')
-rw-r--r-- | intern/cycles/device/device.cpp | 40 |
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() |