@@ -46,9 +46,9 @@ pub unsafe fn new_renderer(
_native_window: *mut c_void,
_native_view: *mut c_void,
_bounds: crate::Size<f32>,
- _transparent: bool,
+ transparent: bool,
) -> Renderer {
- MetalRenderer::new(context)
+ MetalRenderer::new(context, transparent)
}
pub(crate) struct InstanceBufferPool {
@@ -128,7 +128,7 @@ pub struct PathRasterizationVertex {
}
impl MetalRenderer {
- pub fn new(instance_buffer_pool: Arc<Mutex<InstanceBufferPool>>) -> Self {
+ pub fn new(instance_buffer_pool: Arc<Mutex<InstanceBufferPool>>, transparent: bool) -> Self {
// Prefer low‐power integrated GPUs on Intel Mac. On Apple
// Silicon, there is only ever one GPU, so this is equivalent to
// `metal::Device::system_default()`.
@@ -152,7 +152,9 @@ impl MetalRenderer {
let layer = metal::MetalLayer::new();
layer.set_device(&device);
layer.set_pixel_format(MTLPixelFormat::BGRA8Unorm);
- layer.set_opaque(false);
+ // Support direct-to-display rendering if the window is not transparent
+ // https://developer.apple.com/documentation/metal/managing-your-game-window-for-metal-in-macos
+ layer.set_opaque(!transparent);
layer.set_maximum_drawable_count(3);
unsafe {
let _: () = msg_send![&*layer, setAllowsNextDrawableTimeout: NO];
@@ -352,8 +354,8 @@ impl MetalRenderer {
}
}
- pub fn update_transparency(&self, _transparent: bool) {
- // todo(mac)?
+ pub fn update_transparency(&self, transparent: bool) {
+ self.layer.set_opaque(!transparent);
}
pub fn destroy(&self) {