gfx: Rename WebrenderSurfman to RenderingContext and move to gfx (#31184)

This is a small cleanup that moves and renames this class. The rename is
simply because we are exposing a lot about the details of Servo's
rendering in the API and it makes sense to start thinking about
abstracting that away a bit.

This also moves the struct to `gfx`, which does have an effect on
Servo's dependency graph. This adds a new dependency on gfx to
`compositing`, but `compositing` had a transitive dependency on
gfx before through `canvas`.
This commit is contained in:
Martin Robinson 2024-01-27 18:58:34 +01:00 committed by GitHub
parent bbe505e52b
commit bc211f8ff3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 84 additions and 114 deletions

14
Cargo.lock generated
View file

@ -640,7 +640,6 @@ dependencies = [
"time 0.1.45", "time 0.1.45",
"webrender", "webrender",
"webrender_api", "webrender_api",
"webrender_surfman",
"webrender_traits", "webrender_traits",
"webxr", "webxr",
"webxr-api", "webxr-api",
@ -858,6 +857,7 @@ dependencies = [
"embedder_traits", "embedder_traits",
"euclid", "euclid",
"fnv", "fnv",
"gfx",
"gfx_traits", "gfx_traits",
"gleam", "gleam",
"image", "image",
@ -879,7 +879,6 @@ dependencies = [
"toml 0.5.9", "toml 0.5.9",
"webrender", "webrender",
"webrender_api", "webrender_api",
"webrender_surfman",
"webxr", "webxr",
] ]
@ -901,7 +900,6 @@ dependencies = [
"servo_url", "servo_url",
"style_traits", "style_traits",
"webrender_api", "webrender_api",
"webrender_surfman",
] ]
[[package]] [[package]]
@ -2004,6 +2002,7 @@ dependencies = [
"servo_url", "servo_url",
"smallvec", "smallvec",
"style", "style",
"surfman",
"truetype", "truetype",
"ucd", "ucd",
"unicode-bidi", "unicode-bidi",
@ -3351,7 +3350,6 @@ dependencies = [
"webgpu", "webgpu",
"webrender", "webrender",
"webrender_api", "webrender_api",
"webrender_surfman",
"webrender_traits", "webrender_traits",
"webxr", "webxr",
"webxr-api", "webxr-api",
@ -6858,14 +6856,6 @@ dependencies = [
"lazy_static", "lazy_static",
] ]
[[package]]
name = "webrender_surfman"
version = "0.0.1"
dependencies = [
"euclid",
"surfman",
]
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.0.1" version = "0.0.1"

View file

@ -41,7 +41,6 @@ surfman = { workspace = true }
time = { workspace = true, optional = true } time = { workspace = true, optional = true }
webrender = { workspace = true } webrender = { workspace = true }
webrender_api = { workspace = true } webrender_api = { workspace = true }
webrender_surfman = { path = "../webrender_surfman" }
webrender_traits = { workspace = true } webrender_traits = { workspace = true }
webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] } webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] }
webxr = { git = "https://github.com/servo/webxr", features = ["ipc"] } webxr = { git = "https://github.com/servo/webxr", features = ["ipc"] }

View file

@ -8,13 +8,13 @@ use std::sync::{Arc, Mutex};
use canvas_traits::webgl::{webgl_channel, WebGLContextId, WebGLMsg, WebGLThreads}; use canvas_traits::webgl::{webgl_channel, WebGLContextId, WebGLMsg, WebGLThreads};
use euclid::default::Size2D; use euclid::default::Size2D;
use fnv::FnvHashMap; use fnv::FnvHashMap;
use gfx::rendering_context::RenderingContext;
use log::debug; use log::debug;
use sparkle::gl::GlType; use sparkle::gl::GlType;
use surfman::chains::{SwapChainAPI, SwapChains, SwapChainsAPI}; use surfman::chains::{SwapChainAPI, SwapChains, SwapChainsAPI};
use surfman::{Device, SurfaceInfo, SurfaceTexture}; use surfman::{Device, SurfaceInfo, SurfaceTexture};
use webrender::RenderApiSender; use webrender::RenderApiSender;
use webrender_api::DocumentId; use webrender_api::DocumentId;
use webrender_surfman::WebrenderSurfman;
use webrender_traits::{ use webrender_traits::{
WebrenderExternalImageApi, WebrenderExternalImageRegistry, WebrenderImageSource, WebrenderExternalImageApi, WebrenderExternalImageRegistry, WebrenderImageSource,
}; };
@ -32,7 +32,7 @@ pub struct WebGLComm {
impl WebGLComm { impl WebGLComm {
/// Creates a new `WebGLComm` object. /// Creates a new `WebGLComm` object.
pub fn new( pub fn new(
surfman: WebrenderSurfman, surfman: RenderingContext,
webrender_api_sender: RenderApiSender, webrender_api_sender: RenderApiSender,
webrender_doc: DocumentId, webrender_doc: DocumentId,
external_images: Arc<Mutex<WebrenderExternalImageRegistry>>, external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
@ -72,13 +72,13 @@ impl WebGLComm {
/// Bridge between the webrender::ExternalImage callbacks and the WebGLThreads. /// Bridge between the webrender::ExternalImage callbacks and the WebGLThreads.
struct WebGLExternalImages { struct WebGLExternalImages {
surfman: WebrenderSurfman, surfman: RenderingContext,
swap_chains: SwapChains<WebGLContextId, Device>, swap_chains: SwapChains<WebGLContextId, Device>,
locked_front_buffers: FnvHashMap<WebGLContextId, SurfaceTexture>, locked_front_buffers: FnvHashMap<WebGLContextId, SurfaceTexture>,
} }
impl WebGLExternalImages { impl WebGLExternalImages {
fn new(surfman: WebrenderSurfman, swap_chains: SwapChains<WebGLContextId, Device>) -> Self { fn new(surfman: RenderingContext, swap_chains: SwapChains<WebGLContextId, Device>) -> Self {
Self { Self {
surfman, surfman,
swap_chains, swap_chains,

View file

@ -22,6 +22,7 @@ crossbeam-channel = { workspace = true }
embedder_traits = { workspace = true } embedder_traits = { workspace = true }
euclid = { workspace = true } euclid = { workspace = true }
fnv = { workspace = true } fnv = { workspace = true }
gfx = { path = "../gfx" }
gfx_traits = { workspace = true } gfx_traits = { workspace = true }
gleam = { workspace = true } gleam = { workspace = true }
image = { workspace = true } image = { workspace = true }
@ -42,7 +43,6 @@ style_traits = { workspace = true }
time = { workspace = true } time = { workspace = true }
webrender = { workspace = true } webrender = { workspace = true }
webrender_api = { workspace = true } webrender_api = { workspace = true }
webrender_surfman = { path = "../webrender_surfman" }
webxr = { git = "https://github.com/servo/webxr" } webxr = { git = "https://github.com/servo/webxr" }
[build-dependencies] [build-dependencies]

View file

@ -21,6 +21,7 @@ use crossbeam_channel::Sender;
use embedder_traits::Cursor; use embedder_traits::Cursor;
use euclid::{Point2D, Rect, Scale, Transform3D, Vector2D}; use euclid::{Point2D, Rect, Scale, Transform3D, Vector2D};
use fnv::{FnvHashMap, FnvHashSet}; use fnv::{FnvHashMap, FnvHashSet};
use gfx::rendering_context::RenderingContext;
use gfx_traits::{Epoch, FontData, WebRenderEpochToU16}; use gfx_traits::{Epoch, FontData, WebRenderEpochToU16};
use image::{DynamicImage, ImageFormat}; use image::{DynamicImage, ImageFormat};
use ipc_channel::ipc; use ipc_channel::ipc;
@ -54,7 +55,6 @@ use webrender_api::{
ReferenceFrameKind, ScrollClamping, ScrollLocation, SpaceAndClipInfo, SpatialId, ReferenceFrameKind, ScrollClamping, ScrollLocation, SpaceAndClipInfo, SpatialId,
TransformStyle, ZoomFactor, TransformStyle, ZoomFactor,
}; };
use webrender_surfman::WebrenderSurfman;
use crate::gl::RenderTargetInfo; use crate::gl::RenderTargetInfo;
use crate::touch::{TouchAction, TouchHandler}; use crate::touch::{TouchAction, TouchHandler};
@ -199,7 +199,7 @@ pub struct IOCompositor<Window: WindowMethods + ?Sized> {
webrender_api: RenderApi, webrender_api: RenderApi,
/// The surfman instance that webrender targets /// The surfman instance that webrender targets
webrender_surfman: WebrenderSurfman, rendering_context: RenderingContext,
/// The GL bindings for webrender /// The GL bindings for webrender
webrender_gl: Rc<dyn gleam::gl::Gl>, webrender_gl: Rc<dyn gleam::gl::Gl>,
@ -403,7 +403,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
webrender: state.webrender, webrender: state.webrender,
webrender_document: state.webrender_document, webrender_document: state.webrender_document,
webrender_api: state.webrender_api, webrender_api: state.webrender_api,
webrender_surfman: state.webrender_surfman, rendering_context: state.rendering_context,
webrender_gl: state.webrender_gl, webrender_gl: state.webrender_gl,
webxr_main_thread: state.webxr_main_thread, webxr_main_thread: state.webxr_main_thread,
pending_paint_metrics: HashMap::new(), pending_paint_metrics: HashMap::new(),
@ -449,7 +449,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
} }
pub fn deinit(self) { pub fn deinit(self) {
if let Err(err) = self.webrender_surfman.make_gl_context_current() { if let Err(err) = self.rendering_context.make_gl_context_current() {
warn!("Failed to make GL context current: {:?}", err); warn!("Failed to make GL context current: {:?}", err);
} }
self.webrender.deinit(); self.webrender.deinit();
@ -506,7 +506,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
/// We need to unbind the surface so that we don't try to use it again. /// We need to unbind the surface so that we don't try to use it again.
pub fn invalidate_native_surface(&mut self) { pub fn invalidate_native_surface(&mut self) {
debug!("Invalidating native surface in compositor"); debug!("Invalidating native surface in compositor");
if let Err(e) = self.webrender_surfman.unbind_native_surface_from_context() { if let Err(e) = self.rendering_context.unbind_native_surface_from_context() {
warn!("Unbinding native surface from context failed ({:?})", e); warn!("Unbinding native surface from context failed ({:?})", e);
} }
} }
@ -517,11 +517,11 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
#[allow(unsafe_code)] #[allow(unsafe_code)]
pub fn replace_native_surface(&mut self, native_widget: *mut c_void, coords: DeviceIntSize) { pub fn replace_native_surface(&mut self, native_widget: *mut c_void, coords: DeviceIntSize) {
debug!("Replacing native surface in compositor: {native_widget:?}"); debug!("Replacing native surface in compositor: {native_widget:?}");
let connection = self.webrender_surfman.connection(); let connection = self.rendering_context.connection();
let native_widget = let native_widget =
unsafe { connection.create_native_widget_from_ptr(native_widget, coords.to_untyped()) }; unsafe { connection.create_native_widget_from_ptr(native_widget, coords.to_untyped()) };
if let Err(e) = self if let Err(e) = self
.webrender_surfman .rendering_context
.bind_native_surface_to_context(native_widget) .bind_native_surface_to_context(native_widget)
{ {
warn!("Binding native surface to context failed ({:?})", e); warn!("Binding native surface to context failed ({:?})", e);
@ -1721,7 +1721,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
let size = self.embedder_coordinates.framebuffer.to_u32(); let size = self.embedder_coordinates.framebuffer.to_u32();
if let Err(err) = self.webrender_surfman.make_gl_context_current() { if let Err(err) = self.rendering_context.make_gl_context_current() {
warn!("Failed to make GL context current: {:?}", err); warn!("Failed to make GL context current: {:?}", err);
} }
self.assert_no_gl_error(); self.assert_no_gl_error();
@ -1765,7 +1765,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
} else { } else {
// Bind the webrender framebuffer // Bind the webrender framebuffer
let framebuffer_object = self let framebuffer_object = self
.webrender_surfman .rendering_context
.context_surface_info() .context_surface_info()
.unwrap_or(None) .unwrap_or(None)
.map(|info| info.framebuffer_object) .map(|info| info.framebuffer_object)
@ -1941,7 +1941,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
} }
pub fn present(&mut self) { pub fn present(&mut self) {
if let Err(err) = self.webrender_surfman.present() { if let Err(err) = self.rendering_context.present() {
warn!("Failed to present surface: {:?}", err); warn!("Failed to present surface: {:?}", err);
} }
self.waiting_on_present = false; self.waiting_on_present = false;
@ -2049,7 +2049,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
self.webxr_main_thread.run_one_frame(); self.webxr_main_thread.run_one_frame();
// The WebXR thread may make a different context current // The WebXR thread may make a different context current
let _ = self.webrender_surfman.make_gl_context_current(); let _ = self.rendering_context.make_gl_context_current();
if !self.pending_scroll_zoom_events.is_empty() && !self.waiting_for_results_of_scroll { if !self.pending_scroll_zoom_events.is_empty() && !self.waiting_for_results_of_scroll {
self.process_pending_scroll_events() self.process_pending_scroll_events()

View file

@ -8,10 +8,10 @@ use std::rc::Rc;
use compositing_traits::{CompositorProxy, CompositorReceiver, ConstellationMsg}; use compositing_traits::{CompositorProxy, CompositorReceiver, ConstellationMsg};
use crossbeam_channel::Sender; use crossbeam_channel::Sender;
use gfx::rendering_context::RenderingContext;
use profile_traits::{mem, time}; use profile_traits::{mem, time};
use webrender::RenderApi; use webrender::RenderApi;
use webrender_api::DocumentId; use webrender_api::DocumentId;
use webrender_surfman::WebrenderSurfman;
pub use crate::compositor::{CompositeTarget, IOCompositor, ShutdownState}; pub use crate::compositor::{CompositeTarget, IOCompositor, ShutdownState};
@ -36,7 +36,7 @@ pub struct InitialCompositorState {
pub webrender: webrender::Renderer, pub webrender: webrender::Renderer,
pub webrender_document: DocumentId, pub webrender_document: DocumentId,
pub webrender_api: RenderApi, pub webrender_api: RenderApi,
pub webrender_surfman: WebrenderSurfman, pub rendering_context: RenderingContext,
pub webrender_gl: Rc<dyn gleam::gl::Gl>, pub webrender_gl: Rc<dyn gleam::gl::Gl>,
pub webxr_main_thread: webxr::MainThreadRegistry, pub webxr_main_thread: webxr::MainThreadRegistry,
} }

View file

@ -9,6 +9,7 @@ use std::time::Duration;
use embedder_traits::{EmbedderProxy, EventLoopWaker}; use embedder_traits::{EmbedderProxy, EventLoopWaker};
use euclid::Scale; use euclid::Scale;
use gfx::rendering_context::RenderingContext;
use keyboard_types::KeyboardEvent; use keyboard_types::KeyboardEvent;
use libc::c_void; use libc::c_void;
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId, TraversalDirection}; use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId, TraversalDirection};
@ -19,7 +20,6 @@ use servo_url::ServoUrl;
use style_traits::DevicePixel; use style_traits::DevicePixel;
use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint}; use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint};
use webrender_api::ScrollLocation; use webrender_api::ScrollLocation;
use webrender_surfman::WebrenderSurfman;
#[derive(Clone)] #[derive(Clone)]
pub enum MouseWindowEvent { pub enum MouseWindowEvent {
@ -177,8 +177,8 @@ pub trait WindowMethods {
fn get_native_display(&self) -> NativeDisplay; fn get_native_display(&self) -> NativeDisplay;
/// Get the GL api /// Get the GL api
fn get_gl_api(&self) -> GlApi; fn get_gl_api(&self) -> GlApi;
/// Get the webrender surfman instance /// Get the RenderingContext instance.
fn webrender_surfman(&self) -> WebrenderSurfman; fn rendering_context(&self) -> RenderingContext;
} }
pub trait EmbedderMethods { pub trait EmbedderMethods {

View file

@ -33,6 +33,7 @@ servo_arc = { path = "../servo_arc" }
servo_atoms = { path = "../atoms" } servo_atoms = { path = "../atoms" }
servo_url = { path = "../url" } servo_url = { path = "../url" }
smallvec = { workspace = true, features = ["union"] } smallvec = { workspace = true, features = ["union"] }
surfman = { workspace = true }
style = { path = "../style", features = ["servo"] } style = { path = "../style", features = ["servo"] }
ucd = "0.1.1" ucd = "0.1.1"
unicode-bidi = { workspace = true, features = ["with_serde"] } unicode-bidi = { workspace = true, features = ["with_serde"] }

View file

@ -4,15 +4,11 @@
#![deny(unsafe_code)] #![deny(unsafe_code)]
// Fonts
pub mod font; pub mod font;
pub mod font_cache_thread; pub mod font_cache_thread;
pub mod font_context; pub mod font_context;
pub mod font_template; pub mod font_template;
// Platform-specific implementations.
#[allow(unsafe_code)] #[allow(unsafe_code)]
mod platform; mod platform;
pub mod rendering_context;
// Text
pub mod text; pub mod text;

View file

@ -16,19 +16,19 @@ use surfman::{
SurfaceTexture, SurfaceType, SurfaceTexture, SurfaceType,
}; };
/// A bridge between webrender and surfman /// A Servo rendering context, which holds all of the information needed
// TODO: move this into a different crate so that script doesn't depend on surfman /// to render Servo's layout, and bridges WebRender and surfman.
#[derive(Clone)] #[derive(Clone)]
pub struct WebrenderSurfman(Rc<WebrenderSurfmanData>); pub struct RenderingContext(Rc<RenderingContextData>);
struct WebrenderSurfmanData { struct RenderingContextData {
device: RefCell<Device>, device: RefCell<Device>,
context: RefCell<Context>, context: RefCell<Context>,
// We either render to a swap buffer or to a native widget // We either render to a swap buffer or to a native widget
swap_chain: Option<SwapChain<Device>>, swap_chain: Option<SwapChain<Device>>,
} }
impl Drop for WebrenderSurfmanData { impl Drop for RenderingContextData {
fn drop(&mut self) { fn drop(&mut self) {
let ref mut device = self.device.borrow_mut(); let ref mut device = self.device.borrow_mut();
let ref mut context = self.context.borrow_mut(); let ref mut context = self.context.borrow_mut();
@ -39,7 +39,7 @@ impl Drop for WebrenderSurfmanData {
} }
} }
impl WebrenderSurfman { impl RenderingContext {
pub fn create( pub fn create(
connection: &Connection, connection: &Connection,
adapter: &Adapter, adapter: &Adapter,
@ -82,12 +82,12 @@ impl WebrenderSurfman {
}; };
let device = RefCell::new(device); let device = RefCell::new(device);
let context = RefCell::new(context); let context = RefCell::new(context);
let data = WebrenderSurfmanData { let data = RenderingContextData {
device, device,
context, context,
swap_chain, swap_chain,
}; };
Ok(WebrenderSurfman(Rc::new(data))) Ok(RenderingContext(Rc::new(data)))
} }
pub fn create_surface_texture( pub fn create_surface_texture(

View file

@ -79,7 +79,6 @@ webdriver_server = { path = "../webdriver_server", optional = true }
webgpu = { path = "../webgpu" } webgpu = { path = "../webgpu" }
webrender = { workspace = true } webrender = { workspace = true }
webrender_api = { workspace = true } webrender_api = { workspace = true }
webrender_surfman = { path = "../webrender_surfman" }
webrender_traits = { workspace = true } webrender_traits = { workspace = true }
webxr = { git = "https://github.com/servo/webxr" } webxr = { git = "https://github.com/servo/webxr" }
webxr-api = { git = "https://github.com/servo/webxr" } webxr-api = { git = "https://github.com/servo/webxr" }

View file

@ -61,6 +61,7 @@ use euclid::Scale;
))] ))]
use gaol::sandbox::{ChildSandbox, ChildSandboxMethods}; use gaol::sandbox::{ChildSandbox, ChildSandboxMethods};
use gfx::font_cache_thread::FontCacheThread; use gfx::font_cache_thread::FontCacheThread;
pub use gfx::rendering_context;
pub use gleam::gl; pub use gleam::gl;
use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::ipc::{self, IpcSender};
use log::{error, trace, warn, Log, Metadata, Record}; use log::{error, trace, warn, Log, Metadata, Record};
@ -89,7 +90,7 @@ pub use {
keyboard_types, layout_thread_2013, layout_thread_2020, media, msg, net, net_traits, profile, keyboard_types, layout_thread_2013, layout_thread_2020, media, msg, net, net_traits, profile,
profile_traits, script, script_layout_interface, script_traits, servo_config as config, profile_traits, script, script_layout_interface, script_traits, servo_config as config,
servo_config, servo_geometry, servo_url as url, servo_url, style, style_traits, webgpu, servo_config, servo_geometry, servo_url as url, servo_url, style, style_traits, webgpu,
webrender_api, webrender_surfman, webrender_traits, webrender_api, webrender_traits,
}; };
#[cfg(feature = "webdriver")] #[cfg(feature = "webdriver")]
@ -259,22 +260,22 @@ where
}; };
// Initialize surfman // Initialize surfman
let webrender_surfman = window.webrender_surfman(); let rendering_context = window.rendering_context();
// Get GL bindings // Get GL bindings
let webrender_gl = match webrender_surfman.connection().gl_api() { let webrender_gl = match rendering_context.connection().gl_api() {
GLApi::GL => unsafe { gl::GlFns::load_with(|s| webrender_surfman.get_proc_address(s)) }, GLApi::GL => unsafe { gl::GlFns::load_with(|s| rendering_context.get_proc_address(s)) },
GLApi::GLES => unsafe { GLApi::GLES => unsafe {
gl::GlesFns::load_with(|s| webrender_surfman.get_proc_address(s)) gl::GlesFns::load_with(|s| rendering_context.get_proc_address(s))
}, },
}; };
// Make sure the gl context is made current. // Make sure the gl context is made current.
webrender_surfman.make_gl_context_current().unwrap(); rendering_context.make_gl_context_current().unwrap();
debug_assert_eq!(webrender_gl.get_error(), gleam::gl::NO_ERROR,); debug_assert_eq!(webrender_gl.get_error(), gleam::gl::NO_ERROR,);
// Bind the webrender framebuffer // Bind the webrender framebuffer
let framebuffer_object = webrender_surfman let framebuffer_object = rendering_context
.context_surface_info() .context_surface_info()
.unwrap_or(None) .unwrap_or(None)
.map(|info| info.framebuffer_object) .map(|info| info.framebuffer_object)
@ -369,7 +370,7 @@ where
webxr_layer_grand_manager, webxr_layer_grand_manager,
image_handler, image_handler,
} = WebGLComm::new( } = WebGLComm::new(
webrender_surfman.clone(), rendering_context.clone(),
webrender_api.create_sender(), webrender_api.create_sender(),
webrender_document, webrender_document,
external_images.clone(), external_images.clone(),
@ -468,7 +469,7 @@ where
webrender, webrender,
webrender_document, webrender_document,
webrender_api, webrender_api,
webrender_surfman, rendering_context,
webrender_gl, webrender_gl,
webxr_main_thread, webxr_main_thread,
}, },

View file

@ -25,4 +25,3 @@ script_traits = { workspace = true }
servo_url = { path = "../../url" } servo_url = { path = "../../url" }
style_traits = { workspace = true } style_traits = { workspace = true }
webrender_api = { workspace = true } webrender_api = { workspace = true }
webrender_surfman = { path = "../../webrender_surfman" }

View file

@ -1,15 +0,0 @@
[package]
name = "webrender_surfman"
version = "0.0.1"
authors = ["The Servo Project Developers"]
license = "MPL-2.0"
edition = "2018"
publish = false
[lib]
name = "webrender_surfman"
path = "lib.rs"
[dependencies]
euclid = { workspace = true }
surfman = { workspace = true }

View file

@ -30,6 +30,7 @@ use servo::euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
use servo::keyboard_types::{Key, KeyState, KeyboardEvent}; use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
pub use servo::msg::constellation_msg::InputMethodType; pub use servo::msg::constellation_msg::InputMethodType;
use servo::msg::constellation_msg::{TraversalDirection, WebViewId}; use servo::msg::constellation_msg::{TraversalDirection, WebViewId};
use servo::rendering_context::RenderingContext;
pub use servo::script_traits::{MediaSessionActionType, MouseButton}; pub use servo::script_traits::{MediaSessionActionType, MouseButton};
use servo::script_traits::{TouchEventType, TouchId}; use servo::script_traits::{TouchEventType, TouchId};
use servo::servo_config::{opts, pref}; use servo::servo_config::{opts, pref};
@ -37,7 +38,6 @@ use servo::servo_url::ServoUrl;
pub use servo::webrender_api::units::DeviceIntRect; pub use servo::webrender_api::units::DeviceIntRect;
use servo::webrender_api::units::DevicePixel; use servo::webrender_api::units::DevicePixel;
use servo::webrender_api::ScrollLocation; use servo::webrender_api::ScrollLocation;
use servo::webrender_surfman::WebrenderSurfman;
use servo::{self, gl, Servo, TopLevelBrowsingContextId}; use servo::{self, gl, Servo, TopLevelBrowsingContextId};
use servo_media::player::context as MediaPlayerContext; use servo_media::player::context as MediaPlayerContext;
use surfman::{Connection, SurfaceType}; use surfman::{Connection, SurfaceType};
@ -162,7 +162,7 @@ pub trait HostTrait {
} }
pub struct ServoGlue { pub struct ServoGlue {
webrender_surfman: WebrenderSurfman, rendering_context: RenderingContext,
servo: Servo<ServoWindowCallbacks>, servo: Servo<ServoWindowCallbacks>,
batch_mode: bool, batch_mode: bool,
callbacks: Rc<ServoWindowCallbacks>, callbacks: Rc<ServoWindowCallbacks>,
@ -285,7 +285,7 @@ pub fn init(
SurfaceType::Generic { size } SurfaceType::Generic { size }
}, },
}; };
let webrender_surfman = WebrenderSurfman::create(&connection, &adapter, surface_type) let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
.or(Err("Failed to create surface manager"))?; .or(Err("Failed to create surface manager"))?;
let window_callbacks = Rc::new(ServoWindowCallbacks { let window_callbacks = Rc::new(ServoWindowCallbacks {
@ -294,7 +294,7 @@ pub fn init(
density: init_opts.density, density: init_opts.density,
gl_context_pointer: init_opts.gl_context_pointer, gl_context_pointer: init_opts.gl_context_pointer,
native_display_pointer: init_opts.native_display_pointer, native_display_pointer: init_opts.native_display_pointer,
webrender_surfman: webrender_surfman.clone(), rendering_context: rendering_context.clone(),
}); });
let embedder_callbacks = Box::new(ServoEmbedderCallbacks { let embedder_callbacks = Box::new(ServoEmbedderCallbacks {
@ -312,7 +312,7 @@ pub fn init(
SERVO.with(|s| { SERVO.with(|s| {
let mut servo_glue = ServoGlue { let mut servo_glue = ServoGlue {
webrender_surfman, rendering_context,
servo: servo.servo, servo: servo.servo,
batch_mode: false, batch_mode: false,
callbacks: window_callbacks, callbacks: window_callbacks,
@ -354,8 +354,8 @@ impl ServoGlue {
/// Returns the webrender surface management integration interface. /// Returns the webrender surface management integration interface.
/// This provides the embedder access to the current front buffer. /// This provides the embedder access to the current front buffer.
pub fn surfman(&self) -> WebrenderSurfman { pub fn surfman(&self) -> RenderingContext {
self.webrender_surfman.clone() self.rendering_context.clone()
} }
/// This is the Servo heartbeat. This needs to be called /// This is the Servo heartbeat. This needs to be called
@ -863,7 +863,7 @@ struct ServoWindowCallbacks {
density: f32, density: f32,
gl_context_pointer: Option<*const c_void>, gl_context_pointer: Option<*const c_void>,
native_display_pointer: Option<*const c_void>, native_display_pointer: Option<*const c_void>,
webrender_surfman: WebrenderSurfman, rendering_context: RenderingContext,
} }
impl EmbedderMethods for ServoEmbedderCallbacks { impl EmbedderMethods for ServoEmbedderCallbacks {
@ -885,8 +885,8 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
} }
impl WindowMethods for ServoWindowCallbacks { impl WindowMethods for ServoWindowCallbacks {
fn webrender_surfman(&self) -> WebrenderSurfman { fn rendering_context(&self) -> RenderingContext {
self.webrender_surfman.clone() self.rendering_context.clone()
} }
fn set_animation_state(&self, state: AnimationState) { fn set_animation_state(&self, state: AnimationState) {

View file

@ -99,21 +99,21 @@ impl App {
if opts::get().minibrowser && window.winit_window().is_some() { if opts::get().minibrowser && window.winit_window().is_some() {
// Make sure the gl context is made current. // Make sure the gl context is made current.
let webrender_surfman = window.webrender_surfman(); let rendering_context = window.rendering_context();
let webrender_gl = match webrender_surfman.connection().gl_api() { let webrender_gl = match rendering_context.connection().gl_api() {
GLApi::GL => unsafe { GLApi::GL => unsafe {
gl::GlFns::load_with(|s| webrender_surfman.get_proc_address(s)) gl::GlFns::load_with(|s| rendering_context.get_proc_address(s))
}, },
GLApi::GLES => unsafe { GLApi::GLES => unsafe {
gl::GlesFns::load_with(|s| webrender_surfman.get_proc_address(s)) gl::GlesFns::load_with(|s| rendering_context.get_proc_address(s))
}, },
}; };
webrender_surfman.make_gl_context_current().unwrap(); rendering_context.make_gl_context_current().unwrap();
debug_assert_eq!(webrender_gl.get_error(), gleam::gl::NO_ERROR); debug_assert_eq!(webrender_gl.get_error(), gleam::gl::NO_ERROR);
app.minibrowser = Some( app.minibrowser = Some(
Minibrowser::new( Minibrowser::new(
&webrender_surfman, &rendering_context,
&events_loop, &events_loop,
window.as_ref(), window.as_ref(),
initial_url.clone(), initial_url.clone(),
@ -156,7 +156,7 @@ impl App {
t = now; t = now;
match event { match event {
winit::event::Event::NewEvents(winit::event::StartCause::Init) => { winit::event::Event::NewEvents(winit::event::StartCause::Init) => {
let surfman = window.webrender_surfman(); let surfman = window.rendering_context();
let xr_discovery = if pref!(dom.webxr.glwindow.enabled) && !opts::get().headless let xr_discovery = if pref!(dom.webxr.glwindow.enabled) && !opts::get().headless
{ {

View file

@ -17,13 +17,13 @@ use servo::compositing::windowing::{
}; };
use servo::embedder_traits::Cursor; use servo::embedder_traits::Cursor;
use servo::keyboard_types::{Key, KeyState, KeyboardEvent}; use servo::keyboard_types::{Key, KeyState, KeyboardEvent};
use servo::rendering_context::RenderingContext;
use servo::script_traits::{TouchEventType, WheelDelta, WheelMode}; use servo::script_traits::{TouchEventType, WheelDelta, WheelMode};
use servo::servo_config::{opts, pref}; use servo::servo_config::{opts, pref};
use servo::servo_geometry::DeviceIndependentPixel; use servo::servo_geometry::DeviceIndependentPixel;
use servo::style_traits::DevicePixel; use servo::style_traits::DevicePixel;
use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize}; use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize};
use servo::webrender_api::ScrollLocation; use servo::webrender_api::ScrollLocation;
use servo::webrender_surfman::WebrenderSurfman;
use servo_media::player::context::{GlApi, GlContext as PlayerGLContext, NativeDisplay}; use servo_media::player::context::{GlApi, GlContext as PlayerGLContext, NativeDisplay};
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use surfman::platform::generic::multi::connection::NativeConnection; use surfman::platform::generic::multi::connection::NativeConnection;
@ -47,7 +47,7 @@ use crate::window_trait::{WindowPortsMethods, LINE_HEIGHT};
pub struct Window { pub struct Window {
winit_window: winit::window::Window, winit_window: winit::window::Window,
webrender_surfman: WebrenderSurfman, rendering_context: RenderingContext,
screen_size: Size2D<u32, DevicePixel>, screen_size: Size2D<u32, DevicePixel>,
inner_size: Cell<Size2D<u32, DevicePixel>>, inner_size: Cell<Size2D<u32, DevicePixel>>,
toolbar_height: Cell<Length<f32, DeviceIndependentPixel>>, toolbar_height: Cell<Length<f32, DeviceIndependentPixel>>,
@ -136,13 +136,13 @@ impl Window {
.create_native_widget_from_rwh(window_handle) .create_native_widget_from_rwh(window_handle)
.expect("Failed to create native widget"); .expect("Failed to create native widget");
let surface_type = SurfaceType::Widget { native_widget }; let surface_type = SurfaceType::Widget { native_widget };
let webrender_surfman = WebrenderSurfman::create(&connection, &adapter, surface_type) let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
.expect("Failed to create WR surfman"); .expect("Failed to create WR surfman");
debug!("Created window {:?}", winit_window.id()); debug!("Created window {:?}", winit_window.id());
Window { Window {
winit_window, winit_window,
webrender_surfman, rendering_context,
event_queue: RefCell::new(vec![]), event_queue: RefCell::new(vec![]),
mouse_down_button: Cell::new(None), mouse_down_button: Cell::new(None),
mouse_down_point: Cell::new(Point2D::new(0, 0)), mouse_down_point: Cell::new(Point2D::new(0, 0)),
@ -477,7 +477,7 @@ impl WindowPortsMethods for Window {
let new_size = Size2D::new(width, height); let new_size = Size2D::new(width, height);
if self.inner_size.get() != new_size { if self.inner_size.get() != new_size {
let physical_size = Size2D::new(physical_size.width, physical_size.height); let physical_size = Size2D::new(physical_size.width, physical_size.height);
self.webrender_surfman self.rendering_context
.resize(physical_size.to_i32()) .resize(physical_size.to_i32())
.expect("Failed to resize"); .expect("Failed to resize");
self.inner_size.set(new_size); self.inner_size.set(new_size);
@ -550,8 +550,8 @@ impl WindowMethods for Window {
self.animation_state.set(state); self.animation_state.set(state);
} }
fn webrender_surfman(&self) -> WebrenderSurfman { fn rendering_context(&self) -> RenderingContext {
self.webrender_surfman.clone() self.rendering_context.clone()
} }
fn get_gl_context(&self) -> PlayerGLContext { fn get_gl_context(&self) -> PlayerGLContext {
@ -560,7 +560,7 @@ impl WindowMethods for Window {
} }
#[allow(unused_variables)] #[allow(unused_variables)]
let native_context = self.webrender_surfman.native_context(); let native_context = self.rendering_context.native_context();
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
return PlayerGLContext::Egl(native_context.egl_context as usize); return PlayerGLContext::Egl(native_context.egl_context as usize);
@ -591,9 +591,9 @@ impl WindowMethods for Window {
} }
#[allow(unused_variables)] #[allow(unused_variables)]
let native_connection = self.webrender_surfman.connection().native_connection(); let native_connection = self.rendering_context.connection().native_connection();
#[allow(unused_variables)] #[allow(unused_variables)]
let native_device = self.webrender_surfman.native_device(); let native_device = self.rendering_context.native_device();
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
return NativeDisplay::Egl(native_device.egl_display as usize); return NativeDisplay::Egl(native_device.egl_display as usize);
@ -619,8 +619,8 @@ impl WindowMethods for Window {
} }
fn get_gl_api(&self) -> GlApi { fn get_gl_api(&self) -> GlApi {
let api = self.webrender_surfman.connection().gl_api(); let api = self.rendering_context.connection().gl_api();
let attributes = self.webrender_surfman.context_attributes(); let attributes = self.rendering_context.context_attributes();
let GLVersion { major, minor } = attributes.version; let GLVersion { major, minor } = attributes.version;
match api { match api {
GLApi::GL if major >= 3 && minor >= 2 => GlApi::OpenGL3, GLApi::GL if major >= 3 && minor >= 2 => GlApi::OpenGL3,

View file

@ -11,10 +11,10 @@ use euclid::{Length, Point2D, Rotation3D, Scale, Size2D, UnknownUnit, Vector3D};
use servo::compositing::windowing::{ use servo::compositing::windowing::{
AnimationState, EmbedderCoordinates, EmbedderEvent, WindowMethods, AnimationState, EmbedderCoordinates, EmbedderEvent, WindowMethods,
}; };
use servo::rendering_context::RenderingContext;
use servo::servo_geometry::DeviceIndependentPixel; use servo::servo_geometry::DeviceIndependentPixel;
use servo::style_traits::DevicePixel; use servo::style_traits::DevicePixel;
use servo::webrender_api::units::DeviceIntRect; use servo::webrender_api::units::DeviceIntRect;
use servo::webrender_surfman::WebrenderSurfman;
use servo_media::player::context as MediaPlayerCtxt; use servo_media::player::context as MediaPlayerCtxt;
use surfman::{Connection, Context, Device, SurfaceType}; use surfman::{Connection, Context, Device, SurfaceType};
@ -22,7 +22,7 @@ use crate::events_loop::WakerEvent;
use crate::window_trait::WindowPortsMethods; use crate::window_trait::WindowPortsMethods;
pub struct Window { pub struct Window {
webrender_surfman: WebrenderSurfman, rendering_context: RenderingContext,
animation_state: Cell<AnimationState>, animation_state: Cell<AnimationState>,
fullscreen: Cell<bool>, fullscreen: Cell<bool>,
device_pixel_ratio_override: Option<f32>, device_pixel_ratio_override: Option<f32>,
@ -40,11 +40,11 @@ impl Window {
.expect("Failed to create adapter"); .expect("Failed to create adapter");
let size = size.to_untyped().to_i32(); let size = size.to_untyped().to_i32();
let surface_type = SurfaceType::Generic { size }; let surface_type = SurfaceType::Generic { size };
let webrender_surfman = WebrenderSurfman::create(&connection, &adapter, surface_type) let rendering_context = RenderingContext::create(&connection, &adapter, surface_type)
.expect("Failed to create WR surfman"); .expect("Failed to create WR surfman");
let window = Window { let window = Window {
webrender_surfman, rendering_context,
animation_state: Cell::new(AnimationState::Idle), animation_state: Cell::new(AnimationState::Idle),
fullscreen: Cell::new(false), fullscreen: Cell::new(false),
device_pixel_ratio_override, device_pixel_ratio_override,
@ -79,7 +79,7 @@ impl WindowPortsMethods for Window {
fn page_height(&self) -> f32 { fn page_height(&self) -> f32 {
let height = self let height = self
.webrender_surfman .rendering_context
.context_surface_info() .context_surface_info()
.unwrap_or(None) .unwrap_or(None)
.map(|info| info.size.height) .map(|info| info.size.height)
@ -124,7 +124,7 @@ impl WindowMethods for Window {
fn get_coordinates(&self) -> EmbedderCoordinates { fn get_coordinates(&self) -> EmbedderCoordinates {
let dpr = self.hidpi_factor(); let dpr = self.hidpi_factor();
let size = self let size = self
.webrender_surfman .rendering_context
.context_surface_info() .context_surface_info()
.unwrap_or(None) .unwrap_or(None)
.map(|info| Size2D::from_untyped(info.size)) .map(|info| Size2D::from_untyped(info.size))
@ -156,8 +156,8 @@ impl WindowMethods for Window {
MediaPlayerCtxt::GlApi::None MediaPlayerCtxt::GlApi::None
} }
fn webrender_surfman(&self) -> WebrenderSurfman { fn rendering_context(&self) -> RenderingContext {
self.webrender_surfman.clone() self.rendering_context.clone()
} }
} }

View file

@ -16,9 +16,9 @@ use glow::NativeFramebuffer;
use log::{trace, warn}; use log::{trace, warn};
use servo::compositing::windowing::EmbedderEvent; use servo::compositing::windowing::EmbedderEvent;
use servo::msg::constellation_msg::TraversalDirection; use servo::msg::constellation_msg::TraversalDirection;
use servo::rendering_context::RenderingContext;
use servo::servo_geometry::DeviceIndependentPixel; use servo::servo_geometry::DeviceIndependentPixel;
use servo::servo_url::ServoUrl; use servo::servo_url::ServoUrl;
use servo::webrender_surfman::WebrenderSurfman;
use crate::egui_glue::EguiGlow; use crate::egui_glue::EguiGlow;
use crate::events_loop::EventsLoop; use crate::events_loop::EventsLoop;
@ -53,13 +53,13 @@ pub enum MinibrowserEvent {
impl Minibrowser { impl Minibrowser {
pub fn new( pub fn new(
webrender_surfman: &WebrenderSurfman, rendering_context: &RenderingContext,
events_loop: &EventsLoop, events_loop: &EventsLoop,
window: &dyn WindowPortsMethods, window: &dyn WindowPortsMethods,
initial_url: ServoUrl, initial_url: ServoUrl,
) -> Self { ) -> Self {
let gl = unsafe { let gl = unsafe {
glow::Context::from_loader_function(|s| webrender_surfman.get_proc_address(s)) glow::Context::from_loader_function(|s| rendering_context.get_proc_address(s))
}; };
// Adapted from https://github.com/emilk/egui/blob/9478e50d012c5138551c38cbee16b07bc1fcf283/crates/egui_glow/examples/pure_glow.rs // Adapted from https://github.com/emilk/egui/blob/9478e50d012c5138551c38cbee16b07bc1fcf283/crates/egui_glow/examples/pure_glow.rs
@ -68,7 +68,7 @@ impl Minibrowser {
.egui_ctx .egui_ctx
.set_pixels_per_point(window.hidpi_factor().get()); .set_pixels_per_point(window.hidpi_factor().get());
let widget_surface_fbo = match webrender_surfman.context_surface_info() { let widget_surface_fbo = match rendering_context.context_surface_info() {
Ok(Some(info)) => NonZeroU32::new(info.framebuffer_object).map(NativeFramebuffer), Ok(Some(info)) => NonZeroU32::new(info.framebuffer_object).map(NativeFramebuffer),
Ok(None) => panic!("Failed to get widget surface info from surfman!"), Ok(None) => panic!("Failed to get widget surface info from surfman!"),
Err(error) => panic!("Failed to get widget surface info from surfman! {error:?}"), Err(error) => panic!("Failed to get widget surface info from surfman! {error:?}"),