cen 0.0.1

Lightweight compute shader playground
Documentation
use std::sync::Arc;
use ash::{vk};
use log::trace;
use crate::vulkan::{Device, LOG_TARGET};
use crate::vulkan::device::DeviceInner;

pub struct RenderPassInner {
    pub renderpass: vk::RenderPass,
    pub device_dep: Arc<DeviceInner>,
}

impl Drop for RenderPassInner {
    fn drop(&mut self) {
        unsafe {
            let renderpass_addr = format!("{:?}", self.renderpass);
            self.device_dep.device.destroy_render_pass(self.renderpass, None);
            log::trace!(target: LOG_TARGET, "Destroyed render pass: [{}]", renderpass_addr);
        }
    }
}

pub struct RenderPass {
    pub inner: Arc<RenderPassInner>,
}

impl RenderPass {
    pub fn new(device: &Device, surface_format: vk::Format) -> RenderPass {
        let color_attachment = vk::AttachmentDescription::default()
            .format(surface_format)
            .samples(vk::SampleCountFlags::TYPE_1)
            .load_op(vk::AttachmentLoadOp::CLEAR)
            .store_op(vk::AttachmentStoreOp::STORE)
            .stencil_load_op(vk::AttachmentLoadOp::DONT_CARE)
            .stencil_store_op(vk::AttachmentStoreOp::DONT_CARE)
            .initial_layout(vk::ImageLayout::UNDEFINED)
            .final_layout(vk::ImageLayout::PRESENT_SRC_KHR);

        let render_pass_attachments = [color_attachment];

        let color_attachment_ref = vk::AttachmentReference::default()
            .attachment( 0 )
            .layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL);

        let subpass_description = vk::SubpassDescription::default()
            .pipeline_bind_point(vk::PipelineBindPoint::GRAPHICS)
            .color_attachments(std::slice::from_ref(&color_attachment_ref));

        let subpass_descriptions = [subpass_description];

        let renderpass_create_info = vk::RenderPassCreateInfo::default()
            .attachments(&render_pass_attachments)
            .subpasses(&subpass_descriptions);

        let renderpass = unsafe {
            device.handle()
                .create_render_pass(&renderpass_create_info, None)
                .expect("Failed to create render pass")
        };

        trace!(target: LOG_TARGET, "Created render pass: {:?}", renderpass);

        let renderpass_inner = RenderPassInner {
            renderpass,
            device_dep: device.inner.clone()
        };

        RenderPass {
            inner: Arc::new(renderpass_inner),
        }
    }

    pub fn handle(&self) -> vk::RenderPass {
        self.inner.renderpass
    }

}