1
0
Fork 0
forked from wry/wry

autocommit 2022-04-27 20:37:49 CEST

This commit is contained in:
Julian Orth 2022-04-27 20:37:49 +02:00
parent 57899b3f35
commit 324eb835bb
24 changed files with 478 additions and 68 deletions

View file

@ -11,6 +11,7 @@ use {
},
renderer::{context::RenderContext, renderer::Renderer},
sys::{glBlendFunc, glFlush, GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
RenderResult,
},
state::State,
tree::Node,
@ -45,7 +46,14 @@ impl Framebuffer {
});
}
pub fn render(&self, node: &dyn Node, state: &State, cursor_rect: Option<Rect>) {
pub fn render(
&self,
node: &dyn Node,
state: &State,
cursor_rect: Option<Rect>,
on_output: bool,
result: &mut RenderResult,
) {
let _ = self.ctx.ctx.with_current(|| {
let c = state.theme.background_color.get();
unsafe {
@ -59,6 +67,8 @@ impl Framebuffer {
ctx: &self.ctx,
fb: &self.gl,
state,
on_output,
result,
};
node.node_render(&mut renderer, 0, 0);
if let Some(rect) = cursor_rect {

View file

@ -3,9 +3,11 @@ use {
format::{Format, ARGB8888},
ifs::{
wl_buffer::WlBuffer,
wl_callback::WlCallback,
wl_surface::{
xdg_surface::XdgSurface, zwlr_layer_surface_v1::ZwlrLayerSurfaceV1, WlSurface,
},
wp_presentation_feedback::WpPresentationFeedback,
},
rect::Rect,
render::{
@ -31,13 +33,32 @@ use {
},
utils::rc_eq::rc_eq,
},
std::{ops::Deref, rc::Rc, slice},
std::{
fmt::{Debug, Formatter},
ops::Deref,
rc::Rc,
slice,
},
};
#[derive(Default)]
pub struct RenderResult {
pub frame_requests: Vec<Rc<WlCallback>>,
pub presentation_feedbacks: Vec<Rc<WpPresentationFeedback>>,
}
impl Debug for RenderResult {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RenderResult").finish_non_exhaustive()
}
}
pub struct Renderer<'a> {
pub(super) ctx: &'a Rc<RenderContext>,
pub(super) fb: &'a GlFrameBuffer,
pub(super) state: &'a State,
pub(super) on_output: bool,
pub(super) result: &'a mut RenderResult,
}
impl Renderer<'_> {
@ -271,9 +292,15 @@ impl Renderer<'_> {
} else {
self.render_buffer(&buffer, x, y);
}
let mut fr = surface.frame_requests.borrow_mut();
for cb in fr.drain(..) {
surface.client.dispatch_frame_requests.push(cb);
if self.on_output {
{
let mut fr = surface.frame_requests.borrow_mut();
self.result.frame_requests.extend(fr.drain(..));
}
{
let mut fbs = surface.presentation_feedback.borrow_mut();
self.result.presentation_feedbacks.extend(fbs.drain(..));
}
}
}