skia_safe/gpu/vk/
vulkan_types.rs

1use skia_bindings::{
2    self as sb, skgpu_VulkanAlloc, skgpu_VulkanBackendMemory, skgpu_VulkanYcbcrConversionInfo,
3};
4
5use crate::{gpu::vk, prelude::*};
6
7#[deprecated(since = "0.76.0", note = "Use BackendMemory")]
8pub type GraphicsBackendMemory = skgpu_VulkanBackendMemory;
9pub type BackendMemory = skgpu_VulkanBackendMemory;
10
11#[repr(C)]
12#[derive(Copy, Clone, Debug)]
13pub struct Alloc {
14    pub memory: vk::DeviceMemory,
15    pub offset: vk::DeviceSize,
16    pub size: vk::DeviceSize,
17    pub flags: AllocFlag,
18    pub backend_memory: BackendMemory,
19    uses_system_heap: bool,
20}
21unsafe_send_sync!(Alloc);
22
23native_transmutable!(skgpu_VulkanAlloc, Alloc, alloc_layout);
24
25impl Default for Alloc {
26    fn default() -> Self {
27        Self {
28            memory: vk::NULL_HANDLE.into(),
29            offset: 0,
30            size: 0,
31            flags: AllocFlag::empty(),
32            backend_memory: 0,
33            uses_system_heap: false,
34        }
35    }
36}
37
38impl PartialEq for Alloc {
39    fn eq(&self, other: &Self) -> bool {
40        unsafe { sb::C_VulkanAlloc_Equals(self.native(), other.native()) }
41    }
42}
43
44bitflags! {
45    #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
46    pub struct AllocFlag : u32 {
47        const NONCOHERENT = sb::skgpu_VulkanAlloc_Flag::kNoncoherent_Flag as _;
48        const MAPPABLE = sb::skgpu_VulkanAlloc_Flag::kMappable_Flag as _;
49        const LAZILY_ALLOCATED = sb::skgpu_VulkanAlloc_Flag::kLazilyAllocated_Flag as _;
50    }
51}
52
53impl Alloc {
54    /// # Safety
55    /// The memory's lifetime is expected to outlive the lifetime of the returned object.
56    pub unsafe fn from_device_memory(
57        memory: vk::DeviceMemory,
58        offset: vk::DeviceSize,
59        size: vk::DeviceSize,
60        flags: AllocFlag,
61    ) -> Alloc {
62        Alloc {
63            memory,
64            offset,
65            size,
66            flags,
67            backend_memory: 0,
68            uses_system_heap: false,
69        }
70    }
71}
72
73#[derive(Copy, Clone, Eq, Debug)]
74#[repr(C)]
75pub struct YcbcrConversionInfo {
76    pub format: vk::Format,
77    pub external_format: u64,
78    pub ycbcr_model: vk::SamplerYcbcrModelConversion,
79    pub ycbcr_range: vk::SamplerYcbcrRange,
80    pub x_chroma_offset: vk::ChromaLocation,
81    pub y_chroma_offset: vk::ChromaLocation,
82    pub chroma_filter: vk::Filter,
83    pub force_explicit_reconstruction: vk::Bool32,
84    pub format_features: vk::FormatFeatureFlags,
85    pub components: vk::ComponentMapping,
86}
87
88native_transmutable!(
89    skgpu_VulkanYcbcrConversionInfo,
90    YcbcrConversionInfo,
91    ycbcr_conversion_info_layout
92);
93
94impl PartialEq for YcbcrConversionInfo {
95    fn eq(&self, other: &Self) -> bool {
96        unsafe { sb::C_VulkanYcbcrConversionInfo_Equals(self.native(), other.native()) }
97    }
98}
99
100impl Default for YcbcrConversionInfo {
101    fn default() -> Self {
102        YcbcrConversionInfo {
103            format: vk::Format::UNDEFINED,
104            external_format: 0,
105            ycbcr_model: vk::SamplerYcbcrModelConversion::RGB_IDENTITY,
106            ycbcr_range: vk::SamplerYcbcrRange::ITU_FULL,
107            x_chroma_offset: vk::ChromaLocation::COSITED_EVEN,
108            y_chroma_offset: vk::ChromaLocation::COSITED_EVEN,
109            chroma_filter: vk::Filter::NEAREST,
110            force_explicit_reconstruction: 0,
111            format_features: 0,
112            components: vk::ComponentMapping {
113                r: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
114                g: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
115                b: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
116                a: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
117            },
118        }
119    }
120}
121
122impl YcbcrConversionInfo {
123    #[allow(clippy::too_many_arguments)]
124    pub fn new_with_format(
125        format: vk::Format,
126        external_format: u64,
127        ycbcr_model: vk::SamplerYcbcrModelConversion,
128        ycbcr_range: vk::SamplerYcbcrRange,
129        x_chroma_offset: vk::ChromaLocation,
130        y_chroma_offset: vk::ChromaLocation,
131        chroma_filter: vk::Filter,
132        force_explicit_reconstruction: vk::Bool32,
133        format_features: vk::FormatFeatureFlags,
134    ) -> YcbcrConversionInfo {
135        debug_assert!(ycbcr_model != vk::SamplerYcbcrModelConversion::RGB_IDENTITY);
136        debug_assert!((format != vk::Format::UNDEFINED) ^ (external_format != 0));
137        YcbcrConversionInfo {
138            format,
139            external_format,
140            ycbcr_model,
141            ycbcr_range,
142            x_chroma_offset,
143            y_chroma_offset,
144            chroma_filter,
145            force_explicit_reconstruction,
146            format_features,
147            ..YcbcrConversionInfo::default()
148        }
149    }
150
151    #[allow(clippy::too_many_arguments)]
152    pub fn new(
153        ycbcr_model: vk::SamplerYcbcrModelConversion,
154        ycbcr_range: vk::SamplerYcbcrRange,
155        x_chroma_offset: vk::ChromaLocation,
156        y_chroma_offset: vk::ChromaLocation,
157        chroma_filter: vk::Filter,
158        force_explicit_reconstruction: vk::Bool32,
159        external_format: u64,
160        external_format_features: vk::FormatFeatureFlags,
161    ) -> YcbcrConversionInfo {
162        Self::new_with_format(
163            vk::Format::UNDEFINED,
164            external_format,
165            ycbcr_model,
166            ycbcr_range,
167            x_chroma_offset,
168            y_chroma_offset,
169            chroma_filter,
170            force_explicit_reconstruction,
171            external_format_features,
172        )
173    }
174
175    pub fn is_valid(&self) -> bool {
176        self.ycbcr_model != vk::SamplerYcbcrModelConversion::RGB_IDENTITY
177            || self.external_format != 0
178    }
179}