rotex_vulkan/backend/vulkan/graphics_pipeline/
layout.rs1use ash::vk;
2
3use super::super::device::Device;
4use crate::error::vk_error;
5use crate::Error;
6
7pub struct DescriptorSetLayout {
8 handle: vk::DescriptorSetLayout,
9}
10
11impl DescriptorSetLayout {
12 pub fn new(
13 device: &Device,
14 bindings: &[vk::DescriptorSetLayoutBinding],
15 ) -> Result<Self, Error> {
16 let create_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(bindings);
17
18 let handle = unsafe {
19 device
20 .logical_device()
21 .create_descriptor_set_layout(&create_info, None)
22 }
23 .map_err(vk_error)?;
24
25 Ok(Self { handle })
26 }
27
28 pub fn handle(&self) -> vk::DescriptorSetLayout {
29 self.handle
30 }
31
32 pub fn destroy(&self, device: &Device) {
33 unsafe {
34 device
35 .logical_device()
36 .destroy_descriptor_set_layout(self.handle, None);
37 }
38 }
39}
40
41pub struct GraphicsPipelineLayout {
42 handle: vk::PipelineLayout,
43}
44
45impl GraphicsPipelineLayout {
46 pub fn new(
47 device: &Device,
48 set_layouts: &[vk::DescriptorSetLayout],
49 push_constant_ranges: &[vk::PushConstantRange],
50 ) -> Result<Self, Error> {
51 let create_info = vk::PipelineLayoutCreateInfo::default()
52 .set_layouts(set_layouts)
53 .push_constant_ranges(push_constant_ranges);
54
55 let handle = unsafe {
56 device
57 .logical_device()
58 .create_pipeline_layout(&create_info, None)
59 }
60 .map_err(vk_error)?;
61
62 Ok(Self { handle })
63 }
64
65 pub fn handle(&self) -> vk::PipelineLayout {
66 self.handle
67 }
68
69 pub fn destroy(&self, device: &Device) {
70 unsafe {
71 device
72 .logical_device()
73 .destroy_pipeline_layout(self.handle, None);
74 }
75 }
76}