Title: [275603] trunk/Source/WebCore
Revision
275603
Author
[email protected]
Date
2021-04-07 05:27:54 -0700 (Wed, 07 Apr 2021)

Log Message

Use frameData instead of scheduleOnNextFrame calls in WebFakeXRDevice
https://bugs.webkit.org/show_bug.cgi?id=223580

Reviewed by Youenn Fablet.

This patch makes the WebFakeXRDevice code more robust by getting rid of the scheduleOnNextFrame calls.

Tested by WebXR WPT.

* testing/WebFakeXRDevice.cpp:
(WebCore::SimulatedXRDevice::setViews):
(WebCore::SimulatedXRDevice::setNativeBoundsGeometry):
(WebCore::SimulatedXRDevice::setViewerOrigin):
(WebCore::SimulatedXRDevice::frameTimerFired):
(WebCore::WebFakeXRDevice::setViews):
(WebCore::WebFakeXRDevice::setViewerOrigin):
(WebCore::WebFakeXRDevice::setFloorOrigin):
* testing/WebFakeXRDevice.h:
* testing/WebXRTest.cpp:
(WebCore::WebXRTest::simulateDeviceConnection):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (275602 => 275603)


--- trunk/Source/WebCore/ChangeLog	2021-04-07 12:09:36 UTC (rev 275602)
+++ trunk/Source/WebCore/ChangeLog	2021-04-07 12:27:54 UTC (rev 275603)
@@ -1,3 +1,26 @@
+2021-04-07  Imanol Fernandez  <[email protected]>
+
+        Use frameData instead of scheduleOnNextFrame calls in WebFakeXRDevice
+        https://bugs.webkit.org/show_bug.cgi?id=223580
+
+        Reviewed by Youenn Fablet.
+
+        This patch makes the WebFakeXRDevice code more robust by getting rid of the scheduleOnNextFrame calls.
+
+        Tested by WebXR WPT.
+
+        * testing/WebFakeXRDevice.cpp:
+        (WebCore::SimulatedXRDevice::setViews):
+        (WebCore::SimulatedXRDevice::setNativeBoundsGeometry):
+        (WebCore::SimulatedXRDevice::setViewerOrigin):
+        (WebCore::SimulatedXRDevice::frameTimerFired):
+        (WebCore::WebFakeXRDevice::setViews):
+        (WebCore::WebFakeXRDevice::setViewerOrigin):
+        (WebCore::WebFakeXRDevice::setFloorOrigin):
+        * testing/WebFakeXRDevice.h:
+        * testing/WebXRTest.cpp:
+        (WebCore::WebXRTest::simulateDeviceConnection):
+
 2021-04-07  Philippe Normand  <[email protected]>
 
         [GStreamer] Videos start playing muted in epiphany with no unmute icon visible in tab, webkit_web_view_get_is_muted() returns incorrect results

Modified: trunk/Source/WebCore/testing/WebFakeXRDevice.cpp (275602 => 275603)


--- trunk/Source/WebCore/testing/WebFakeXRDevice.cpp	2021-04-07 12:09:36 UTC (rev 275602)
+++ trunk/Source/WebCore/testing/WebFakeXRDevice.cpp	2021-04-07 12:27:54 UTC (rev 275603)
@@ -60,14 +60,33 @@
     stopTimer();
 }
 
+void SimulatedXRDevice::setViews(Vector<FrameData::View>&& views)
+{
+    m_frameData.views = WTFMove(views);
+}
+
 void SimulatedXRDevice::setNativeBoundsGeometry(const Vector<FakeXRBoundsPoint>& geometry)
 {
-    m_stageParameters.id++;
-    m_stageParameters.bounds.clear();
+    m_frameData.stageParameters.id++;
+    m_frameData.stageParameters.bounds.clear();
     for (auto& point : geometry)
-        m_stageParameters.bounds.append({ static_cast<float>(point.x), static_cast<float>(point.z) });
+        m_frameData.stageParameters.bounds.append({ static_cast<float>(point.x), static_cast<float>(point.z) });
 }
 
+void SimulatedXRDevice::setViewerOrigin(const Optional<FrameData::Pose>& origin)
+{
+    if (origin) {
+        m_frameData.origin = *origin;
+        m_frameData.isPositionValid = true;
+        m_frameData.isTrackingValid = true;
+        return;
+    }
+
+    m_frameData.origin = Device::FrameData::Pose();
+    m_frameData.isPositionValid = false;
+    m_frameData.isTrackingValid = false;
+}
+
 void SimulatedXRDevice::simulateShutdownCompleted()
 {
     if (m_trackingAndRenderingClient)
@@ -109,35 +128,9 @@
 
 void SimulatedXRDevice::frameTimerFired()
 {
-    auto updates = WTFMove(m_pendingUpdates);
-    for (auto& update : updates)
-        update();
-
-    FrameData data;
+    FrameData data = ""
     data.shouldRender = true;
-    if (m_viewerOrigin) {
-        data.origin = *m_viewerOrigin;
-        data.isTrackingValid = true;
-        data.isPositionValid = true;
-        data.isPositionEmulated = m_emulatedPosition;
-    }
 
-    if (m_floorOrigin)
-        data.floorTransform = { *m_floorOrigin };
-
-    data.stageParameters = m_stageParameters;
-
-    for (auto& fakeView : m_views) {
-        FrameData::View view;
-        view.offset = fakeView->offset();
-        if (fakeView->fieldOfView().hasValue())
-            view.projection = { *fakeView->fieldOfView() };
-        else
-            view.projection = { fakeView->projection() };
-        
-        data.views.append(view);
-    }
-
     for (auto& layer : m_layers)
         data.layers.add(layer.key, FrameData::LayerData { .opaqueTexture = layer.value });
 
@@ -190,26 +183,28 @@
     return { { .active = true, .eye = PlatformXR::Eye::None } };
 }
 
-void SimulatedXRDevice::scheduleOnNextFrame(Function<void()>&& func)
-{
-    m_pendingUpdates.append(WTFMove(func));
-}
-
 WebFakeXRDevice::WebFakeXRDevice() = default;
 
 void WebFakeXRDevice::setViews(const Vector<FakeXRViewInit>& views)
 {
-    m_device.scheduleOnNextFrame([this, views]() {
-        Vector<Ref<FakeXRView>> deviceViews;
+    Vector<PlatformXR::Device::FrameData::View> deviceViews;
 
-        for (auto& viewInit : views) {
-            auto view = parseView(viewInit);
-            if (!view.hasException())
-                deviceViews.append(view.releaseReturnValue());
+    for (auto& viewInit : views) {
+        auto parsedView = parseView(viewInit);
+        if (!parsedView.hasException()) {
+            auto fakeView = parsedView.releaseReturnValue();
+            PlatformXR::Device::FrameData::View view;
+            view.offset = fakeView->offset();
+            if (fakeView->fieldOfView().hasValue())
+                view.projection = { *fakeView->fieldOfView() };
+            else
+                view.projection = { fakeView->projection() };
+
+            deviceViews.append(view);
         }
+    }
 
-        m_device.setViews(WTFMove(deviceViews));
-    });
+    m_device.setViews(WTFMove(deviceViews));
 }
 
 void WebFakeXRDevice::disconnect(DOMPromiseDeferred<void>&& promise)
@@ -219,56 +214,27 @@
 
 void WebFakeXRDevice::setViewerOrigin(FakeXRRigidTransformInit origin, bool emulatedPosition)
 {
-    auto result = parseRigidTransform(origin);
-    if (result.hasException())
+    auto pose = parseRigidTransform(origin);
+    if (pose.hasException())
         return;
 
-    auto pose = result.releaseReturnValue();
-
-    m_device.scheduleOnNextFrame([this, pose = WTFMove(pose), emulatedPosition]() mutable {
-        m_device.setViewerOrigin(WTFMove(pose));
-        m_device.setEmulatedPosition(emulatedPosition);
-    });
+    m_device.setViewerOrigin(pose.releaseReturnValue());
+    m_device.setEmulatedPosition(emulatedPosition);
 }
 
-void WebFakeXRDevice::clearViewerOrigin()
-{
-    m_device.scheduleOnNextFrame([this]() {
-        m_device.setViewerOrigin(WTF::nullopt);
-    });
-}
-
 void WebFakeXRDevice::simulateVisibilityChange(XRVisibilityState)
 {
 }
 
-void WebFakeXRDevice::setBoundsGeometry(Vector<FakeXRBoundsPoint>&& bounds)
-{
-    m_device.scheduleOnNextFrame([this, bounds = WTFMove(bounds)]() {
-        m_device.setNativeBoundsGeometry(bounds);
-    });
-} 
-
 void WebFakeXRDevice::setFloorOrigin(FakeXRRigidTransformInit origin)
 {
-    auto result = parseRigidTransform(origin);
-    if (result.hasException())
+    auto pose = parseRigidTransform(origin);
+    if (pose.hasException())
         return;
 
-    auto pose = result.releaseReturnValue();
-
-    m_device.scheduleOnNextFrame([this, pose = WTFMove(pose)]() mutable {
-        m_device.setFloorOrigin(WTFMove(pose));
-    });
+    m_device.setFloorOrigin(pose.releaseReturnValue());
 }
 
-void WebFakeXRDevice::clearFloorOrigin()
-{
-    m_device.scheduleOnNextFrame([this]() {
-        m_device.setFloorOrigin(WTF::nullopt);
-    });
-}
-
 void WebFakeXRDevice::simulateResetPose()
 {
 }

Modified: trunk/Source/WebCore/testing/WebFakeXRDevice.h (275602 => 275603)


--- trunk/Source/WebCore/testing/WebFakeXRDevice.h	2021-04-07 12:09:36 UTC (rev 275602)
+++ trunk/Source/WebCore/testing/WebFakeXRDevice.h	2021-04-07 12:27:54 UTC (rev 275603)
@@ -72,12 +72,11 @@
 public:
     SimulatedXRDevice();
     ~SimulatedXRDevice();
-    void setViews(Vector<Ref<FakeXRView>>&& views) { m_views = WTFMove(views); }
+    void setViews(Vector<FrameData::View>&&);
     void setNativeBoundsGeometry(const Vector<FakeXRBoundsPoint>&);
-    void setViewerOrigin(Optional<FrameData::Pose>&& origin) { m_viewerOrigin = WTFMove(origin); }
-    void setFloorOrigin(Optional<FrameData::Pose>&& origin) { m_floorOrigin = WTFMove(origin); }
-    void setEmulatedPosition(bool emulated) { m_emulatedPosition = emulated; }
-    Vector<Ref<FakeXRView>>& views() { return m_views; }
+    void setViewerOrigin(const Optional<FrameData::Pose>&);
+    void setFloorOrigin(Optional<FrameData::Pose>&& origin) { m_frameData.floorTransform = WTFMove(origin); }
+    void setEmulatedPosition(bool emulated) { m_frameData.isPositionEmulated = emulated; }
     void setSupportsShutdownNotification(bool supportsShutdownNotification) { m_supportsShutdownNotification = supportsShutdownNotification; }
     void simulateShutdownCompleted();
     void scheduleOnNextFrame(Function<void()>&&);
@@ -95,16 +94,10 @@
     void stopTimer();
     void frameTimerFired();
 
-    Optional<Vector<FakeXRBoundsPoint>> m_nativeBoundsGeometry;
-    Optional<FrameData::Pose> m_viewerOrigin;
-    Optional<FrameData::Pose> m_floorOrigin;
-    bool m_emulatedPosition { false };
-    Vector<Ref<FakeXRView>> m_views;
+    PlatformXR::Device::FrameData m_frameData;
     bool m_supportsShutdownNotification { false };
     Timer m_frameTimer;
     RequestFrameCallback m_FrameCallback;
-    Vector<Function<void()>> m_pendingUpdates;
-    FrameData::StageParameters m_stageParameters;
     RefPtr<WebCore::GraphicsContextGL> m_gl;
     HashMap<PlatformXR::LayerHandle, PlatformGLObject> m_layers;
     uint32_t m_layerIndex { 0 };
@@ -115,31 +108,18 @@
     static Ref<WebFakeXRDevice> create() { return adoptRef(*new WebFakeXRDevice()); }
 
     void setViews(const Vector<FakeXRViewInit>&);
-
     void disconnect(DOMPromiseDeferred<void>&&);
-
     void setViewerOrigin(FakeXRRigidTransformInit origin, bool emulatedPosition = false);
-
-    void clearViewerOrigin();
-
+    void clearViewerOrigin() { m_device.setViewerOrigin(WTF::nullopt); }
     void simulateVisibilityChange(XRVisibilityState);
-
-    void setBoundsGeometry(Vector<FakeXRBoundsPoint>&& boundsCoordinates);
-
+    void setBoundsGeometry(Vector<FakeXRBoundsPoint>&& bounds) { m_device.setNativeBoundsGeometry(WTFMove(bounds)); }
     void setFloorOrigin(FakeXRRigidTransformInit);
-
-    void clearFloorOrigin();
-
+    void clearFloorOrigin() { m_device.setFloorOrigin(WTF::nullopt); }
     void simulateResetPose();
-
     Ref<WebFakeXRInputController> simulateInputSourceConnection(FakeXRInputSourceInit);
-
     static ExceptionOr<Ref<FakeXRView>> parseView(const FakeXRViewInit&);
-
     SimulatedXRDevice& simulatedXRDevice() { return m_device; }
-
     void setSupportsShutdownNotification();
-
     void simulateShutdown();
 
 private:

Modified: trunk/Source/WebCore/testing/WebXRTest.cpp (275602 => 275603)


--- trunk/Source/WebCore/testing/WebXRTest.cpp	2021-04-07 12:09:36 UTC (rev 275602)
+++ trunk/Source/WebCore/testing/WebXRTest.cpp	2021-04-07 12:27:54 UTC (rev 275603)
@@ -41,18 +41,11 @@
 void WebXRTest::simulateDeviceConnection(ScriptExecutionContext& context, const FakeXRDeviceInit& init, WebFakeXRDevicePromise&& promise)
 {
     // https://immersive-web.github.io/webxr-test-api/#dom-xrtest-simulatedeviceconnection
-    context.postTask([this, init, promise = WTFMove(promise)] (ScriptExecutionContext& context) mutable {
+    context.postTask([this, protectedThis = makeRef(*this), init, promise = WTFMove(promise)] (ScriptExecutionContext& context) mutable {
         auto device = WebFakeXRDevice::create();
         auto& simulatedDevice = device->simulatedXRDevice();
 
-        for (auto& viewInit : init.views) {
-            auto view = WebFakeXRDevice::parseView(viewInit);
-            if (view.hasException()) {
-                promise.reject(view.releaseException());
-                return;
-            }
-            simulatedDevice.views().append(view.releaseReturnValue());
-        }
+        device->setViews(init.views);
 
         Vector<XRReferenceSpaceType> features;
         if (init.supportedFeatures) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to