librashader/librashader-runtime-vk/src/render_pass.rs
chyyran fb827b7c24 vk: reallow usage of render passes for environments where dynamic rendering is not available
This implementation is greatly simplified compared to the older implementation where framebuffers were attached to output targets. Instead, the graphics pipeline object will create new framebuffers on the fly. The suggestion is still to use dynamic rendering for best performance.
2023-01-25 23:45:10 -05:00

51 lines
No EOL
1.7 KiB
Rust

use crate::error;
use ash::vk;
use ash::vk::{
AttachmentLoadOp, AttachmentStoreOp, ImageLayout, PipelineBindPoint, SampleCountFlags,
};
pub struct VulkanRenderPass {
pub handle: vk::RenderPass,
pub format: vk::Format,
}
impl VulkanRenderPass {
pub fn create_render_pass(
device: &ash::Device,
mut format: vk::Format,
) -> error::Result<Self> {
// format should never be undefined.
let attachment = [vk::AttachmentDescription::builder()
.flags(vk::AttachmentDescriptionFlags::empty())
.format(format)
.samples(SampleCountFlags::TYPE_1)
.load_op(AttachmentLoadOp::DONT_CARE)
.store_op(AttachmentStoreOp::STORE)
.stencil_load_op(AttachmentLoadOp::DONT_CARE)
.stencil_store_op(AttachmentStoreOp::DONT_CARE)
.initial_layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.final_layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.build()];
let attachment_ref = [vk::AttachmentReference::builder()
.attachment(0)
.layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.build()];
let subpass = [vk::SubpassDescription::builder()
.pipeline_bind_point(PipelineBindPoint::GRAPHICS)
.color_attachments(&attachment_ref)
.build()];
let renderpass_info = vk::RenderPassCreateInfo::builder()
.flags(vk::RenderPassCreateFlags::empty())
.attachments(&attachment)
.subpasses(&subpass)
.build();
unsafe {
let rp = device.create_render_pass(&renderpass_info, None)?;
Ok(Self { handle: rp, format })
}
}
}