Skip to content

Commit

Permalink
extensions/khr: Add VK_KHR_pipeline_binary extension
Browse files Browse the repository at this point in the history
  • Loading branch information
MarijnS95 committed Dec 2, 2024
1 parent 0b5b1a4 commit dd71365
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added `VK_KHR_get_display_properties2` instance extension (#932)
- Added `VK_EXT_metal_objects` device extension (#942)
- Added `VK_AMD_anti_lag` device extension (#943)
- Added `VK_KHR_pipeline_binary` device extension (#944)

## [0.38.0] - 2024-04-01

Expand Down
1 change: 1 addition & 0 deletions ash/src/extensions/khr/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ pub mod maintenance4;
pub mod maintenance5;
pub mod maintenance6;
pub mod performance_query;
pub mod pipeline_binary;
pub mod pipeline_executable_properties;
pub mod present_wait;
pub mod push_descriptor;
Expand Down
95 changes: 95 additions & 0 deletions ash/src/extensions/khr/pipeline_binary.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
//! <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_pipeline_binary.html>
use crate::prelude::*;
use crate::vk;
use crate::RawPtr as _;
use alloc::vec::Vec;
use core::ffi;
use core::mem;

impl crate::khr::pipeline_binary::Device {
/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkCreatePipelineBinariesKHR.html>
#[inline]
#[doc(alias = "vkCreatePipelineBinariesKHR")]
pub unsafe fn create_pipeline_binaries(
&self,
create_info: &vk::PipelineBinaryCreateInfoKHR<'_>,
allocation_callbacks: Option<&vk::AllocationCallbacks<'_>>,
binaries: &mut vk::PipelineBinaryHandlesInfoKHR<'_>,
) -> VkResult<()> {
(self.fp.create_pipeline_binaries_khr)(
self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
binaries,
)
.result()
}

/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkDestroyPipelineBinaryKHR.html>
#[inline]
#[doc(alias = "vkDestroyPipelineBinaryKHR")]
pub unsafe fn destroy_pipeline_binary(
&self,
pipeline_binary: vk::PipelineBinaryKHR,
allocation_callbacks: Option<&vk::AllocationCallbacks<'_>>,
) {
(self.fp.destroy_pipeline_binary_khr)(
self.handle,
pipeline_binary,
allocation_callbacks.as_raw_ptr(),
)
}

/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPipelineKeyKHR.html>
#[inline]
#[doc(alias = "vkGetPipelineKeyKHR")]
pub unsafe fn get_pipeline_key(
&self,
pipeline_create_info: Option<&vk::PipelineCreateInfoKHR<'_>>,
) -> VkResult<vk::PipelineBinaryKeyKHR<'_>> {
let mut pipeline_key = mem::MaybeUninit::uninit();
(self.fp.get_pipeline_key_khr)(
self.handle,
pipeline_create_info.as_raw_ptr(),
pipeline_key.as_mut_ptr(),
)
.assume_init_on_success(pipeline_key)
}

/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkGetPipelineBinaryDataKHR.html>
#[inline]
#[doc(alias = "vkGetPipelineBinaryDataKHR")]
pub unsafe fn get_pipeline_binary_data(
&self,
info: &vk::PipelineBinaryDataInfoKHR<'_>,
pipeline_binary_key: &mut vk::PipelineBinaryKeyKHR<'_>,
) -> VkResult<Vec<u8>> {
// TODO: This returns NOT_ENOUGH_SPACE_KHR, not INCOMPLETE (because nothing is written, instead of returning an impartial result)
read_into_uninitialized_vector(|count, data| {
(self.fp.get_pipeline_binary_data_khr)(
self.handle,
info,
pipeline_binary_key,
count,
data as *mut ffi::c_void,
)
})
}

/// <https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkReleaseCapturedPipelineDataKHR.html>
#[inline]
#[doc(alias = "vkReleaseCapturedPipelineDataKHR")]
pub unsafe fn release_captured_pipeline_data(
&self,
info: &vk::ReleaseCapturedPipelineDataInfoKHR<'_>,
allocation_callbacks: Option<&vk::AllocationCallbacks<'_>>,
) -> VkResult<()> {
(self.fp.release_captured_pipeline_data_khr)(
self.handle,
info,
allocation_callbacks.as_raw_ptr(),
)
.result()
}
}
4 changes: 2 additions & 2 deletions ash/src/prelude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ impl vk::Result {
///
/// [`vkEnumerateInstanceExtensionProperties`]: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/vkEnumerateInstanceExtensionProperties.html
pub(crate) unsafe fn read_into_uninitialized_vector<N: Copy + Default + TryInto<usize>, T>(
f: impl Fn(&mut N, *mut T) -> vk::Result,
mut f: impl FnMut(&mut N, *mut T) -> vk::Result,
) -> VkResult<Vec<T>>
where
<N as TryInto<usize>>::Error: core::fmt::Debug,
Expand Down Expand Up @@ -81,7 +81,7 @@ pub(crate) unsafe fn read_into_defaulted_vector<
N: Copy + Default + TryInto<usize>,
T: Default + Clone,
>(
f: impl Fn(&mut N, *mut T) -> vk::Result,
mut f: impl FnMut(&mut N, *mut T) -> vk::Result,
) -> VkResult<Vec<T>>
where
<N as TryInto<usize>>::Error: core::fmt::Debug,
Expand Down

0 comments on commit dd71365

Please sign in to comment.