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.
51 lines
No EOL
1.7 KiB
Rust
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 })
|
|
}
|
|
}
|
|
} |