diff --git a/.vscode/launch.json b/.vscode/launch.json index 91b425d9..faa6e76a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,5 +3,20 @@ // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", - "configurations": [] + "configurations": [ + { + "type": "lldb", + "request": "launch", + "name": "Cargo test", + "cargo": { + "args": [ + "test", + "--no-run", + "--lib" + ] + }, + "args": [] + } + + ] } \ No newline at end of file diff --git a/src/executor.rs b/src/executor.rs index 2b478871..f2de5d3d 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -135,44 +135,44 @@ impl Executor { } } -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test() { - let (executor, spawner) = new_executor_and_spawner(); - - spawner.spawn(async { - println!("howdy!"); - // Wait for our timer future to complete after two seconds. - TimerFuture::new(std::time::Duration::new(2, 0)).await; - println!("done!"); - }); +// #[cfg(test)] +// mod tests { +// use super::*; - drop(spawner); +// #[test] +// fn test() { +// let (executor, spawner) = new_executor_and_spawner(); - executor.run(); - } +// spawner.spawn(async { +// println!("howdy!"); +// // Wait for our timer future to complete after two seconds. +// TimerFuture::new(std::time::Duration::new(2, 0)).await; +// println!("done!"); +// }); + +// drop(spawner); + +// executor.run(); +// } - // #[test] - // fn test_systems_as_parameters() { - // let mut dispatcher = Dispatcher::new(); +// // #[test] +// // fn test_systems_as_parameters() { +// // let mut dispatcher = Dispatcher::new(); - // let test_system = TestSystem::new(); +// // let test_system = TestSystem::new(); - // let system_handle = dispatcher.add_system(test_system); +// // let system_handle = dispatcher.add_system(test_system); - // async fn task(orchestrator: &Orchestrator<'static>) { - // // let test_system = orchestrator.get_system::(system_handle).await; +// // async fn task(orchestrator: &Orchestrator<'static>) { +// // // let test_system = orchestrator.get_system::(system_handle).await; - // // let test_system = test_system.lock().unwrap(); +// // // let test_system = test_system.lock().unwrap(); - // // assert_eq!(test_system.get_value(), 0); - // }; +// // // assert_eq!(test_system.get_value(), 0); +// // }; - // dispatcher.execute_task_2(task); +// // dispatcher.execute_task_2(task); - // dispatcher.update(); - // } -} \ No newline at end of file +// // dispatcher.update(); +// // } +// } \ No newline at end of file diff --git a/src/input_manager.rs b/src/input_manager.rs index 1920120e..825efc66 100644 --- a/src/input_manager.rs +++ b/src/input_manager.rs @@ -635,20 +635,37 @@ impl InputManager { pub fn get_action_state(&self, input_event_handle: ActionHandle, device_handle: &DeviceHandle) -> InputEventState { let action = &self.actions[input_event_handle.0 as usize]; - // let input_sources_values = action.input_event_descriptions.iter().map(|input_event_description| { - // (self.get_input_source_record(device_handle, InputSourceAction::Handle(input_event_description.input_source_handle)), input_event_description.input_source_handle, input_event_description) - // }).collect::>(); - - // Assume linear event, boolean input sources, last event takes precedence - - let record = self.records.iter().filter(|r| action.input_event_descriptions.iter().any(|ied| ied.input_source_handle == r.input_source_handle)).max_by_key(|r| r.time).unwrap(); - - let value = self.resolve_action_value_from_record(action, record); + if let Some(record) = self.records.iter().filter(|r| action.input_event_descriptions.iter().any(|ied| ied.input_source_handle == r.input_source_handle)).max_by_key(|r| r.time) { + let value = self.resolve_action_value_from_record(action, record); + + InputEventState { + device_handle: device_handle.clone(), + input_event_handle, + value, + } + } else { + let value = match self.input_sources[action.input_event_descriptions[0].input_source_handle.0 as usize].type_ { + InputTypes::Bool(v) => { + match action.type_ { + Types::Bool => { + Value::Bool(false) + } + Types::Float => { + Value::Float(0.0f32) + } + _ => panic!() + } + } + InputTypes::Float(v) => Value::Float(v.default), + InputTypes::Vector2(v) => Value::Vector2(v.default), + _ => panic!() + }; - InputEventState { - device_handle: device_handle.clone(), - input_event_handle, - value, + InputEventState { + device_handle: device_handle.clone(), + input_event_handle, + value, + } } } @@ -658,7 +675,7 @@ impl InputManager { match action.type_ { Types::Float => { let float = match record.value { - Value::Bool(value) => { + Value::Bool(record_value) => { if let Some(last) = action.stack.last() { if let Value::Bool(value) = last.value { let event_description_for_input_source = action.input_event_descriptions.iter().find(|description| description.input_source_handle == last.input_source_handle).unwrap(); @@ -680,7 +697,7 @@ impl InputManager { match mapping.mapping { Value::Bool(value) => if value { 1f32 } else { 0f32 }, Value::Unicode(_) => 0f32, - Value::Float(value) => value, + Value::Float(mapping_value) => mapping_value * record_value as u32 as f32, Value::Int(value) => value as f32, Value::Rgba(value) => value.r, Value::Vector2(value) => value.x, diff --git a/src/render_backend.rs b/src/render_backend.rs index 2ea898b2..b563b1b7 100644 --- a/src/render_backend.rs +++ b/src/render_backend.rs @@ -267,10 +267,10 @@ bitflags! { const HOST = 0b01000000; /// The all graphics stage. const ALL_GRAPHICS = 0b10000000; + /// The shader read stage. + const SHADER_READ = 0b100000000; /// The all stage. const ALL = 0b11111111; - /// The shader read stage. - const SHADER_READ = 0b00000001; } } @@ -387,9 +387,9 @@ pub enum DescriptorInfo { /// The buffer of the descriptor. buffer: Buffer, /// The offset to start reading from inside the buffer. - offset: u64, + offset: usize, /// How much to read from the buffer after `offset`. - range: u64, + range: usize, }, /// A texture descriptor. Texture { diff --git a/src/render_domain.rs b/src/render_domain.rs index 4cb16eac..659dca3c 100644 --- a/src/render_domain.rs +++ b/src/render_domain.rs @@ -43,8 +43,8 @@ impl VisibilityWorldRenderDomain { let frames = (0..2).map(|_| render_system.create_frame()).collect::>(); let vertex_layout = [ - render_system::VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: false }, - render_system::VertexElement{ name: "NORMAL".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: false }, + render_system::VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + render_system::VertexElement{ name: "NORMAL".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, ]; let bindings = [ @@ -110,13 +110,13 @@ impl VisibilityWorldRenderDomain { descriptor_set, binding: 0, array_element: 0, - descriptor: render_system::Descriptor::Buffer(camera_data_buffer_handle), + descriptor: render_system::Descriptor::Buffer{ handle: camera_data_buffer_handle, size: 64 }, }, render_system::DescriptorWrite { descriptor_set, binding: 1, array_element: 0, - descriptor: render_system::Descriptor::Buffer(meshes_data_buffer), + descriptor: render_system::Descriptor::Buffer{ handle: meshes_data_buffer, size: 64 }, }, ]); diff --git a/src/render_system.rs b/src/render_system.rs index e9a04c7b..fc64928b 100644 --- a/src/render_system.rs +++ b/src/render_system.rs @@ -91,7 +91,7 @@ pub enum DataTypes { pub struct VertexElement { pub name: String, pub format: DataTypes, - pub shuffled: bool, + pub binding: u32, } #[derive(PartialEq, Eq, Clone, Copy)] @@ -477,7 +477,7 @@ impl CommandBufferRecording<'_> { } /// Ends recording on the command buffer. - pub fn end(&mut self) { + fn end(&mut self) { if self.in_render_pass { self.render_system.render_backend.end_render_pass(&self.render_system.command_buffers[self.command_buffer.0 as usize].command_buffer); } @@ -556,7 +556,10 @@ pub struct DescriptorSet { } pub enum Descriptor { - Buffer(BufferHandle), + Buffer{ + handle: BufferHandle, + size: usize, + }, Texture(TextureHandle), } @@ -709,7 +712,7 @@ impl RenderSystem { pointer: std::ptr::null_mut(), }, vertex_layout_hash, - index_count: indices.len() as u32 / 4, + index_count: indices.len() as u32 / 2, }); mesh_handle @@ -810,14 +813,14 @@ impl RenderSystem { binding: descriptor_write.binding, array_element: descriptor_write.array_element, descriptor_type: match descriptor_write.descriptor { - Descriptor::Buffer(_) => render_backend::DescriptorType::UniformBuffer, + Descriptor::Buffer{ handle, size } => render_backend::DescriptorType::UniformBuffer, Descriptor::Texture(_) => render_backend::DescriptorType::SampledImage, }, descriptor_info: match descriptor_write.descriptor { - Descriptor::Buffer(buffer_handle) => { + Descriptor::Buffer{ handle: buffer_handle, size } => { let buffer = &self.buffers[buffer_handle.0 as usize]; assert!(buffer.role == "GPU_READ"); - render_backend::DescriptorInfo::Buffer{ buffer: buffer.buffer, offset: 0, range: 128 } + render_backend::DescriptorInfo::Buffer{ buffer: buffer.buffer, offset: 0, range: size } } Descriptor::Texture(texture_handle) => render_backend::DescriptorInfo::Texture{ texture: self.textures[texture_handle.0 as usize].texture_view.unwrap(), format: render_backend::TextureFormats::RGBAu8, layout: render_backend::Layouts::Texture, }, }, @@ -1464,13 +1467,13 @@ mod tests { ]; let vertex_layout = [ - VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: true }, - VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, shuffled: true }, + VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, binding: 0 }, ]; let mesh = unsafe { renderer.add_mesh_from_vertices_and_indices( std::slice::from_raw_parts(floats.as_ptr() as *const u8, (3*4 + 4*4) * 3), - std::slice::from_raw_parts([0, 1, 2].as_ptr() as *const u8, 3 * 4), + std::slice::from_raw_parts([0u16, 1u16, 2u16].as_ptr() as *const u8, 3 * 2), &vertex_layout ) }; @@ -1550,8 +1553,6 @@ mod tests { command_buffer_recording.synchronize_texture(render_target); - command_buffer_recording.end(); - renderer.execute(Some(frame_handle), command_buffer_recording, &[], &[], signal); renderer.end_frame_capture(); @@ -1619,13 +1620,13 @@ mod tests { ]; let vertex_layout = [ - VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: true }, - VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, shuffled: true }, + VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, binding: 0 }, ]; let mesh = unsafe { renderer.add_mesh_from_vertices_and_indices( std::slice::from_raw_parts(floats.as_ptr() as *const u8, (3*4 + 4*4) * 3), - std::slice::from_raw_parts([0, 1, 2].as_ptr() as *const u8, 3 * 4), + std::slice::from_raw_parts([0u16, 1u16, 2u16].as_ptr() as *const u8, 3 * 2), &vertex_layout ) }; @@ -1657,8 +1658,8 @@ mod tests { } "; - let vertex_shader = renderer.add_shader(crate::render_system::ShaderSourceType::GLSL, vertex_shader_code.as_bytes()); - let fragment_shader = renderer.add_shader(crate::render_system::ShaderSourceType::GLSL, fragment_shader_code.as_bytes()); + let vertex_shader = renderer.add_shader(ShaderSourceType::GLSL, vertex_shader_code.as_bytes()); + let fragment_shader = renderer.add_shader(ShaderSourceType::GLSL, fragment_shader_code.as_bytes()); let pipeline_layout = renderer.create_pipeline_layout(&[]); @@ -1667,7 +1668,7 @@ mod tests { let attachments = [ crate::render_system::AttachmentInfo { texture: render_target, - format: crate::render_backend::TextureFormats::BGRAu8, + format: crate::render_backend::TextureFormats::RGBAu8, clear: None, load: false, store: true, @@ -1709,8 +1710,6 @@ mod tests { command_buffer_recording.copy_textures(&[(render_target, swapchain_texture_handle,)]); - command_buffer_recording.end(); - renderer.execute(Some(frame_handle), command_buffer_recording, &[image_ready], &[render_finished_synchronizer], render_finished_synchronizer); renderer.present(Some(frame_handle), image_index, render_finished_synchronizer); @@ -1745,13 +1744,13 @@ mod tests { ]; let vertex_layout = [ - VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: true }, - VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, shuffled: true }, + VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, binding: 0 }, ]; let mesh = unsafe { renderer.add_mesh_from_vertices_and_indices( std::slice::from_raw_parts(floats.as_ptr() as *const u8, (3*4 + 4*4) * 3), - std::slice::from_raw_parts([0, 1, 2].as_ptr() as *const u8, 3 * 4), + std::slice::from_raw_parts([0u16, 1u16, 2u16].as_ptr() as *const u8, 3 * 2), &vertex_layout ) }; @@ -1836,8 +1835,6 @@ mod tests { command_buffer_recording.synchronize_texture(render_target); - command_buffer_recording.end(); - renderer.execute(Some(frames[i % FRAMES_IN_FLIGHT]), command_buffer_recording, &[], &[], render_finished_synchronizer); renderer.end_frame_capture(); @@ -1869,13 +1866,13 @@ mod tests { ]; let vertex_layout = [ - VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: true }, - VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, shuffled: true }, + VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, binding: 0 }, ]; let mesh = unsafe { renderer.add_mesh_from_vertices_and_indices( std::slice::from_raw_parts(floats.as_ptr() as *const u8, (3*4 + 4*4) * 3), - std::slice::from_raw_parts([0, 1, 2].as_ptr() as *const u8, 3 * 4), + std::slice::from_raw_parts([0u16, 1u16, 2u16].as_ptr() as *const u8, 3 * 2), &vertex_layout ) }; @@ -1984,8 +1981,6 @@ mod tests { command_buffer_recording.synchronize_texture(render_target); - command_buffer_recording.end(); - renderer.execute(Some(frames[i % FRAMES_IN_FLIGHT]), command_buffer_recording, &[], &[], render_finished_synchronizer); renderer.end_frame_capture(); @@ -2009,13 +2004,13 @@ mod tests { ]; let vertex_layout = [ - VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, shuffled: true }, - VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, shuffled: true }, + VertexElement{ name: "POSITION".to_string(), format: crate::render_system::DataTypes::Float3, binding: 0 }, + VertexElement{ name: "COLOR".to_string(), format: crate::render_system::DataTypes::Float4, binding: 0 }, ]; let mesh = unsafe { renderer.add_mesh_from_vertices_and_indices( std::slice::from_raw_parts(floats.as_ptr() as *const u8, (3*4 + 4*4) * 3), - std::slice::from_raw_parts([0, 1, 2].as_ptr() as *const u8, 3 * 4), + std::slice::from_raw_parts([0u16, 1u16, 2u16].as_ptr() as *const u8, 3 * 2), &vertex_layout ) }; @@ -2099,7 +2094,7 @@ mod tests { let descriptor_set = renderer.create_descriptor_set(&descriptor_set_layout_handle, &bindings); renderer.write(&[ - DescriptorWrite { descriptor_set: descriptor_set, binding: 1, array_element: 0, descriptor: Descriptor::Buffer(buffer) }, + DescriptorWrite { descriptor_set: descriptor_set, binding: 1, array_element: 0, descriptor: Descriptor::Buffer{ handle: buffer, size: 64 } }, DescriptorWrite { descriptor_set: descriptor_set, binding: 2, array_element: 0, descriptor: Descriptor::Texture(sampled_texture) }, ]); @@ -2130,6 +2125,8 @@ mod tests { command_buffer_recording.write_texture_data(sampled_texture, &pixels); + command_buffer_recording.transition_textures(&[(sampled_texture, true, render_backend::Layouts::Texture, render_backend::Stages::SHADER_READ, render_backend::AccessPolicies::READ)]); + let attachments = [ crate::render_system::AttachmentInfo { texture: render_target, @@ -2152,8 +2149,6 @@ mod tests { command_buffer_recording.synchronize_texture(render_target); - command_buffer_recording.end(); - renderer.execute(Some(frame_handle), command_buffer_recording, &[], &[], signal); renderer.end_frame_capture(); diff --git a/src/vulkan_render_backend.rs b/src/vulkan_render_backend.rs index d56cd5a4..773344ac 100644 --- a/src/vulkan_render_backend.rs +++ b/src/vulkan_render_backend.rs @@ -146,7 +146,7 @@ fn texture_format_and_resource_use_to_image_layout(_texture_format: render_backe } } render_backend::Layouts::Present => vk::ImageLayout::PRESENT_SRC_KHR, - render_backend::Layouts::Texture => vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL, + render_backend::Layouts::Texture => vk::ImageLayout::READ_ONLY_OPTIMAL, } } @@ -210,6 +210,10 @@ fn to_pipeline_stage_flags(stages: crate::render_backend::Stages) -> vk::Pipelin pipeline_stage_flags |= vk::PipelineStageFlags2::BOTTOM_OF_PIPE } + if stages.contains(render_backend::Stages::SHADER_READ) { + pipeline_stage_flags |= vk::PipelineStageFlags2::FRAGMENT_SHADER; // TODO: not really? + } + pipeline_stage_flags } @@ -223,6 +227,9 @@ fn to_access_flags(accesses: crate::render_backend::AccessPolicies, stages: crat if stages.intersects(render_backend::Stages::PRESENTATION) { access_flags |= vk::AccessFlags2::NONE } + if stages.intersects(render_backend::Stages::SHADER_READ) { + access_flags |= vk::AccessFlags2::SHADER_SAMPLED_READ; + } } if accesses.contains(crate::render_backend::AccessPolicies::WRITE) { @@ -556,8 +563,8 @@ impl render_backend::RenderBackend for VulkanRenderBackend { render_backend::DescriptorInfo::Buffer { buffer, offset, range } => { let a = vk::DescriptorBufferInfo::default() .buffer(unsafe { buffer.vulkan_buffer.buffer }) - .offset(offset) - .range(range); + .offset(offset as u64) + .range(range as u64); buffers.push(a); write_info.buffer_info(&buffers) }, @@ -641,30 +648,32 @@ impl render_backend::RenderBackend for VulkanRenderBackend { render_backend::PipelineConfigurationBlocks::VertexInput { vertex_elements } => { let mut vertex_input_attribute_descriptions = vec![]; - let mut offset = 0; - + let mut offset_per_binding = [0, 0, 0, 0, 0, 0, 0, 0]; // Assume 8 bindings max + for (i, vertex_element) in vertex_elements.iter().enumerate() { let ve = vk::VertexInputAttributeDescription::default() - .binding(i as u32) // TODO: change + .binding(vertex_element.binding) .location(i as u32) .format(vertex_element.format.into()) - .offset(0); // TODO: change + .offset(offset_per_binding[vertex_element.binding as usize]); vertex_input_attribute_descriptions.push(ve); - offset += vertex_element.format.size() as u32; + offset_per_binding[vertex_element.binding as usize] += vertex_element.format.size() as u32; + } + + let max_binding = vertex_elements.iter().map(|ve| ve.binding).max().unwrap() + 1; + + let mut vertex_binding_descriptions = Vec::with_capacity(max_binding as usize); + + for i in 0..max_binding { + vertex_binding_descriptions.push( + vk::VertexInputBindingDescription::default() + .binding(i) + .stride(offset_per_binding[i as usize]) + .input_rate(vk::VertexInputRate::VERTEX) + ) } - - let vertex_binding_descriptions = [ - vk::VertexInputBindingDescription::default() - .binding(0) - .stride(12) - .input_rate(vk::VertexInputRate::VERTEX), - vk::VertexInputBindingDescription::default() - .binding(1) - .stride(12) - .input_rate(vk::VertexInputRate::VERTEX), - ]; let vertex_input_state = vk::PipelineVertexInputStateCreateInfo::default() .vertex_attribute_descriptions(&vertex_input_attribute_descriptions) @@ -1264,7 +1273,7 @@ impl render_backend::RenderBackend for VulkanRenderBackend { unsafe { self.device.cmd_bind_vertex_buffers(command_buffer.vulkan_command_buffer.command_buffer, 0, &buffers, &offsets); } } - fn bind_index_buffer(&self, command_buffer: &crate::render_backend::CommandBuffer, buffer_descriptor: &crate::render_backend::BufferDescriptor) { + fn bind_index_buffer(&self, command_buffer: &render_backend::CommandBuffer, buffer_descriptor: &render_backend::BufferDescriptor) { unsafe { self.device.cmd_bind_index_buffer(command_buffer.vulkan_command_buffer.command_buffer, buffer_descriptor.buffer.vulkan_buffer.buffer, buffer_descriptor.offset, vk::IndexType::UINT16); } }