vulkan: preserve framebuffer in pending frame
This commit is contained in:
parent
1b46fd0ceb
commit
cf6016f61f
5 changed files with 39 additions and 34 deletions
|
|
@ -257,23 +257,8 @@ pub enum ResetStatus {
|
|||
pub trait GfxFramebuffer: Debug {
|
||||
fn physical_size(&self) -> (i32, i32);
|
||||
|
||||
fn full_region(&self) -> Region {
|
||||
let (width, height) = self.physical_size();
|
||||
Region::new2(Rect::new_sized_unchecked(0, 0, width, height))
|
||||
}
|
||||
|
||||
fn render(
|
||||
&self,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
clear: Option<&Color>,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
self.render_with_region(acquire_sync, release_sync, ops, clear, &self.full_region())
|
||||
}
|
||||
|
||||
fn render_with_region(
|
||||
&self,
|
||||
self: Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
|
|
@ -300,8 +285,24 @@ pub trait GfxInternalFramebuffer: GfxFramebuffer {
|
|||
}
|
||||
|
||||
impl dyn GfxFramebuffer {
|
||||
pub fn render(
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
clear: Option<&Color>,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
self.clone()
|
||||
.render_with_region(acquire_sync, release_sync, ops, clear, &self.full_region())
|
||||
}
|
||||
|
||||
fn full_region(&self) -> Region {
|
||||
let (width, height) = self.physical_size();
|
||||
Region::new2(Rect::new_sized_unchecked(0, 0, width, height))
|
||||
}
|
||||
|
||||
pub fn clear(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
|
|
@ -309,7 +310,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn clear_with(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
r: f32,
|
||||
|
|
@ -334,7 +335,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn copy_texture(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
fb_acquire_sync: AcquireSync,
|
||||
fb_release_sync: ReleaseSync,
|
||||
texture: &Rc<dyn GfxTexture>,
|
||||
|
|
@ -365,7 +366,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn render_custom(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
scale: Scale,
|
||||
|
|
@ -407,13 +408,13 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn perform_render_pass(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
pass: &GfxRenderPass,
|
||||
region: &Region,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
self.render_with_region(
|
||||
self.clone().render_with_region(
|
||||
acquire_sync,
|
||||
release_sync,
|
||||
&pass.ops,
|
||||
|
|
@ -423,7 +424,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn render_output(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
node: &OutputNode,
|
||||
|
|
@ -449,7 +450,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn render_node(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
node: &dyn Node,
|
||||
|
|
@ -478,7 +479,7 @@ impl dyn GfxFramebuffer {
|
|||
}
|
||||
|
||||
pub fn render_hardware_cursor(
|
||||
&self,
|
||||
self: &Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
cursor: &dyn Cursor,
|
||||
|
|
|
|||
|
|
@ -100,14 +100,16 @@ impl GfxFramebuffer for Framebuffer {
|
|||
}
|
||||
|
||||
fn render_with_region(
|
||||
&self,
|
||||
self: Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
_release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
clear: Option<&Color>,
|
||||
_region: &Region,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
self.render(acquire_sync, ops, clear).map_err(|e| e.into())
|
||||
(*self)
|
||||
.render(acquire_sync, ops, clear)
|
||||
.map_err(|e| e.into())
|
||||
}
|
||||
|
||||
fn format(&self) -> &'static Format {
|
||||
|
|
|
|||
|
|
@ -531,7 +531,7 @@ impl GfxFramebuffer for VulkanImage {
|
|||
}
|
||||
|
||||
fn render_with_region(
|
||||
&self,
|
||||
self: Rc<Self>,
|
||||
acquire_sync: AcquireSync,
|
||||
release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
|
|
@ -539,7 +539,7 @@ impl GfxFramebuffer for VulkanImage {
|
|||
region: &Region,
|
||||
) -> Result<Option<SyncFile>, GfxError> {
|
||||
self.renderer
|
||||
.execute(self, acquire_sync, release_sync, ops, clear, region)
|
||||
.execute(&self, acquire_sync, release_sync, ops, clear, region)
|
||||
.map_err(|e| e.into())
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ pub(super) struct PendingFrame {
|
|||
point: u64,
|
||||
renderer: Rc<VulkanRenderer>,
|
||||
cmd: Cell<Option<Rc<VulkanCommandBuffer>>>,
|
||||
_fb: Rc<VulkanImage>,
|
||||
_textures: Vec<UsedTexture>,
|
||||
wait_semaphores: Cell<Vec<Rc<VulkanSemaphore>>>,
|
||||
waiter: Cell<Option<SpawnedFuture<()>>>,
|
||||
|
|
@ -1008,7 +1009,7 @@ impl VulkanRenderer {
|
|||
}
|
||||
}
|
||||
|
||||
fn create_pending_frame(self: &Rc<Self>, buf: Rc<VulkanCommandBuffer>) {
|
||||
fn create_pending_frame(self: &Rc<Self>, buf: Rc<VulkanCommandBuffer>, fb: &Rc<VulkanImage>) {
|
||||
zone!("create_pending_frame");
|
||||
let point = self.allocate_point();
|
||||
let mut memory = self.memory.borrow_mut();
|
||||
|
|
@ -1016,6 +1017,7 @@ impl VulkanRenderer {
|
|||
point,
|
||||
renderer: self.clone(),
|
||||
cmd: Cell::new(Some(buf)),
|
||||
_fb: fb.clone(),
|
||||
_textures: mem::take(&mut memory.textures),
|
||||
wait_semaphores: Cell::new(mem::take(&mut memory.wait_semaphores)),
|
||||
waiter: Cell::new(None),
|
||||
|
|
@ -1037,7 +1039,7 @@ impl VulkanRenderer {
|
|||
|
||||
pub fn execute(
|
||||
self: &Rc<Self>,
|
||||
fb: &VulkanImage,
|
||||
fb: &Rc<VulkanImage>,
|
||||
fb_acquire_sync: AcquireSync,
|
||||
fb_release_sync: ReleaseSync,
|
||||
opts: &[GfxApiOpt],
|
||||
|
|
@ -1102,7 +1104,7 @@ impl VulkanRenderer {
|
|||
|
||||
fn try_execute(
|
||||
self: &Rc<Self>,
|
||||
fb: &VulkanImage,
|
||||
fb: &Rc<VulkanImage>,
|
||||
fb_acquire_sync: AcquireSync,
|
||||
fb_release_sync: ReleaseSync,
|
||||
opts: &[GfxApiOpt],
|
||||
|
|
@ -1127,7 +1129,7 @@ impl VulkanRenderer {
|
|||
self.submit(buf.buffer)?;
|
||||
self.import_release_semaphore(fb, fb_release_sync);
|
||||
self.store_layouts(fb);
|
||||
self.create_pending_frame(buf);
|
||||
self.create_pending_frame(buf, fb);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -377,7 +377,7 @@ impl GfxFramebuffer for TestGfxFb {
|
|||
}
|
||||
|
||||
fn render_with_region(
|
||||
&self,
|
||||
self: Rc<Self>,
|
||||
_acquire_sync: AcquireSync,
|
||||
_release_sync: ReleaseSync,
|
||||
ops: &[GfxApiOpt],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue