1
0
Fork 0
forked from wry/wry

gfx: remove GfxFramebuffer::take_render_ops

This commit is contained in:
Julian Orth 2024-09-09 20:52:00 +02:00
parent 02cfdc4be1
commit 5d5843df9a
8 changed files with 26 additions and 50 deletions

View file

@ -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();

View file

@ -256,13 +256,11 @@ pub enum ResetStatus {
}
pub trait GfxFramebuffer: Debug {
fn take_render_ops(&self) -> Vec<GfxApiOpt>;
fn physical_size(&self) -> (i32, i32);
fn render(
&self,
ops: Vec<GfxApiOpt>,
ops: &[GfxApiOpt],
clear: Option<&Color>,
) -> Result<Option<SyncFile>, GfxError>;
@ -286,8 +284,7 @@ impl dyn GfxFramebuffer {
}
pub fn clear_with(&self, r: f32, g: f32, b: f32, a: f32) -> Result<Option<SyncFile>, 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<Option<SyncFile>, 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<Option<SyncFile>, 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<Option<SyncFile>, GfxError> {
self.render(pass.ops, pass.clear.as_ref())
pub fn perform_render_pass(&self, pass: &GfxRenderPass) -> Result<Option<SyncFile>, 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<Option<SyncFile>, 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))
}
}

View file

@ -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<Vec<GfxApiOpt>>,
pub(in crate::gfx_apis::gl) gl_state: RefCell<GfxGlState>,
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(),

View file

@ -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<GfxApiOpt>,
ops: &[GfxApiOpt],
clear: Option<&Color>,
) -> Result<Option<SyncFile>, 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<GfxApiOpt> {
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<GfxApiOpt>,
ops: &[GfxApiOpt],
clear: Option<&Color>,
) -> Result<Option<SyncFile>, GfxError> {
self.render(ops, clear).map_err(|e| e.into())

View file

@ -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<bool>,
pub(super) contents_are_undefined: Cell<bool>,
pub(super) ty: VulkanImageMemory,
pub(super) render_ops: CloneCell<Vec<GfxApiOpt>>,
pub(super) bridge: Option<VulkanFramebufferBridge>,
}
@ -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<GfxApiOpt> {
self.render_ops.take()
}
fn physical_size(&self) -> (i32, i32) {
(self.width as _, self.height as _)
}
fn render(
&self,
ops: Vec<GfxApiOpt>,
ops: &[GfxApiOpt],
clear: Option<&Color>,
) -> Result<Option<SyncFile>, GfxError> {
self.renderer
.execute(self, &ops, clear)
.execute(self, ops, clear)
.map_err(|e| e.into())
}

View file

@ -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 {

View file

@ -404,10 +404,6 @@ impl GfxImage for TestGfxImage {
}
impl GfxFramebuffer for TestGfxFb {
fn take_render_ops(&self) -> Vec<GfxApiOpt> {
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<GfxApiOpt>,
ops: &[GfxApiOpt],
clear: Option<&Color>,
) -> Result<Option<SyncFile>, GfxError> {
let fb_points = |width: i32, height: i32, rect: &FramebufferRect| {

View file

@ -905,7 +905,7 @@ impl State {
size: Option<(i32, i32)>,
transform: Transform,
) -> Result<Option<SyncFile>, 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 {