1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use super::SecondaryLevel;

/// Command buffer with this usage flag will move to invalid state after execution.
/// Resubmitting will require reset and rerecording commands.
#[derive(Clone, Copy, Debug, Default)]
pub struct OneShot;

/// Command buffer with this usage flag will move back to executable state after execution.
#[derive(Clone, Copy, Debug, Default)]
pub struct MultiShot<S = NoSimultaneousUse>(pub S);

/// Additional flag that allows resubmission of a command buffer while it is still in a pending state.
/// `Submit<B, SimultaneousUse>` can be submitted more than once.
#[derive(Clone, Copy, Debug, Default)]
pub struct SimultaneousUse;

/// Additional flag that disallows resubmission of a command buffer while it is still in a pending state
/// It must be completed, i.e. a fence must submitted with this buffer or later into the same queue
/// and be waited on before buffer resubmission.
/// `Submit<B, NoSimultaneousUse>` cannot be submitted more than once.
#[derive(Clone, Copy, Debug, Default)]
pub struct NoSimultaneousUse;

/// Buffers with this usage flag must be secondary buffers executed entirely in render-pass.
#[derive(Clone, Copy, Debug, Default)]
pub struct RenderPassContinue;

/// Primary buffers must has this flag as they cannot has `RenderPassContinue` flag.
/// Secondary buffers with this usage flag cannot be executed as part of render-pass.
#[derive(Clone, Copy, Debug, Default)]
pub struct OutsideRenderPass;

/// Type-level usage flags.
/// It defines if buffer can be resubmitted without reset.
/// Or even resubmitted while being executed.
pub trait Usage: Copy + Default + std::fmt::Debug + 'static {
    /// Flags required to begin command buffer.
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags;
}

impl Usage for OneShot {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::ONE_TIME_SUBMIT
    }
}

impl Usage for MultiShot {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::empty()
    }
}

impl Usage for MultiShot<SimultaneousUse> {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::SIMULTANEOUS_USE
    }
}

impl Usage for NoSimultaneousUse {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::empty()
    }
}

/// Trait implemented for type-level render pass relation flags.
/// `RenderPassContinue` and `OutsideRenderPass`.
pub trait RenderPassRelation<L>: Copy + Default + std::fmt::Debug + 'static {
    /// Flags required to begin command buffer.
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags;
}

impl RenderPassRelation<SecondaryLevel> for RenderPassContinue {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::RENDER_PASS_CONTINUE
    }
}

impl<L> RenderPassRelation<L> for OutsideRenderPass {
    fn flags(&self) -> gfx_hal::command::CommandBufferFlags {
        gfx_hal::command::CommandBufferFlags::empty()
    }
}