atagen

monolith

public
Star0
Watch0
a2cc6a5809c0d4ccee49c13fe9ccbc9a78abb041
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;
de1e9f21296catagen2026-10-17 04:49 UTC3
de1e9f21296catagen2026-10-17 04:49 UTC4
/// A full barrier between all earlier and later work on the image, optionally
de1e9f21296catagen2026-10-17 04:49 UTC5
/// transferring ownership between queue families. Coarse, but correct for
de1e9f21296catagen2026-10-17 04:49 UTC6
/// every transition the renderer makes.
de1e9f21296catagen2026-10-17 04:49 UTC7
pub(crate) unsafe fn barrier(
de1e9f21296catagen2026-10-17 04:49 UTC8
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC9
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC10
    image: vk::Image,
de1e9f21296catagen2026-10-17 04:49 UTC11
    old: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC12
    new: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC13
    src_family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC14
    dst_family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC15
) {
de1e9f21296catagen2026-10-17 04:49 UTC16
    let b = [vk::ImageMemoryBarrier2::default()
de1e9f21296catagen2026-10-17 04:49 UTC17
        .src_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
de1e9f21296catagen2026-10-17 04:49 UTC18
        .src_access_mask(vk::AccessFlags2::MEMORY_WRITE)
de1e9f21296catagen2026-10-17 04:49 UTC19
        .dst_stage_mask(vk::PipelineStageFlags2::ALL_COMMANDS)
de1e9f21296catagen2026-10-17 04:49 UTC20
        .dst_access_mask(vk::AccessFlags2::MEMORY_READ | vk::AccessFlags2::MEMORY_WRITE)
de1e9f21296catagen2026-10-17 04:49 UTC21
        .old_layout(old)
de1e9f21296catagen2026-10-17 04:49 UTC22
        .new_layout(new)
de1e9f21296catagen2026-10-17 04:49 UTC23
        .src_queue_family_index(src_family)
de1e9f21296catagen2026-10-17 04:49 UTC24
        .dst_queue_family_index(dst_family)
de1e9f21296catagen2026-10-17 04:49 UTC25
        .image(image)
de1e9f21296catagen2026-10-17 04:49 UTC26
        .subresource_range(color_range())];
de1e9f21296catagen2026-10-17 04:49 UTC27
    unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC28
        d.cmd_pipeline_barrier2(
de1e9f21296catagen2026-10-17 04:49 UTC29
            cmd,
de1e9f21296catagen2026-10-17 04:49 UTC30
            &vk::DependencyInfo::default().image_memory_barriers(&b),
de1e9f21296catagen2026-10-17 04:49 UTC31
        )
de1e9f21296catagen2026-10-17 04:49 UTC32
    };
de1e9f21296catagen2026-10-17 04:49 UTC33
}
de1e9f21296catagen2026-10-17 04:49 UTC34
de1e9f21296catagen2026-10-17 04:49 UTC35
/// Moves an image into `layout` for use on this queue. Dmabuf images come
de1e9f21296catagen2026-10-17 04:49 UTC36
/// from the foreign queue family in the general layout, others continue from
de1e9f21296catagen2026-10-17 04:49 UTC37
/// their tracked layout.
de1e9f21296catagen2026-10-17 04:49 UTC38
pub(crate) unsafe fn acquire(
de1e9f21296catagen2026-10-17 04:49 UTC39
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC40
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC41
    family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC42
    image: &ImageInner,
de1e9f21296catagen2026-10-17 04:49 UTC43
    layout: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC44
) {
de1e9f21296catagen2026-10-17 04:49 UTC45
    if image.external {
de1e9f21296catagen2026-10-17 04:49 UTC46
        unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC47
            barrier(
de1e9f21296catagen2026-10-17 04:49 UTC48
                d,
de1e9f21296catagen2026-10-17 04:49 UTC49
                cmd,
de1e9f21296catagen2026-10-17 04:49 UTC50
                image.image,
de1e9f21296catagen2026-10-17 04:49 UTC51
                vk::ImageLayout::GENERAL,
de1e9f21296catagen2026-10-17 04:49 UTC52
                layout,
de1e9f21296catagen2026-10-17 04:49 UTC53
                vk::QUEUE_FAMILY_FOREIGN_EXT,
de1e9f21296catagen2026-10-17 04:49 UTC54
                family,
de1e9f21296catagen2026-10-17 04:49 UTC55
            )
de1e9f21296catagen2026-10-17 04:49 UTC56
        };
de1e9f21296catagen2026-10-17 04:49 UTC57
    } else {
de1e9f21296catagen2026-10-17 04:49 UTC58
        let old = image.layout();
de1e9f21296catagen2026-10-17 04:49 UTC59
        if old != layout {
de1e9f21296catagen2026-10-17 04:49 UTC60
            unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC61
                barrier(
de1e9f21296catagen2026-10-17 04:49 UTC62
                    d,
de1e9f21296catagen2026-10-17 04:49 UTC63
                    cmd,
de1e9f21296catagen2026-10-17 04:49 UTC64
                    image.image,
de1e9f21296catagen2026-10-17 04:49 UTC65
                    old,
de1e9f21296catagen2026-10-17 04:49 UTC66
                    layout,
de1e9f21296catagen2026-10-17 04:49 UTC67
                    vk::QUEUE_FAMILY_IGNORED,
de1e9f21296catagen2026-10-17 04:49 UTC68
                    vk::QUEUE_FAMILY_IGNORED,
de1e9f21296catagen2026-10-17 04:49 UTC69
                )
de1e9f21296catagen2026-10-17 04:49 UTC70
            };
de1e9f21296catagen2026-10-17 04:49 UTC71
            image.set_layout(layout);
de1e9f21296catagen2026-10-17 04:49 UTC72
        }
de1e9f21296catagen2026-10-17 04:49 UTC73
    }
de1e9f21296catagen2026-10-17 04:49 UTC74
}
de1e9f21296catagen2026-10-17 04:49 UTC75
de1e9f21296catagen2026-10-17 04:49 UTC76
/// Hands a dmabuf image back to the foreign queue family after use.
de1e9f21296catagen2026-10-17 04:49 UTC77
pub(crate) unsafe fn release(
de1e9f21296catagen2026-10-17 04:49 UTC78
    d: &ash::Device,
de1e9f21296catagen2026-10-17 04:49 UTC79
    cmd: vk::CommandBuffer,
de1e9f21296catagen2026-10-17 04:49 UTC80
    family: u32,
de1e9f21296catagen2026-10-17 04:49 UTC81
    image: &ImageInner,
de1e9f21296catagen2026-10-17 04:49 UTC82
    layout: vk::ImageLayout,
de1e9f21296catagen2026-10-17 04:49 UTC83
) {
de1e9f21296catagen2026-10-17 04:49 UTC84
    if image.external {
de1e9f21296catagen2026-10-17 04:49 UTC85
        unsafe {
de1e9f21296catagen2026-10-17 04:49 UTC86
            barrier(
de1e9f21296catagen2026-10-17 04:49 UTC87
                d,
de1e9f21296catagen2026-10-17 04:49 UTC88
                cmd,
de1e9f21296catagen2026-10-17 04:49 UTC89
                image.image,
de1e9f21296catagen2026-10-17 04:49 UTC90
                layout,
de1e9f21296catagen2026-10-17 04:49 UTC91
                vk::ImageLayout::GENERAL,
de1e9f21296catagen2026-10-17 04:49 UTC92
                family,
de1e9f21296catagen2026-10-17 04:49 UTC93
                vk::QUEUE_FAMILY_FOREIGN_EXT,
de1e9f21296catagen2026-10-17 04:49 UTC94
            )
de1e9f21296catagen2026-10-17 04:49 UTC95
        };
de1e9f21296catagen2026-10-17 04:49 UTC96
    }
de1e9f21296catagen2026-10-17 04:49 UTC97
}