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            vk::{Format, YcbcrConversionInfo},
7            BackendFormat,
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) }
41            .if_true_some(r)
42    }
43
44    pub fn get_vk_ycbcr_conversion_info(
45        backend_format: &BackendFormat,
46    ) -> Option<&YcbcrConversionInfo> {
47        unsafe {
48            YcbcrConversionInfo::from_native_ptr(sb::C_GrBackendFormats_GetVkYcbcrConversionInfo(
49                backend_format.native(),
50            ))
51            .into_option()
52            .map(|r| &*r)
53        }
54    }
55}
56
57pub mod backend_textures {
58    use skia_bindings as sb;
59
60    use crate::{
61        gpu::{
62            vk::{ImageInfo, ImageLayout},
63            BackendTexture,
64        },
65        prelude::*,
66    };
67
68    #[allow(clippy::missing_safety_doc)]
69    pub unsafe fn make_vk(
70        (width, height): (i32, i32),
71        vk_info: &ImageInfo,
72        label: impl AsRef<str>,
73    ) -> BackendTexture {
74        let label = label.as_ref().as_bytes();
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        .unwrap()
83    }
84
85    pub fn get_vk_image_info(texture: &BackendTexture) -> Option<ImageInfo> {
86        unsafe {
87            // constructor not available.
88            let mut image_info = ImageInfo::default();
89
90            sb::C_GrBackendTextures_GetVkImageInfo(texture.native(), image_info.native_mut())
91                .if_true_some(image_info)
92        }
93    }
94
95    pub fn set_vk_image_layout(
96        texture: &mut BackendTexture,
97        layout: ImageLayout,
98    ) -> &mut BackendTexture {
99        unsafe { sb::C_GrBackendTextures_SetVkImageLayout(texture.native_mut(), layout) }
100        texture
101    }
102}
103
104pub mod backend_render_targets {
105    use skia_bindings as sb;
106
107    use crate::{
108        gpu::{
109            vk::{ImageInfo, ImageLayout},
110            BackendRenderTarget,
111        },
112        prelude::*,
113    };
114
115    pub fn make_vk((width, height): (i32, i32), info: &ImageInfo) -> BackendRenderTarget {
116        BackendRenderTarget::construct(|target| unsafe {
117            sb::C_GrBackendRenderTargets_ConstructVk(target, width, height, info.native())
118        })
119    }
120
121    pub fn get_vk_image_info(target: &BackendRenderTarget) -> Option<ImageInfo> {
122        let mut info = ImageInfo::default();
123        unsafe { sb::C_GrBackendRenderTargets_GetVkImageInfo(target.native(), info.native_mut()) }
124            .if_true_some(info)
125    }
126
127    pub fn set_vk_image_layout(
128        target: &mut BackendRenderTarget,
129        layout: ImageLayout,
130    ) -> &mut BackendRenderTarget {
131        unsafe { sb::C_GrBackendRenderTargets_SetVkImageLayout(target.native_mut(), layout) }
132        target
133    }
134}