diff options
Diffstat (limited to 'intern/cycles/device/device.cpp')
-rw-r--r-- | intern/cycles/device/device.cpp | 75 |
1 files changed, 56 insertions, 19 deletions
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index 81574e8b184..14c97affb76 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -20,24 +20,27 @@ #include "bvh/bvh2.h" #include "device/device.h" -#include "device/device_queue.h" +#include "device/queue.h" #include "device/cpu/device.h" +#include "device/cpu/kernel.h" #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" -#include "util/util_foreach.h" -#include "util/util_half.h" -#include "util/util_logging.h" -#include "util/util_math.h" -#include "util/util_string.h" -#include "util/util_system.h" -#include "util/util_time.h" -#include "util/util_types.h" -#include "util/util_vector.h" +#include "util/foreach.h" +#include "util/half.h" +#include "util/log.h" +#include "util/math.h" +#include "util/string.h" +#include "util/system.h" +#include "util/task.h" +#include "util/time.h" +#include "util/types.h" +#include "util/vector.h" CCL_NAMESPACE_BEGIN @@ -48,6 +51,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 */ @@ -71,14 +75,12 @@ void Device::build_bvh(BVH *bvh, Progress &progress, bool refit) Device *Device::create(const DeviceInfo &info, Stats &stats, Profiler &profiler) { -#ifdef WITH_MULTI if (!info.multi_devices.empty()) { /* Always create a multi device when info contains multiple devices. * This is done so that the type can still be e.g. DEVICE_CPU to indicate * that it is a homogeneous collection of devices, which simplifies checks. */ return device_multi_create(info, stats, profiler); } -#endif Device *device = NULL; @@ -106,6 +108,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; } @@ -129,6 +137,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; } @@ -145,6 +155,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 ""; } @@ -162,7 +174,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; } @@ -228,6 +242,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; } @@ -267,6 +295,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; } @@ -287,7 +324,6 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo> &subdevices, info.description = "Multi Device"; info.num = 0; - info.has_half_images = true; info.has_nanovdb = true; info.has_osl = true; info.has_profiling = true; @@ -298,7 +334,7 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo> &subdevices, /* Ensure CPU device does not slow down GPU. */ if (device.type == DEVICE_CPU && subdevices.size() > 1) { if (background) { - int orig_cpu_threads = (threads) ? threads : system_cpu_thread_count(); + int orig_cpu_threads = (threads) ? threads : TaskScheduler::max_concurrency(); int cpu_threads = max(orig_cpu_threads - (subdevices.size() - 1), 0); VLOG(1) << "CPU render threads reduced from " << orig_cpu_threads << " to " << cpu_threads @@ -334,7 +370,6 @@ DeviceInfo Device::get_multi_device(const vector<DeviceInfo> &subdevices, } /* Accumulate device info. */ - info.has_half_images &= device.has_half_images; info.has_nanovdb &= device.has_nanovdb; info.has_osl &= device.has_osl; info.has_profiling &= device.has_profiling; @@ -357,6 +392,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() @@ -365,10 +401,11 @@ unique_ptr<DeviceQueue> Device::gpu_queue_create() return nullptr; } -const CPUKernels *Device::get_cpu_kernels() const +const CPUKernels &Device::get_cpu_kernels() { - LOG(FATAL) << "Device does not support CPU kernels."; - return nullptr; + /* Initialize CPU kernels once and reuse. */ + static CPUKernels kernels; + return kernels; } void Device::get_cpu_kernel_thread_globals( |