webxr: Update XRView to latest spec (#33145)

* Add recommendedViewportScale and requestViewportScale

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Remove currently unused internal slots

Signed-off-by: Daniel Adams <msub2official@gmail.com>

---------

Signed-off-by: Daniel Adams <msub2official@gmail.com>
This commit is contained in:
Daniel Adams 2024-08-20 16:37:58 -10:00 committed by GitHub
parent 75b817cca3
commit 8e224cb4d3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 47 additions and 194 deletions

View file

@ -14,7 +14,10 @@ enum XREye {
interface XRView {
readonly attribute XREye eye;
readonly attribute Float32Array projectionMatrix;
readonly attribute XRRigidTransform transform;
[SameObject] readonly attribute XRRigidTransform transform;
readonly attribute double? recommendedViewportScale;
undefined requestViewportScale(double? scale);
// AR Module
readonly attribute boolean isFirstPersonObserver;

View file

@ -2,6 +2,8 @@
* 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/. */
use std::cell::Cell;
use dom_struct::dom_struct;
use euclid::RigidTransform3D;
use js::typedarray::{Float32, Float32Array};
@ -9,6 +11,7 @@ use webxr_api::{ApiSpace, View};
use super::bindings::buffer_source::HeapBufferSource;
use crate::dom::bindings::codegen::Bindings::XRViewBinding::{XREye, XRViewMethods};
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::{Dom, DomRoot};
use crate::dom::globalscope::GlobalScope;
@ -28,6 +31,7 @@ pub struct XRView {
#[no_trace]
view: View<ApiSpace>,
transform: Dom<XRRigidTransform>,
requested_viewport_scale: Cell<f64>,
}
impl XRView {
@ -46,6 +50,7 @@ impl XRView {
proj: HeapBufferSource::default(),
view,
transform: Dom::from_ref(transform),
requested_viewport_scale: Cell::new(1.0),
}
}
@ -107,6 +112,22 @@ impl XRViewMethods for XRView {
DomRoot::from_ref(&self.transform)
}
/// <https://www.w3.org/TR/webxr/#dom-xrview-recommendedviewportscale>
fn GetRecommendedViewportScale(&self) -> Option<Finite<f64>> {
// Just return 1.0 since we currently will always use full-sized viewports
Finite::new(1.0)
}
/// <https://www.w3.org/TR/webxr/#dom-xrview-requestviewportscale>
fn RequestViewportScale(&self, scale: Option<Finite<f64>>) {
if let Some(scale) = scale {
if *scale > 0.0 {
let clamped_scale = scale.clamp(0.0, 1.0);
self.requested_viewport_scale.set(clamped_scale);
}
}
}
/// <https://www.w3.org/TR/webxr-ar-module-1/#dom-xrview-isfirstpersonobserver>
fn IsFirstPersonObserver(&self) -> bool {
// Servo is not currently supported anywhere that supports this, so return false

View file

@ -316,7 +316,7 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
let index = view.viewport_index();
let viewport = self.session().with_session(|s| {
// Inline sssions
// Inline sessions
if s.viewports().is_empty() {
Rect::from_size(self.size().to_i32())
} else {
@ -324,6 +324,11 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
}
});
// NOTE: According to spec, viewport sizes should be recalculated here if the
// requested viewport scale has changed. However, existing browser implementations
// don't seem to do this for stereoscopic immersive sessions.
// Revisit if Servo gets support for handheld AR/VR via ARCore/ARKit
Some(XRViewport::new(&self.global(), viewport))
}
}

View file

@ -317,12 +317,6 @@
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
expected: FAIL
[XRView interface: attribute recommendedViewportScale]
expected: FAIL
[XRView interface: operation requestViewportScale(double?)]
expected: FAIL
[XRPose interface: attribute linearVelocity]
expected: FAIL

View file

@ -1,85 +1,24 @@
[xr_viewport_scale.https.html]
expected: ERROR
[requestViewportScale valid viewport for inline session - webgl]
expected: TIMEOUT
[recommendedViewportScale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale applied next frame for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for inline session - webgl]
expected: NOTRUN
[recommendedViewportScale for inline session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for inline session - webgl2]
expected: NOTRUN
[recommendedViewportScale for inline session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for inline session - webgl2]
expected: NOTRUN
[recommendedViewportScale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport for inline session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for inline session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED

View file

@ -260,12 +260,6 @@
[XRSession interface: calling cancelAnimationFrame(unsigned long) on xrSession with too few arguments must throw TypeError]
expected: FAIL
[XRView interface: attribute recommendedViewportScale]
expected: FAIL
[XRView interface: operation requestViewportScale(double?)]
expected: FAIL
[XRPose interface: attribute linearVelocity]
expected: FAIL

View file

@ -1,127 +1,24 @@
[xr_viewport_scale.https.html]
expected: ERROR
[requestViewportScale valid viewport for inline session]
expected: TIMEOUT
[requestViewportScale valid viewport w/ null scale for inline session]
expected: NOTRUN
[recommendedViewportScale for immersive-vr session]
expected: NOTRUN
[requestViewportScale applied next frame for inline session]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for inline session]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session]
expected: NOTRUN
[requestViewportScale valid viewport for immersive-vr session]
expected: NOTRUN
[requestViewportScale same frame for inline session]
expected: NOTRUN
[recommendedViewportScale for inline session]
expected: NOTRUN
[requestViewportScale same frame for immersive-vr session]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for immersive-vr session]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for immersive-vr session]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for inline session]
expected: NOTRUN
[requestViewportScale applied next frame for immersive-vr session]
expected: NOTRUN
[requestViewportScale valid viewport for inline session - webgl]
expected: TIMEOUT
[recommendedViewportScale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale applied next frame for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for inline session - webgl]
expected: NOTRUN
[recommendedViewportScale for inline session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for inline session - webgl2]
expected: NOTRUN
[recommendedViewportScale for inline session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale same frame for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED
[requestViewportScale applied next frame for inline session - webgl2]
expected: NOTRUN
[recommendedViewportScale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport for inline session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for inline session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl2]
expected: NOTRUN
[requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl]
expected: NOTRUN
[requestViewportScale valid viewport w/ undefined scale for inline session - webgl2]
expected: NOTRUN
expected: PRECONDITION_FAILED