Use surfman with glow bindings (#34328)

* Use glowing surfman

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* Port https://github.com/servo/webxr/pull/255

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* fixups rebase

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* fmt

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* Update surfman

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

* Fix stale TODO

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>

---------

Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
Samson 2025-02-05 07:13:21 +01:00 committed by GitHub
parent fdbfecf7dd
commit 503bb10c5b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 70 additions and 97 deletions

View file

@ -570,15 +570,9 @@ macro_rules! define_resource_id {
pub struct $name(nonzero_type!($type));
impl $name {
#[allow(unsafe_code)]
#[inline]
/// Create a new $name.
///
/// # Safety
///
/// Using an invalid OpenGL id may result in undefined behavior.
pub unsafe fn new(id: $type) -> Self {
$name(<nonzero_type!($type)>::new_unchecked(id))
pub fn new(id: nonzero_type!($type)) -> Self {
Self(id)
}
#[inline]
@ -599,10 +593,10 @@ macro_rules! define_resource_id {
D: ::serde::Deserializer<'de>,
{
let id = <$type>::deserialize(deserializer)?;
if id == 0 {
Err(::serde::de::Error::custom("expected a non-zero value"))
if let Some(id) = <nonzero_type!($type)>::new(id) {
Ok($name(id))
} else {
Ok(unsafe { $name::new(id) })
Err(::serde::de::Error::custom("expected a non-zero value"))
}
}
}

View file

@ -135,7 +135,8 @@ impl RenderingContext for SurfmanRenderingContext {
fn framebuffer_object(&self) -> u32 {
self.context_surface_info()
.unwrap_or(None)
.map(|info| info.framebuffer_object)
.and_then(|info| info.framebuffer_object)
.map(|fbo| fbo.0.get())
.unwrap_or(0)
}
#[allow(unsafe_code)]
@ -187,7 +188,11 @@ impl RenderingContext for SurfmanRenderingContext {
debug!("... getting texture for surface {:?}", front_buffer_id);
let surface_texture = device.create_surface_texture(context, surface).unwrap();
let gl_texture = device.surface_texture_object(&surface_texture);
(surface_texture, gl_texture, size)
(
surface_texture,
gl_texture.map(|tex| tex.0.get()).unwrap_or(0),
size,
)
}
fn destroy_texture(&self, surface_texture: SurfaceTexture) -> Surface {
@ -390,7 +395,10 @@ impl SurfmanRenderingContext {
pub fn surface_texture_object(&self, surface: &SurfaceTexture) -> u32 {
let device = &self.0.device.borrow();
device.surface_texture_object(surface)
device
.surface_texture_object(surface)
.map(|t| t.0.get())
.unwrap_or_default()
}
pub fn get_proc_address(&self, name: &str) -> *const c_void {

View file

@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use std::fmt::Debug;
use std::num::NonZeroU32;
use std::sync::atomic::{AtomicUsize, Ordering};
use euclid::{Rect, Size2D};
@ -286,9 +287,8 @@ pub struct SubImages {
#[derive(Clone, Debug)]
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
pub struct SubImage {
pub color_texture: u32,
// TODO: make this Option<NonZeroU32>
pub depth_stencil_texture: Option<u32>,
pub color_texture: Option<NonZeroU32>,
pub depth_stencil_texture: Option<NonZeroU32>,
pub texture_array_index: Option<u32>,
pub viewport: Rect<i32, Viewport>,
}