diff --git a/examples/src/bin/deferred/frame/ambient_lighting_system.rs b/examples/src/bin/deferred/frame/ambient_lighting_system.rs index 1fc27b003..815687d04 100644 --- a/examples/src/bin/deferred/frame/ambient_lighting_system.rs +++ b/examples/src/bin/deferred/frame/ambient_lighting_system.rs @@ -136,7 +136,7 @@ impl AmbientLightingSystem { } } -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } diff --git a/examples/src/bin/deferred/frame/directional_lighting_system.rs b/examples/src/bin/deferred/frame/directional_lighting_system.rs index 517ef9da0..24c0fa3e1 100644 --- a/examples/src/bin/deferred/frame/directional_lighting_system.rs +++ b/examples/src/bin/deferred/frame/directional_lighting_system.rs @@ -148,7 +148,7 @@ impl DirectionalLightingSystem { } } -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } diff --git a/examples/src/bin/deferred/frame/point_lighting_system.rs b/examples/src/bin/deferred/frame/point_lighting_system.rs index e456b4e66..73e02c9a4 100644 --- a/examples/src/bin/deferred/frame/point_lighting_system.rs +++ b/examples/src/bin/deferred/frame/point_lighting_system.rs @@ -162,7 +162,7 @@ impl PointLightingSystem { } } -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } diff --git a/examples/src/bin/deferred/triangle_draw_system.rs b/examples/src/bin/deferred/triangle_draw_system.rs index 83bf65982..307036026 100644 --- a/examples/src/bin/deferred/triangle_draw_system.rs +++ b/examples/src/bin/deferred/triangle_draw_system.rs @@ -88,7 +88,7 @@ impl TriangleDrawSystem { } } -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } diff --git a/examples/src/bin/image/main.rs b/examples/src/bin/image/main.rs index abd50d39f..d34952698 100644 --- a/examples/src/bin/image/main.rs +++ b/examples/src/bin/image/main.rs @@ -76,7 +76,7 @@ fn main() { }; - #[derive(Debug, Clone)] + #[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } vulkano::impl_vertex!(Vertex, position); diff --git a/examples/src/bin/instancing.rs b/examples/src/bin/instancing.rs index e021f8897..2d447e0c0 100644 --- a/examples/src/bin/instancing.rs +++ b/examples/src/bin/instancing.rs @@ -44,14 +44,14 @@ use std::sync::Arc; // graphics pipeline, we need to define two vertex types: // // 1. `Vertex` is the vertex type that we will use to describe the triangle's geometry. -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2], } impl_vertex!(Vertex, position); // 2. `InstanceData` is the vertex type that describes the unique data per instance. -#[derive(Debug, Clone)] +#[derive(Default, Debug, Clone)] struct InstanceData { position_offset: [f32; 2], scale: f32, diff --git a/examples/src/bin/msaa-renderpass.rs b/examples/src/bin/msaa-renderpass.rs index f3c1cdf13..3a840c483 100644 --- a/examples/src/bin/msaa-renderpass.rs +++ b/examples/src/bin/msaa-renderpass.rs @@ -178,7 +178,7 @@ void main() { let vs = vs::Shader::load(device.clone()).unwrap(); let fs = fs::Shader::load(device.clone()).unwrap(); - #[derive(Copy, Clone)] + #[derive(Default, Copy, Clone)] struct Vertex { position: [f32; 2], } diff --git a/examples/src/bin/runtime-shader/main.rs b/examples/src/bin/runtime-shader/main.rs index c892b6048..5e19eca71 100644 --- a/examples/src/bin/runtime-shader/main.rs +++ b/examples/src/bin/runtime-shader/main.rs @@ -52,7 +52,7 @@ use std::fs::File; use std::io::Read; use std::sync::Arc; -#[derive(Copy, Clone)] +#[derive(Default, Copy, Clone)] pub struct Vertex { pub position: [f32; 2], pub color: [f32; 3], diff --git a/examples/src/bin/tessellation.rs b/examples/src/bin/tessellation.rs index ea0d50b8d..343ac9e44 100644 --- a/examples/src/bin/tessellation.rs +++ b/examples/src/bin/tessellation.rs @@ -167,7 +167,7 @@ fn main() { }; let vertex_buffer = { - #[derive(Debug, Clone)] + #[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } vulkano::impl_vertex!(Vertex, position); diff --git a/examples/src/bin/triangle.rs b/examples/src/bin/triangle.rs index 5cb85d851..1fe92ab29 100644 --- a/examples/src/bin/triangle.rs +++ b/examples/src/bin/triangle.rs @@ -170,7 +170,7 @@ fn main() { // We now create a buffer that will store the shape of our triangle. let vertex_buffer = { - #[derive(Debug, Clone)] + #[derive(Default, Debug, Clone)] struct Vertex { position: [f32; 2] } vulkano::impl_vertex!(Vertex, position); diff --git a/examples/src/lib.rs b/examples/src/lib.rs index c9444beea..d97daf1aa 100644 --- a/examples/src/lib.rs +++ b/examples/src/lib.rs @@ -7,7 +7,7 @@ // notice may not be copied, modified, or distributed except // according to those terms. -#[derive(Copy, Clone)] +#[derive(Default, Copy, Clone)] pub struct Vertex { position: (f32, f32, f32) } @@ -549,7 +549,7 @@ pub const VERTICES: [Vertex; 531] = [ Vertex { position: (34.9202, 28.3457, -15.6121) } ]; -#[derive(Copy, Clone)] +#[derive(Default, Copy, Clone)] pub struct Normal { normal: (f32, f32, f32) } diff --git a/vulkano-shaders/src/structs.rs b/vulkano-shaders/src/structs.rs index d0b18675d..00af5ecc8 100644 --- a/vulkano-shaders/src/structs.rs +++ b/vulkano-shaders/src/structs.rs @@ -202,8 +202,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: i8, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{i8}, Some(size), mem::align_of::()); + return (quote!{i8}, Some(std::mem::size_of::()), mem::align_of::()); }, (8, false) => { #[repr(C)] @@ -211,8 +210,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: u8, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{u8}, Some(size), mem::align_of::()); + return (quote!{u8}, Some(std::mem::size_of::()), mem::align_of::()); }, (16, true) => { #[repr(C)] @@ -220,8 +218,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: i16, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{i16}, Some(size), mem::align_of::()); + return (quote!{i16}, Some(std::mem::size_of::()), mem::align_of::()); }, (16, false) => { #[repr(C)] @@ -229,8 +226,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: u16, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{u16}, Some(size), mem::align_of::()); + return (quote!{u16}, Some(std::mem::size_of::()), mem::align_of::()); }, (32, true) => { #[repr(C)] @@ -238,8 +234,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: i32, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{i32}, Some(size), mem::align_of::()); + return (quote!{i32}, Some(std::mem::size_of::()), mem::align_of::()); }, (32, false) => { #[repr(C)] @@ -247,8 +242,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: u32, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{u32}, Some(size), mem::align_of::()); + return (quote!{u32}, Some(std::mem::size_of::()), mem::align_of::()); }, (64, true) => { #[repr(C)] @@ -256,8 +250,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: i64, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{i64}, Some(size), mem::align_of::()); + return (quote!{i64}, Some(std::mem::size_of::()), mem::align_of::()); }, (64, false) => { #[repr(C)] @@ -265,8 +258,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: u64, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{u64}, Some(size), mem::align_of::()); + return (quote!{u64}, Some(std::mem::size_of::()), mem::align_of::()); }, _ => panic!("No Rust equivalent for an integer of width {}", width), } @@ -279,8 +271,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: f32, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{f32}, Some(size), mem::align_of::()); + return (quote!{f32}, Some(std::mem::size_of::()), mem::align_of::()); }, 64 => { #[repr(C)] @@ -288,8 +279,7 @@ pub fn type_from_id(doc: &Spirv, searched: u32) -> (TokenStream, Option, data: f64, after: u8, } - let size = unsafe { (&(&*(0 as *const Foo)).after) as *const u8 as usize }; - return (quote!{f64}, Some(size), mem::align_of::()); + return (quote!{f64}, Some(std::mem::size_of::()), mem::align_of::()); }, _ => panic!("No Rust equivalent for a floating-point of width {}", width), } diff --git a/vulkano/src/pipeline/vertex/impl_vertex.rs b/vulkano/src/pipeline/vertex/impl_vertex.rs index 0077a9291..5c63b5ff4 100644 --- a/vulkano/src/pipeline/vertex/impl_vertex.rs +++ b/vulkano/src/pipeline/vertex/impl_vertex.rs @@ -27,20 +27,15 @@ macro_rules! impl_vertex { $( if name == stringify!($member) { - let (ty, array_size) = unsafe { - #[inline] fn f(_: &T) -> (VertexMemberTy, usize) - { T::format() } - let dummy: *const $out = ptr::null(); - f(&(&*dummy).$member) - }; + let dummy = <$out>::default(); + #[inline] fn f(_: &T) -> (VertexMemberTy, usize) { T::format() } + let (ty, array_size) = f(&dummy.$member); + + let dummy_ptr = (&dummy) as *const _; + let member_ptr = (&dummy.$member) as *const _; return Some(VertexMemberInfo { - offset: unsafe { - let dummy: *const $out = ptr::null(); - let member = (&(&*dummy).$member) as *const _; - member as usize - }, - + offset: member_ptr as usize - dummy_ptr as usize, ty: ty, array_size: array_size, });