367: Support rendering to the swapchain from multiple command buffers r=jazzay a=kvark

Fixes #366

Co-authored-by: Dzmitry Malyshau <kvarkus@gmail.com>
This commit is contained in:
bors[bot]
2019-11-02 12:12:50 +00:00
committed by GitHub
3 changed files with 17 additions and 17 deletions

View File

@@ -1571,22 +1571,20 @@ pub fn queue_submit<B: GfxBackend>(
let comb = &mut command_buffer_guard[cmb_id];
if let Some((view_id, fbo)) = comb.used_swap_chain.take() {
let sem = match texture_view_guard[view_id.value].inner {
match texture_view_guard[view_id.value].inner {
resource::TextureViewInner::Native { .. } => unreachable!(),
resource::TextureViewInner::SwapChain {
ref source_id,
ref mut framebuffer,
ref mut framebuffers,
..
} => {
assert!(
framebuffer.is_none(),
"Using a swap chain in multiple framebuffers is not supported yet"
);
*framebuffer = Some(fbo);
&swap_chain_guard[source_id.value].semaphore
if framebuffers.is_empty() {
let sem = &swap_chain_guard[source_id.value].semaphore;
signal_semaphores.push(sem);
}
framebuffers.push(fbo);
}
};
signal_semaphores.push(sem);
}
// optimize the tracked states

View File

@@ -18,6 +18,7 @@ use crate::{
use bitflags::bitflags;
use hal;
use rendy_memory::MemoryBlock;
use smallvec::SmallVec;
use std::borrow::Borrow;
@@ -274,9 +275,7 @@ pub(crate) enum TextureViewInner<B: hal::Backend> {
SwapChain {
image: <B::Surface as hal::window::PresentationSurface<B>>::SwapchainImage,
source_id: Stored<SwapChainId>,
//Note: limited to a single framebuffer, could be relaxed
// to support multiple ones.
framebuffer: Option<B::Framebuffer>,
framebuffers: SmallVec<[B::Framebuffer; 1]>,
},
}

View File

@@ -50,9 +50,12 @@ use crate::{gfx_select, hub::GLOBAL};
use hal::{self, device::Device as _, queue::CommandQueue as _, window::PresentationSurface as _};
use smallvec::SmallVec;
#[cfg(feature = "local")]
use std::marker::PhantomData;
const FRAME_TIMEOUT_MS: u64 = 1000;
pub const DESIRED_NUM_FRAMES: u32 = 3;
@@ -173,7 +176,7 @@ pub fn swap_chain_get_next_texture<B: GfxBackend>(
value: swap_chain_id,
ref_count: sc.life_guard.ref_count.clone(),
},
framebuffer: None,
framebuffers: SmallVec::new(),
},
format: sc.desc.format,
extent: hal::image::Extent {
@@ -229,11 +232,11 @@ pub fn swap_chain_present<B: GfxBackend>(global: &Global, swap_chain_id: SwapCha
.take()
.expect("Swap chain image is not acquired");
let (view, _) = hub.texture_views.unregister(view_id.value, &mut token);
let (image, framebuffer) = match view.inner {
let (image, framebuffers) = match view.inner {
resource::TextureViewInner::Native { .. } => unreachable!(),
resource::TextureViewInner::SwapChain {
image, framebuffer, ..
} => (image, framebuffer),
image, framebuffers, ..
} => (image, framebuffers),
};
let err = unsafe {
@@ -244,7 +247,7 @@ pub fn swap_chain_present<B: GfxBackend>(global: &Global, swap_chain_id: SwapCha
log::warn!("present failed: {:?}", e);
}
if let Some(fbo) = framebuffer {
for fbo in framebuffers {
unsafe {
device.raw.destroy_framebuffer(fbo);
}