diff --git a/intern/cycles/blender/display_driver.cpp b/intern/cycles/blender/display_driver.cpp index 13f945ff8d6..2d111e1f6a1 100644 --- a/intern/cycles/blender/display_driver.cpp +++ b/intern/cycles/blender/display_driver.cpp @@ -633,9 +633,10 @@ GraphicsInteropDevice BlenderDisplayDriver::graphics_interop_get_device() interop_device.type = GraphicsInteropDevice::VULKAN; break; case GPU_BACKEND_METAL: + interop_device.type = GraphicsInteropDevice::METAL; + break; case GPU_BACKEND_NONE: case GPU_BACKEND_ANY: - /* Metal not supported yet by Cycles. */ interop_device.type = GraphicsInteropDevice::NONE; break; } @@ -665,9 +666,10 @@ GraphicsInteropBuffer BlenderDisplayDriver::graphics_interop_get_buffer() interop_buffer.type = GraphicsInteropDevice::VULKAN; break; case GPU_BACKEND_METAL: + interop_buffer.type = GraphicsInteropDevice::METAL; + break; case GPU_BACKEND_NONE: case GPU_BACKEND_ANY: - /* Metal not supported yet by Cycles. */ interop_buffer.type = GraphicsInteropDevice::NONE; break; } diff --git a/intern/cycles/device/metal/graphics_interop.h b/intern/cycles/device/metal/graphics_interop.h index 6bfd1d953d6..899c2cbde5c 100644 --- a/intern/cycles/device/metal/graphics_interop.h +++ b/intern/cycles/device/metal/graphics_interop.h @@ -5,6 +5,8 @@ #ifdef WITH_METAL # include "device/graphics_interop.h" +# include "device/metal/device_impl.h" + # include "session/display_driver.h" CCL_NAMESPACE_BEGIN @@ -34,7 +36,7 @@ class MetalDeviceGraphicsInterop : public DeviceGraphicsInterop { MetalDevice *device_ = nullptr; /* Native handle. */ - void *buffer_ = nullptr; + MetalDevice::MetalMem mem_; size_t size_ = 0; /* The destination was requested to be cleared. */ diff --git a/intern/cycles/device/metal/graphics_interop.mm b/intern/cycles/device/metal/graphics_interop.mm index ca9345b88d9..2a1d5f6269d 100644 --- a/intern/cycles/device/metal/graphics_interop.mm +++ b/intern/cycles/device/metal/graphics_interop.mm @@ -22,18 +22,19 @@ void MetalDeviceGraphicsInterop::set_buffer(const GraphicsInteropBuffer &interop /* Trivial implementation due to unified memory. */ if (interop_buffer.type == GraphicsInteropDevice::METAL) { need_clear_ |= interop_buffer.need_clear; - buffer_ = reinterpret_cast(interop_buffer.handle); + mem_.mtlBuffer = reinterpret_cast>(interop_buffer.handle); size_ = interop_buffer.width * interop_buffer.height * sizeof(half4); } } device_ptr MetalDeviceGraphicsInterop::map() { - if (buffer_ && need_clear_) { - memset(buffer_, 0, size_); + if (mem_.mtlBuffer && need_clear_) { + memset([mem_.mtlBuffer contents], 0, size_); + need_clear_ = false; } - return device_ptr(buffer_); + return device_ptr(&mem_); } void MetalDeviceGraphicsInterop::unmap() {} diff --git a/intern/cycles/session/display_driver.h b/intern/cycles/session/display_driver.h index f764c1fd3b4..3cf146b97ed 100644 --- a/intern/cycles/session/display_driver.h +++ b/intern/cycles/session/display_driver.h @@ -41,7 +41,7 @@ class GraphicsInteropBuffer { * - OpenGL: pixel buffer object ID. * - Vulkan on Windows: opaque handle for VkBuffer. * - Vulkan on Unix: opaque file descriptor for VkBuffer. - * - Metal: pixel buffer unified memory pointer. */ + * - Metal: MTLBuffer with unified memory. */ GraphicsInteropDevice::Type type = GraphicsInteropDevice::NONE; int64_t handle = 0; diff --git a/source/blender/gpu/metal/mtl_texture.mm b/source/blender/gpu/metal/mtl_texture.mm index 28d028c8b3f..3d34f76d5a6 100644 --- a/source/blender/gpu/metal/mtl_texture.mm +++ b/source/blender/gpu/metal/mtl_texture.mm @@ -2657,7 +2657,8 @@ GPUPixelBufferNativeHandle MTLPixelBuffer::get_native_handle() } /* Just get pointer to unified memory. No need to unmap. */ - native_handle.handle = reinterpret_cast(map()); + map(); + native_handle.handle = reinterpret_cast(buffer_); native_handle.size = size_; return native_handle;