diff options
author | Michael Jones <michael_p_jones@apple.com> | 2021-12-07 18:11:35 +0300 |
---|---|---|
committer | Michael Jones <michael_p_jones@apple.com> | 2021-12-07 18:52:21 +0300 |
commit | 9558fa5196033390111a2348caa66ab18b8a4f89 (patch) | |
tree | acc3ed446f709390abfef5f97f82c1ed9abe0100 /intern/cycles/device/metal/device_impl.h | |
parent | 565b33c0ad31966b860123837d2c4b5a8cbedad2 (diff) |
Cycles: Metal host-side code
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
Diffstat (limited to 'intern/cycles/device/metal/device_impl.h')
-rw-r--r-- | intern/cycles/device/metal/device_impl.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/intern/cycles/device/metal/device_impl.h b/intern/cycles/device/metal/device_impl.h new file mode 100644 index 00000000000..a420a3ba704 --- /dev/null +++ b/intern/cycles/device/metal/device_impl.h @@ -0,0 +1,166 @@ +/* + * Copyright 2021 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. + */ + +#pragma once + +#ifdef WITH_METAL + +# include "bvh/bvh.h" +# include "device/device.h" +# include "device/metal/bvh.h" +# include "device/metal/device.h" +# include "device/metal/kernel.h" +# include "device/metal/queue.h" +# include "device/metal/util.h" + +# include <Metal/Metal.h> + +CCL_NAMESPACE_BEGIN + +class DeviceQueue; + +class MetalDevice : public Device { + public: + id<MTLDevice> mtlDevice = nil; + id<MTLLibrary> mtlLibrary[PSO_NUM] = {nil}; + id<MTLArgumentEncoder> mtlBufferKernelParamsEncoder = + nil; /* encoder used for fetching device pointers from MTLBuffers */ + id<MTLCommandQueue> mtlGeneralCommandQueue = nil; + id<MTLArgumentEncoder> mtlAncillaryArgEncoder = + nil; /* encoder used for fetching device pointers from MTLBuffers */ + string source_used_for_compile[PSO_NUM]; + + KernelParamsMetal launch_params = {0}; + + /* MetalRT members ----------------------------------*/ + BVHMetal *bvhMetalRT = nullptr; + bool motion_blur = false; + id<MTLArgumentEncoder> mtlASArgEncoder = + nil; /* encoder used for fetching device pointers from MTLAccelerationStructure */ + /*---------------------------------------------------*/ + + string device_name; + MetalGPUVendor device_vendor; + + uint kernel_features; + MTLResourceOptions default_storage_mode; + int max_threads_per_threadgroup; + + int mtlDevId = 0; + bool first_error = true; + + struct MetalMem { + device_memory *mem = nullptr; + int pointer_index = -1; + id<MTLBuffer> mtlBuffer = nil; + id<MTLTexture> mtlTexture = nil; + uint64_t offset = 0; + uint64_t size = 0; + void *hostPtr = nullptr; + bool use_UMA = false; /* If true, UMA memory in shared_pointer is being used. */ + }; + typedef map<device_memory *, unique_ptr<MetalMem>> MetalMemMap; + MetalMemMap metal_mem_map; + std::vector<id<MTLResource>> delayed_free_list; + std::recursive_mutex metal_mem_map_mutex; + + /* Bindless Textures */ + device_vector<TextureInfo> texture_info; + bool need_texture_info; + id<MTLArgumentEncoder> mtlTextureArgEncoder = nil; + id<MTLBuffer> texture_bindings_2d = nil; + id<MTLBuffer> texture_bindings_3d = nil; + std::vector<id<MTLTexture>> texture_slot_map; + + MetalDeviceKernels kernels; + bool use_metalrt = false; + bool use_function_specialisation = false; + + virtual BVHLayoutMask get_bvh_layout_mask() const override; + + void set_error(const string &error) override; + + MetalDevice(const DeviceInfo &info, Stats &stats, Profiler &profiler); + + virtual ~MetalDevice(); + + bool support_device(const uint /*kernel_features*/); + + bool check_peer_access(Device *peer_device) override; + + bool use_adaptive_compilation(); + + string get_source(const uint kernel_features); + + string compile_kernel(const uint kernel_features, const char *name); + + virtual bool load_kernels(const uint kernel_features) override; + + void reserve_local_memory(const uint kernel_features); + + void init_host_memory(); + + void load_texture_info(); + + virtual bool should_use_graphics_interop() override; + + virtual unique_ptr<DeviceQueue> gpu_queue_create() override; + + virtual void build_bvh(BVH *bvh, Progress &progress, bool refit) override; + + /* ------------------------------------------------------------------ */ + /* low-level memory management */ + + MetalMem *generic_alloc(device_memory &mem); + + void generic_copy_to(device_memory &mem); + + void generic_free(device_memory &mem); + + void mem_alloc(device_memory &mem) override; + + void mem_copy_to(device_memory &mem) override; + + void mem_copy_from(device_memory &mem) + { + mem_copy_from(mem, -1, -1, -1, -1); + } + void mem_copy_from(device_memory &mem, size_t y, size_t w, size_t h, size_t elem) override; + + void mem_zero(device_memory &mem) override; + + void mem_free(device_memory &mem) override; + + device_ptr mem_alloc_sub_ptr(device_memory &mem, size_t offset, size_t /*size*/) override; + + virtual void const_copy_to(const char *name, void *host, size_t size) override; + + void global_alloc(device_memory &mem); + + void global_free(device_memory &mem); + + void tex_alloc(device_texture &mem); + + void tex_alloc_as_buffer(device_texture &mem); + + void tex_free(device_texture &mem); + + void flush_delayed_free_list(); +}; + +CCL_NAMESPACE_END + +#endif |