Skip to main content

skia_safe/gpu/ganesh/vk/
vk_backend_surface.rs

1pub mod backend_formats {
2    use skia_bindings as sb;
3
4    use crate::{
5        gpu::{
6            BackendFormat,
7            vk::{Format, YcbcrConversionInfo},
8        },
9        prelude::*,
10    };
11
12    pub fn make_vk(
13        format: Format,
14        will_use_drm_format_modifiers: impl Into<Option<bool>>,
15    ) -> BackendFormat {
16        let will_use_drm_format_modifiers = will_use_drm_format_modifiers.into().unwrap_or(false);
17        BackendFormat::construct(|bf| unsafe {
18            sb::C_GrBackendFormat_ConstructVk(bf, format, will_use_drm_format_modifiers)
19        })
20        .assert_valid()
21    }
22
23    pub fn make_vk_ycbcr(
24        conversion_info: &YcbcrConversionInfo,
25        will_use_drm_format_modifiers: impl Into<Option<bool>>,
26    ) -> BackendFormat {
27        let will_use_drm_format_modifiers = will_use_drm_format_modifiers.into().unwrap_or(false);
28        BackendFormat::construct(|bf| unsafe {
29            sb::C_GrBackendFormat_ConstructVk2(
30                bf,
31                conversion_info.native(),
32                will_use_drm_format_modifiers,
33            )
34        })
35        .assert_valid()
36    }
37
38    pub fn as_vk_format(backend_format: &BackendFormat) -> Option<Format> {
39        let mut r = Format::UNDEFINED;
40        unsafe { sb::C_GrBackendFormats_AsVkFormat(backend_format.native(), &mut r) }.then_some(r)
41    }
42
43    pub fn get_vk_ycbcr_conversion_info(
44        backend_format: &BackendFormat,
45    ) -> Option<&YcbcrConversionInfo> {
46        unsafe {
47            YcbcrConversionInfo::from_native_ptr(sb::C_GrBackendFormats_GetVkYcbcrConversionInfo(
48                backend_format.native(),
49            ))
50            .into_non_null()
51            .map(|r| r.as_ref())
52        }
53    }
54}
55
56pub mod backend_textures {
57    use skia_bindings as sb;
58
59    use crate::{
60        gpu::{
61            BackendTexture,
62            vk::{ImageInfo, ImageLayout},
63        },
64        prelude::*,
65    };
66
67    #[allow(clippy::missing_safety_doc)]
68    pub unsafe fn make_vk(
69        (width, height): (i32, i32),
70        vk_info: &ImageInfo,
71        label: impl AsRef<str>,
72    ) -> BackendTexture {
73        let label = label.as_ref().as_bytes();
74        unsafe {
75            BackendTexture::from_native_if_valid(sb::C_GrBackendTexture_newVk(
76                width,
77                height,
78                vk_info.native(),
79                label.as_ptr() as _,
80                label.len(),
81            ))
82        }
83        .unwrap()
84    }
85
86    pub fn get_vk_image_info(texture: &BackendTexture) -> Option<ImageInfo> {
87        unsafe {
88            // constructor not available.
89            let mut image_info = ImageInfo::default();
90
91            sb::C_GrBackendTextures_GetVkImageInfo(texture.native(), image_info.native_mut())
92                .then_some(image_info)
93        }
94    }
95
96    pub fn set_vk_image_layout(
97        texture: &mut BackendTexture,
98        layout: ImageLayout,
99    ) -> &mut BackendTexture {
100        unsafe { sb::C_GrBackendTextures_SetVkImageLayout(texture.native_mut(), layout) }
101        texture
102    }
103}
104
105pub mod backend_render_targets {
106    use skia_bindings as sb;
107
108    use crate::{
109        gpu::{
110            BackendRenderTarget,
111            vk::{ImageInfo, ImageLayout},
112        },
113        prelude::*,
114    };
115
116    pub fn make_vk((width, height): (i32, i32), info: &ImageInfo) -> BackendRenderTarget {
117        BackendRenderTarget::construct(|target| unsafe {
118            sb::C_GrBackendRenderTargets_ConstructVk(target, width, height, info.native())
119        })
120    }
121
122    pub fn get_vk_image_info(target: &BackendRenderTarget) -> Option<ImageInfo> {
123        let mut info = ImageInfo::default();
124        unsafe { sb::C_GrBackendRenderTargets_GetVkImageInfo(target.native(), info.native_mut()) }
125            .then_some(info)
126    }
127
128    pub fn set_vk_image_layout(
129        target: &mut BackendRenderTarget,
130        layout: ImageLayout,
131    ) -> &mut BackendRenderTarget {
132        unsafe { sb::C_GrBackendRenderTargets_SetVkImageLayout(target.native_mut(), layout) }
133        target
134    }
135}