1 use crate::prelude::*; 2 use crate::vk; 3 use crate::RawPtr; 4 use crate::{Device, Instance}; 5 use std::ffi::CStr; 6 use std::mem; 7 8 #[derive(Clone)] 9 pub struct CreateRenderPass2 { 10 handle: vk::Device, 11 fp: vk::KhrCreateRenderpass2Fn, 12 } 13 14 impl CreateRenderPass2 { new(instance: &Instance, device: &Device) -> Self15 pub fn new(instance: &Instance, device: &Device) -> Self { 16 let handle = device.handle(); 17 let fp = vk::KhrCreateRenderpass2Fn::load(|name| unsafe { 18 mem::transmute(instance.get_device_proc_addr(handle, name.as_ptr())) 19 }); 20 Self { handle, fp } 21 } 22 23 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateRenderPass2.html> 24 #[inline] create_render_pass2( &self, create_info: &vk::RenderPassCreateInfo2, allocation_callbacks: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::RenderPass>25 pub unsafe fn create_render_pass2( 26 &self, 27 create_info: &vk::RenderPassCreateInfo2, 28 allocation_callbacks: Option<&vk::AllocationCallbacks>, 29 ) -> VkResult<vk::RenderPass> { 30 let mut renderpass = mem::zeroed(); 31 (self.fp.create_render_pass2_khr)( 32 self.handle, 33 create_info, 34 allocation_callbacks.as_raw_ptr(), 35 &mut renderpass, 36 ) 37 .result_with_success(renderpass) 38 } 39 40 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBeginRenderPass2.html> 41 #[inline] cmd_begin_render_pass2( &self, command_buffer: vk::CommandBuffer, render_pass_begin_info: &vk::RenderPassBeginInfo, subpass_begin_info: &vk::SubpassBeginInfo, )42 pub unsafe fn cmd_begin_render_pass2( 43 &self, 44 command_buffer: vk::CommandBuffer, 45 render_pass_begin_info: &vk::RenderPassBeginInfo, 46 subpass_begin_info: &vk::SubpassBeginInfo, 47 ) { 48 (self.fp.cmd_begin_render_pass2_khr)( 49 command_buffer, 50 render_pass_begin_info, 51 subpass_begin_info, 52 ); 53 } 54 55 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdNextSubpass2.html> 56 #[inline] cmd_next_subpass2( &self, command_buffer: vk::CommandBuffer, subpass_begin_info: &vk::SubpassBeginInfo, subpass_end_info: &vk::SubpassEndInfo, )57 pub unsafe fn cmd_next_subpass2( 58 &self, 59 command_buffer: vk::CommandBuffer, 60 subpass_begin_info: &vk::SubpassBeginInfo, 61 subpass_end_info: &vk::SubpassEndInfo, 62 ) { 63 (self.fp.cmd_next_subpass2_khr)(command_buffer, subpass_begin_info, subpass_end_info); 64 } 65 66 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdEndRenderPass2.html> 67 #[inline] cmd_end_render_pass2( &self, command_buffer: vk::CommandBuffer, subpass_end_info: &vk::SubpassEndInfo, )68 pub unsafe fn cmd_end_render_pass2( 69 &self, 70 command_buffer: vk::CommandBuffer, 71 subpass_end_info: &vk::SubpassEndInfo, 72 ) { 73 (self.fp.cmd_end_render_pass2_khr)(command_buffer, subpass_end_info); 74 } 75 76 #[inline] name() -> &'static CStr77 pub const fn name() -> &'static CStr { 78 vk::KhrCreateRenderpass2Fn::name() 79 } 80 81 #[inline] fp(&self) -> &vk::KhrCreateRenderpass2Fn82 pub fn fp(&self) -> &vk::KhrCreateRenderpass2Fn { 83 &self.fp 84 } 85 86 #[inline] device(&self) -> vk::Device87 pub fn device(&self) -> vk::Device { 88 self.handle 89 } 90 } 91