Skip to content

Commit 67a22dc

Browse files
yshuiRalith
authored andcommitted
Add enumerate_layer_extensions
For enumerating extensions supported by an API layer.
1 parent 185a6f3 commit 67a22dc

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

openxr/examples/hello.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff 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 {

openxr/src/entry.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff 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]

0 commit comments

Comments
 (0)