atagen

monolith

public
Star0
Watch0
ad1f04ba8cb292f72b399096c225ffd592040418
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git

Blame: crates/render-vk/src/barrier.rs

de1e9f21296catagen2026-10-17 04:49 UTC1
use crate::image::{ImageInner, color_range};
de1e9f21296catagen2026-10-17 04:49 UTC2
use ash::vk;
ad1f04ba8cb2atagen2026-10-19 07:30 UTC3
use std::sync::Arc;
ad1f04ba8cb2atagen2026-10-19 07:30 UTC4
ad1f04ba8cb2atagen2026-10-19 07:30 UTC5
/// Layout changes recorded into a command buffer that has not been submitted.
ad1f04ba8cb2atagen2026-10-19 07:30 UTC6
/// Images keep their old layout until `commit`, so a failed submit leaves the
ad1f04ba8cb2atagen2026-10-19 07:30 UTC7
/// tracking true to what the GPU has done.
ad1f04ba8cb2atagen2026-10-19 07:30 UTC8
#[derive(Default)]
ad1f04ba8cb2atagen2026-10-19 07:30 UTC9
pub(crate) struct LayoutLog(Vec<(Arc<ImageInner>, vk::ImageLayout)>);
ad1f04ba8cb2atagen2026-10-19 07:30 UTC10
ad1f04ba8cb2atagen2026-10-19 07:30 UTC11
impl LayoutLog {
ad1f04ba8cb2atagen2026-10-19 07:30 UTC12
    fn current(&self, image: &Arc<ImageInner>) -> vk::ImageLayout {
ad1f04ba8cb2atagen2026-10-19 07:30 UTC13
        self.0
ad1f04ba8cb2atagen2026-10-19 07:30 UTC14
            .iter()
ad1f04ba8cb2atagen2026-10-19 07:30 UTC15
            .rev()
ad1f04ba8cb2atagen2026-10-19 07:30 UTC16
            .find(|(i, _)| Arc::ptr_eq(i, image))
ad1f04ba8cb2atagen2026-10-19 07:30 UTC17
            .map_or_else(|| image.layout(), |(_, layout)| *layout)
ad1f04ba8cb2atagen2026-10-19 07:30 UTC18
    }
ad1f04ba8cb2atagen2026-10-19 07:30 UTC19
ad1f04ba8cb2atagen2026-10-19 07:30 UTC20
    pub fn commit(self) {
ad1f04ba8cb2atagen2026-10-19 07:30 UTC21
        for (image, layout) in self.0 {
ad1f04ba8cb2atagen2026-10-19 07:30 UTC22
            image.set_layout(layout);
ad1f04ba8cb2atagen2026-10-19 07:30 UTC23
        }
ad1f04ba8cb2atagen2026-10-19 07:30 UTC24
    }
ad1f04ba8cb2atagen2026-10-19 07:30 UTC25
}
de1e9f21296catagen2026-10-17 04:49 UTC26
de1e9f21296catagen2026-10-17 04:49 UTC27
/// A full barrier between all earlier and later work on the image, optionally
de1e9f21296catagen2026-10-17 04:49 UTC28
/// transferring ownership between queue families. Coarse, but correct for
de1e9f21296catagen2026-10-17 04:49 UTC29
/// every transition the renderer makes.
de1e9f21296catagen2026-10-17 04:49 UTC30
pub(crate) unsafe fn barrier(
de1e9f21296catagen2026-10-17 04:49 UTC31
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC32
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC33
    image: vk::Image,
de1e9f21296catagen2026-10-17 04:49 UTC34
    old: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC35
    new: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC36
    src_family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC37
    dst_family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC38
) {
de1e9f21296catagen2026-10-17 04:49 UTC39
    let b = [vk::ImageMemoryBarrier2::default()
de1e9f21296catagen2026-10-17 04:49 UTC40
        .src_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
de1e9f21296catagen2026-10-17 04:49 UTC41
        .src_access_mask(vk::AccessFlags2::MEMORY_WRITE)
de1e9f21296catagen2026-10-17 04:49 UTC42
        .dst_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
de1e9f21296catagen2026-10-17 04:49 UTC43
        .dst_access_mask(vk::AccessFlags2::MEMORY_READ | vk::AccessFlags2::MEMORY_WRITE)
de1e9f21296catagen2026-10-17 04:49 UTC44
        .old_layout(old)
de1e9f21296catagen2026-10-17 04:49 UTC45
        .new_layout(new)
de1e9f21296catagen2026-10-17 04:49 UTC46
        .src_queue_family_index(src_family)
de1e9f21296catagen2026-10-17 04:49 UTC47
        .dst_queue_family_index(dst_family)
de1e9f21296catagen2026-10-17 04:49 UTC48
        .image(image)
de1e9f21296catagen2026-10-17 04:49 UTC49
        .subresource_range(color_range())];
de1e9f21296catagen2026-10-17 04:49 UTC50
    unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC51
        d.cmd_pipeline_barrier2(
de1e9f21296catagen2026-10-17 04:49 UTC52
            cmd,
de1e9f21296catagen2026-10-17 04:49 UTC53
            &vk::DependencyInfo::default().image_memory_barriers(&b),
de1e9f21296catagen2026-10-17 04:49 UTC54
        )
de1e9f21296catagen2026-10-17 04:49 UTC55
    };
de1e9f21296catagen2026-10-17 04:49 UTC56
}
de1e9f21296catagen2026-10-17 04:49 UTC57
de1e9f21296catagen2026-10-17 04:49 UTC58
/// Moves an image into `layout` for use on this queue. Dmabuf images come
de1e9f21296catagen2026-10-17 04:49 UTC59
/// from the foreign queue family in the general layout, others continue from
de1e9f21296catagen2026-10-17 04:49 UTC60
/// their tracked layout.
de1e9f21296catagen2026-10-17 04:49 UTC61
pub(crate) unsafe fn acquire(
de1e9f21296catagen2026-10-17 04:49 UTC62
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC63
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC64
    family: u32,
ad1f04ba8cb2atagen2026-10-19 07:30 UTC65
    image: &Arc<ImageInner>,
de1e9f21296catagen2026-10-17 04:49 UTC66
    layout: vk::ImageLayout,
ad1f04ba8cb2atagen2026-10-19 07:30 UTC67
    log: &mut LayoutLog,
de1e9f21296catagen2026-10-17 04:49 UTC68
) {
de1e9f21296catagen2026-10-17 04:49 UTC69
    if image.external {
de1e9f21296catagen2026-10-17 04:49 UTC70
        unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC71
            barrier(
de1e9f21296catagen2026-10-17 04:49 UTC72
                d,
de1e9f21296catagen2026-10-17 04:49 UTC73
                cmd,
de1e9f21296catagen2026-10-17 04:49 UTC74
                image.image,
de1e9f21296catagen2026-10-17 04:49 UTC75
                vk::ImageLayout::GENERAL,
de1e9f21296catagen2026-10-17 04:49 UTC76
                layout,
de1e9f21296catagen2026-10-17 04:49 UTC77
                vk::QUEUE_FAMILY_FOREIGN_EXT,
de1e9f21296catagen2026-10-17 04:49 UTC78
                family,
de1e9f21296catagen2026-10-17 04:49 UTC79
            )
de1e9f21296catagen2026-10-17 04:49 UTC80
        };
de1e9f21296catagen2026-10-17 04:49 UTC81
    } else {
ad1f04ba8cb2atagen2026-10-19 07:30 UTC82
        let old = log.current(image);
de1e9f21296catagen2026-10-17 04:49 UTC83
        if old != layout {
de1e9f21296catagen2026-10-17 04:49 UTC84
            unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC85
                barrier(
de1e9f21296catagen2026-10-17 04:49 UTC86
                    d,
de1e9f21296catagen2026-10-17 04:49 UTC87
                    cmd,
de1e9f21296catagen2026-10-17 04:49 UTC88
                    image.image,
de1e9f21296catagen2026-10-17 04:49 UTC89
                    old,
de1e9f21296catagen2026-10-17 04:49 UTC90
                    layout,
de1e9f21296catagen2026-10-17 04:49 UTC91
                    vk::QUEUE_FAMILY_IGNORED,
de1e9f21296catagen2026-10-17 04:49 UTC92
                    vk::QUEUE_FAMILY_IGNORED,
de1e9f21296catagen2026-10-17 04:49 UTC93
                )
de1e9f21296catagen2026-10-17 04:49 UTC94
            };
ad1f04ba8cb2atagen2026-10-19 07:30 UTC95
            log.0.push((image.clone(), layout));
de1e9f21296catagen2026-10-17 04:49 UTC96
        }
de1e9f21296catagen2026-10-17 04:49 UTC97
    }
de1e9f21296catagen2026-10-17 04:49 UTC98
}
de1e9f21296catagen2026-10-17 04:49 UTC99
de1e9f21296catagen2026-10-17 04:49 UTC100
/// Hands a dmabuf image back to the foreign queue family after use.
de1e9f21296catagen2026-10-17 04:49 UTC101
pub(crate) unsafe fn release(
de1e9f21296catagen2026-10-17 04:49 UTC102
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC103
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC104
    family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC105
    image: &ImageInner,
de1e9f21296catagen2026-10-17 04:49 UTC106
    layout: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC107
) {
de1e9f21296catagen2026-10-17 04:49 UTC108
    if image.external {
de1e9f21296catagen2026-10-17 04:49 UTC109
        unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC110
            barrier(
de1e9f21296catagen2026-10-17 04:49 UTC111
                d,
de1e9f21296catagen2026-10-17 04:49 UTC112
                cmd,
de1e9f21296catagen2026-10-17 04:49 UTC113
                image.image,
de1e9f21296catagen2026-10-17 04:49 UTC114
                layout,
de1e9f21296catagen2026-10-17 04:49 UTC115
                vk::ImageLayout::GENERAL,
de1e9f21296catagen2026-10-17 04:49 UTC116
                family,
de1e9f21296catagen2026-10-17 04:49 UTC117
                vk::QUEUE_FAMILY_FOREIGN_EXT,
de1e9f21296catagen2026-10-17 04:49 UTC118
            )
de1e9f21296catagen2026-10-17 04:49 UTC119
        };
de1e9f21296catagen2026-10-17 04:49 UTC120
    }
de1e9f21296catagen2026-10-17 04:49 UTC121
}