mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Merge #367
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:
@@ -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
|
||||
|
||||
@@ -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]>,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user