Changeset 273381 in webkit
- Timestamp:
- Feb 24, 2021 5:09:49 AM (3 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r273380 r273381 1 2021-02-24 Imanol Fernandez <ifernandez@igalia.com> 2 3 Implement WebXR getViewport 4 https://bugs.webkit.org/show_bug.cgi?id=222270 5 6 Reviewed by Sergio Villar Senin. 7 8 Update WebXR Viewport test expectations. 9 10 * platform/wpe/TestExpectations: 11 1 12 2021-02-17 Sergio Villar Senin <svillar@igalia.com> 2 13 -
trunk/LayoutTests/imported/w3c/ChangeLog
r273261 r273381 1 2021-02-24 Imanol Fernandez <ifernandez@igalia.com> 2 3 Implement WebXR getViewport 4 https://bugs.webkit.org/show_bug.cgi?id=222270 5 6 Reviewed by Sergio Villar Senin. 7 8 Update WebXR Viewport test expectations. 9 10 * web-platform-tests/webxr/xrViewport_valid.https-expected.txt: Added. 11 * web-platform-tests/webxr/xrWebGLLayer_viewports.https-expected.txt: Added. 12 1 13 2021-02-22 Ryan Haddad <ryanhaddad@apple.com> 2 14 -
trunk/LayoutTests/platform/wpe/TestExpectations
r273228 r273381 648 648 imported/w3c/web-platform-tests/webxr/xrView_match.https.html [ Pass ] 649 649 imported/w3c/web-platform-tests/webxr/xrView_oneframeupdate.https.html [ Pass ] 650 webkit.org/b/209859 imported/w3c/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html [ Pass ]651 webkit.org/b/209859 imported/w3c/web-platform-tests/webxr/xrWebGLLayer_framebuffer_sameObject.https.html [ Pass ]652 650 imported/w3c/web-platform-tests/webxr/navigator_xr_sameObject.https.html [ Pass ] 653 651 imported/w3c/web-platform-tests/webxr/xrReferenceSpace_originOffset_viewer.https.html [ Pass ] … … 667 665 imported/w3c/web-platform-tests/webxr/xrSession_requestReferenceSpace.https.html [ Pass ] 668 666 imported/w3c/web-platform-tests/webxr/xrSession_viewer_referenceSpace.https.html [ Pass ] 667 imported/w3c/web-platform-tests/webxr/xrViewport_valid.https.html [ Pass ] 668 imported/w3c/web-platform-tests/webxr/xrWebGLLayer_constructor.https.html [ Pass ] 669 imported/w3c/web-platform-tests/webxr/xrWebGLLayer_framebuffer_sameObject.https.html [ Pass ] 670 imported/w3c/web-platform-tests/webxr/xrWebGLLayer_viewports.https.html [ Pass ] 669 671 imported/w3c/web-platform-tests/webxr/render_state_vertical_fov_immersive.https.html [ Pass ] 670 672 imported/w3c/web-platform-tests/webxr/render_state_update.https.html [ Pass ] -
trunk/Source/WebCore/ChangeLog
r273380 r273381 1 2021-02-24 Imanol Fernandez <ifernandez@igalia.com> 2 3 Implement WebXR getViewport 4 https://bugs.webkit.org/show_bug.cgi?id=222270 5 6 Reviewed by Sergio Villar Senin. 7 8 * Modules/webxr/WebXRFrame.cpp: 9 (WebCore::WebXRFrame::getViewerPose): set WebXRView viewport modifiable value. 10 * Modules/webxr/WebXRFrame.h: 11 (WebCore::WebXRFrame::isAnimationFrame const): add method. 12 13 * Modules/webxr/WebXRSession.cpp: Implement supportsViewportScaling(). 14 (WebCore::WebXRSession::supportsViewportScaling const): 15 * Modules/webxr/WebXRSession.h: 16 17 * Modules/webxr/WebXRView.cpp: Add viewport scale data. 18 (WebCore::WebXRView::create): 19 (WebCore::WebXRView::WebXRView): 20 (WebCore::WebXRView::recommendedViewportScale const): 21 (WebCore::WebXRView::requestViewportScale): 22 * Modules/webxr/WebXRView.h: 23 (WebCore::WebXRView::frame const): 24 (WebCore::WebXRView::currentViewportScale const): 25 (WebCore::WebXRView::setCurrentViewportScale): 26 (WebCore::WebXRView::requestedViewportScale const): 27 (WebCore::WebXRView::isViewportModifiable const): 28 (WebCore::WebXRView::setViewportModifiable): 29 30 * Modules/webxr/WebXRView.idl: add requestViewportScale() and recommendedViewportScale. 31 32 * Modules/webxr/WebXRViewport.cpp: Implement viewport rect values. 33 (WebCore::WebXRViewport::create): 34 (WebCore::WebXRViewport::WebXRViewport): 35 * Modules/webxr/WebXRViewport.h: 36 (WebCore::WebXRViewport::x const): 37 (WebCore::WebXRViewport::y const): 38 (WebCore::WebXRViewport::width const): 39 (WebCore::WebXRViewport::height const): 40 (WebCore::WebXRViewport::updateViewport): 41 42 * Modules/webxr/WebXRWebGLLayer.cpp: Implement getViewport() 43 (WebCore::WebXRWebGLLayer::WebXRWebGLLayer): 44 (WebCore::m_rightViewport): 45 (WebCore::WebXRWebGLLayer::getViewport): 46 * Modules/webxr/WebXRWebGLLayer.h: 47 48 * Modules/webxr/WebXRWebGLLayer.idl: Add MayThrowException 49 50 * platform/xr/PlatformXR.h: Add supportsViewportScaling method 51 (PlatformXR::Device::supportsViewportScaling const): 52 1 53 2021-02-17 Sergio Villar Senin <svillar@igalia.com> 2 54 -
trunk/Source/WebCore/Modules/webxr/WebXRFrame.cpp
r273132 r273381 202 202 }); 203 203 204 auto xrView = WebXRView::create(view.eye, WTFMove(transform), Float32Array::create(projection.data(), projection.size())); 204 auto xrView = WebXRView::create(makeRef(*this), view.eye, WTFMove(transform), Float32Array::create(projection.data(), projection.size())); 205 xrView->setViewportModifiable(m_session->supportsViewportScaling()); 205 206 206 207 // 8.8. Append xrview to xrviews -
trunk/Source/WebCore/Modules/webxr/WebXRFrame.h
r273132 r273381 62 62 void setActive(bool active) { m_active = active; } 63 63 bool isActive() const { return m_active; } 64 bool isAnimationFrame() const { return m_isAnimationFrame; } 64 65 65 66 static TransformationMatrix matrixFromPose(const PlatformXR::Device::FrameData::Pose&); -
trunk/Source/WebCore/Modules/webxr/WebXRSession.cpp
r273132 r273381 307 307 } 308 308 309 // https://immersive-web.github.io/webxr/#view-viewport-modifiable 310 bool WebXRSession::supportsViewportScaling() const 311 { 312 ASSERT(m_device); 313 // Only immersive sessions support viewport scaling. 314 return m_mode == XRSessionMode::ImmersiveVr && m_device->supportsViewportScaling(); 315 } 316 309 317 // https://immersive-web.github.io/webxr/#shut-down-the-session 310 318 void WebXRSession::shutdown(InitiatedBySystem initiatedBySystem) -
trunk/Source/WebCore/Modules/webxr/WebXRSession.h
r273132 r273381 82 82 IntSize nativeWebGLFramebufferResolution() const; 83 83 IntSize recommendedWebGLFramebufferResolution() const; 84 bool supportsViewportScaling() const; 84 85 85 86 // EventTarget. -
trunk/Source/WebCore/Modules/webxr/WebXRView.cpp
r273132 r273381 29 29 #if ENABLE(WEBXR) 30 30 31 #include "WebXRFrame.h" 31 32 #include "WebXRRigidTransform.h" 32 33 #include <JavaScriptCore/TypedArrayInlines.h> … … 35 36 namespace WebCore { 36 37 38 // Arbitrary value for minimum viewport scaling. 39 // Below this threshold the resulting viewport would be too pixelated. 40 static constexpr double kMinViewportScale = 0.1; 41 37 42 WTF_MAKE_ISO_ALLOCATED_IMPL(WebXRView); 38 43 39 Ref<WebXRView> WebXRView::create( XREye eye, Ref<WebXRRigidTransform>&& transform, Ref<Float32Array>&& projection)44 Ref<WebXRView> WebXRView::create(Ref<WebXRFrame>&& frame, XREye eye, Ref<WebXRRigidTransform>&& transform, Ref<Float32Array>&& projection) 40 45 { 41 return adoptRef(*new WebXRView( eye, WTFMove(transform), WTFMove(projection)));46 return adoptRef(*new WebXRView(WTFMove(frame), eye, WTFMove(transform), WTFMove(projection))); 42 47 } 43 48 44 WebXRView::WebXRView(XREye eye, Ref<WebXRRigidTransform>&& transform, Ref<Float32Array>&& projection) 45 : m_eye(eye) 49 WebXRView::WebXRView(Ref<WebXRFrame>&& frame, XREye eye, Ref<WebXRRigidTransform>&& transform, Ref<Float32Array>&& projection) 50 : m_frame(WTFMove(frame)) 51 , m_eye(eye) 46 52 , m_transform(WTFMove(transform)) 47 , m_projection( projection)53 , m_projection(WTFMove(projection)) 48 54 { 49 55 } … … 51 57 WebXRView::~WebXRView() = default; 52 58 59 // https://immersive-web.github.io/webxr/#dom-xrview-recommendedviewportscale 60 Optional<double> WebXRView::recommendedViewportScale() const 61 { 62 // Return null if the system does not implement a heuristic or method for determining a recommended scale. 63 return WTF::nullopt; 64 } 65 66 // https://immersive-web.github.io/webxr/#dom-xrview-requestviewportscale 67 void WebXRView::requestViewportScale(Optional<double> value) 68 { 69 if (!value || *value <= 0.0) 70 return; 71 m_requestedViewportScale = std::clamp(*value, kMinViewportScale, 1.0); 72 } 73 74 53 75 } // namespace WebCore 54 76 -
trunk/Source/WebCore/Modules/webxr/WebXRView.h
r273132 r273381 40 40 class WebXRFrame; 41 41 class WebXRRigidTransform; 42 class WebXRSession; 42 43 43 44 class WebXRView : public RefCounted<WebXRView> { 44 45 WTF_MAKE_ISO_ALLOCATED_EXPORT(WebXRView, WEBCORE_EXPORT); 45 46 public: 46 WEBCORE_EXPORT static Ref<WebXRView> create( XREye, Ref<WebXRRigidTransform>&&, Ref<Float32Array>&&);47 WEBCORE_EXPORT static Ref<WebXRView> create(Ref<WebXRFrame>&&, XREye, Ref<WebXRRigidTransform>&&, Ref<Float32Array>&&); 47 48 WEBCORE_EXPORT ~WebXRView(); 48 49 50 const WebXRFrame& frame() const { return m_frame.get(); } 49 51 XREye eye() const { return m_eye; } 50 52 const Float32Array& projectionMatrix() const { return m_projection.get(); } 51 53 const WebXRRigidTransform& transform() const { return m_transform.get(); } 52 54 55 Optional<double> recommendedViewportScale() const; 56 void requestViewportScale(Optional<double>); 57 58 double requestedViewportScale() const { return m_requestedViewportScale; } 59 bool isViewportModifiable() const { return m_viewportModifiable; } 60 void setViewportModifiable(bool modifiable) { m_viewportModifiable = modifiable; } 61 53 62 private: 54 WebXRView( XREye, Ref<WebXRRigidTransform>&&, Ref<Float32Array>&&);63 WebXRView(Ref<WebXRFrame>&&, XREye, Ref<WebXRRigidTransform>&&, Ref<Float32Array>&&); 55 64 65 Ref<WebXRFrame> m_frame; 56 66 XREye m_eye; 57 67 Ref<WebXRRigidTransform> m_transform; 58 68 Ref<Float32Array> m_projection; 69 bool m_viewportModifiable { false }; 70 double m_requestedViewportScale { 1.0 }; 71 59 72 }; 60 73 -
trunk/Source/WebCore/Modules/webxr/WebXRView.idl
r258498 r273381 35 35 readonly attribute Float32Array projectionMatrix; 36 36 [SameObject] readonly attribute WebXRRigidTransform transform; 37 readonly attribute double? recommendedViewportScale; 38 undefined requestViewportScale(double? scale); 37 39 }; -
trunk/Source/WebCore/Modules/webxr/WebXRViewport.cpp
r258498 r273381 35 35 WTF_MAKE_ISO_ALLOCATED_IMPL(WebXRViewport); 36 36 37 Ref<WebXRViewport> WebXRViewport::create( )37 Ref<WebXRViewport> WebXRViewport::create(const IntRect& viewport) 38 38 { 39 return adoptRef(*new WebXRViewport );39 return adoptRef(*new WebXRViewport(viewport)); 40 40 } 41 41 42 WebXRViewport::WebXRViewport() = default; 43 44 int WebXRViewport::x() const 42 WebXRViewport::WebXRViewport(const IntRect& viewport) 43 : m_viewport(viewport) 45 44 { 46 return 0;47 }48 49 int WebXRViewport::y() const50 {51 return 0;52 }53 54 int WebXRViewport::width() const55 {56 return 0;57 }58 59 int WebXRViewport::height() const60 {61 return 0;62 45 } 63 46 -
trunk/Source/WebCore/Modules/webxr/WebXRViewport.h
r258498 r273381 28 28 #if ENABLE(WEBXR) 29 29 30 #include "IntRect.h" 30 31 #include <wtf/IsoMalloc.h> 31 32 #include <wtf/Ref.h> … … 37 38 WTF_MAKE_ISO_ALLOCATED(WebXRViewport); 38 39 public: 39 static Ref<WebXRViewport> create( );40 static Ref<WebXRViewport> create(const IntRect&); 40 41 41 int x() const; 42 int y() const; 43 int width() const; 44 int height() const; 42 int x() const { return m_viewport.x(); } 43 int y() const { return m_viewport.y(); } 44 int width() const { return m_viewport.width(); } 45 int height() const { return m_viewport.height(); } 46 47 void updateViewport(const IntRect& viewport) { m_viewport = viewport; } 45 48 46 49 private: 47 WebXRViewport(); 50 explicit WebXRViewport(const IntRect&); 51 52 IntRect m_viewport; 48 53 }; 49 54 -
trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.cpp
r272734 r273381 38 38 #endif 39 39 #include "WebGLRenderingContextBase.h" 40 #include "WebXRFrame.h" 40 41 #include "WebXRSession.h" 42 #include "WebXRView.h" 41 43 #include "WebXRViewport.h" 42 44 #include "XRWebGLLayerInit.h" … … 98 100 , m_session(WTFMove(session)) 99 101 , m_context(WTFMove(context)) 102 , m_leftViewportData({ WebXRViewport::create({ }) }) 103 , m_rightViewportData({ WebXRViewport::create({ }) }) 100 104 { 101 105 // 7. Initialize layer’s ignoreDepthValues as follows: … … 145 149 m_framebuffer.object = nullptr; 146 150 } 147 } 148 149 WebXRWebGLLayer::~WebXRWebGLLayer() = default; 151 152 auto canvasElement = canvas(); 153 if (canvasElement) 154 canvasElement->addObserver(*this); 155 } 156 157 WebXRWebGLLayer::~WebXRWebGLLayer() 158 { 159 auto canvasElement = canvas(); 160 if (canvasElement) 161 canvasElement->removeObserver(*this); 162 } 150 163 151 164 bool WebXRWebGLLayer::antialias() const … … 184 197 } 185 198 186 RefPtr<WebXRViewport> WebXRWebGLLayer::getViewport(const WebXRView&) 187 { 188 return { }; 199 // https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport 200 ExceptionOr<RefPtr<WebXRViewport>> WebXRWebGLLayer::getViewport(WebXRView& view) 201 { 202 // 1. Let session be view’s session. 203 // 2. Let frame be session’s animation frame. 204 // 3. If session is not equal to layer’s session, throw an InvalidStateError and abort these steps. 205 if (&view.frame().session() != m_session.ptr()) 206 return Exception { InvalidStateError }; 207 208 // 4. If frame’s active boolean is false, throw an InvalidStateError and abort these steps. 209 // 5. If view’s frame is not equal to frame, throw an InvalidStateError and abort these steps. 210 if (!view.frame().isActive() || !view.frame().isAnimationFrame()) 211 return Exception { InvalidStateError }; 212 213 auto& viewportData = view.eye() == XREye::Right ? m_rightViewportData : m_leftViewportData; 214 215 // 6. If the viewport modifiable flag is true and view’s requested viewport scale is not equal to current viewport scale: 216 // 6.1 Set current viewport scale to requested viewport scale. 217 // 6.2 Compute the scaled viewport. 218 if (view.isViewportModifiable() && view.requestedViewportScale() != viewportData.currentScale) { 219 viewportData.currentScale = view.requestedViewportScale(); 220 m_viewportsDirty = true; 221 } 222 223 // 7. Set the view’s viewport modifiable flag to false. 224 view.setViewportModifiable(false); 225 226 if (m_viewportsDirty) 227 computeViewports(); 228 229 // 8. Let viewport be the XRViewport from the list of viewport objects associated with view. 230 // 9. Return viewport. 231 return RefPtr<WebXRViewport>(viewportData.viewport.copyRef()); 189 232 } 190 233 … … 214 257 } 215 258 259 // https://immersive-web.github.io/webxr/#xrview-obtain-a-scaled-viewport 260 void WebXRWebGLLayer::computeViewports() 261 { 262 auto roundDown = [](double value) -> int { 263 // Round down to integer value and ensure that the value is not zero. 264 return std::max(1, static_cast<int>(std::floor(value))); 265 }; 266 267 auto width = framebufferWidth(); 268 auto height = framebufferHeight(); 269 270 if (m_session->mode() == XRSessionMode::ImmersiveVr) { 271 // Update left viewport 272 auto scale = m_leftViewportData.currentScale; 273 m_leftViewportData.viewport->updateViewport(IntRect(0, 0, roundDown(width * 0.5 * scale), roundDown(height * scale))); 274 275 // Update right viewport 276 scale = m_rightViewportData.currentScale; 277 m_rightViewportData.viewport->updateViewport(IntRect(width * 0.5, 0, roundDown(width * 0.5 * scale), roundDown(height * scale))); 278 } else { 279 // We reuse m_leftViewport for XREye::None. 280 m_leftViewportData.viewport->updateViewport(IntRect(0, 0, width, height)); 281 } 282 283 m_viewportsDirty = false; 284 } 285 286 void WebXRWebGLLayer::canvasResized(CanvasBase&) 287 { 288 m_viewportsDirty = true; 289 } 290 216 291 } // namespace WebCore 217 292 -
trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.h
r272734 r273381 28 28 #if ENABLE(WEBXR) 29 29 30 #include "CanvasBase.h" 30 31 #include "ExceptionOr.h" 31 32 #include "WebXRLayer.h" … … 49 50 struct XRWebGLLayerInit; 50 51 51 class WebXRWebGLLayer : public WebXRLayer {52 class WebXRWebGLLayer : public WebXRLayer, private CanvasObserver { 52 53 WTF_MAKE_ISO_ALLOCATED(WebXRWebGLLayer); 53 54 public: … … 70 71 unsigned framebufferHeight() const; 71 72 72 RefPtr<WebXRViewport> getViewport(constWebXRView&);73 ExceptionOr<RefPtr<WebXRViewport>> getViewport(WebXRView&); 73 74 74 75 static double getNativeFramebufferScaleFactor(const WebXRSession&); … … 83 84 WebXRWebGLLayer(Ref<WebXRSession>&&, WebXRRenderingContext&&, const XRWebGLLayerInit&); 84 85 86 void computeViewports(); 85 87 static IntSize computeNativeWebGLFramebufferResolution(); 86 88 static IntSize computeRecommendedWebGLFramebufferResolution(); 87 89 90 void canvasChanged(CanvasBase&, const FloatRect&) final { }; 91 void canvasResized(CanvasBase&) final; 92 void canvasDestroyed(CanvasBase&) final { }; 93 88 94 Ref<WebXRSession> m_session; 89 95 WebXRRenderingContext m_context; 96 97 struct ViewportData { 98 Ref<WebXRViewport> viewport; 99 double currentScale { 1.0 }; 100 }; 101 102 ViewportData m_leftViewportData; 103 ViewportData m_rightViewportData; 90 104 bool m_antialias { false }; 91 105 bool m_ignoreDepthValues { false }; 92 106 bool m_isCompositionEnabled { true }; 107 bool m_viewportsDirty { true }; 93 108 94 109 struct { -
trunk/Source/WebCore/Modules/webxr/WebXRWebGLLayer.idl
r267007 r273381 50 50 51 51 // Methods 52 WebXRViewport? getViewport(WebXRView view);52 [MayThrowException] WebXRViewport? getViewport(WebXRView view); 53 53 54 54 // Static Methods -
trunk/Source/WebCore/platform/xr/PlatformXR.h
r273132 r273381 76 76 77 77 bool supportsOrientationTracking() const { return m_supportsOrientationTracking; } 78 bool supportsViewportScaling() const { return m_supportsViewportScaling; } 78 79 79 80 virtual void initializeTrackingAndRendering(SessionMode) = 0; … … 142 143 143 144 bool m_supportsOrientationTracking { false }; 145 bool m_supportsViewportScaling { false }; 144 146 WeakPtr<TrackingAndRenderingClient> m_trackingAndRenderingClient; 145 147 }; -
trunk/Source/WebCore/testing/WebFakeXRDevice.cpp
r273132 r273381 66 66 } 67 67 68 WebCore::IntSize SimulatedXRDevice::recommendedResolution(PlatformXR::SessionMode) 69 { 70 // Return at least a 2 pixel size so we can have different viewports for left and right eyes 71 return IntSize(2, 2); 72 } 73 68 74 void SimulatedXRDevice::shutDownTrackingAndRendering() 69 75 { -
trunk/Source/WebCore/testing/WebFakeXRDevice.h
r273132 r273381 81 81 void scheduleOnNextFrame(Function<void()>&&); 82 82 private: 83 WebCore::IntSize recommendedResolution(PlatformXR::SessionMode) final; 83 84 void initializeTrackingAndRendering(PlatformXR::SessionMode) final { } 84 85 void shutDownTrackingAndRendering() final;
Note: See TracChangeset
for help on using the changeset viewer.