rotex-vulkan 0.1.1

A Vulkan backend for rotex_core
Documentation
use ash::vk;

use super::super::device::Device;
use crate::error::vk_error;
use crate::Error;

pub struct DescriptorSetLayout {
    handle: vk::DescriptorSetLayout,
}

impl DescriptorSetLayout {
    pub fn new(
        device: &Device,
        bindings: &[vk::DescriptorSetLayoutBinding],
    ) -> Result<Self, Error> {
        let create_info = vk::DescriptorSetLayoutCreateInfo::default().bindings(bindings);

        let handle = unsafe {
            device
                .logical_device()
                .create_descriptor_set_layout(&create_info, None)
        }
        .map_err(vk_error)?;

        Ok(Self { handle })
    }

    pub fn handle(&self) -> vk::DescriptorSetLayout {
        self.handle
    }

    pub fn destroy(&self, device: &Device) {
        unsafe {
            device
                .logical_device()
                .destroy_descriptor_set_layout(self.handle, None);
        }
    }
}

pub struct GraphicsPipelineLayout {
    handle: vk::PipelineLayout,
}

impl GraphicsPipelineLayout {
    pub fn new(
        device: &Device,
        set_layouts: &[vk::DescriptorSetLayout],
        push_constant_ranges: &[vk::PushConstantRange],
    ) -> Result<Self, Error> {
        let create_info = vk::PipelineLayoutCreateInfo::default()
            .set_layouts(set_layouts)
            .push_constant_ranges(push_constant_ranges);

        let handle = unsafe {
            device
                .logical_device()
                .create_pipeline_layout(&create_info, None)
        }
        .map_err(vk_error)?;

        Ok(Self { handle })
    }

    pub fn handle(&self) -> vk::PipelineLayout {
        self.handle
    }

    pub fn destroy(&self, device: &Device) {
        unsafe {
            device
                .logical_device()
                .destroy_pipeline_layout(self.handle, None);
        }
    }
}