Commit fa044597 authored by Brandon Jones's avatar Brandon Jones Committed by Commit Bot

Fix issue with inline WebXR sessions returning null viewports

Introduction of the "none" eye missed inverting the logic for
determining which viewport to return in the XRWebGLLayer, which caused
it to return the viewport typically associated with the right eye, which
is null for inline sessions.

Bug: 966077
Change-Id: I6ca51c327f7081ea4180e8515cc076b3ed8c4de8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1635731Reviewed-by: default avatarAlexander Cooper <alcooper@chromium.org>
Reviewed-by: default avatarKlaus Weidner <klausw@chromium.org>
Commit-Queue: Brandon Jones <bajones@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664576}
parent 06f43b52
......@@ -184,10 +184,11 @@ XRViewport* XRWebGLLayer::GetViewportForEye(XRView::XREye eye) {
if (viewports_dirty_)
UpdateViewports();
if (eye == XRView::kEyeLeft)
return left_viewport_;
if (eye == XRView::kEyeRight)
return right_viewport_;
return right_viewport_;
// This code path also handles an eye of "none".
return left_viewport_;
}
double XRWebGLLayer::getNativeFramebufferScaleFactor(XRSession* session) {
......
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-constants.js"></script>
<script src="resources/webxr_util.js"></script>
<script src="resources/xr-test-asserts.js"></script>
<canvas></canvas>
<script>
let immersiveTestName = "XRWebGLLayer reports a valid viewports for immersive sessions";
let inlineTestName = "XRWebGLLayer reports a valid viewports for inline sessions";
let fakeDeviceInitParams = { supportsImmersive:true };
let testFunction = function(session, fakeDeviceController, t) {
// Need to have a valid pose.
fakeDeviceController.setXRPresentationFrameData(VALID_POSE_MATRIX, [{
eye:"left",
projectionMatrix: VALID_PROJECTION_MATRIX,
viewMatrix: VALID_VIEW_MATRIX
}, {
eye:"right",
projectionMatrix: VALID_PROJECTION_MATRIX,
viewMatrix: VALID_VIEW_MATRIX
}]);
return session.requestReferenceSpace('viewer')
.then((space) => new Promise((resolve) => {
function onFrame(time, xrFrame) {
let viewer_pose = xrFrame.getViewerPose(space);
let layer = xrFrame.session.renderState.baseLayer;
for (view of viewer_pose.views) {
let viewport = layer.getViewport(view);
// Ensure the returned object is an XRViewport object
assert_not_equals(viewport, null);
assert_true(viewport instanceof XRViewport);
// Ensure the viewport dimensions are valid
assert_greater_than_equal(viewport.x, 0);
assert_greater_than_equal(viewport.y, 0);
assert_greater_than_equal(viewport.width, 1);
assert_greater_than_equal(viewport.height, 1);
}
// Finished test.
resolve();
}
session.requestAnimationFrame(onFrame);
}));
};
xr_session_promise_test(immersiveTestName, testFunction,
fakeDeviceInitParams, 'immersive-vr');
xr_session_promise_test(inlineTestName, testFunction,
fakeDeviceInitParams, 'inline');
</script>
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