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