diff --git a/skybox/src/lib.rs b/skybox/src/lib.rs index 09c93e8..79bc60a 100644 --- a/skybox/src/lib.rs +++ b/skybox/src/lib.rs @@ -1,6 +1,6 @@ mod vertex; -use std::{path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc, time::Duration}; use anyhow::Result; use ecs::*; @@ -94,8 +94,24 @@ impl SkyBox { .add_descriptor_set_layout(&descriptor_set_layout) .build(context.device().clone())?; - let pipeline = - Self::create_pipeline(context, sample_count, &render_target, &pipeline_layout)?; + let vertex_shader = ShaderModule::from_slice( + context.device().clone(), + include_bytes!("../shader/skybox.vert.spv"), + )?; + + let fragment_shader = ShaderModule::from_slice( + context.device().clone(), + include_bytes!("../shader/skybox.frag.spv"), + )?; + + let pipeline = Self::create_pipeline( + context, + sample_count, + &render_target, + &pipeline_layout, + &vertex_shader, + &fragment_shader, + )?; let descriptor_pool = DescriptorPool::builder() .set_layout(descriptor_set_layout) @@ -124,17 +140,32 @@ impl SkyBox { .map(|t| VertexPoint::new(t[0] as f32, t[1] as f32, t[2] as f32)) .collect::>(); - let cube_buffer = Buffer::builder() - .set_memory_usage(MemoryUsage::GpuOnly) - .set_sharing_mode(VK_SHARING_MODE_EXCLUSIVE) - .set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) - .set_data(&cube_mesh) - .build(context.device().clone())?; + let command_buffer = CommandBuffer::new_primary() + .build(context.device().clone(), context.queue().clone())?; + + let cube_buffer = SingleSubmit::builder(&command_buffer, context.queue(), |recorder| { + Buffer::builder() + .set_memory_usage(MemoryUsage::CpuToGpu) + .set_usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT) + .set_data(&cube_mesh) + .build(context.device().clone())? + .into_device_local( + recorder, + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + ) + }) + .wait_for_timeout(Duration::from_secs(2)) + .submit()?; let me = Self { _cube_map: cube_map, cube_buffer, + vertex_shader, + fragment_shader, + render_target, pipeline, descriptor_set, @@ -195,11 +226,18 @@ impl SkyBox { sample_count: VkSampleCountFlags, render_target: &TargetMode, pipeline_layout: &Arc, + vertex_shader: &Arc>, + fragment_shader: &Arc>, ) -> Result>> { render_target.execute(|render_target| { Pipeline::new_graphics() + .set_vertex_shader::(vertex_shader.clone()) + .set_fragment_shader(fragment_shader.clone()) + .input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, false) .default_multisample(sample_count) + .default_color_blend(vec![VkPipelineColorBlendAttachmentState::default()]) .default_rasterization(VK_CULL_MODE_NONE, VK_FRONT_FACE_CLOCKWISE) + .whole_area(render_target.width(), render_target.height()) .build( context.device().clone(), pipeline_layout, @@ -245,6 +283,6 @@ impl TScene for SkyBox { window_height: f32, images: &TargetMode>>, ) -> Result<()> { - todo!() + Ok(()) } }