diff --git a/shaders/shader.vert b/shaders/shader.vert index 93ea71f..11e7a6f 100644 --- a/shaders/shader.vert +++ b/shaders/shader.vert @@ -9,5 +9,5 @@ layout(location = 0) out vec4 colourdata_for_the_fragmentshader; void main() { gl_PointSize = size; gl_Position = position; - colourdata_for_the_fragmentshader = vec4(0.4, 1.0, 0.5, 1.0); + colourdata_for_the_fragmentshader = colour; } diff --git a/src/instance/buffer.rs b/src/instance/buffer.rs index d8abe7f..02b3564 100644 --- a/src/instance/buffer.rs +++ b/src/instance/buffer.rs @@ -82,8 +82,9 @@ impl Buffer { } } - pub unsafe fn fill(&mut self, data: &[u8]) { - let inner_buffer = self.mapped_slice_mut().unwrap(); - inner_buffer.copy_from_slice(data); + pub unsafe fn fill(&mut self, data: &[T]) { + let slice = self.mapped_slice_mut().unwrap(); + let inner_buffer = slice.as_ptr() as *mut T; + inner_buffer.copy_from_nonoverlapping(data.as_ptr(), data.len()); } } diff --git a/src/instance/mod.rs b/src/instance/mod.rs index 96a0df0..b53b456 100644 --- a/src/instance/mod.rs +++ b/src/instance/mod.rs @@ -111,20 +111,23 @@ impl EngineInstance { let renderpass = Self::init_renderpass(&device, surface_format.format)?; swapchain.create_framebuffers(&device, renderpass)?; + let pbuflen1: u32 = 16; + let pbuflen2: u32 = 20; + let nvertex: u32 = 1; + let ninstance: u32 = 6; + log::debug!("Create allocator"); let mut allocator = BufferAllocator::init(&ash_instance, physical_device, &device)?; - let mut buffer1 = allocator.create_buffer(&device, 16)?; - + let mut buffer1 = allocator.create_buffer(&device, pbuflen1 as u64 * ninstance as u64)?; unsafe { - let data: [u8; 16] = std::mem::transmute([-0.5f32, 0.0f32, 0.0f32, 1.0f32]); - buffer1.fill(&data); - } - - let mut buffer2 = allocator.create_buffer(&device, 20)?; - unsafe { - let data: [u8; 20] = std::mem::transmute([5.0f32, 1.0f32, 1.0f32, 0.0f32, 1.0f32]); - buffer2.fill(&data); - } + buffer1.fill(&[ + 0.4f32, -0.2f32, 0.0f32, 1.0f32, 0.2f32, 0.0f32, 0.0f32, 1.0f32, -0.4f32, 0.2f32, + 0.0f32, 1.0f32, 0.5f32, 0.0f32, 0.0f32, 1.0f32, 0.0f32, 0.2f32, 0.0f32, 1.0f32, + -0.5f32, 0.0f32, 0.0f32, 1.0f32, + ]) + }; + let mut buffer2 = allocator.create_buffer(&device, pbuflen2 as u64 * nvertex as u64)?; + unsafe { buffer2.fill(&[15.0f32, 0.0f32, 1.0f32, 0.0f32, 1.0f32]) }; let vertex_attrib_descs = [ vk::VertexInputAttributeDescription { @@ -149,12 +152,12 @@ impl EngineInstance { let vertex_binding_descs = [ vk::VertexInputBindingDescription { binding: 0, - stride: 16, - input_rate: vk::VertexInputRate::VERTEX, + stride: pbuflen1, + input_rate: vk::VertexInputRate::INSTANCE, }, vk::VertexInputBindingDescription { binding: 1, - stride: 20, + stride: pbuflen2, input_rate: vk::VertexInputRate::VERTEX, }, ]; @@ -183,6 +186,8 @@ impl EngineInstance { &pipeline, buffer1.buffer, buffer2.buffer, + nvertex, + ninstance, )?; } @@ -391,6 +396,8 @@ impl EngineInstance { // buffers: &[vk::Buffer], buffer1: vk::Buffer, buffer2: vk::Buffer, + vertex_count: u32, + instance_count: u32, ) -> Result<(), vk::Result> { let commandbuffer_begininfo = vk::CommandBufferBeginInfo::default(); unsafe { @@ -424,7 +431,7 @@ impl EngineInstance { ); device.cmd_bind_vertex_buffers(commandbuffer, 0, &[buffer1], &[0]); device.cmd_bind_vertex_buffers(commandbuffer, 1, &[buffer2], &[0]); - device.cmd_draw(commandbuffer, 1, 1, 0, 0); + device.cmd_draw(commandbuffer, vertex_count, instance_count, 0, 0); device.cmd_end_render_pass(commandbuffer); device.end_command_buffer(commandbuffer)?; }