From 5d5843df9a4010b4d4b19fa5a0dd8448e3d1ddd1 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Mon, 9 Sep 2024 20:52:00 +0200 Subject: [PATCH] gfx: remove GfxFramebuffer::take_render_ops --- src/backends/metal/video.rs | 2 +- src/gfx_api.rs | 27 +++++++++++-------------- src/gfx_apis/gl/renderer/context.rs | 6 ++---- src/gfx_apis/gl/renderer/framebuffer.rs | 18 +++++------------ src/gfx_apis/vulkan/image.rs | 12 +++-------- src/gfx_apis/vulkan/shm_image.rs | 1 - src/it/test_gfx_api.rs | 6 +----- src/state.rs | 4 ++-- 8 files changed, 26 insertions(+), 50 deletions(-) diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 51c36192..3f4a55c7 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -923,7 +923,7 @@ impl MetalConnector { match &direct_scanout_data { None => { let sf = buffer_fb - .perform_render_pass(pass) + .perform_render_pass(&pass) .map_err(MetalError::RenderFrame)?; sync_file = buffer.copy_to_dev(sf)?; fb = buffer.drm.clone(); diff --git a/src/gfx_api.rs b/src/gfx_api.rs index 9e7882ec..c31c3849 100644 --- a/src/gfx_api.rs +++ b/src/gfx_api.rs @@ -256,13 +256,11 @@ pub enum ResetStatus { } pub trait GfxFramebuffer: Debug { - fn take_render_ops(&self) -> Vec; - fn physical_size(&self) -> (i32, i32); fn render( &self, - ops: Vec, + ops: &[GfxApiOpt], clear: Option<&Color>, ) -> Result, GfxError>; @@ -286,8 +284,7 @@ impl dyn GfxFramebuffer { } pub fn clear_with(&self, r: f32, g: f32, b: f32, a: f32) -> Result, GfxError> { - let ops = self.take_render_ops(); - self.render(ops, Some(&Color { r, g, b, a })) + self.render(&[], Some(&Color { r, g, b, a })) } pub fn logical_size(&self, transform: Transform) -> (i32, i32) { @@ -320,7 +317,7 @@ impl dyn GfxFramebuffer { x: i32, y: i32, ) -> Result, GfxError> { - let mut ops = self.take_render_ops(); + let mut ops = vec![]; let scale = Scale::from_int(1); let mut renderer = self.renderer_base(&mut ops, scale, Transform::None); renderer.render_texture( @@ -337,7 +334,7 @@ impl dyn GfxFramebuffer { release_sync, ); let clear = self.format().has_alpha.then_some(&Color::TRANSPARENT); - self.render(ops, clear) + self.render(&ops, clear) } pub fn render_custom( @@ -346,10 +343,10 @@ impl dyn GfxFramebuffer { clear: Option<&Color>, f: &mut dyn FnMut(&mut RendererBase), ) -> Result, GfxError> { - let mut ops = self.take_render_ops(); + let mut ops = vec![]; let mut renderer = self.renderer_base(&mut ops, scale, Transform::None); f(&mut renderer); - self.render(ops, clear) + self.render(&ops, clear) } pub fn create_render_pass( @@ -365,7 +362,7 @@ impl dyn GfxFramebuffer { transform: Transform, visualizer: Option<&DamageVisualizer>, ) -> GfxRenderPass { - let mut ops = self.take_render_ops(); + let mut ops = vec![]; let mut renderer = Renderer { base: self.renderer_base(&mut ops, scale, transform), state, @@ -430,8 +427,8 @@ impl dyn GfxFramebuffer { } } - pub fn perform_render_pass(&self, pass: GfxRenderPass) -> Result, GfxError> { - self.render(pass.ops, pass.clear.as_ref()) + pub fn perform_render_pass(&self, pass: &GfxRenderPass) -> Result, GfxError> { + self.render(&pass.ops, pass.clear.as_ref()) } pub fn render_output( @@ -480,7 +477,7 @@ impl dyn GfxFramebuffer { transform, None, ); - self.perform_render_pass(pass) + self.perform_render_pass(&pass) } pub fn render_hardware_cursor( @@ -490,7 +487,7 @@ impl dyn GfxFramebuffer { scale: Scale, transform: Transform, ) -> Result, GfxError> { - let mut ops = self.take_render_ops(); + let mut ops = vec![]; let mut renderer = Renderer { base: self.renderer_base(&mut ops, scale, transform), state, @@ -502,7 +499,7 @@ impl dyn GfxFramebuffer { }, }; cursor.render_hardware_cursor(&mut renderer); - self.render(ops, Some(&Color::TRANSPARENT)) + self.render(&ops, Some(&Color::TRANSPARENT)) } } diff --git a/src/gfx_apis/gl/renderer/context.rs b/src/gfx_apis/gl/renderer/context.rs index f242800c..e0ab21bb 100644 --- a/src/gfx_apis/gl/renderer/context.rs +++ b/src/gfx_apis/gl/renderer/context.rs @@ -4,8 +4,8 @@ use { cpu_worker::CpuWorker, format::{Format, XRGB8888}, gfx_api::{ - AsyncShmGfxTexture, BufferResvUser, GfxApiOpt, GfxContext, GfxError, GfxFormat, - GfxFramebuffer, GfxImage, ResetStatus, ShmGfxTexture, + AsyncShmGfxTexture, BufferResvUser, GfxContext, GfxError, GfxFormat, GfxFramebuffer, + GfxImage, ResetStatus, ShmGfxTexture, }, gfx_apis::gl::{ egl::{context::EglContext, display::EglDisplay, image::EglImage}, @@ -84,7 +84,6 @@ pub(in crate::gfx_apis::gl) struct GlRenderContext { pub(crate) fill_prog_pos: GLint, pub(crate) fill_prog_color: GLint, - pub(crate) gfx_ops: RefCell>, pub(in crate::gfx_apis::gl) gl_state: RefCell, pub(in crate::gfx_apis::gl) buffer_resv_user: BufferResvUser, @@ -169,7 +168,6 @@ impl GlRenderContext { fill_prog_color: fill_prog.get_uniform_location(c"color"), fill_prog, - gfx_ops: Default::default(), gl_state: Default::default(), buffer_resv_user: Default::default(), diff --git a/src/gfx_apis/gl/renderer/framebuffer.rs b/src/gfx_apis/gl/renderer/framebuffer.rs index 96d42e08..0f0c07cf 100644 --- a/src/gfx_apis/gl/renderer/framebuffer.rs +++ b/src/gfx_apis/gl/renderer/framebuffer.rs @@ -17,7 +17,6 @@ use { std::{ cell::Cell, fmt::{Debug, Formatter}, - mem, rc::Rc, }, }; @@ -70,11 +69,11 @@ impl Framebuffer { pub fn render( &self, - mut ops: Vec, + ops: &[GfxApiOpt], clear: Option<&Color>, ) -> Result, RenderError> { let gles = self.ctx.ctx.dpy.gles; - let res = self.ctx.ctx.with_current(|| { + self.ctx.ctx.with_current(|| { unsafe { (gles.glBindFramebuffer)(GL_FRAMEBUFFER, self.gl.fbo); (gles.glViewport)(0, 0, self.gl.width, self.gl.height); @@ -84,32 +83,25 @@ impl Framebuffer { } (gles.glBlendFunc)(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } - let fd = run_ops(self, &ops); + let fd = run_ops(self, ops); if fd.is_none() { unsafe { (gles.glFlush)(); } } Ok(fd) - }); - ops.clear(); - *self.ctx.gfx_ops.borrow_mut() = ops; - res + }) } } impl GfxFramebuffer for Framebuffer { - fn take_render_ops(&self) -> Vec { - mem::take(&mut *self.ctx.gfx_ops.borrow_mut()) - } - fn physical_size(&self) -> (i32, i32) { (self.gl.width, self.gl.height) } fn render( &self, - ops: Vec, + ops: &[GfxApiOpt], clear: Option<&Color>, ) -> Result, GfxError> { self.render(ops, clear).map_err(|e| e.into()) diff --git a/src/gfx_apis/vulkan/image.rs b/src/gfx_apis/vulkan/image.rs index 53c26af4..a29a16f0 100644 --- a/src/gfx_apis/vulkan/image.rs +++ b/src/gfx_apis/vulkan/image.rs @@ -13,7 +13,7 @@ use { }, rect::Region, theme::Color, - utils::{clonecell::CloneCell, on_drop::OnDrop}, + utils::on_drop::OnDrop, video::dmabuf::{DmaBuf, PlaneVec}, }, ash::vk::{ @@ -59,7 +59,6 @@ pub struct VulkanImage { pub(super) is_undefined: Cell, pub(super) contents_are_undefined: Cell, pub(super) ty: VulkanImageMemory, - pub(super) render_ops: CloneCell>, pub(super) bridge: Option, } @@ -378,7 +377,6 @@ impl VulkanDmaBufImageTemplate { width: self.width, height: self.height, stride: 0, - render_ops: Default::default(), ty: VulkanImageMemory::DmaBuf(VulkanDmaBufImage { template: self.clone(), mems: device_memories, @@ -461,21 +459,17 @@ impl Debug for VulkanImage { } impl GfxFramebuffer for VulkanImage { - fn take_render_ops(&self) -> Vec { - self.render_ops.take() - } - fn physical_size(&self) -> (i32, i32) { (self.width as _, self.height as _) } fn render( &self, - ops: Vec, + ops: &[GfxApiOpt], clear: Option<&Color>, ) -> Result, GfxError> { self.renderer - .execute(self, &ops, clear) + .execute(self, ops, clear) .map_err(|e| e.into()) } diff --git a/src/gfx_apis/vulkan/shm_image.rs b/src/gfx_apis/vulkan/shm_image.rs index 24ef74e5..af050af3 100644 --- a/src/gfx_apis/vulkan/shm_image.rs +++ b/src/gfx_apis/vulkan/shm_image.rs @@ -730,7 +730,6 @@ impl VulkanRenderer { is_undefined: Cell::new(true), contents_are_undefined: Cell::new(true), ty: VulkanImageMemory::Internal(shm), - render_ops: Default::default(), bridge: None, }); let shm = match &img.ty { diff --git a/src/it/test_gfx_api.rs b/src/it/test_gfx_api.rs index 8ef52878..784b39c8 100644 --- a/src/it/test_gfx_api.rs +++ b/src/it/test_gfx_api.rs @@ -404,10 +404,6 @@ impl GfxImage for TestGfxImage { } impl GfxFramebuffer for TestGfxFb { - fn take_render_ops(&self) -> Vec { - vec![] - } - fn physical_size(&self) -> (i32, i32) { match &*self.img { TestGfxImage::Shm(v) => (v.width, v.height), @@ -417,7 +413,7 @@ impl GfxFramebuffer for TestGfxFb { fn render( &self, - ops: Vec, + ops: &[GfxApiOpt], clear: Option<&Color>, ) -> Result, GfxError> { let fb_points = |width: i32, height: i32, rect: &FramebufferRect| { diff --git a/src/state.rs b/src/state.rs index f3f2f5b0..d06889be 100644 --- a/src/state.rs +++ b/src/state.rs @@ -905,7 +905,7 @@ impl State { size: Option<(i32, i32)>, transform: Transform, ) -> Result, GfxError> { - let mut ops = target.take_render_ops(); + let mut ops = vec![]; let mut renderer = Renderer { base: target.renderer_base(&mut ops, Scale::from_int(1), Transform::None), state: self, @@ -943,7 +943,7 @@ impl State { } } } - target.render(ops, Some(&Color::SOLID_BLACK)) + target.render(&ops, Some(&Color::SOLID_BLACK)) } fn have_hardware_cursor(&self) -> bool {