Commit 300cd0df authored by Brandon Jones's avatar Brandon Jones Committed by Commit Bot

Moved XR getViewport, removed XRDevice.external

Brings Chrome's implementation inline with the latest spec changes.

Bug: 819744
Change-Id: I716bab14bdbcc1c452a4dd447adbe28ffef05f98
Reviewed-on: https://chromium-review.googlesource.com/953259
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: default avatarBrian Sheedy <bsheedy@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541739}
parent eebaaff0
...@@ -12,9 +12,6 @@ partial interface Navigator { ...@@ -12,9 +12,6 @@ partial interface Navigator {
}; };
[SecureContext, Exposed=Window] interface XRDevice : EventTarget { [SecureContext, Exposed=Window] interface XRDevice : EventTarget {
// Attributes
readonly attribute boolean external;
// Methods // Methods
Promise<void> supportsSession(optional XRSessionCreationOptions options); Promise<void> supportsSession(optional XRSessionCreationOptions options);
Promise<XRSession> requestSession(optional XRSessionCreationOptions options); Promise<XRSession> requestSession(optional XRSessionCreationOptions options);
...@@ -97,8 +94,6 @@ enum XREye { ...@@ -97,8 +94,6 @@ enum XREye {
[SecureContext, Exposed=Window] interface XRView { [SecureContext, Exposed=Window] interface XRView {
readonly attribute XREye eye; readonly attribute XREye eye;
readonly attribute Float32Array projectionMatrix; readonly attribute Float32Array projectionMatrix;
XRViewport? getViewport(XRLayer layer);
}; };
[SecureContext, Exposed=Window] interface XRViewport { [SecureContext, Exposed=Window] interface XRViewport {
...@@ -146,6 +141,7 @@ interface XRWebGLLayer : XRLayer { ...@@ -146,6 +141,7 @@ interface XRWebGLLayer : XRLayer {
readonly attribute unsigned long framebufferHeight; readonly attribute unsigned long framebufferHeight;
// Methods // Methods
XRViewport? getViewport(XRView view);
void requestViewportScaling(double viewportScaleFactor); void requestViewportScaling(double viewportScaleFactor);
}; };
......
...@@ -19,8 +19,6 @@ PASS XRDevice interface object name ...@@ -19,8 +19,6 @@ PASS XRDevice interface object name
PASS XRDevice interface: existence and properties of interface prototype object PASS XRDevice interface: existence and properties of interface prototype object
PASS XRDevice interface: existence and properties of interface prototype object's "constructor" property PASS XRDevice interface: existence and properties of interface prototype object's "constructor" property
PASS XRDevice interface: existence and properties of interface prototype object's @@unscopables property PASS XRDevice interface: existence and properties of interface prototype object's @@unscopables property
PASS XRDevice interface: attribute external
PASS Unscopable handled correctly for external property on XRDevice
PASS XRDevice interface: operation supportsSession(XRSessionCreationOptions) PASS XRDevice interface: operation supportsSession(XRSessionCreationOptions)
PASS Unscopable handled correctly for supportsSession(XRSessionCreationOptions) on XRDevice PASS Unscopable handled correctly for supportsSession(XRSessionCreationOptions) on XRDevice
PASS XRDevice interface: operation requestSession(XRSessionCreationOptions) PASS XRDevice interface: operation requestSession(XRSessionCreationOptions)
...@@ -117,8 +115,6 @@ PASS XRView interface: attribute eye ...@@ -117,8 +115,6 @@ PASS XRView interface: attribute eye
PASS Unscopable handled correctly for eye property on XRView PASS Unscopable handled correctly for eye property on XRView
PASS XRView interface: attribute projectionMatrix PASS XRView interface: attribute projectionMatrix
PASS Unscopable handled correctly for projectionMatrix property on XRView PASS Unscopable handled correctly for projectionMatrix property on XRView
PASS XRView interface: operation getViewport(XRLayer)
PASS Unscopable handled correctly for getViewport(XRLayer) on XRView
PASS XRViewport interface: existence and properties of interface object PASS XRViewport interface: existence and properties of interface object
PASS XRViewport interface object length PASS XRViewport interface object length
PASS XRViewport interface object name PASS XRViewport interface object name
...@@ -173,6 +169,8 @@ PASS XRWebGLLayer interface: attribute framebufferWidth ...@@ -173,6 +169,8 @@ PASS XRWebGLLayer interface: attribute framebufferWidth
PASS Unscopable handled correctly for framebufferWidth property on XRWebGLLayer PASS Unscopable handled correctly for framebufferWidth property on XRWebGLLayer
PASS XRWebGLLayer interface: attribute framebufferHeight PASS XRWebGLLayer interface: attribute framebufferHeight
PASS Unscopable handled correctly for framebufferHeight property on XRWebGLLayer PASS Unscopable handled correctly for framebufferHeight property on XRWebGLLayer
PASS XRWebGLLayer interface: operation getViewport(XRView)
PASS Unscopable handled correctly for getViewport(XRView) on XRWebGLLayer
PASS XRWebGLLayer interface: operation requestViewportScaling(double) PASS XRWebGLLayer interface: operation requestViewportScaling(double)
PASS Unscopable handled correctly for requestViewportScaling(double) on XRWebGLLayer PASS Unscopable handled correctly for requestViewportScaling(double) on XRWebGLLayer
PASS XRPresentationContext interface: existence and properties of interface object PASS XRPresentationContext interface: existence and properties of interface object
......
...@@ -9000,7 +9000,6 @@ interface XRCoordinateSystem ...@@ -9000,7 +9000,6 @@ interface XRCoordinateSystem
method getTransformTo method getTransformTo
interface XRDevice : EventTarget interface XRDevice : EventTarget
attribute @@toStringTag attribute @@toStringTag
getter external
method constructor method constructor
method requestSession method requestSession
method supportsSession method supportsSession
...@@ -9087,7 +9086,6 @@ interface XRView ...@@ -9087,7 +9086,6 @@ interface XRView
getter eye getter eye
getter projectionMatrix getter projectionMatrix
method constructor method constructor
method getViewport
interface XRViewport interface XRViewport
attribute @@toStringTag attribute @@toStringTag
getter height getter height
...@@ -9107,6 +9105,7 @@ interface XRWebGLLayer : XRLayer ...@@ -9107,6 +9105,7 @@ interface XRWebGLLayer : XRLayer
getter multiview getter multiview
getter stencil getter stencil
method constructor method constructor
method getViewport
method requestViewportScaling method requestViewportScaling
interface XSLTProcessor interface XSLTProcessor
attribute @@toStringTag attribute @@toStringTag
......
...@@ -12,8 +12,10 @@ let fakeDevices = fakeXRDevices(); ...@@ -12,8 +12,10 @@ let fakeDevices = fakeXRDevices();
promise_test((t) => { promise_test((t) => {
setFakeDevices([fakeDevices["FakeGooglePixelPhone"]]); setFakeDevices([fakeDevices["FakeGooglePixelPhone"]]);
return navigator.xr.requestDevice().then( (device) => { return navigator.xr.requestDevice().then( (device) => {
assert_true(device != null); t.step(() => {
assert_false(device.external); assert_true(device != null);
assert_true(device instanceof XRDevice);
});
}); });
}, "navigator.xr.requestDevice properly returns a single device"); }, "navigator.xr.requestDevice properly returns a single device");
......
...@@ -13,8 +13,19 @@ promise_test( (t) => { ...@@ -13,8 +13,19 @@ promise_test( (t) => {
// return, update this test. // return, update this test.
setFakeDevices([fakeDevices["FakeGooglePixelPhone"], fakeDevices["FakeMagicWindowOnly"]]); setFakeDevices([fakeDevices["FakeGooglePixelPhone"], fakeDevices["FakeMagicWindowOnly"]]);
return navigator.xr.requestDevice().then( (device) => { return navigator.xr.requestDevice().then( (device) => {
assert_true(device != null); t.step(() => {
assert_false(device.external); assert_true(device != null);
assert_true(device instanceof XRDevice);
});
// Repeated calls to requestDevice should yeild the same device each time.
navigator.xr.requestDevice().then( (device2) => {
t.step(() => {
assert_true(device2 != null);
assert_true(device2 instanceof XRDevice);
assert_equals(device, device2);
});
});
}); });
}, "navigator.xr.requestDevice properly returns one device when there are two"); }, "navigator.xr.requestDevice properly returns one device when there are two");
</script> </script>
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<script> <script>
let fakeDevices = fakeXRDevices(); let fakeDevices = fakeXRDevices();
xr_session_promise_test( (session) => { xr_session_promise_test( (session, t) => {
// Session must have a baseLayer or frame requests will be ignored. // Session must have a baseLayer or frame requests will be ignored.
let webglLayer = new XRWebGLLayer(session, gl); let webglLayer = new XRWebGLLayer(session, gl);
session.baseLayer = webglLayer; session.baseLayer = webglLayer;
...@@ -22,42 +22,44 @@ xr_session_promise_test( (session) => { ...@@ -22,42 +22,44 @@ xr_session_promise_test( (session) => {
let leftView = xrFrame.views[0]; let leftView = xrFrame.views[0];
let rightView = xrFrame.views[1]; let rightView = xrFrame.views[1];
let leftViewport = leftView.getViewport(webglLayer); let leftViewport = webglLayer.getViewport(leftView);
let rightViewport = rightView.getViewport(webglLayer); let rightViewport = webglLayer.getViewport(rightView);
// Ensure the views report the expected viewports into the WebGL layer. t.step(() => {
assert_true(leftViewport instanceof XRViewport); // Ensure the views report the expected viewports into the WebGL layer.
assert_true(rightViewport instanceof XRViewport); assert_true(leftViewport instanceof XRViewport);
assert_true(rightViewport instanceof XRViewport);
assert_not_equals(leftViewport, null); assert_not_equals(leftViewport, null);
assert_not_equals(rightViewport, null); assert_not_equals(rightViewport, null);
// Exact viewport values don't matter, but they must pass several tests: // Exact viewport values don't matter, but they must pass several tests:
// Viewports have non-zero widths and heights. // Viewports have non-zero widths and heights.
assert_greater_than(leftViewport.width, 0); assert_greater_than(leftViewport.width, 0);
assert_greater_than(leftViewport.height, 0); assert_greater_than(leftViewport.height, 0);
assert_greater_than(rightViewport.width, 0); assert_greater_than(rightViewport.width, 0);
assert_greater_than(rightViewport.height, 0); assert_greater_than(rightViewport.height, 0);
// Viewports are located within the framebuffer. // Viewports are located within the framebuffer.
assert_greater_than_equal(leftViewport.x, 0); assert_greater_than_equal(leftViewport.x, 0);
assert_greater_than_equal(leftViewport.y, 0); assert_greater_than_equal(leftViewport.y, 0);
assert_greater_than_equal(leftViewport.x, 0); assert_greater_than_equal(leftViewport.x, 0);
assert_greater_than_equal(leftViewport.y, 0); assert_greater_than_equal(leftViewport.y, 0);
assert_less_than_equal( assert_less_than_equal(
leftViewport.x + leftViewport.width, webglLayer.framebufferWidth); leftViewport.x + leftViewport.width, webglLayer.framebufferWidth);
assert_less_than_equal( assert_less_than_equal(
leftViewport.y + leftViewport.height, webglLayer.framebufferHeight); leftViewport.y + leftViewport.height, webglLayer.framebufferHeight);
assert_less_than_equal( assert_less_than_equal(
rightViewport.x + rightViewport.width, webglLayer.framebufferWidth); rightViewport.x + rightViewport.width, webglLayer.framebufferWidth);
assert_less_than_equal( assert_less_than_equal(
rightViewport.y + rightViewport.height, webglLayer.framebufferHeight); rightViewport.y + rightViewport.height, webglLayer.framebufferHeight);
// Assumes that the left viewport will always be physically to the left // Assumes that the left viewport will always be physically to the left
// of the right viewport. // of the right viewport.
assert_less_than_equal(leftViewport.x + leftViewport.width, rightViewport.x); assert_less_than_equal(leftViewport.x + leftViewport.width, rightViewport.x);
});
resolve(); resolve();
} }
......
...@@ -7,8 +7,6 @@ ...@@ -7,8 +7,6 @@
SecureContext, SecureContext,
RuntimeEnabled=WebXR RuntimeEnabled=WebXR
] interface XRDevice : EventTarget { ] interface XRDevice : EventTarget {
readonly attribute boolean external;
[CallWith=ScriptState] Promise supportsSession([PermissiveDictionaryConversion] optional XRSessionCreationOptions options); [CallWith=ScriptState] Promise supportsSession([PermissiveDictionaryConversion] optional XRSessionCreationOptions options);
[CallWith=ScriptState] Promise requestSession([PermissiveDictionaryConversion] optional XRSessionCreationOptions options); [CallWith=ScriptState] Promise requestSession([PermissiveDictionaryConversion] optional XRSessionCreationOptions options);
}; };
...@@ -361,8 +361,8 @@ void XRFrameProvider::UpdateWebGLLayerViewports(XRWebGLLayer* layer) { ...@@ -361,8 +361,8 @@ void XRFrameProvider::UpdateWebGLLayerViewports(XRWebGLLayer* layer) {
DCHECK(layer->session() == exclusive_session_); DCHECK(layer->session() == exclusive_session_);
DCHECK(presentation_provider_); DCHECK(presentation_provider_);
XRViewport* left = layer->GetViewport(XRView::kEyeLeft); XRViewport* left = layer->GetViewportForEye(XRView::kEyeLeft);
XRViewport* right = layer->GetViewport(XRView::kEyeRight); XRViewport* right = layer->GetViewportForEye(XRView::kEyeRight);
float width = layer->framebufferWidth(); float width = layer->framebufferWidth();
float height = layer->framebufferHeight(); float height = layer->framebufferHeight();
......
...@@ -10,10 +10,6 @@ namespace blink { ...@@ -10,10 +10,6 @@ namespace blink {
XRLayer::XRLayer(XRSession* session, XRLayerType layer_type) XRLayer::XRLayer(XRSession* session, XRLayerType layer_type)
: session_(session), layer_type_(layer_type) {} : session_(session), layer_type_(layer_type) {}
XRViewport* XRLayer::GetViewport(XRView::Eye) {
return nullptr;
}
void XRLayer::OnFrameStart() {} void XRLayer::OnFrameStart() {}
void XRLayer::OnFrameEnd() {} void XRLayer::OnFrameEnd() {}
void XRLayer::OnResize() {} void XRLayer::OnResize() {}
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#ifndef XRLayer_h #ifndef XRLayer_h
#define XRLayer_h #define XRLayer_h
#include "modules/xr/XRView.h"
#include "platform/bindings/ScriptWrappable.h" #include "platform/bindings/ScriptWrappable.h"
#include "platform/heap/Handle.h" #include "platform/heap/Handle.h"
#include "platform/wtf/Forward.h" #include "platform/wtf/Forward.h"
...@@ -13,7 +12,6 @@ ...@@ -13,7 +12,6 @@
namespace blink { namespace blink {
class XRSession; class XRSession;
class XRViewport;
enum XRLayerType { kXRWebGLLayerType }; enum XRLayerType { kXRWebGLLayerType };
...@@ -25,7 +23,6 @@ class XRLayer : public ScriptWrappable { ...@@ -25,7 +23,6 @@ class XRLayer : public ScriptWrappable {
XRSession* session() const { return session_; } XRSession* session() const { return session_; }
XRLayerType layerType() const { return layer_type_; } XRLayerType layerType() const { return layer_type_; }
virtual XRViewport* GetViewport(XRView::Eye);
virtual void OnFrameStart(); virtual void OnFrameStart();
virtual void OnFrameEnd(); virtual void OnFrameEnd();
......
...@@ -4,10 +4,8 @@ ...@@ -4,10 +4,8 @@
#include "modules/xr/XRView.h" #include "modules/xr/XRView.h"
#include "modules/xr/XRLayer.h"
#include "modules/xr/XRPresentationFrame.h" #include "modules/xr/XRPresentationFrame.h"
#include "modules/xr/XRSession.h" #include "modules/xr/XRSession.h"
#include "modules/xr/XRViewport.h"
#include "platform/geometry/FloatPoint3D.h" #include "platform/geometry/FloatPoint3D.h"
namespace blink { namespace blink {
...@@ -23,13 +21,6 @@ XRSession* XRView::session() const { ...@@ -23,13 +21,6 @@ XRSession* XRView::session() const {
return session_; return session_;
} }
XRViewport* XRView::getViewport(XRLayer* layer) const {
if (!layer || layer->session() != session_)
return nullptr;
return layer->GetViewport(eye_);
}
void XRView::UpdateProjectionMatrixFromFoV(float up_rad, void XRView::UpdateProjectionMatrixFromFoV(float up_rad,
float down_rad, float down_rad,
float left_rad, float left_rad,
......
...@@ -15,9 +15,7 @@ ...@@ -15,9 +15,7 @@
namespace blink { namespace blink {
class XRLayer;
class XRSession; class XRSession;
class XRViewport;
class XRView final : public ScriptWrappable { class XRView final : public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
...@@ -28,9 +26,10 @@ class XRView final : public ScriptWrappable { ...@@ -28,9 +26,10 @@ class XRView final : public ScriptWrappable {
XRView(XRSession*, Eye); XRView(XRSession*, Eye);
const String& eye() const { return eye_string_; } const String& eye() const { return eye_string_; }
Eye EyeValue() const { return eye_; }
XRSession* session() const; XRSession* session() const;
DOMFloat32Array* projectionMatrix() const { return projection_matrix_; } DOMFloat32Array* projectionMatrix() const { return projection_matrix_; }
XRViewport* getViewport(XRLayer*) const;
void UpdateProjectionMatrixFromFoV(float up_rad, void UpdateProjectionMatrixFromFoV(float up_rad,
float down_rad, float down_rad,
......
...@@ -9,5 +9,4 @@ ...@@ -9,5 +9,4 @@
] interface XRView { ] interface XRView {
readonly attribute VREye? eye; readonly attribute VREye? eye;
readonly attribute Float32Array projectionMatrix; readonly attribute Float32Array projectionMatrix;
XRViewport? getViewport(XRLayer layer);
}; };
...@@ -137,6 +137,23 @@ void XRWebGLLayer::getXRWebGLRenderingContext( ...@@ -137,6 +137,23 @@ void XRWebGLLayer::getXRWebGLRenderingContext(
} }
} }
XRViewport* XRWebGLLayer::getViewport(XRView* view) {
if (!view || view->session() != session())
return nullptr;
return GetViewportForEye(view->EyeValue());
}
XRViewport* XRWebGLLayer::GetViewportForEye(XRView::Eye eye) {
if (viewports_dirty_)
UpdateViewports();
if (eye == XRView::kEyeLeft)
return left_viewport_;
return right_viewport_;
}
void XRWebGLLayer::requestViewportScaling(double scale_factor) { void XRWebGLLayer::requestViewportScaling(double scale_factor) {
if (!session()->exclusive()) { if (!session()->exclusive()) {
// TODO(bajones): For the moment we're just going to ignore viewport changes // TODO(bajones): For the moment we're just going to ignore viewport changes
...@@ -156,16 +173,6 @@ void XRWebGLLayer::requestViewportScaling(double scale_factor) { ...@@ -156,16 +173,6 @@ void XRWebGLLayer::requestViewportScaling(double scale_factor) {
} }
} }
XRViewport* XRWebGLLayer::GetViewport(XRView::Eye eye) {
if (viewports_dirty_)
UpdateViewports();
if (eye == XRView::kEyeLeft)
return left_viewport_;
return right_viewport_;
}
void XRWebGLLayer::UpdateViewports() { void XRWebGLLayer::UpdateViewports() {
long framebuffer_width = framebufferWidth(); long framebuffer_width = framebufferWidth();
long framebuffer_height = framebufferHeight(); long framebuffer_height = framebufferHeight();
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "modules/webgl/WebGL2RenderingContext.h" #include "modules/webgl/WebGL2RenderingContext.h"
#include "modules/webgl/WebGLRenderingContext.h" #include "modules/webgl/WebGLRenderingContext.h"
#include "modules/xr/XRLayer.h" #include "modules/xr/XRLayer.h"
#include "modules/xr/XRView.h"
#include "modules/xr/XRWebGLLayerInit.h" #include "modules/xr/XRWebGLLayerInit.h"
#include "platform/graphics/gpu/XRWebGLDrawingBuffer.h" #include "platform/graphics/gpu/XRWebGLDrawingBuffer.h"
#include "platform/wtf/RefCounted.h" #include "platform/wtf/RefCounted.h"
...@@ -23,6 +24,7 @@ class ExceptionState; ...@@ -23,6 +24,7 @@ class ExceptionState;
class WebGLFramebuffer; class WebGLFramebuffer;
class WebGLRenderingContextBase; class WebGLRenderingContextBase;
class XRSession; class XRSession;
class XRViewport;
class XRWebGLLayer final : public XRLayer { class XRWebGLLayer final : public XRLayer {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
...@@ -54,9 +56,10 @@ class XRWebGLLayer final : public XRLayer { ...@@ -54,9 +56,10 @@ class XRWebGLLayer final : public XRLayer {
bool alpha() const { return drawing_buffer_->alpha(); } bool alpha() const { return drawing_buffer_->alpha(); }
bool multiview() const { return drawing_buffer_->multiview(); } bool multiview() const { return drawing_buffer_->multiview(); }
XRViewport* getViewport(XRView*);
void requestViewportScaling(double scale_factor); void requestViewportScaling(double scale_factor);
XRViewport* GetViewport(XRView::Eye) override; XRViewport* GetViewportForEye(XRView::Eye);
void UpdateViewports(); void UpdateViewports();
......
...@@ -22,5 +22,6 @@ typedef (WebGLRenderingContext or WebGL2RenderingContext) XRWebGLRenderingContex ...@@ -22,5 +22,6 @@ typedef (WebGLRenderingContext or WebGL2RenderingContext) XRWebGLRenderingContex
readonly attribute unsigned long framebufferHeight; readonly attribute unsigned long framebufferHeight;
readonly attribute WebGLFramebuffer framebuffer; readonly attribute WebGLFramebuffer framebuffer;
XRViewport? getViewport(XRView view);
void requestViewportScaling(double viewportScaleFactor); void requestViewportScaling(double viewportScaleFactor);
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment