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 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}