Simplify RenderingContext trait methods (#35251)

There are a few methods are still difficult to implement without
the help of surfman. To simplify the trait methods, all methods that
return surfman types are removed. They are either handled by
embedders themselves or abstract to simpler types that servo
components need. The most noticeable changes are:

- Methods related to native surface are moved to servo_glue. The
  embedder should decide when to remove/replace the surface and it's
  outside of servo's scope.
- Methods required by servo media now return exact media types for it.

The other major change is sevevral difficult trait methods that are
reuiqred by WebGL and Servo media have default implementation. So they
can be optional for users to implement.

Signed-off-by: Wu Wayne <yuweiwu@pm.me>
This commit is contained in:
Ngo Iok Ui (Wu Yu Wei) 2025-02-05 21:02:11 +09:00 committed by GitHub
parent 175f28866d
commit 07aa4ce093
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 176 additions and 230 deletions

View file

@ -48,6 +48,10 @@ impl WebGLComm {
let webxr_init = crate::webxr::WebXRBridgeInit::new(sender.clone());
#[cfg(feature = "webxr")]
let webxr_layer_grand_manager = webxr_init.layer_grand_manager();
let connection = surfman::Connection::new().expect("Failed to create connection");
let adapter = connection
.create_adapter()
.expect("Failed to create adapter");
// This implementation creates a single `WebGLThread` for all the pipelines.
let init = WebGLThreadInit {
@ -57,8 +61,8 @@ impl WebGLComm {
sender: sender.clone(),
receiver,
webrender_swap_chains: webrender_swap_chains.clone(),
connection: rendering_context.connection(),
adapter: rendering_context.adapter(),
connection,
adapter,
api_type,
#[cfg(feature = "webxr")]
webxr_init,
@ -100,23 +104,30 @@ impl WebGLExternalImages {
debug!("... locking chain {:?}", id);
let front_buffer = self.swap_chains.get(id)?.take_surface()?;
let (surface_texture, gl_texture, size) =
self.rendering_context.create_texture(front_buffer);
if let Some((surface_texture, gl_texture, size)) =
self.rendering_context.create_texture(front_buffer)
{
self.locked_front_buffers.insert(id, surface_texture);
self.locked_front_buffers.insert(id, surface_texture);
Some((gl_texture, size))
Some((gl_texture, size))
} else {
None
}
}
fn unlock_swap_chain(&mut self, id: WebGLContextId) -> Option<()> {
let locked_front_buffer = self.locked_front_buffers.remove(&id)?;
let locked_front_buffer = self.rendering_context.destroy_texture(locked_front_buffer);
debug!("... unlocked chain {:?}", id);
self.swap_chains
.get(id)?
.recycle_surface(locked_front_buffer);
Some(())
let locked_front_buffer = self.locked_front_buffers.remove(&id)?;
if let Some(locked_front_buffer) =
self.rendering_context.destroy_texture(locked_front_buffer)
{
self.swap_chains
.get(id)?
.recycle_surface(locked_front_buffer);
Some(())
} else {
None
}
}
}