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);
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!(skgpu_VulkanYcbcrConversionInfo, YcbcrConversionInfo);
89
90impl PartialEq for YcbcrConversionInfo {
91    fn eq(&self, other: &Self) -> bool {
92        unsafe { sb::C_VulkanYcbcrConversionInfo_Equals(self.native(), other.native()) }
93    }
94}
95
96impl Default for YcbcrConversionInfo {
97    fn default() -> Self {
98        YcbcrConversionInfo {
99            format: vk::Format::UNDEFINED,
100            external_format: 0,
101            ycbcr_model: vk::SamplerYcbcrModelConversion::RGB_IDENTITY,
102            ycbcr_range: vk::SamplerYcbcrRange::ITU_FULL,
103            x_chroma_offset: vk::ChromaLocation::COSITED_EVEN,
104            y_chroma_offset: vk::ChromaLocation::COSITED_EVEN,
105            chroma_filter: vk::Filter::NEAREST,
106            force_explicit_reconstruction: 0,
107            format_features: 0,
108            components: vk::ComponentMapping {
109                r: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
110                g: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
111                b: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
112                a: vk::ComponentSwizzle::VK_COMPONENT_SWIZZLE_IDENTITY,
113            },
114        }
115    }
116}
117
118impl YcbcrConversionInfo {
119    #[allow(clippy::too_many_arguments)]
120    pub fn new_with_format(
121        format: vk::Format,
122        external_format: u64,
123        ycbcr_model: vk::SamplerYcbcrModelConversion,
124        ycbcr_range: vk::SamplerYcbcrRange,
125        x_chroma_offset: vk::ChromaLocation,
126        y_chroma_offset: vk::ChromaLocation,
127        chroma_filter: vk::Filter,
128        force_explicit_reconstruction: vk::Bool32,
129        format_features: vk::FormatFeatureFlags,
130    ) -> YcbcrConversionInfo {
131        debug_assert!(ycbcr_model != vk::SamplerYcbcrModelConversion::RGB_IDENTITY);
132        debug_assert!((format != vk::Format::UNDEFINED) ^ (external_format != 0));
133        YcbcrConversionInfo {
134            format,
135            external_format,
136            ycbcr_model,
137            ycbcr_range,
138            x_chroma_offset,
139            y_chroma_offset,
140            chroma_filter,
141            force_explicit_reconstruction,
142            format_features,
143            ..YcbcrConversionInfo::default()
144        }
145    }
146
147    #[allow(clippy::too_many_arguments)]
148    pub fn new(
149        ycbcr_model: vk::SamplerYcbcrModelConversion,
150        ycbcr_range: vk::SamplerYcbcrRange,
151        x_chroma_offset: vk::ChromaLocation,
152        y_chroma_offset: vk::ChromaLocation,
153        chroma_filter: vk::Filter,
154        force_explicit_reconstruction: vk::Bool32,
155        external_format: u64,
156        external_format_features: vk::FormatFeatureFlags,
157    ) -> YcbcrConversionInfo {
158        Self::new_with_format(
159            vk::Format::UNDEFINED,
160            external_format,
161            ycbcr_model,
162            ycbcr_range,
163            x_chroma_offset,
164            y_chroma_offset,
165            chroma_filter,
166            force_explicit_reconstruction,
167            external_format_features,
168        )
169    }
170
171    pub fn is_valid(&self) -> bool {
172        self.ycbcr_model != vk::SamplerYcbcrModelConversion::RGB_IDENTITY
173            || self.external_format != 0
174    }
175}