Add allocation callbacks everywhere

This commit is contained in:
maik klein 2016-12-28 09:07:27 +01:00
parent 85b7a7c136
commit ce4945a61c
6 changed files with 215 additions and 67 deletions

View file

@ -249,7 +249,7 @@ impl ExampleBase {
pp_enabled_extension_names: extension_names_raw.as_ptr(),
enabled_extension_count: extension_names_raw.len() as u32,
};
let instance: Instance = entry.create_instance(&create_info)
let instance: Instance = entry.create_instance(&create_info, None)
.expect("Instance creation error");
let debug_info = vk::DebugReportCallbackCreateInfoEXT {
s_type: vk::StructureType::DebugReportCallbackCreateInfoExt,

View file

@ -36,7 +36,37 @@ pub trait VkAllocation {
}
pub struct DefaultAllocatorCallback;
pub struct TestAlloc;
impl VkAllocation for TestAlloc {
unsafe extern "system" fn allocation(_: *mut (),
_: vk::size_t,
_: vk::size_t,
_: vk::SystemAllocationScope)
-> *mut () {
ptr::null_mut()
}
unsafe extern "system" fn reallocation(_: *mut vk::c_void,
_: *mut vk::c_void,
_: vk::size_t,
_: vk::size_t,
_: vk::SystemAllocationScope)
-> *mut vk::c_void {
ptr::null_mut()
}
unsafe extern "system" fn free(_: *mut vk::c_void, _: *mut vk::c_void) {}
unsafe extern "system" fn internal_allocation(_: *mut vk::c_void,
_: vk::size_t,
_: vk::InternalAllocationType,
_: vk::SystemAllocationScope) {
}
unsafe extern "system" fn internal_free(_: *mut vk::c_void,
_: vk::size_t,
_: vk::InternalAllocationType,
_: vk::SystemAllocationScope) {
}
}
impl VkAllocation for DefaultAllocatorCallback {
unsafe extern "system" fn allocation(_: *mut (),
_: vk::size_t,

View file

@ -3,6 +3,7 @@ use prelude::*;
use std::ptr;
use std::mem;
use vk;
use ::RawPtr;
unsafe impl Sync for Device {}
unsafe impl Send for Device {}
@ -24,69 +25,105 @@ impl Device {
}
}
pub unsafe fn destroy_device(&self) {
self.device_fn.destroy_device(self.handle, ptr::null());
pub unsafe fn destroy_device(&self, allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_device(self.handle, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_sampler(&self, sampler: vk::Sampler) {
self.device_fn.destroy_sampler(self.handle, sampler, ptr::null());
pub unsafe fn destroy_sampler(&self,
sampler: vk::Sampler,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_sampler(self.handle, sampler, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn free_memory(&self, memory: vk::DeviceMemory) {
self.device_fn.free_memory(self.handle, memory, ptr::null());
pub unsafe fn free_memory(&self,
memory: vk::DeviceMemory,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.free_memory(self.handle, memory, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_fence(&self, fence: vk::Fence) {
self.device_fn.destroy_fence(self.handle, fence, ptr::null());
pub unsafe fn destroy_fence(&self,
fence: vk::Fence,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_fence(self.handle, fence, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_image(&self, image: vk::Image) {
self.device_fn.destroy_image(self.handle, image, ptr::null());
pub unsafe fn destroy_image(&self,
image: vk::Image,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_image(self.handle, image, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_command_pool(&self, pool: vk::CommandPool) {
self.device_fn.destroy_command_pool(self.handle, pool, ptr::null());
pub unsafe fn destroy_command_pool(&self,
pool: vk::CommandPool,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_command_pool(self.handle, pool, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_image_view(&self, image_view: vk::ImageView) {
self.device_fn.destroy_image_view(self.handle, image_view, ptr::null());
pub unsafe fn destroy_image_view(&self,
image_view: vk::ImageView,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_image_view(self.handle, image_view, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_render_pass(&self, renderpass: vk::RenderPass) {
self.device_fn.destroy_render_pass(self.handle, renderpass, ptr::null());
pub unsafe fn destroy_render_pass(&self,
renderpass: vk::RenderPass,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_render_pass(self.handle, renderpass, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_framebuffer(&self, framebuffer: vk::Framebuffer) {
self.device_fn.destroy_framebuffer(self.handle, framebuffer, ptr::null());
pub unsafe fn destroy_framebuffer(&self,
framebuffer: vk::Framebuffer,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_framebuffer(self.handle, framebuffer, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_pipeline_layout(&self, pipeline_layout: vk::PipelineLayout) {
self.device_fn.destroy_pipeline_layout(self.handle, pipeline_layout, ptr::null());
pub unsafe fn destroy_pipeline_layout(&self,
pipeline_layout: vk::PipelineLayout,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_pipeline_layout(self.handle,
pipeline_layout,
allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_buffer(&self, buffer: vk::Buffer) {
self.device_fn.destroy_buffer(self.handle, buffer, ptr::null());
pub unsafe fn destroy_buffer(&self,
buffer: vk::Buffer,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_buffer(self.handle, buffer, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_shader_module(&self, shader: vk::ShaderModule) {
self.device_fn.destroy_shader_module(self.handle, shader, ptr::null());
pub unsafe fn destroy_shader_module(&self,
shader: vk::ShaderModule,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_shader_module(self.handle, shader, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_pipeline(&self, pipeline: vk::Pipeline) {
self.device_fn.destroy_pipeline(self.handle, pipeline, ptr::null());
pub unsafe fn destroy_pipeline(&self,
pipeline: vk::Pipeline,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_pipeline(self.handle, pipeline, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_semaphore(&self, semaphore: vk::Semaphore) {
self.device_fn.destroy_semaphore(self.handle, semaphore, ptr::null());
pub unsafe fn destroy_semaphore(&self,
semaphore: vk::Semaphore,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn.destroy_semaphore(self.handle, semaphore, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_descriptor_pool(&self, pool: vk::DescriptorPool) {
self.device_fn.destroy_descriptor_pool(self.handle, pool, ptr::null());
pub unsafe fn destroy_descriptor_pool(&self,
pool: vk::DescriptorPool,
allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_descriptor_pool(self.handle, pool, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn destroy_descriptor_set_layout(&self, layout: vk::DescriptorSetLayout) {
self.device_fn.destroy_descriptor_set_layout(self.handle, layout, ptr::null());
pub unsafe fn destroy_descriptor_set_layout(&self, layout: vk::DescriptorSetLayout, allocation_callbacks: Option<&vk::AllocationCallbacks>) {
self.device_fn
.destroy_descriptor_set_layout(self.handle, layout, allocation_callbacks.as_raw_ptr());
}
pub unsafe fn free_descriptor_sets(&self,
@ -108,11 +145,17 @@ impl Device {
descriptor_copies.as_ptr());
}
pub fn create_sampler(&self, create_info: &vk::SamplerCreateInfo) -> VkResult<vk::Sampler> {
pub fn create_sampler(&self,
create_info: &vk::SamplerCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Sampler> {
unsafe {
let mut sampler = mem::uninitialized();
let err_code = self.device_fn
.create_sampler(self.handle, create_info, ptr::null(), &mut sampler);
.create_sampler(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut sampler);
match err_code {
vk::Result::Success => Ok(sampler),
_ => Err(err_code),
@ -176,12 +219,16 @@ impl Device {
}
}
pub fn create_descriptor_set_layout(&self,
create_info: &vk::DescriptorSetLayoutCreateInfo)
create_info: &vk::DescriptorSetLayoutCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::DescriptorSetLayout> {
unsafe {
let mut layout = mem::uninitialized();
let err_code = self.device_fn
.create_descriptor_set_layout(self.handle, create_info, ptr::null(), &mut layout);
.create_descriptor_set_layout(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut layout);
match err_code {
vk::Result::Success => Ok(layout),
_ => Err(err_code),
@ -199,12 +246,16 @@ impl Device {
}
pub fn create_descriptor_pool(&self,
create_info: &vk::DescriptorPoolCreateInfo)
create_info: &vk::DescriptorPoolCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::DescriptorPool> {
unsafe {
let mut pool = mem::uninitialized();
let err_code = self.device_fn
.create_descriptor_pool(self.handle, create_info, ptr::null(), &mut pool);
.create_descriptor_pool(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut pool);
match err_code {
vk::Result::Success => Ok(pool),
_ => Err(err_code),
@ -337,12 +388,16 @@ impl Device {
pub fn create_semaphore(&self,
create_info: &vk::SemaphoreCreateInfo)
create_info: &vk::SemaphoreCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Semaphore> {
unsafe {
let mut semaphore = mem::uninitialized();
let err_code = self.device_fn
.create_semaphore(self.handle, create_info, ptr::null(), &mut semaphore);
.create_semaphore(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut semaphore);
match err_code {
vk::Result::Success => Ok(semaphore),
_ => Err(err_code),
@ -352,7 +407,8 @@ impl Device {
pub fn create_graphics_pipelines(&self,
pipeline_cache: vk::PipelineCache,
create_infos: &[vk::GraphicsPipelineCreateInfo])
create_infos: &[vk::GraphicsPipelineCreateInfo],
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<Vec<vk::Pipeline>> {
unsafe {
let mut pipelines = Vec::with_capacity(create_infos.len());
@ -361,7 +417,7 @@ impl Device {
pipeline_cache,
create_infos.len() as vk::uint32_t,
create_infos.as_ptr(),
ptr::null(),
allocation_callbacks.as_raw_ptr(),
pipelines.as_mut_ptr());
pipelines.set_len(create_infos.len());
match err_code {
@ -371,11 +427,17 @@ impl Device {
}
}
pub fn create_buffer(&self, create_info: &vk::BufferCreateInfo) -> VkResult<vk::Buffer> {
pub fn create_buffer(&self,
create_info: &vk::BufferCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Buffer> {
unsafe {
let mut buffer = mem::uninitialized();
let err_code = self.device_fn
.create_buffer(self.handle, create_info, ptr::null(), &mut buffer);
.create_buffer(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut buffer);
match err_code {
vk::Result::Success => Ok(buffer),
_ => Err(err_code),
@ -384,14 +446,15 @@ impl Device {
}
pub fn create_pipeline_layout(&self,
create_info: &vk::PipelineLayoutCreateInfo)
create_info: &vk::PipelineLayoutCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::PipelineLayout> {
unsafe {
let mut pipeline_layout = mem::uninitialized();
let err_code = self.device_fn
.create_pipeline_layout(self.handle,
create_info,
ptr::null(),
allocation_callbacks.as_raw_ptr(),
&mut pipeline_layout);
match err_code {
vk::Result::Success => Ok(pipeline_layout),
@ -423,12 +486,16 @@ impl Device {
}
pub fn create_framebuffer(&self,
create_info: &vk::FramebufferCreateInfo)
create_info: &vk::FramebufferCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Framebuffer> {
unsafe {
let mut framebuffer = mem::uninitialized();
let err_code = self.device_fn
.create_framebuffer(self.handle, create_info, ptr::null(), &mut framebuffer);
.create_framebuffer(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut framebuffer);
match err_code {
vk::Result::Success => Ok(framebuffer),
_ => Err(err_code),
@ -469,12 +536,16 @@ impl Device {
}
pub fn create_render_pass(&self,
create_info: &vk::RenderPassCreateInfo)
create_info: &vk::RenderPassCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::RenderPass> {
unsafe {
let mut renderpass = mem::uninitialized();
let err_code = self.device_fn
.create_render_pass(self.handle, create_info, ptr::null(), &mut renderpass);
.create_render_pass(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut renderpass);
match err_code {
vk::Result::Success => Ok(renderpass),
_ => Err(err_code),
@ -561,12 +632,16 @@ impl Device {
}
pub fn create_image_view(&self,
create_info: &vk::ImageViewCreateInfo)
create_info: &vk::ImageViewCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::ImageView> {
unsafe {
let mut image_view = mem::uninitialized();
let err_code = self.device_fn
.create_image_view(self.handle, create_info, ptr::null(), &mut image_view);
.create_image_view(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut image_view);
match err_code {
vk::Result::Success => Ok(image_view),
_ => Err(err_code),
@ -589,12 +664,16 @@ impl Device {
}
pub fn create_command_pool(&self,
create_info: &vk::CommandPoolCreateInfo)
create_info: &vk::CommandPoolCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::CommandPool> {
unsafe {
let mut pool = mem::uninitialized();
let err_code = self.device_fn
.create_command_pool(self.handle, create_info, ptr::null(), &mut pool);
.create_command_pool(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut pool);
match err_code {
vk::Result::Success => Ok(pool),
_ => Err(err_code),
@ -603,11 +682,17 @@ impl Device {
}
pub fn create_image(&self, create_info: &vk::ImageCreateInfo) -> VkResult<vk::Image> {
pub fn create_image(&self,
create_info: &vk::ImageCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Image> {
unsafe {
let mut image = mem::uninitialized();
let err_code = self.device_fn
.create_image(self.handle, create_info, ptr::null(), &mut image);
.create_image(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut image);
match err_code {
vk::Result::Success => Ok(image),
_ => Err(err_code),
@ -634,12 +719,16 @@ impl Device {
}
pub fn allocate_memory(&self,
create_info: &vk::MemoryAllocateInfo)
create_info: &vk::MemoryAllocateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::DeviceMemory> {
unsafe {
let mut memory = mem::uninitialized();
let err_code = self.device_fn
.allocate_memory(self.handle, create_info, ptr::null(), &mut memory);
.allocate_memory(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut memory);
match err_code {
vk::Result::Success => Ok(memory),
_ => Err(err_code),
@ -648,12 +737,16 @@ impl Device {
}
pub fn create_shader_module(&self,
create_info: &vk::ShaderModuleCreateInfo)
create_info: &vk::ShaderModuleCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::ShaderModule> {
unsafe {
let mut shader = mem::uninitialized();
let err_code = self.device_fn
.create_shader_module(self.handle, create_info, ptr::null(), &mut shader);
.create_shader_module(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut shader);
match err_code {
vk::Result::Success => Ok(shader),
_ => Err(err_code),
@ -661,11 +754,17 @@ impl Device {
}
}
pub fn create_fence(&self, create_info: &vk::FenceCreateInfo) -> VkResult<vk::Fence> {
pub fn create_fence(&self,
create_info: &vk::FenceCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> VkResult<vk::Fence> {
unsafe {
let mut fence = mem::uninitialized();
let err_code = self.device_fn
.create_fence(self.handle, create_info, ptr::null(), &mut fence);
.create_fence(self.handle,
create_info,
allocation_callbacks.as_raw_ptr(),
&mut fence);
match err_code {
vk::Result::Success => Ok(fence),
_ => Err(err_code),

View file

@ -69,11 +69,15 @@ impl Entry {
}
pub fn create_instance(&self,
create_info: &vk::InstanceCreateInfo)
create_info: &vk::InstanceCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> Result<Instance, InstanceError> {
unsafe {
use ::RawPtr;
let mut instance: vk::Instance = mem::uninitialized();
let err_code = self.entry_fn.create_instance(create_info, ptr::null(), &mut instance);
let err_code = self.entry_fn.create_instance(create_info,
allocation_callbacks.as_raw_ptr(),
&mut instance);
if err_code != vk::Result::Success {
return Err(InstanceError::VkError(err_code));
}

View file

@ -4,6 +4,7 @@ use std::ptr;
use std::mem;
use vk;
use device::Device;
use ::RawPtr;
#[derive(Debug)]
pub enum DeviceError {
@ -31,12 +32,13 @@ impl Instance {
pub fn create_device(&self,
physical_device: vk::PhysicalDevice,
create_info: &vk::DeviceCreateInfo)
create_info: &vk::DeviceCreateInfo,
allocation_callbacks: Option<&vk::AllocationCallbacks>)
-> Result<Device, DeviceError> {
unsafe {
let mut device: vk::Device = mem::uninitialized();
let err_code = self.instance_fn
.create_device(physical_device, create_info, ptr::null(), &mut device);
.create_device(physical_device, create_info, allocation_callbacks.as_raw_ptr(), &mut device);
if err_code != vk::Result::Success {
return Err(DeviceError::VkError(err_code));
}

View file

@ -8,3 +8,16 @@ pub mod prelude;
pub mod vk;
pub mod allocator;
pub mod extensions;
pub trait RawPtr<T>{
fn as_raw_ptr(&self) -> *const T;
}
impl<'r, T> RawPtr<T> for Option<&'r T>{
fn as_raw_ptr(&self) -> *const T{
match self{
&Some(inner) => inner as *const T,
_ => ::std::ptr::null()
}
}
}