mirror of
https://github.com/vulkano-rs/vulkano.git
synced 2025-02-16 17:12:29 +00:00
Simplify BufferSlice
This commit is contained in:
parent
a6b166c7b6
commit
88f0eb5f71
@ -441,15 +441,14 @@ impl Usage {
|
||||
/// This object doesn't correspond to any Vulkan object. It exists for the programmer's
|
||||
/// convenience.
|
||||
#[derive(Clone)]
|
||||
pub struct BufferSlice<'a, T: ?Sized + 'a, M: 'a> {
|
||||
pub struct BufferSlice<T: ?Sized> {
|
||||
marker: PhantomData<T>,
|
||||
resource: Arc<AbstractBuffer>,
|
||||
inner: &'a Inner<M>,
|
||||
offset: usize,
|
||||
size: usize,
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized + 'a, M: 'a> BufferSlice<'a, T, M> {
|
||||
impl<T: ?Sized> BufferSlice<T> {
|
||||
/// Returns the buffer that this slice belongs to.
|
||||
pub fn buffer(&self) -> &Arc<AbstractBuffer> {
|
||||
&self.resource
|
||||
@ -466,63 +465,9 @@ impl<'a, T: ?Sized + 'a, M: 'a> BufferSlice<'a, T, M> {
|
||||
pub fn size(&self) -> usize {
|
||||
self.size
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as a source for buffer transfers.
|
||||
#[inline]
|
||||
pub fn usage_transfer_src(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_TRANSFER_SRC_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as a destination for buffer transfers.
|
||||
#[inline]
|
||||
pub fn usage_transfer_dest(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_TRANSFER_DST_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as
|
||||
#[inline]
|
||||
pub fn usage_uniform_texel_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as
|
||||
#[inline]
|
||||
pub fn usage_storage_texel_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as
|
||||
#[inline]
|
||||
pub fn usage_uniform_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as
|
||||
#[inline]
|
||||
pub fn usage_storage_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as a source for index data.
|
||||
#[inline]
|
||||
pub fn usage_index_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_INDEX_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as a source for vertex data.
|
||||
#[inline]
|
||||
pub fn usage_vertex_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_VERTEX_BUFFER_BIT) != 0
|
||||
}
|
||||
|
||||
/// True if the buffer can be used as
|
||||
#[inline]
|
||||
pub fn usage_indirect_buffer(&self) -> bool {
|
||||
(self.inner.usage & vk::BUFFER_USAGE_INDIRECT_BUFFER_BIT) != 0
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'a, M: 'a> BufferSlice<'a, [T], M> {
|
||||
impl<T> BufferSlice<[T]> {
|
||||
/// Returns the number of elements in this slice.
|
||||
#[inline]
|
||||
pub fn len(&self) -> usize {
|
||||
@ -530,37 +475,26 @@ impl<'a, T: 'a, M: 'a> BufferSlice<'a, [T], M> {
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<'a, T: ?Sized, M> VulkanObject for BufferSlice<'a, T, M> {
|
||||
type Object = vk::Buffer;
|
||||
|
||||
#[inline]
|
||||
fn internal_object(&self) -> vk::Buffer {
|
||||
self.inner.buffer
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized + 'static, M: 'static> From<&'a Arc<Buffer<T, M>>> for BufferSlice<'a, T, M>
|
||||
impl<'a, T: ?Sized + 'static, M: 'static> From<&'a Arc<Buffer<T, M>>> for BufferSlice<T>
|
||||
where M: MemorySourceChunk
|
||||
{
|
||||
#[inline]
|
||||
fn from(r: &'a Arc<Buffer<T, M>>) -> BufferSlice<'a, T, M> {
|
||||
fn from(r: &'a Arc<Buffer<T, M>>) -> BufferSlice<T> {
|
||||
BufferSlice {
|
||||
marker: PhantomData,
|
||||
resource: r.clone(),
|
||||
inner: &r.inner,
|
||||
offset: 0,
|
||||
size: r.inner.size,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'a, M: 'a> From<BufferSlice<'a, T, M>> for BufferSlice<'a, [T], M> {
|
||||
impl<T> From<BufferSlice<T>> for BufferSlice<[T]> {
|
||||
#[inline]
|
||||
fn from(r: BufferSlice<'a, T, M>) -> BufferSlice<'a, [T], M> {
|
||||
fn from(r: BufferSlice<T>) -> BufferSlice<[T]> {
|
||||
BufferSlice {
|
||||
marker: PhantomData,
|
||||
resource: r.resource,
|
||||
inner: r.inner,
|
||||
offset: r.offset,
|
||||
size: r.size,
|
||||
}
|
||||
|
@ -155,9 +155,9 @@ impl InnerCommandBufferBuilder {
|
||||
///
|
||||
/// - Care must be taken to respect the rules about secondary command buffers.
|
||||
///
|
||||
pub unsafe fn update_buffer<'a, B, T: 'a, M: 'a>(self, buffer: B, data: &T)
|
||||
-> InnerCommandBufferBuilder
|
||||
where B: Into<BufferSlice<'a, T, M>>
|
||||
pub unsafe fn update_buffer<B, T>(self, buffer: B, data: &T)
|
||||
-> InnerCommandBufferBuilder
|
||||
where B: Into<BufferSlice<T>>
|
||||
{
|
||||
{
|
||||
let vk = self.device.pointers();
|
||||
@ -168,13 +168,13 @@ impl InnerCommandBufferBuilder {
|
||||
assert!(buffer.size() <= 65536);
|
||||
assert!(buffer.offset() % 4 == 0);
|
||||
assert!(buffer.size() % 4 == 0);
|
||||
assert!(buffer.usage_transfer_dest());
|
||||
assert!(buffer.buffer().usage_transfer_dest());
|
||||
|
||||
// FIXME: check that the queue family supports transfers
|
||||
// FIXME: add the buffer to the list of resources
|
||||
// FIXME: check queue family of the buffer
|
||||
|
||||
vk.CmdUpdateBuffer(self.cmd.unwrap(), buffer.internal_object(),
|
||||
vk.CmdUpdateBuffer(self.cmd.unwrap(), buffer.buffer().internal_object(),
|
||||
buffer.offset() as vk::DeviceSize,
|
||||
buffer.size() as vk::DeviceSize, data as *const T as *const _);
|
||||
}
|
||||
@ -321,12 +321,12 @@ impl InnerCommandBufferBuilder {
|
||||
|
||||
/// Calls `vkCmdDrawIndexed`.
|
||||
// FIXME: push constants
|
||||
pub unsafe fn draw_indexed<'a, V, Pl, L, I, Ib, IbM>(mut self, pipeline: &Arc<GraphicsPipeline<V, Pl>>,
|
||||
pub unsafe fn draw_indexed<V, Pl, L, I, Ib>(mut self, pipeline: &Arc<GraphicsPipeline<V, Pl>>,
|
||||
vertices: V, indices: Ib, dynamic: &DynamicState,
|
||||
sets: L) -> InnerCommandBufferBuilder
|
||||
where V: 'static + MultiVertex, L: 'static + DescriptorSetsCollection,
|
||||
Pl: 'static + PipelineLayoutDesc,
|
||||
Ib: Into<BufferSlice<'a, [I], IbM>>, I: 'static + Index, IbM: 'static
|
||||
Ib: Into<BufferSlice<[I]>>, I: 'static + Index
|
||||
{
|
||||
|
||||
// FIXME: add buffers to the resources
|
||||
|
@ -60,9 +60,8 @@ impl PrimaryCommandBufferBuilder {
|
||||
/// - Panicks if the queue family doesn't support transfer operations.
|
||||
///
|
||||
#[inline]
|
||||
pub fn update_buffer<'a, B, T: 'a, M: 'a>(self, buffer: B, data: &T)
|
||||
-> PrimaryCommandBufferBuilder
|
||||
where B: Into<BufferSlice<'a, T, M>>
|
||||
pub fn update_buffer<B, T>(self, buffer: B, data: &T) -> PrimaryCommandBufferBuilder
|
||||
where B: Into<BufferSlice<T>>
|
||||
{
|
||||
unsafe {
|
||||
PrimaryCommandBufferBuilder {
|
||||
@ -220,11 +219,11 @@ impl PrimaryCommandBufferBuilderInlineDraw {
|
||||
}
|
||||
|
||||
/// Calls `vkCmdDrawIndexed`.
|
||||
pub fn draw_indexed<'a, V, L, Pl, I, Ib, IbM>(self, pipeline: &Arc<GraphicsPipeline<V, Pl>>,
|
||||
pub fn draw_indexed<V, L, Pl, I, Ib>(self, pipeline: &Arc<GraphicsPipeline<V, Pl>>,
|
||||
vertices: V, indices: Ib, dynamic: &DynamicState,
|
||||
sets: L) -> PrimaryCommandBufferBuilderInlineDraw
|
||||
where V: 'static + MultiVertex, Pl: 'static + PipelineLayoutDesc,
|
||||
Ib: Into<BufferSlice<'a, [I], IbM>>, I: 'static + Index, IbM: 'static,
|
||||
Ib: Into<BufferSlice<[I]>>, I: 'static + Index,
|
||||
L: DescriptorSetsCollection + 'static
|
||||
{
|
||||
unsafe {
|
||||
@ -477,9 +476,8 @@ impl SecondaryComputeCommandBufferBuilder {
|
||||
/// - Panicks if the queue family doesn't support transfer operations.
|
||||
///
|
||||
#[inline]
|
||||
pub fn update_buffer<'a, B, T: 'a, M: 'a>(self, buffer: B, data: &T)
|
||||
-> SecondaryComputeCommandBufferBuilder
|
||||
where B: Into<BufferSlice<'a, T, M>>
|
||||
pub fn update_buffer<B, T>(self, buffer: B, data: &T) -> SecondaryComputeCommandBufferBuilder
|
||||
where B: Into<BufferSlice<T>>
|
||||
{
|
||||
unsafe {
|
||||
SecondaryComputeCommandBufferBuilder {
|
||||
|
Loading…
Reference in New Issue
Block a user