gfx_hal/queue/
mod.rs

1//! Command queues.
2//!
3//! Queues are the execution paths of the graphical processing units. These process
4//! submitted commands buffers.
5//!
6//! There are different types of queues, which can only handle associated command buffers.
7//! `Queue<B, C>` has the capability defined by `C`: graphics, compute and transfer.
8
9pub mod family;
10
11use crate::{
12    device::OutOfMemory,
13    pso,
14    window::{PresentError, PresentationSurface, Suboptimal},
15    Backend,
16};
17use std::{any::Any, fmt};
18
19pub use self::family::{QueueFamily, QueueFamilyId, QueueGroup};
20use crate::memory::{SparseBind, SparseImageBind};
21
22/// The type of the queue, an enum encompassing `queue::Capability`
23#[derive(Debug, Copy, Clone, PartialEq, Eq)]
24#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
25pub enum QueueType {
26    /// Supports all operations.
27    General,
28    /// Only supports graphics and transfer operations.
29    Graphics,
30    /// Only supports compute and transfer operations.
31    Compute,
32    /// Only supports transfer operations.
33    Transfer,
34}
35
36impl QueueType {
37    /// Returns true if the queue supports graphics operations.
38    pub fn supports_graphics(&self) -> bool {
39        match *self {
40            QueueType::General | QueueType::Graphics => true,
41            QueueType::Compute | QueueType::Transfer => false,
42        }
43    }
44    /// Returns true if the queue supports compute operations.
45    pub fn supports_compute(&self) -> bool {
46        match *self {
47            QueueType::General | QueueType::Graphics | QueueType::Compute => true,
48            QueueType::Transfer => false,
49        }
50    }
51    /// Returns true if the queue supports transfer operations.
52    pub fn supports_transfer(&self) -> bool {
53        true
54    }
55}
56
57/// Scheduling hint for devices about the priority of a queue.  Values range from `0.0` (low) to
58/// `1.0` (high).
59pub type QueuePriority = f32;
60
61/// Abstraction for an internal GPU execution engine.
62///
63/// Commands are executed on the the device by submitting
64/// [command buffers][crate::command::CommandBuffer].
65///
66/// Queues can also be used for presenting to a surface
67/// (that is, flip the front buffer with the next one in the chain).
68pub trait Queue<B: Backend>: fmt::Debug + Any + Send + Sync {
69    /// Sparse memory bind operation.
70    ///
71    /// # Arguments
72    ///
73    /// * `info` - information about the memory bindings.
74    ///
75    /// # Safety
76    ///
77    /// - Defining memory as `None` will cause undefined behaviour when the
78    /// tile is read or written from in some hardware.
79    /// - The memory regions provided are not checked to be valid and matching
80    /// of the sparse resource type.
81    /// - If extents are not a multiple of the block size, additional space will be
82    /// bound, and accessing memory is unsafe.
83    unsafe fn bind_sparse<'a, Iw, Is, Ibi, Ib, Iii, Io, Ii>(
84        &mut self,
85        _wait_semaphores: Iw,
86        _signal_semaphores: Is,
87        _buffer_memory_binds: Ib,
88        _image_opaque_memory_binds: Io,
89        _image_memory_binds: Ii,
90        _device: &B::Device,
91        _fence: Option<&B::Fence>,
92    ) where
93        Ibi: Iterator<Item = &'a SparseBind<&'a B::Memory>>,
94        Ib: Iterator<Item = (&'a mut B::Buffer, Ibi)>,
95        Iii: Iterator<Item = &'a SparseImageBind<&'a B::Memory>>,
96        Io: Iterator<Item = (&'a mut B::Image, Ibi)>,
97        Ii: Iterator<Item = (&'a mut B::Image, Iii)>,
98        Iw: Iterator<Item = &'a B::Semaphore>,
99        Is: Iterator<Item = &'a B::Semaphore>,
100    {
101        unimplemented!()
102    }
103
104    /// Submit command buffers to queue for execution.
105    ///
106    /// # Arguments
107    ///
108    /// * `command_buffers` - command buffers to submit.
109    /// * `wait_semaphores` - semaphores to wait being signalled before submission.
110    /// * `signal_semaphores` - semaphores to signal after all command buffers
111    ///   in the submission have finished execution.
112    /// * `fence` - must be in unsignaled state, and will be signaled after
113    ///   all command buffers in the submission have finished execution.
114    ///
115    /// # Safety
116    ///
117    /// It's not checked that the queue can process the submitted command buffers.
118    ///
119    /// For example, trying to submit compute commands to a graphics queue
120    /// will result in undefined behavior.
121    unsafe fn submit<'a, Ic, Iw, Is>(
122        &mut self,
123        command_buffers: Ic,
124        wait_semaphores: Iw,
125        signal_semaphores: Is,
126        fence: Option<&mut B::Fence>,
127    ) where
128        Ic: Iterator<Item = &'a B::CommandBuffer>,
129        Iw: Iterator<Item = (&'a B::Semaphore, pso::PipelineStage)>,
130        Is: Iterator<Item = &'a B::Semaphore>;
131
132    /// Present a swapchain image directly to a surface, after waiting on `wait_semaphore`.
133    ///
134    /// # Safety
135    ///
136    /// Unsafe for the same reasons as [`submit`][Queue::submit].
137    /// No checks are performed to verify that this queue supports present operations.
138    unsafe fn present(
139        &mut self,
140        surface: &mut B::Surface,
141        image: <B::Surface as PresentationSurface<B>>::SwapchainImage,
142        wait_semaphore: Option<&mut B::Semaphore>,
143    ) -> Result<Option<Suboptimal>, PresentError>;
144
145    /// Wait for the queue to be idle.
146    fn wait_idle(&mut self) -> Result<(), OutOfMemory>;
147
148    /// The amount of nanoseconds that causes a timestamp query value to increment by one.
149    fn timestamp_period(&self) -> f32;
150}