File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -17,6 +17,17 @@ fn main() {
1717 println ! ( "supported extensions: {:#?}" , extensions) ;
1818 let layers = entry. enumerate_layers ( ) . unwrap ( ) ;
1919 println ! ( "supported layers: {:?}" , layers) ;
20+ println ! ( "layer extensions:" ) ;
21+ for layer in layers {
22+ let extensions = entry. enumerate_layer_extensions ( & layer. layer_name ) . unwrap ( ) ;
23+ let extension_names = extensions. names ( ) ;
24+ if !extension_names. is_empty ( ) {
25+ println ! ( " - {}:" , layer. layer_name) ;
26+ for ext in extension_names {
27+ println ! ( " - {}" , String :: from_utf8_lossy( ext) ) ;
28+ }
29+ }
30+ }
2031 let instance = entry
2132 . create_instance (
2233 & xr:: ApplicationInfo {
Original file line number Diff line number Diff line change @@ -308,6 +308,29 @@ impl Entry {
308308 . collect ( ) )
309309 }
310310 }
311+
312+ /// Determine the set of extensions supported by a given OpenXR API layer
313+ pub fn enumerate_layer_extensions ( & self , api_layers : & str ) -> Result < ExtensionSet > {
314+ let c_str = CString :: new ( api_layers) . map_err ( |_| sys:: Result :: ERROR_API_LAYER_NOT_PRESENT ) ?;
315+ unsafe {
316+ let exts = get_arr_init (
317+ sys:: ExtensionProperties :: out ( ptr:: null_mut ( ) ) ,
318+ |cap, count, buf| {
319+ ( self . fp ( ) . enumerate_instance_extension_properties ) (
320+ c_str. as_ptr ( ) ,
321+ cap,
322+ count,
323+ buf as _ ,
324+ )
325+ } ,
326+ ) ?;
327+ // https://github.com/rust-lang/rust/issues/63569
328+ Ok ( ExtensionSet :: from ( mem:: transmute :: <
329+ & [ std:: mem:: MaybeUninit < sys:: ExtensionProperties > ] ,
330+ & [ sys:: ExtensionProperties ] ,
331+ > ( & exts[ ..] ) ) )
332+ }
333+ }
311334}
312335
313336#[ inline]
You can’t perform that action at this time.
0 commit comments