mirror of
https://github.com/servo/servo
synced 2026-05-15 11:26:50 +02:00
Adds epoch to each WR image op command that is sent to compositor. The renderer now has a `FrameDelayer` data structure that is responsible for tracking when a frame is ready to be displayed. When asking canvases to update their rendering, they are given an optional `Epoch` which denotes the `Document`'s canvas epoch. When all image updates for that `Epoch` are seen in the renderer, the frame can be displayed. Testing: Existing WPT tests Fixes: #35733 Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
53 lines
1.4 KiB
Rust
53 lines
1.4 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
#![deny(unsafe_code)]
|
|
|
|
//! A crate to hold very common types in Servo.
|
|
//!
|
|
//! You should almost never need to add a data type to this crate. Instead look for
|
|
//! a more shared crate that has fewer dependents.
|
|
|
|
pub mod cross_process_instant;
|
|
pub mod generic_channel;
|
|
pub mod id;
|
|
pub mod print_tree;
|
|
pub mod text;
|
|
mod unicode_block;
|
|
|
|
use malloc_size_of_derive::MallocSizeOf;
|
|
use serde::{Deserialize, Serialize};
|
|
use webrender_api::Epoch as WebRenderEpoch;
|
|
|
|
/// A struct for denoting the age of messages; prevents race conditions.
|
|
#[derive(
|
|
Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize, MallocSizeOf,
|
|
)]
|
|
pub struct Epoch(pub u32);
|
|
|
|
impl Epoch {
|
|
pub fn next(&mut self) {
|
|
self.0 += 1;
|
|
}
|
|
}
|
|
|
|
impl From<Epoch> for WebRenderEpoch {
|
|
fn from(val: Epoch) -> Self {
|
|
WebRenderEpoch(val.0)
|
|
}
|
|
}
|
|
|
|
pub trait WebRenderEpochToU16 {
|
|
fn as_u16(&self) -> u16;
|
|
}
|
|
|
|
impl WebRenderEpochToU16 for WebRenderEpoch {
|
|
/// The value of this [`Epoch`] as a u16 value. Note that if this Epoch's
|
|
/// value is more than u16::MAX, then the return value will be modulo
|
|
/// u16::MAX.
|
|
fn as_u16(&self) -> u16 {
|
|
(self.0 % u16::MAX as u32) as u16
|
|
}
|
|
}
|