1use crate::{VulkanDevice, ffi};
7#[cfg(feature = "v1_26")]
8#[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
9use glib::object::ObjectType as _;
10use glib::{
11 prelude::*,
12 signal::{SignalHandlerId, connect_raw},
13 translate::*,
14};
15use std::boxed::Box as Box_;
16
17glib::wrapper! {
18 #[doc(alias = "GstVulkanInstance")]
19 pub struct VulkanInstance(Object<ffi::GstVulkanInstance, ffi::GstVulkanInstanceClass>) @extends gst::Object;
20
21 match fn {
22 type_ => || ffi::gst_vulkan_instance_get_type(),
23 }
24}
25
26impl VulkanInstance {
27 pub const NONE: Option<&'static VulkanInstance> = None;
28
29 #[doc(alias = "gst_vulkan_instance_new")]
30 pub fn new() -> VulkanInstance {
31 assert_initialized_main_thread!();
32 unsafe { from_glib_full(ffi::gst_vulkan_instance_new()) }
33 }
34
35 #[doc(alias = "gst_vulkan_instance_handle_context_query")]
36 pub fn handle_context_query(
37 element: &impl IsA<gst::Element>,
38 query: &gst::Query,
39 instance: Option<&impl IsA<VulkanInstance>>,
40 ) -> bool {
41 assert_initialized_main_thread!();
42 unsafe {
43 from_glib(ffi::gst_vulkan_instance_handle_context_query(
44 element.as_ref().to_glib_none().0,
45 query.to_glib_none().0,
46 instance.map(|p| p.as_ref()).to_glib_none().0,
47 ))
48 }
49 }
50
51 }
56
57impl Default for VulkanInstance {
58 fn default() -> Self {
59 Self::new()
60 }
61}
62
63unsafe impl Send for VulkanInstance {}
64unsafe impl Sync for VulkanInstance {}
65
66pub trait VulkanInstanceExt: IsA<VulkanInstance> + 'static {
67 #[cfg(feature = "v1_26")]
68 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
69 #[doc(alias = "gst_vulkan_instance_check_api_version")]
70 fn check_api_version(&self, major: u32, minor: u32, patch: u32) -> bool {
71 unsafe {
72 from_glib(ffi::gst_vulkan_instance_check_api_version(
73 self.as_ref().to_glib_none().0,
74 major,
75 minor,
76 patch,
77 ))
78 }
79 }
80
81 #[doc(alias = "gst_vulkan_instance_check_version")]
82 fn check_version(&self, major: u32, minor: u32, patch: u32) -> bool {
83 unsafe {
84 from_glib(ffi::gst_vulkan_instance_check_version(
85 self.as_ref().to_glib_none().0,
86 major,
87 minor,
88 patch,
89 ))
90 }
91 }
92
93 #[doc(alias = "gst_vulkan_instance_create_device")]
94 fn create_device(&self) -> Result<VulkanDevice, glib::Error> {
95 unsafe {
96 let mut error = std::ptr::null_mut();
97 let ret =
98 ffi::gst_vulkan_instance_create_device(self.as_ref().to_glib_none().0, &mut error);
99 if error.is_null() {
100 Ok(from_glib_full(ret))
101 } else {
102 Err(from_glib_full(error))
103 }
104 }
105 }
106
107 #[cfg(feature = "v1_26")]
108 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
109 #[doc(alias = "gst_vulkan_instance_create_device_with_index")]
110 fn create_device_with_index(&self, device_index: u32) -> Result<VulkanDevice, glib::Error> {
111 unsafe {
112 let mut error = std::ptr::null_mut();
113 let ret = ffi::gst_vulkan_instance_create_device_with_index(
114 self.as_ref().to_glib_none().0,
115 device_index,
116 &mut error,
117 );
118 if error.is_null() {
119 Ok(from_glib_full(ret))
120 } else {
121 Err(from_glib_full(error))
122 }
123 }
124 }
125
126 #[doc(alias = "gst_vulkan_instance_disable_extension")]
127 fn disable_extension(&self, name: &str) -> bool {
128 unsafe {
129 from_glib(ffi::gst_vulkan_instance_disable_extension(
130 self.as_ref().to_glib_none().0,
131 name.to_glib_none().0,
132 ))
133 }
134 }
135
136 #[doc(alias = "gst_vulkan_instance_enable_extension")]
137 fn enable_extension(&self, name: &str) -> bool {
138 unsafe {
139 from_glib(ffi::gst_vulkan_instance_enable_extension(
140 self.as_ref().to_glib_none().0,
141 name.to_glib_none().0,
142 ))
143 }
144 }
145
146 #[doc(alias = "gst_vulkan_instance_enable_layer")]
147 fn enable_layer(&self, name: &str) -> bool {
148 unsafe {
149 from_glib(ffi::gst_vulkan_instance_enable_layer(
150 self.as_ref().to_glib_none().0,
151 name.to_glib_none().0,
152 ))
153 }
154 }
155
156 #[doc(alias = "gst_vulkan_instance_fill_info")]
157 fn fill_info(&self) -> Result<(), glib::Error> {
158 unsafe {
159 let mut error = std::ptr::null_mut();
160 let is_ok =
161 ffi::gst_vulkan_instance_fill_info(self.as_ref().to_glib_none().0, &mut error);
162 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
163 if error.is_null() {
164 Ok(())
165 } else {
166 Err(from_glib_full(error))
167 }
168 }
169 }
170
171 #[cfg(feature = "v1_26")]
172 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
173 #[doc(alias = "gst_vulkan_instance_get_api_version")]
174 #[doc(alias = "get_api_version")]
175 fn api_version(&self) -> (u32, u32, u32) {
176 unsafe {
177 let mut major = std::mem::MaybeUninit::uninit();
178 let mut minor = std::mem::MaybeUninit::uninit();
179 let mut patch = std::mem::MaybeUninit::uninit();
180 ffi::gst_vulkan_instance_get_api_version(
181 self.as_ref().to_glib_none().0,
182 major.as_mut_ptr(),
183 minor.as_mut_ptr(),
184 patch.as_mut_ptr(),
185 );
186 (
187 major.assume_init(),
188 minor.assume_init(),
189 patch.assume_init(),
190 )
191 }
192 }
193
194 #[doc(alias = "gst_vulkan_instance_get_extension_info")]
195 #[doc(alias = "get_extension_info")]
196 fn extension_info(&self, name: &str) -> Option<u32> {
197 unsafe {
198 let mut spec_version = std::mem::MaybeUninit::uninit();
199 let ret = from_glib(ffi::gst_vulkan_instance_get_extension_info(
200 self.as_ref().to_glib_none().0,
201 name.to_glib_none().0,
202 spec_version.as_mut_ptr(),
203 ));
204 if ret {
205 Some(spec_version.assume_init())
206 } else {
207 None
208 }
209 }
210 }
211
212 #[doc(alias = "gst_vulkan_instance_get_layer_info")]
213 #[doc(alias = "get_layer_info")]
214 fn layer_info(&self, name: &str) -> Option<(Option<glib::GString>, u32, u32)> {
215 unsafe {
216 let mut description = std::ptr::null_mut();
217 let mut spec_version = std::mem::MaybeUninit::uninit();
218 let mut implementation_version = std::mem::MaybeUninit::uninit();
219 let ret = from_glib(ffi::gst_vulkan_instance_get_layer_info(
220 self.as_ref().to_glib_none().0,
221 name.to_glib_none().0,
222 &mut description,
223 spec_version.as_mut_ptr(),
224 implementation_version.as_mut_ptr(),
225 ));
226 if ret {
227 Some((
228 from_glib_full(description),
229 spec_version.assume_init(),
230 implementation_version.assume_init(),
231 ))
232 } else {
233 None
234 }
235 }
236 }
237
238 #[doc(alias = "gst_vulkan_instance_get_version")]
245 #[doc(alias = "get_version")]
246 fn version(&self) -> (u32, u32, u32) {
247 unsafe {
248 let mut major = std::mem::MaybeUninit::uninit();
249 let mut minor = std::mem::MaybeUninit::uninit();
250 let mut patch = std::mem::MaybeUninit::uninit();
251 ffi::gst_vulkan_instance_get_version(
252 self.as_ref().to_glib_none().0,
253 major.as_mut_ptr(),
254 minor.as_mut_ptr(),
255 patch.as_mut_ptr(),
256 );
257 (
258 major.assume_init(),
259 minor.assume_init(),
260 patch.assume_init(),
261 )
262 }
263 }
264
265 #[doc(alias = "gst_vulkan_instance_is_extension_enabled")]
266 fn is_extension_enabled(&self, name: &str) -> bool {
267 unsafe {
268 from_glib(ffi::gst_vulkan_instance_is_extension_enabled(
269 self.as_ref().to_glib_none().0,
270 name.to_glib_none().0,
271 ))
272 }
273 }
274
275 #[doc(alias = "gst_vulkan_instance_is_layer_enabled")]
276 fn is_layer_enabled(&self, name: &str) -> bool {
277 unsafe {
278 from_glib(ffi::gst_vulkan_instance_is_layer_enabled(
279 self.as_ref().to_glib_none().0,
280 name.to_glib_none().0,
281 ))
282 }
283 }
284
285 #[doc(alias = "gst_vulkan_instance_open")]
286 fn open(&self) -> Result<(), glib::Error> {
287 unsafe {
288 let mut error = std::ptr::null_mut();
289 let is_ok = ffi::gst_vulkan_instance_open(self.as_ref().to_glib_none().0, &mut error);
290 debug_assert_eq!(is_ok == glib::ffi::GFALSE, !error.is_null());
291 if error.is_null() {
292 Ok(())
293 } else {
294 Err(from_glib_full(error))
295 }
296 }
297 }
298
299 #[doc(alias = "requested-api-major")]
300 fn requested_api_major(&self) -> u32 {
301 ObjectExt::property(self.as_ref(), "requested-api-major")
302 }
303
304 #[doc(alias = "requested-api-major")]
305 fn set_requested_api_major(&self, requested_api_major: u32) {
306 ObjectExt::set_property(self.as_ref(), "requested-api-major", requested_api_major)
307 }
308
309 #[doc(alias = "requested-api-minor")]
310 fn requested_api_minor(&self) -> u32 {
311 ObjectExt::property(self.as_ref(), "requested-api-minor")
312 }
313
314 #[doc(alias = "requested-api-minor")]
315 fn set_requested_api_minor(&self, requested_api_minor: u32) {
316 ObjectExt::set_property(self.as_ref(), "requested-api-minor", requested_api_minor)
317 }
318
319 #[cfg(feature = "v1_26")]
320 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
321 #[doc(alias = "create-device")]
322 fn connect_create_device<F: Fn(&Self, u32) -> VulkanDevice + Send + Sync + 'static>(
323 &self,
324 f: F,
325 ) -> SignalHandlerId {
326 unsafe extern "C" fn create_device_trampoline<
327 P: IsA<VulkanInstance>,
328 F: Fn(&P, u32) -> VulkanDevice + Send + Sync + 'static,
329 >(
330 this: *mut ffi::GstVulkanInstance,
331 device_index: std::ffi::c_uint,
332 f: glib::ffi::gpointer,
333 ) -> *mut ffi::GstVulkanDevice {
334 unsafe {
335 let f: &F = &*(f as *const F);
336 f(
337 VulkanInstance::from_glib_borrow(this).unsafe_cast_ref(),
338 device_index,
339 )
340 .to_glib_full()
341 }
342 }
343 unsafe {
344 let f: Box_<F> = Box_::new(f);
345 connect_raw(
346 self.as_ptr() as *mut _,
347 c"create-device".as_ptr(),
348 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
349 create_device_trampoline::<Self, F> as *const (),
350 )),
351 Box_::into_raw(f),
352 )
353 }
354 }
355
356 #[doc(alias = "requested-api-major")]
357 fn connect_requested_api_major_notify<F: Fn(&Self) + Send + Sync + 'static>(
358 &self,
359 f: F,
360 ) -> SignalHandlerId {
361 unsafe extern "C" fn notify_requested_api_major_trampoline<
362 P: IsA<VulkanInstance>,
363 F: Fn(&P) + Send + Sync + 'static,
364 >(
365 this: *mut ffi::GstVulkanInstance,
366 _param_spec: glib::ffi::gpointer,
367 f: glib::ffi::gpointer,
368 ) {
369 unsafe {
370 let f: &F = &*(f as *const F);
371 f(VulkanInstance::from_glib_borrow(this).unsafe_cast_ref())
372 }
373 }
374 unsafe {
375 let f: Box_<F> = Box_::new(f);
376 connect_raw(
377 self.as_ptr() as *mut _,
378 c"notify::requested-api-major".as_ptr(),
379 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
380 notify_requested_api_major_trampoline::<Self, F> as *const (),
381 )),
382 Box_::into_raw(f),
383 )
384 }
385 }
386
387 #[doc(alias = "requested-api-minor")]
388 fn connect_requested_api_minor_notify<F: Fn(&Self) + Send + Sync + 'static>(
389 &self,
390 f: F,
391 ) -> SignalHandlerId {
392 unsafe extern "C" fn notify_requested_api_minor_trampoline<
393 P: IsA<VulkanInstance>,
394 F: Fn(&P) + Send + Sync + 'static,
395 >(
396 this: *mut ffi::GstVulkanInstance,
397 _param_spec: glib::ffi::gpointer,
398 f: glib::ffi::gpointer,
399 ) {
400 unsafe {
401 let f: &F = &*(f as *const F);
402 f(VulkanInstance::from_glib_borrow(this).unsafe_cast_ref())
403 }
404 }
405 unsafe {
406 let f: Box_<F> = Box_::new(f);
407 connect_raw(
408 self.as_ptr() as *mut _,
409 c"notify::requested-api-minor".as_ptr(),
410 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
411 notify_requested_api_minor_trampoline::<Self, F> as *const (),
412 )),
413 Box_::into_raw(f),
414 )
415 }
416 }
417}
418
419impl<O: IsA<VulkanInstance>> VulkanInstanceExt for O {}