From 9558fa5196033390111a2348caa66ab18b8a4f89 Mon Sep 17 00:00:00 2001 From: Michael Jones Date: Tue, 7 Dec 2021 15:11:35 +0000 Subject: Cycles: Metal host-side code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds the Metal host-side code: - Add all core host-side Metal backend files (device_impl, queue, etc) - Add MetalRT BVH setup files - Integrate with Cycles device enumeration code - Revive `path_source_replace_includes` in util/path (required for MSL compilation) This patch also includes a couple of small kernel-side fixes: - Add an implementation of `lgammaf` for Metal [Nemes, Gergő (2010), "New asymptotic expansion for the Gamma function", Archiv der Mathematik](https://users.renyi.hu/~gergonemes/) - include "work_stealing.h" inside the Metal context class because it accesses state now Ref T92212 Reviewed By: brecht Maniphest Tasks: T92212 Differential Revision: https://developer.blender.org/D13423 --- intern/cycles/device/device.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'intern/cycles/device/device.cpp') 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 Device::cuda_devices; vector Device::optix_devices; vector Device::cpu_devices; vector Device::hip_devices; +vector 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 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 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 Device::gpu_queue_create() -- cgit v1.2.3