Switch util::* to DeviceSize

This commit is contained in:
Maik Klein 2017-06-11 17:49:38 +02:00
parent 0f8ac7ecff
commit 90d67c29c9
3 changed files with 44 additions and 31 deletions

View file

@ -1,6 +1,7 @@
use std::iter::Iterator; use std::iter::Iterator;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::mem::size_of; use std::mem::size_of;
use vk;
/// AlignByteSlice is the dynamic alternative to `Align`. Sometimes the user wants to /// AlignByteSlice is the dynamic alternative to `Align`. Sometimes the user wants to
/// align slices at runtime. One example would be to align different images in one buffer. /// align slices at runtime. One example would be to align different images in one buffer.
@ -9,8 +10,8 @@ use std::mem::size_of;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct AlignByteSlice { pub struct AlignByteSlice {
ptr: *mut (), ptr: *mut (),
alignment: usize, alignment: vk::DeviceSize,
size: usize, size: vk::DeviceSize,
} }
impl AlignByteSlice { impl AlignByteSlice {
@ -23,7 +24,7 @@ impl AlignByteSlice {
let ptr = (self.ptr as *mut u8).offset(current as isize); let ptr = (self.ptr as *mut u8).offset(current as isize);
let raw_slice = ::std::slice::from_raw_parts_mut(ptr, slice.len()); let raw_slice = ::std::slice::from_raw_parts_mut(ptr, slice.len());
raw_slice.copy_from_slice(slice); raw_slice.copy_from_slice(slice);
current += slice.len(); current += slice.len() as vk::DeviceSize;
let padding = current % self.alignment; let padding = current % self.alignment;
current += padding; current += padding;
} }
@ -32,7 +33,7 @@ impl AlignByteSlice {
} }
impl AlignByteSlice { impl AlignByteSlice {
pub unsafe fn new(ptr: *mut (), alignment: usize, size: usize) -> Self { pub unsafe fn new(ptr: *mut (), alignment: vk::DeviceSize, size: vk::DeviceSize) -> Self {
AlignByteSlice { AlignByteSlice {
ptr, ptr,
size, size,
@ -52,15 +53,15 @@ impl AlignByteSlice {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Align<T> { pub struct Align<T> {
ptr: *mut (), ptr: *mut (),
offset: usize, offset: vk::DeviceSize,
size: usize, size: vk::DeviceSize,
_m: PhantomData<T>, _m: PhantomData<T>,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct AlignIter<'a, T: 'a> { pub struct AlignIter<'a, T: 'a> {
align: &'a mut Align<T>, align: &'a mut Align<T>,
current: usize, current: vk::DeviceSize,
} }
impl<T: Copy> Align<T> { impl<T: Copy> Align<T> {
@ -71,13 +72,14 @@ impl<T: Copy> Align<T> {
} }
} }
fn calc_padding(adr: usize, align: usize) -> usize { fn calc_padding(adr: vk::DeviceSize, align: vk::DeviceSize) -> vk::DeviceSize {
(align - adr % align) % align (align - adr % align) % align
} }
impl<T> Align<T> { impl<T> Align<T> {
pub unsafe fn new(ptr: *mut (), alignment: usize, size: usize) -> Self { pub unsafe fn new(ptr: *mut (), alignment: vk::DeviceSize, size: vk::DeviceSize) -> Self {
let offset = size_of::<T>() + calc_padding(size_of::<T>(), alignment); let offset = size_of::<T>() as vk::DeviceSize +
calc_padding(size_of::<T>() as vk::DeviceSize, alignment);
Align { Align {
ptr, ptr,
offset, offset,

View file

@ -1,4 +1,3 @@
#[macro_use]
extern crate ash; extern crate ash;
#[macro_use] #[macro_use]
extern crate examples; extern crate examples;
@ -21,6 +20,13 @@ struct Vertex {
uv: [f32; 2], uv: [f32; 2],
} }
#[derive(Clone, Debug, Copy)]
pub struct Vector3 {
pub x: f32,
pub y: f32,
pub z: f32,
}
fn main() { fn main() {
unsafe { unsafe {
let base = ExampleBase::new(1920, 1080); let base = ExampleBase::new(1920, 1080);
@ -145,8 +151,8 @@ fn main() {
vk::MemoryMapFlags::empty()) vk::MemoryMapFlags::empty())
.unwrap(); .unwrap();
let mut index_slice = Align::new(index_ptr, let mut index_slice = Align::new(index_ptr,
index_buffer_memory_req.alignment as usize, index_buffer_memory_req.alignment,
index_buffer_memory_req.size as usize); index_buffer_memory_req.size);
index_slice.copy_from_slice(&index_buffer_data); index_slice.copy_from_slice(&index_buffer_data);
base.device.unmap_memory(index_buffer_memory); base.device.unmap_memory(index_buffer_memory);
base.device base.device
@ -207,15 +213,19 @@ fn main() {
vk::MemoryMapFlags::empty()) vk::MemoryMapFlags::empty())
.unwrap(); .unwrap();
let mut slice = Align::new(vert_ptr, let mut slice = Align::new(vert_ptr,
vertex_input_buffer_memory_req.alignment as usize, vertex_input_buffer_memory_req.alignment,
vertex_input_buffer_memory_req.size as usize); vertex_input_buffer_memory_req.size);
slice.copy_from_slice(&vertices); slice.copy_from_slice(&vertices);
base.device.unmap_memory(vertex_input_buffer_memory); base.device.unmap_memory(vertex_input_buffer_memory);
base.device base.device
.bind_buffer_memory(vertex_input_buffer, vertex_input_buffer_memory, 0) .bind_buffer_memory(vertex_input_buffer, vertex_input_buffer_memory, 0)
.unwrap(); .unwrap();
let uniform_color_buffer_data = [0.0f32, 0.0, 1.0]; let uniform_color_buffer_data = Vector3 {
x: 1.0,
y: 1.0,
z: 1.0,
};
let uniform_color_buffer_info = vk::BufferCreateInfo { let uniform_color_buffer_info = vk::BufferCreateInfo {
s_type: vk::StructureType::BufferCreateInfo, s_type: vk::StructureType::BufferCreateInfo,
p_next: ptr::null(), p_next: ptr::null(),
@ -247,15 +257,16 @@ fn main() {
let uniform_color_buffer_memory = base.device let uniform_color_buffer_memory = base.device
.allocate_memory(&uniform_color_buffer_allocate_info, None) .allocate_memory(&uniform_color_buffer_allocate_info, None)
.unwrap(); .unwrap();
//let mut uniform_slice = base.device let uniform_ptr = base.device
// .map_memory::<f32>(uniform_color_buffer_memory, .map_memory(uniform_color_buffer_memory,
// 0, 0,
// 12, uniform_color_buffer_memory_req.size,
// vk::MemoryMapFlags::empty(), vk::MemoryMapFlags::empty())
// 4) .unwrap();
// .unwrap(); let mut uniform_aligned_slice = Align::new(uniform_ptr,
// println!("{:?}", uniform_slice); uniform_color_buffer_memory_req.alignment,
// uniform_slice.copy_from_slice(&uniform_color_buffer_data[..]); uniform_color_buffer_memory_req.size);
uniform_aligned_slice.copy_from_slice(&[uniform_color_buffer_data]);
base.device.unmap_memory(uniform_color_buffer_memory); base.device.unmap_memory(uniform_color_buffer_memory);
base.device base.device
.bind_buffer_memory(uniform_color_buffer, uniform_color_buffer_memory, 0) .bind_buffer_memory(uniform_color_buffer, uniform_color_buffer_memory, 0)
@ -298,8 +309,8 @@ fn main() {
vk::MemoryMapFlags::empty()) vk::MemoryMapFlags::empty())
.unwrap(); .unwrap();
let mut image_slice = AlignByteSlice::new(image_ptr, let mut image_slice = AlignByteSlice::new(image_ptr,
image_buffer_memory_req.alignment as usize, image_buffer_memory_req.alignment,
image_buffer_memory_req.size as usize); image_buffer_memory_req.size);
image_slice.copy_from_slices(&[&image_data]); image_slice.copy_from_slices(&[&image_data]);
base.device.unmap_memory(image_buffer_memory); base.device.unmap_memory(image_buffer_memory);
base.device base.device

View file

@ -143,8 +143,8 @@ fn main() {
vk::MemoryMapFlags::empty()) vk::MemoryMapFlags::empty())
.unwrap(); .unwrap();
let mut index_slice = Align::new(index_ptr, let mut index_slice = Align::new(index_ptr,
index_buffer_memory_req.alignment as usize, index_buffer_memory_req.alignment,
index_buffer_memory_req.size as usize); index_buffer_memory_req.size);
index_slice.copy_from_slice(&index_buffer_data); index_slice.copy_from_slice(&index_buffer_data);
base.device.unmap_memory(index_buffer_memory); base.device.unmap_memory(index_buffer_memory);
base.device base.device
@ -201,8 +201,8 @@ fn main() {
vk::MemoryMapFlags::empty()) vk::MemoryMapFlags::empty())
.unwrap(); .unwrap();
let mut vert_align = Align::new(vert_ptr, let mut vert_align = Align::new(vert_ptr,
vertex_input_buffer_memory_req.alignment as usize, vertex_input_buffer_memory_req.alignment,
vertex_input_buffer_memory_req.size as usize); vertex_input_buffer_memory_req.size);
vert_align.copy_from_slice(&vertices); vert_align.copy_from_slice(&vertices);
base.device.unmap_memory(vertex_input_buffer_memory); base.device.unmap_memory(vertex_input_buffer_memory);
base.device base.device