Simplify BufferSlice

This commit is contained in:
Pierre Krieger 2016-02-24 08:44:43 +01:00
parent a6b166c7b6
commit 88f0eb5f71
3 changed files with 20 additions and 88 deletions

View File

@ -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,
}

View File

@ -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

View File

@ -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 {