Skip to content
This repository was archived by the owner on Feb 16, 2025. It is now read-only.

Commit ade0f62

Browse files
committed
Use surfman with glow instead of gl_generator
Signed-off-by: sagudev <[email protected]>
1 parent 4fd38cf commit ade0f62

File tree

6 files changed

+29
-42
lines changed

6 files changed

+29
-42
lines changed

webxr-api/layer.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use euclid::Rect;
1010
use euclid::Size2D;
1111

1212
use std::fmt::Debug;
13+
use std::num::NonZeroU32;
1314
use std::sync::atomic::AtomicUsize;
1415
use std::sync::atomic::Ordering;
1516

@@ -288,9 +289,8 @@ pub struct SubImages {
288289
#[derive(Clone, Debug)]
289290
#[cfg_attr(feature = "ipc", derive(Deserialize, Serialize))]
290291
pub struct SubImage {
291-
pub color_texture: u32,
292-
// TODO: make this Option<NonZeroU32>
293-
pub depth_stencil_texture: Option<u32>,
292+
pub color_texture: Option<NonZeroU32>,
293+
pub depth_stencil_texture: Option<NonZeroU32>,
294294
pub texture_array_index: Option<u32>,
295295
pub viewport: Rect<i32, Viewport>,
296296
}

webxr/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ openxr = { version = "0.19", optional = true }
3535
serde = { version = "1.0", optional = true }
3636
glow = "0.16"
3737
raw-window-handle = "0.6"
38-
surfman = { git = "https://github.com/servo/surfman", rev = "300789ddbda45c89e9165c31118bf1c4c07f89f6", features = [
38+
surfman = { git = "https://github.com/servo/surfman", rev = "e78ea1b24e1de57f24fc761186d8e9d9e43d660a", features = [
3939
"chains",
4040
"sm-raw-window-handle-06",
4141
] }

webxr/gl_utils.rs

+8-14
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ use webxr_api::ContextId;
1313
use webxr_api::GLContexts;
1414
use webxr_api::LayerId;
1515

16-
pub(crate) fn framebuffer(framebuffer: u32) -> Option<gl::NativeFramebuffer> {
17-
NonZero::new(framebuffer).map(gl::NativeFramebuffer)
18-
}
19-
2016
// A utility to clear a color texture and optional depth/stencil texture
2117
pub(crate) struct GlClearer {
2218
fbos: HashMap<
@@ -53,10 +49,9 @@ impl GlClearer {
5349
.entry((layer_id, color, depth_stencil))
5450
.or_insert_with(|| {
5551
// Save the current GL state
56-
let mut bound_fbos = [0, 0];
5752
unsafe {
58-
gl.get_parameter_i32_slice(gl::DRAW_FRAMEBUFFER_BINDING, &mut bound_fbos[0..]);
59-
gl.get_parameter_i32_slice(gl::READ_FRAMEBUFFER_BINDING, &mut bound_fbos[1..]);
53+
let draw_fbo = gl.get_parameter_framebuffer(gl::DRAW_FRAMEBUFFER_BINDING);
54+
let read_fbo = gl.get_parameter_framebuffer(gl::READ_FRAMEBUFFER_BINDING);
6055

6156
// Generate and set attachments of a new FBO
6257
let fbo = gl.create_framebuffer().ok();
@@ -84,8 +79,8 @@ impl GlClearer {
8479
}
8580

8681
// Restore the GL state
87-
gl.bind_framebuffer(gl::DRAW_FRAMEBUFFER, framebuffer(bound_fbos[0] as _));
88-
gl.bind_framebuffer(gl::READ_FRAMEBUFFER, framebuffer(bound_fbos[1] as _));
82+
gl.bind_framebuffer(gl::DRAW_FRAMEBUFFER, draw_fbo);
83+
gl.bind_framebuffer(gl::READ_FRAMEBUFFER, read_fbo);
8984
debug_assert_eq!(gl.get_error(), gl::NO_ERROR);
9085

9186
fbo
@@ -110,7 +105,6 @@ impl GlClearer {
110105
let fbo = self.fbo(gl, layer_id, color, color_target, depth_stencil);
111106
unsafe {
112107
// Save the current GL state
113-
let mut bound_fbos = [0, 0];
114108
let mut clear_color = [0., 0., 0., 0.];
115109
let mut clear_depth = [0.];
116110
let mut clear_stencil = [0];
@@ -120,8 +114,8 @@ impl GlClearer {
120114
let scissor_enabled = gl.is_enabled(gl::SCISSOR_TEST);
121115
let rasterizer_enabled = gl.is_enabled(gl::RASTERIZER_DISCARD);
122116

123-
gl.get_parameter_i32_slice(gl::DRAW_FRAMEBUFFER_BINDING, &mut bound_fbos[0..]);
124-
gl.get_parameter_i32_slice(gl::READ_FRAMEBUFFER_BINDING, &mut bound_fbos[1..]);
117+
let draw_fbo = gl.get_parameter_framebuffer(gl::DRAW_FRAMEBUFFER_BINDING);
118+
let read_fbo = gl.get_parameter_framebuffer(gl::READ_FRAMEBUFFER_BINDING);
125119
gl.get_parameter_f32_slice(gl::COLOR_CLEAR_VALUE, &mut clear_color[..]);
126120
gl.get_parameter_f32_slice(gl::DEPTH_CLEAR_VALUE, &mut clear_depth[..]);
127121
gl.get_parameter_i32_slice(gl::STENCIL_CLEAR_VALUE, &mut clear_stencil[..]);
@@ -142,8 +136,8 @@ impl GlClearer {
142136
gl.clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT | gl::STENCIL_BUFFER_BIT);
143137

144138
// Restore the GL state
145-
gl.bind_framebuffer(gl::DRAW_FRAMEBUFFER, framebuffer(bound_fbos[0] as _));
146-
gl.bind_framebuffer(gl::READ_FRAMEBUFFER, framebuffer(bound_fbos[1] as _));
139+
gl.bind_framebuffer(gl::DRAW_FRAMEBUFFER, draw_fbo);
140+
gl.bind_framebuffer(gl::READ_FRAMEBUFFER, read_fbo);
147141
gl.clear_color(
148142
clear_color[0],
149143
clear_color[1],

webxr/glwindow/mod.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
44

5-
use crate::gl_utils::framebuffer;
65
use crate::{SurfmanGL, SurfmanLayerManager};
76
use core::slice;
87
use euclid::{
98
Angle, Point2D, Rect, RigidTransform3D, Rotation3D, Size2D, Transform3D, UnknownUnit, Vector3D,
109
};
1110
use glow::{self as gl, Context as Gl, HasContext};
1211
use raw_window_handle::DisplayHandle;
13-
use std::num::NonZeroU32;
1412
use std::rc::Rc;
1513
use surfman::chains::{PreserveBuffer, SwapChain, SwapChainAPI, SwapChains, SwapChainsAPI};
1614
use surfman::{
@@ -220,10 +218,10 @@ impl DeviceAPI for GlWindowDevice {
220218
.context_surface_info(&self.context)
221219
.unwrap()
222220
.map(|info| info.framebuffer_object)
223-
.unwrap_or(0);
221+
.flatten();
224222
unsafe {
225223
self.gl
226-
.bind_framebuffer(gl::FRAMEBUFFER, framebuffer(framebuffer_object));
224+
.bind_framebuffer(gl::FRAMEBUFFER, framebuffer_object);
227225
debug_assert_eq!(
228226
(
229227
self.gl.get_error(),
@@ -251,10 +249,9 @@ impl DeviceAPI for GlWindowDevice {
251249
.device
252250
.create_surface_texture(&mut self.context, surface)
253251
.unwrap();
254-
let raw_texture_id = self.device.surface_texture_object(&surface_texture);
255-
let texture_id = NonZeroU32::new(raw_texture_id).map(gl::NativeTexture);
252+
let texture_id = self.device.surface_texture_object(&surface_texture);
256253
let texture_target = self.device.surface_gl_texture_target();
257-
log::debug!("Presenting texture {}", raw_texture_id);
254+
log::debug!("Presenting texture {:?}", texture_id);
258255

259256
if let Some(ref shader) = self.shader {
260257
shader.draw_texture(
@@ -390,8 +387,8 @@ impl GlWindowDevice {
390387
.context_surface_info(&context)
391388
.unwrap()
392389
.map(|info| info.framebuffer_object)
393-
.unwrap_or(0);
394-
gl.bind_framebuffer(gl::FRAMEBUFFER, framebuffer(framebuffer_object));
390+
.flatten();
391+
gl.bind_framebuffer(gl::FRAMEBUFFER, framebuffer_object);
395392
debug_assert_eq!(
396393
(gl.get_error(), gl.check_framebuffer_status(gl::FRAMEBUFFER)),
397394
(gl::NO_ERROR, gl::FRAMEBUFFER_COMPLETE)

webxr/openxr/mod.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use openxr::{
2424
};
2525
use std::collections::HashMap;
2626
use std::mem;
27-
use std::num::NonZeroU32;
2827
use std::ops::Deref;
2928
use std::sync::{Arc, Mutex};
3029
use std::thread;
@@ -802,15 +801,13 @@ impl LayerManagerAPI<SurfmanGL> for OpenXrLayerManager {
802801
})?;
803802
let color_texture = device.surface_texture_object(color_surface_texture);
804803
let color_target = device.surface_gl_texture_target();
805-
let depth_stencil_texture = openxr_layer
806-
.depth_stencil_texture
807-
.map(|texture| texture.0.get());
804+
let depth_stencil_texture = openxr_layer.depth_stencil_texture;
808805
let texture_array_index = None;
809806
let origin = Point2D::new(0, 0);
810807
let texture_size = openxr_layer.size;
811808
let sub_image = Some(SubImage {
812-
color_texture,
813-
depth_stencil_texture,
809+
color_texture: color_texture.map(|t| t.0),
810+
depth_stencil_texture: depth_stencil_texture.map(|t| t.0),
814811
texture_array_index,
815812
viewport: Rect::new(origin, texture_size),
816813
});
@@ -819,8 +816,8 @@ impl LayerManagerAPI<SurfmanGL> for OpenXrLayerManager {
819816
.viewports
820817
.iter()
821818
.map(|&viewport| SubImage {
822-
color_texture,
823-
depth_stencil_texture,
819+
color_texture: color_texture.map(|t| t.0),
820+
depth_stencil_texture: depth_stencil_texture.map(|t| t.0),
824821
texture_array_index,
825822
viewport,
826823
})
@@ -830,7 +827,7 @@ impl LayerManagerAPI<SurfmanGL> for OpenXrLayerManager {
830827
contexts,
831828
context_id,
832829
layer_id,
833-
NonZeroU32::new(color_texture).map(glow::NativeTexture),
830+
color_texture,
834831
color_target,
835832
openxr_layer.depth_stencil_texture,
836833
);

webxr/surfman_layer_manager.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use crate::gl_utils::GlClearer;
88
use euclid::{Point2D, Rect, Size2D};
99
use glow::{self as gl, Context as Gl, HasContext, PixelUnpackData};
1010
use std::collections::HashMap;
11-
use std::num::NonZeroU32;
1211
use surfman::chains::{PreserveBuffer, SwapChains, SwapChainsAPI};
1312
use surfman::{Context as SurfmanContext, Device as SurfmanDevice, SurfaceAccess, SurfaceTexture};
1413
use webxr_api::{
@@ -163,8 +162,8 @@ impl LayerManagerAPI<SurfmanGL> for SurfmanLayerManager {
163162
let texture_array_index = None;
164163
let origin = Point2D::new(0, 0);
165164
let sub_image = Some(SubImage {
166-
color_texture,
167-
depth_stencil_texture: depth_stencil_texture.map(|nt| nt.0.get()),
165+
color_texture: color_texture.map(|nt| nt.0),
166+
depth_stencil_texture: depth_stencil_texture.map(|nt| nt.0),
168167
texture_array_index,
169168
viewport: Rect::new(origin, surface_size),
170169
});
@@ -173,8 +172,8 @@ impl LayerManagerAPI<SurfmanGL> for SurfmanLayerManager {
173172
.viewports
174173
.iter()
175174
.map(|&viewport| SubImage {
176-
color_texture,
177-
depth_stencil_texture: depth_stencil_texture.map(|texture| texture.0.get()),
175+
color_texture: color_texture.map(|nt| nt.0),
176+
depth_stencil_texture: depth_stencil_texture.map(|texture| texture.0),
178177
texture_array_index,
179178
viewport,
180179
})
@@ -185,7 +184,7 @@ impl LayerManagerAPI<SurfmanGL> for SurfmanLayerManager {
185184
contexts,
186185
context_id,
187186
layer_id,
188-
NonZeroU32::new(color_texture).map(gl::NativeTexture),
187+
color_texture,
189188
color_target,
190189
depth_stencil_texture,
191190
);

0 commit comments

Comments
 (0)