| 1 | use crate::{gpu, prelude::*, Surface, SurfaceProps}; |
| 2 | use skia_bindings as sb; |
| 3 | |
| 4 | /// Creates [`Surface`] from CAMetalLayer. |
| 5 | /// Returned [`Surface`] takes a reference on the CAMetalLayer. The ref on the layer will be |
| 6 | /// released when the [`Surface`] is destroyed. |
| 7 | /// |
| 8 | /// Only available when Metal API is enabled. |
| 9 | /// |
| 10 | /// Will grab the current drawable from the layer and use its texture as a `backend_rt` to |
| 11 | /// create a renderable surface. |
| 12 | /// |
| 13 | /// * `context` - GPU context |
| 14 | /// * `layer` - [`gpu::mtl::Handle`] (expected to be a CAMetalLayer*) |
| 15 | /// * `sample_cnt` - samples per pixel, or 0 to disable full scene anti-aliasing |
| 16 | /// * `color_space` - range of colors; may be `None` |
| 17 | /// * `surface_props` - LCD striping orientation and setting for device independent |
| 18 | /// fonts; may be `None` |
| 19 | /// * `drawable` - Pointer to drawable to be filled in when this surface is |
| 20 | /// instantiated; may not be `None` |
| 21 | /// |
| 22 | /// Returns: created [`Surface`], or `None` |
| 23 | #[allow (clippy::missing_safety_doc)] |
| 24 | #[allow (clippy::too_many_arguments)] |
| 25 | pub unsafe fn wrap_ca_metal_layer( |
| 26 | context: &mut gpu::RecordingContext, |
| 27 | layer: gpu::mtl::Handle, |
| 28 | origin: gpu::SurfaceOrigin, |
| 29 | sample_cnt: impl Into<Option<usize>>, |
| 30 | color_type: crate::ColorType, |
| 31 | color_space: impl Into<Option<crate::ColorSpace>>, |
| 32 | surface_props: Option<&SurfaceProps>, |
| 33 | drawable: *mut gpu::mtl::Handle, |
| 34 | ) -> Option<Surface> { |
| 35 | Surface::from_ptr(sb::C_SkSurfaces_WrapCAMetalLayer( |
| 36 | context.native_mut(), |
| 37 | layer, |
| 38 | origin, |
| 39 | sample_cnt.into().unwrap_or(0).try_into().unwrap(), |
| 40 | color_type.into_native(), |
| 41 | color_space.into().into_ptr_or_null(), |
| 42 | surface_props.native_ptr_or_null(), |
| 43 | drawable, |
| 44 | )) |
| 45 | } |
| 46 | |
| 47 | /// Creates [`Surface`] from MTKView. |
| 48 | /// Returned [`Surface`] takes a reference on the MTKView. The ref on the layer will be |
| 49 | /// released when the [`Surface`] is destroyed. |
| 50 | /// |
| 51 | /// Only available when Metal API is enabled. |
| 52 | /// |
| 53 | /// Will grab the current drawable from the layer and use its texture as a `backend_rt` to |
| 54 | /// create a renderable surface. |
| 55 | /// |
| 56 | /// * `context` - GPU context |
| 57 | /// * `layer` - [`gpu::mtl::Handle`] (expected to be a MTKView*) |
| 58 | /// * `sample_cnt` - samples per pixel, or 0 to disable full scene anti-aliasing |
| 59 | /// * `color_space` - range of colors; may be `None` |
| 60 | /// * `surface_props` - LCD striping orientation and setting for device independent |
| 61 | /// fonts; may be `None` |
| 62 | /// |
| 63 | /// Returns: created [`Surface`], or `None` |
| 64 | #[allow (clippy::missing_safety_doc)] |
| 65 | #[cfg (feature = "metal" )] |
| 66 | pub unsafe fn wrap_mtk_view( |
| 67 | context: &mut gpu::RecordingContext, |
| 68 | mtk_view: gpu::mtl::Handle, |
| 69 | origin: gpu::SurfaceOrigin, |
| 70 | sample_count: impl Into<Option<usize>>, |
| 71 | color_type: crate::ColorType, |
| 72 | color_space: impl Into<Option<crate::ColorSpace>>, |
| 73 | surface_props: Option<&SurfaceProps>, |
| 74 | ) -> Option<Surface> { |
| 75 | Surface::from_ptr(sb::C_SkSurfaces_WrapMTKView( |
| 76 | context.native_mut(), |
| 77 | mtk_view, |
| 78 | origin, |
| 79 | sample_count.into().unwrap_or(0).try_into().unwrap(), |
| 80 | color_type.into_native(), |
| 81 | color_space.into().into_ptr_or_null(), |
| 82 | surface_props.native_ptr_or_null(), |
| 83 | )) |
| 84 | } |
| 85 | |