wl_surface: track if surface is fully opaque
This commit is contained in:
parent
6243278f5f
commit
c796602aab
8 changed files with 59 additions and 5 deletions
|
|
@ -391,6 +391,7 @@ fn render_img(image: &InstantiatedCursorImage, renderer: &mut Renderer, x: Fixed
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -414,6 +415,7 @@ impl Cursor for StaticCursor {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -455,6 +457,7 @@ impl Cursor for AnimatedCursor {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,8 @@ pub struct CopyTexture {
|
||||||
pub acquire_sync: AcquireSync,
|
pub acquire_sync: AcquireSync,
|
||||||
pub release_sync: ReleaseSync,
|
pub release_sync: ReleaseSync,
|
||||||
pub alpha: Option<f32>,
|
pub alpha: Option<f32>,
|
||||||
|
#[expect(dead_code)]
|
||||||
|
pub opaque: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
@ -371,6 +373,7 @@ impl dyn GfxFramebuffer {
|
||||||
resv.cloned(),
|
resv.cloned(),
|
||||||
acquire_sync,
|
acquire_sync,
|
||||||
release_sync,
|
release_sync,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
let clear = self.format().has_alpha.then_some(&Color::TRANSPARENT);
|
let clear = self.format().has_alpha.then_some(&Color::TRANSPARENT);
|
||||||
self.render(fb_acquire_sync, fb_release_sync, &ops, clear)
|
self.render(fb_acquire_sync, fb_release_sync, &ops, clear)
|
||||||
|
|
|
||||||
|
|
@ -278,7 +278,7 @@ pub struct WlSurface {
|
||||||
role: Cell<SurfaceRole>,
|
role: Cell<SurfaceRole>,
|
||||||
pending: RefCell<Box<PendingState>>,
|
pending: RefCell<Box<PendingState>>,
|
||||||
input_region: CloneCell<Option<Rc<Region>>>,
|
input_region: CloneCell<Option<Rc<Region>>>,
|
||||||
opaque_region: Cell<Option<Rc<Region>>>,
|
opaque_region: CloneCell<Option<Rc<Region>>>,
|
||||||
buffer_points: RefCell<BufferPoints>,
|
buffer_points: RefCell<BufferPoints>,
|
||||||
pub buffer_points_norm: RefCell<SampleRect>,
|
pub buffer_points_norm: RefCell<SampleRect>,
|
||||||
damage_matrix: Cell<DamageMatrix>,
|
damage_matrix: Cell<DamageMatrix>,
|
||||||
|
|
@ -331,6 +331,7 @@ pub struct WlSurface {
|
||||||
clear_fifo_on_vblank: Cell<bool>,
|
clear_fifo_on_vblank: Cell<bool>,
|
||||||
commit_timer: CloneCell<Option<Rc<WpCommitTimerV1>>>,
|
commit_timer: CloneCell<Option<Rc<WpCommitTimerV1>>>,
|
||||||
before_latch_listener: EventListener<dyn BeforeLatchListener>,
|
before_latch_listener: EventListener<dyn BeforeLatchListener>,
|
||||||
|
is_opaque: Cell<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Debug for WlSurface {
|
impl Debug for WlSurface {
|
||||||
|
|
@ -668,6 +669,7 @@ impl WlSurface {
|
||||||
clear_fifo_on_vblank: Default::default(),
|
clear_fifo_on_vblank: Default::default(),
|
||||||
commit_timer: Default::default(),
|
commit_timer: Default::default(),
|
||||||
before_latch_listener: EventListener::new(slf.clone()),
|
before_latch_listener: EventListener::new(slf.clone()),
|
||||||
|
is_opaque: Cell::new(false),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1195,6 +1197,7 @@ impl WlSurface {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let transform_changed = viewport_changed || scale_changed || buffer_transform_changed;
|
let transform_changed = viewport_changed || scale_changed || buffer_transform_changed;
|
||||||
|
let mut buffer_abs_pos_size_changed = false;
|
||||||
if buffer_changed || transform_changed {
|
if buffer_changed || transform_changed {
|
||||||
let mut buffer_points = self.buffer_points.borrow_mut();
|
let mut buffer_points = self.buffer_points.borrow_mut();
|
||||||
let mut buffer_points_norm = self.buffer_points_norm.borrow_mut();
|
let mut buffer_points_norm = self.buffer_points_norm.borrow_mut();
|
||||||
|
|
@ -1288,6 +1291,7 @@ impl WlSurface {
|
||||||
.set(buffer_abs_pos.with_size(width, height).unwrap());
|
.set(buffer_abs_pos.with_size(width, height).unwrap());
|
||||||
max_surface_size = (width.max(old_width), height.max(old_height));
|
max_surface_size = (width.max(old_width), height.max(old_height));
|
||||||
damage_full = true;
|
damage_full = true;
|
||||||
|
buffer_abs_pos_size_changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let has_new_frame_requests = pending.frame_request.is_not_empty();
|
let has_new_frame_requests = pending.frame_request.is_not_empty();
|
||||||
|
|
@ -1304,15 +1308,25 @@ impl WlSurface {
|
||||||
mem::swap(fbs.deref_mut(), &mut pending.presentation_feedback);
|
mem::swap(fbs.deref_mut(), &mut pending.presentation_feedback);
|
||||||
fbs.is_not_empty()
|
fbs.is_not_empty()
|
||||||
};
|
};
|
||||||
|
let mut opaque_region_changed = false;
|
||||||
{
|
{
|
||||||
if let Some(region) = pending.input_region.take() {
|
if let Some(region) = pending.input_region.take() {
|
||||||
self.input_region.set(region);
|
self.input_region.set(region);
|
||||||
self.client.state.tree_changed();
|
self.client.state.tree_changed();
|
||||||
}
|
}
|
||||||
if let Some(region) = pending.opaque_region.take() {
|
if let Some(region) = pending.opaque_region.take() {
|
||||||
|
opaque_region_changed = true;
|
||||||
self.opaque_region.set(region);
|
self.opaque_region.set(region);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if opaque_region_changed || buffer_abs_pos_size_changed {
|
||||||
|
let pos = self.buffer_abs_pos.get().at_point(0, 0);
|
||||||
|
let is_opaque = match self.opaque_region.get() {
|
||||||
|
None => false,
|
||||||
|
Some(o) => o.contains_rect(&pos),
|
||||||
|
};
|
||||||
|
self.is_opaque.set(is_opaque);
|
||||||
|
}
|
||||||
let mut tearing_changed = false;
|
let mut tearing_changed = false;
|
||||||
if let Some(tearing) = pending.tearing.take() {
|
if let Some(tearing) = pending.tearing.take() {
|
||||||
if self.tearing.replace(tearing) != tearing {
|
if self.tearing.replace(tearing) != tearing {
|
||||||
|
|
@ -1636,6 +1650,10 @@ impl WlSurface {
|
||||||
pub fn alpha(&self) -> Option<f32> {
|
pub fn alpha(&self) -> Option<f32> {
|
||||||
self.alpha.get()
|
self.alpha.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn opaque(&self) -> bool {
|
||||||
|
self.is_opaque.get()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object_base! {
|
object_base! {
|
||||||
|
|
|
||||||
|
|
@ -225,6 +225,7 @@ impl GuiElement for Button {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -325,6 +326,7 @@ impl GuiElement for Label {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -175,6 +175,26 @@ where
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn contains_rect(&self, rect: &Rect) -> bool {
|
||||||
|
if rect.is_empty() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
let mut y1 = rect.y1();
|
||||||
|
for r in self.rects() {
|
||||||
|
if r.y2() <= y1 || r.x2() <= rect.x1() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if r.y1() > y1 || r.x1() > rect.x1() || r.x2() < rect.x2() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
y1 = r.y2();
|
||||||
|
if y1 >= rect.y2() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Deref for Region<T>
|
impl<T> Deref for Region<T>
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,7 @@ impl Renderer<'_> {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if let Some(status) = &rd.status {
|
if let Some(status) = &rd.status {
|
||||||
|
|
@ -141,6 +142,7 @@ impl Renderer<'_> {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -219,6 +221,7 @@ impl Renderer<'_> {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -264,6 +267,7 @@ impl Renderer<'_> {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -379,7 +383,6 @@ impl Renderer<'_> {
|
||||||
} else {
|
} else {
|
||||||
size = self.base.scale_point(size.0, size.1);
|
size = self.base.scale_point(size.0, size.1);
|
||||||
}
|
}
|
||||||
let alpha = surface.alpha();
|
|
||||||
if let Some(children) = children.deref() {
|
if let Some(children) = children.deref() {
|
||||||
macro_rules! render {
|
macro_rules! render {
|
||||||
($children:expr) => {
|
($children:expr) => {
|
||||||
|
|
@ -401,10 +404,10 @@ impl Renderer<'_> {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
render!(&children.below);
|
render!(&children.below);
|
||||||
self.render_buffer(surface, &buffer, alpha, x, y, *tpoints, size, bounds);
|
self.render_buffer(surface, &buffer, x, y, *tpoints, size, bounds);
|
||||||
render!(&children.above);
|
render!(&children.above);
|
||||||
} else {
|
} else {
|
||||||
self.render_buffer(surface, &buffer, alpha, x, y, *tpoints, size, bounds);
|
self.render_buffer(surface, &buffer, x, y, *tpoints, size, bounds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -412,13 +415,13 @@ impl Renderer<'_> {
|
||||||
&mut self,
|
&mut self,
|
||||||
surface: &WlSurface,
|
surface: &WlSurface,
|
||||||
buffer: &Rc<SurfaceBuffer>,
|
buffer: &Rc<SurfaceBuffer>,
|
||||||
alpha: Option<f32>,
|
|
||||||
x: i32,
|
x: i32,
|
||||||
y: i32,
|
y: i32,
|
||||||
tpoints: SampleRect,
|
tpoints: SampleRect,
|
||||||
tsize: (i32, i32),
|
tsize: (i32, i32),
|
||||||
bounds: Option<&Rect>,
|
bounds: Option<&Rect>,
|
||||||
) {
|
) {
|
||||||
|
let alpha = surface.alpha();
|
||||||
if let Some(tex) = buffer.buffer.get_texture(surface) {
|
if let Some(tex) = buffer.buffer.get_texture(surface) {
|
||||||
self.base.render_texture(
|
self.base.render_texture(
|
||||||
&tex,
|
&tex,
|
||||||
|
|
@ -432,6 +435,7 @@ impl Renderer<'_> {
|
||||||
Some(buffer.clone()),
|
Some(buffer.clone()),
|
||||||
AcquireSync::Unnecessary,
|
AcquireSync::Unnecessary,
|
||||||
buffer.release_sync,
|
buffer.release_sync,
|
||||||
|
surface.opaque(),
|
||||||
);
|
);
|
||||||
} else if let Some(color) = &buffer.buffer.color {
|
} else if let Some(color) = &buffer.buffer.color {
|
||||||
if let Some(rect) = Rect::new_sized(x, y, tsize.0, tsize.1) {
|
if let Some(rect) = Rect::new_sized(x, y, tsize.0, tsize.1) {
|
||||||
|
|
@ -496,6 +500,7 @@ impl Renderer<'_> {
|
||||||
None,
|
None,
|
||||||
AcquireSync::None,
|
AcquireSync::None,
|
||||||
ReleaseSync::None,
|
ReleaseSync::None,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -156,6 +156,7 @@ impl RendererBase<'_> {
|
||||||
buffer_resv: Option<Rc<dyn BufferResv>>,
|
buffer_resv: Option<Rc<dyn BufferResv>>,
|
||||||
acquire_sync: AcquireSync,
|
acquire_sync: AcquireSync,
|
||||||
release_sync: ReleaseSync,
|
release_sync: ReleaseSync,
|
||||||
|
opaque: bool,
|
||||||
) {
|
) {
|
||||||
let mut texcoord = tpoints.unwrap_or_else(SampleRect::identity);
|
let mut texcoord = tpoints.unwrap_or_else(SampleRect::identity);
|
||||||
|
|
||||||
|
|
@ -198,6 +199,7 @@ impl RendererBase<'_> {
|
||||||
buffer_resv,
|
buffer_resv,
|
||||||
acquire_sync,
|
acquire_sync,
|
||||||
release_sync,
|
release_sync,
|
||||||
|
opaque,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1046,6 +1046,7 @@ impl State {
|
||||||
resv.cloned(),
|
resv.cloned(),
|
||||||
acquire_sync.clone(),
|
acquire_sync.clone(),
|
||||||
release_sync,
|
release_sync,
|
||||||
|
false,
|
||||||
);
|
);
|
||||||
if render_hardware_cursors {
|
if render_hardware_cursors {
|
||||||
if let Some(cursor_user_group) = self.cursor_user_group_hardware_cursor.get() {
|
if let Some(cursor_user_group) = self.cursor_user_group_hardware_cursor.get() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue