Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pub fn draw_triangle_frame(&mut self, triangle: Triangle) -> Result<(), &'static str> {
- // FRAME SETUP
- let image_available = &self.image_available_semaphores[self.current_frame];
- let render_finished = &self.render_finished_semaphores[self.current_frame];
- // advance the frame before early returns can happen
- self.current_frame = (self.current_frame + 1) % self.frames_in_flight;
- let (i_u32, i_usize) = unsafe {
- let image_index = self
- .swapchain
- .acquire_image(core::u64::MAX, FrameSync::Semaphore(image_available))
- .map_err(|_| "Couldn't acquire an image from the swapchain!")?;
- (image_index, image_index as usize)
- };
- let flight_fence = &self.in_flight_fences[i_usize];
- unsafe {
- self.device
- .wait_for_fence(flight_fence, core::u64::MAX)
- .map_err(|_| "Failed to wait on the fence!")?;
- self.device
- .reset_fence(flight_fence)
- .map_err(|_| "Couldn't reset fence!")?;
- }
- unsafe {
- let mut data_target = self
- .device
- .acquire_mapping_writer(&*self.memory, 0..self.requirements.size)
- .map_err(|_| "Failed to acquire a memory writer!")?;
- let points = triangle.points_flat();
- data_target[..points.len()].copy_from_slice(&points);
- self.device
- .release_mapping_writer(data_target)
- .map_err(|_| "Couldn't release the mapping writer")?;
- }
- // record commands
- unsafe {
- let buffer = &mut self.command_buffers[i_usize];
- const TRIANGLE_CLEAR: [ClearValue; 1] =
- [ClearValue::Color(ClearColor::Float([0.1, 0.2, 0.3, 1.0]))];
- buffer.begin(false);
- {
- let mut encoder = buffer.begin_render_pass_inline(
- &self.render_pass,
- &self.framebuffers[i_usize],
- self.render_area,
- TRIANGLE_CLEAR.iter(),
- );
- encoder.bind_graphics_pipeline(&self.graphics_pipeline);
- // force deref impl of ManuallyDrop to do stuff
- let buffer_ref: &<back::Backend as Backend>::Buffer = &self.buffer;
- let buffers: ArrayVec<[_; 1]> = [(buffer_ref, 0)].into();
- encoder.bind_vertex_buffers(0, buffers);
- encoder.draw(0..3, 0..1);
- }
- buffer.finish()
- }
- // Submission
- let command_buffers = &self.command_buffers[i_usize..=i_usize];
- let wait_semaphores: ArrayVec<[_; 1]> =
- [(image_available, PipelineStage::COLOR_ATTACHMENT_OUTPUT)].into();
- let signal_semaphores: ArrayVec<[_; 1]> = [render_finished].into();
- // apparently, you gotta do this twice, because reasons
- let present_wait_semaphores: ArrayVec<[_; 1]> = [render_finished].into();
- let submission = Submission {
- command_buffers,
- wait_semaphores,
- signal_semaphores,
- };
- let the_command_queue = &mut self.queue_group.queues[0];
- unsafe {
- the_command_queue.submit(submission, Some(flight_fence));
- self.swapchain
- .present(the_command_queue, i_u32, present_wait_semaphores)
- .map_err(|_| "Failed to present into the swapchain!")
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement