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
// Copyright (c) 2016 The vulkano developers // Licensed under the Apache License, Version 2.0 // <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT // license <LICENSE-MIT or http://opensource.org/licenses/MIT>, // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. use std::ops::Range; use std::sync::Arc; use buffer::sys::UnsafeBuffer; use command_buffer::Submission; use memory::Content; use sync::Semaphore; pub unsafe trait Buffer: 'static + Send + Sync { /// Returns the inner buffer. fn inner(&self) -> &UnsafeBuffer; /// Returns whether accessing a range of this buffer should signal a fence. fn needs_fence(&self, write: bool, Range<usize>) -> Option<bool>; /// Called when a command buffer that uses this buffer is being built. /// /// Must return true if the command buffer should include a pipeline barrier at the start, /// to read from what the host wrote, and a pipeline barrier at the end, to flush caches and /// allows the host to read the data. fn host_accesses(&self, block: usize) -> bool; /// Given a range, returns the list of blocks which each range is contained in. /// /// Each block must have a unique number. Hint: it can simply be the offset of the start of the /// block. /// Calling this function multiple times with the same parameter must always return the same /// value. /// The return value must not be empty. fn blocks(&self, range: Range<usize>) -> Vec<usize>; /// Returns the range of bytes of the buffer slice used by a block. fn block_memory_range(&self, block: usize) -> Range<usize>; /// /// /// If the host is still accessing the buffer, this function implementation should block /// until it is no longer the case. /// /// **Important**: The `Submission` object likely holds an `Arc` to `self`. Therefore you /// should store the `Submission` in the form of a `Weak<Submission>` and not /// of an `Arc<Submission>` to avoid cyclic references. unsafe fn gpu_access(&self, ranges: &mut Iterator<Item = AccessRange>, submission: &Arc<Submission>) -> GpuAccessResult; #[inline] fn size(&self) -> usize { self.inner().size() } } pub unsafe trait TypedBuffer: Buffer { type Content: ?Sized + 'static; #[inline] fn len(&self) -> usize where Self::Content: Content { self.size() / <Self::Content as Content>::indiv_size() } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct AccessRange { pub block: usize, pub write: bool, } pub struct GpuAccessResult { pub dependencies: Vec<Arc<Submission>>, pub additional_wait_semaphore: Option<Arc<Semaphore>>, pub additional_signal_semaphore: Option<Arc<Semaphore>>, }