Changeset 275603 in webkit


Ignore:
Timestamp:
Apr 7, 2021 5:27:54 AM (3 years ago)
Author:
imanol
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):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r275600 r275603  
     12021-04-07  Imanol Fernandez  <ifernandez@igalia.com>
     2
     3        Use frameData instead of scheduleOnNextFrame calls in WebFakeXRDevice
     4        https://bugs.webkit.org/show_bug.cgi?id=223580
     5
     6        Reviewed by Youenn Fablet.
     7
     8        This patch makes the WebFakeXRDevice code more robust by getting rid of the scheduleOnNextFrame calls.
     9
     10        Tested by WebXR WPT.
     11
     12        * testing/WebFakeXRDevice.cpp:
     13        (WebCore::SimulatedXRDevice::setViews):
     14        (WebCore::SimulatedXRDevice::setNativeBoundsGeometry):
     15        (WebCore::SimulatedXRDevice::setViewerOrigin):
     16        (WebCore::SimulatedXRDevice::frameTimerFired):
     17        (WebCore::WebFakeXRDevice::setViews):
     18        (WebCore::WebFakeXRDevice::setViewerOrigin):
     19        (WebCore::WebFakeXRDevice::setFloorOrigin):
     20        * testing/WebFakeXRDevice.h:
     21        * testing/WebXRTest.cpp:
     22        (WebCore::WebXRTest::simulateDeviceConnection):
     23
    1242021-04-07  Philippe Normand  <pnormand@igalia.com>
    225
  • trunk/Source/WebCore/testing/WebFakeXRDevice.cpp

    r274704 r275603  
    6161}
    6262
     63void SimulatedXRDevice::setViews(Vector<FrameData::View>&& views)
     64{
     65    m_frameData.views = WTFMove(views);
     66}
     67
    6368void SimulatedXRDevice::setNativeBoundsGeometry(const Vector<FakeXRBoundsPoint>& geometry)
    6469{
    65     m_stageParameters.id++;
    66     m_stageParameters.bounds.clear();
     70    m_frameData.stageParameters.id++;
     71    m_frameData.stageParameters.bounds.clear();
    6772    for (auto& point : geometry)
    68         m_stageParameters.bounds.append({ static_cast<float>(point.x), static_cast<float>(point.z) });
     73        m_frameData.stageParameters.bounds.append({ static_cast<float>(point.x), static_cast<float>(point.z) });
     74}
     75
     76void SimulatedXRDevice::setViewerOrigin(const Optional<FrameData::Pose>& origin)
     77{
     78    if (origin) {
     79        m_frameData.origin = *origin;
     80        m_frameData.isPositionValid = true;
     81        m_frameData.isTrackingValid = true;
     82        return;
     83    }
     84
     85    m_frameData.origin = Device::FrameData::Pose();
     86    m_frameData.isPositionValid = false;
     87    m_frameData.isTrackingValid = false;
    6988}
    7089
     
    110129void SimulatedXRDevice::frameTimerFired()
    111130{
    112     auto updates = WTFMove(m_pendingUpdates);
    113     for (auto& update : updates)
    114         update();
    115 
    116     FrameData data;
     131    FrameData data = m_frameData;
    117132    data.shouldRender = true;
    118     if (m_viewerOrigin) {
    119         data.origin = *m_viewerOrigin;
    120         data.isTrackingValid = true;
    121         data.isPositionValid = true;
    122         data.isPositionEmulated = m_emulatedPosition;
    123     }
    124 
    125     if (m_floorOrigin)
    126         data.floorTransform = { *m_floorOrigin };
    127 
    128     data.stageParameters = m_stageParameters;
    129 
    130     for (auto& fakeView : m_views) {
    131         FrameData::View view;
    132         view.offset = fakeView->offset();
    133         if (fakeView->fieldOfView().hasValue())
    134             view.projection = { *fakeView->fieldOfView() };
    135         else
    136             view.projection = { fakeView->projection() };
    137        
    138         data.views.append(view);
    139     }
    140133
    141134    for (auto& layer : m_layers)
     
    191184}
    192185
    193 void SimulatedXRDevice::scheduleOnNextFrame(Function<void()>&& func)
    194 {
    195     m_pendingUpdates.append(WTFMove(func));
    196 }
    197 
    198186WebFakeXRDevice::WebFakeXRDevice() = default;
    199187
    200188void WebFakeXRDevice::setViews(const Vector<FakeXRViewInit>& views)
    201189{
    202     m_device.scheduleOnNextFrame([this, views]() {
    203         Vector<Ref<FakeXRView>> deviceViews;
    204 
    205         for (auto& viewInit : views) {
    206             auto view = parseView(viewInit);
    207             if (!view.hasException())
    208                 deviceViews.append(view.releaseReturnValue());
     190    Vector<PlatformXR::Device::FrameData::View> deviceViews;
     191
     192    for (auto& viewInit : views) {
     193        auto parsedView = parseView(viewInit);
     194        if (!parsedView.hasException()) {
     195            auto fakeView = parsedView.releaseReturnValue();
     196            PlatformXR::Device::FrameData::View view;
     197            view.offset = fakeView->offset();
     198            if (fakeView->fieldOfView().hasValue())
     199                view.projection = { *fakeView->fieldOfView() };
     200            else
     201                view.projection = { fakeView->projection() };
     202
     203            deviceViews.append(view);
    209204        }
    210 
    211         m_device.setViews(WTFMove(deviceViews));
    212     });
     205    }
     206
     207    m_device.setViews(WTFMove(deviceViews));
    213208}
    214209
     
    220215void WebFakeXRDevice::setViewerOrigin(FakeXRRigidTransformInit origin, bool emulatedPosition)
    221216{
    222     auto result = parseRigidTransform(origin);
    223     if (result.hasException())
     217    auto pose = parseRigidTransform(origin);
     218    if (pose.hasException())
    224219        return;
    225220
    226     auto pose = result.releaseReturnValue();
    227 
    228     m_device.scheduleOnNextFrame([this, pose = WTFMove(pose), emulatedPosition]() mutable {
    229         m_device.setViewerOrigin(WTFMove(pose));
    230         m_device.setEmulatedPosition(emulatedPosition);
    231     });
    232 }
    233 
    234 void WebFakeXRDevice::clearViewerOrigin()
    235 {
    236     m_device.scheduleOnNextFrame([this]() {
    237         m_device.setViewerOrigin(WTF::nullopt);
    238     });
     221    m_device.setViewerOrigin(pose.releaseReturnValue());
     222    m_device.setEmulatedPosition(emulatedPosition);
    239223}
    240224
     
    243227}
    244228
    245 void WebFakeXRDevice::setBoundsGeometry(Vector<FakeXRBoundsPoint>&& bounds)
    246 {
    247     m_device.scheduleOnNextFrame([this, bounds = WTFMove(bounds)]() {
    248         m_device.setNativeBoundsGeometry(bounds);
    249     });
    250 }
    251 
    252229void WebFakeXRDevice::setFloorOrigin(FakeXRRigidTransformInit origin)
    253230{
    254     auto result = parseRigidTransform(origin);
    255     if (result.hasException())
     231    auto pose = parseRigidTransform(origin);
     232    if (pose.hasException())
    256233        return;
    257234
    258     auto pose = result.releaseReturnValue();
    259 
    260     m_device.scheduleOnNextFrame([this, pose = WTFMove(pose)]() mutable {
    261         m_device.setFloorOrigin(WTFMove(pose));
    262     });
    263 }
    264 
    265 void WebFakeXRDevice::clearFloorOrigin()
    266 {
    267     m_device.scheduleOnNextFrame([this]() {
    268         m_device.setFloorOrigin(WTF::nullopt);
    269     });
     235    m_device.setFloorOrigin(pose.releaseReturnValue());
    270236}
    271237
  • trunk/Source/WebCore/testing/WebFakeXRDevice.h

    r274704 r275603  
    7373    SimulatedXRDevice();
    7474    ~SimulatedXRDevice();
    75     void setViews(Vector<Ref<FakeXRView>>&& views) { m_views = WTFMove(views); }
     75    void setViews(Vector<FrameData::View>&&);
    7676    void setNativeBoundsGeometry(const Vector<FakeXRBoundsPoint>&);
    77     void setViewerOrigin(Optional<FrameData::Pose>&& origin) { m_viewerOrigin = WTFMove(origin); }
    78     void setFloorOrigin(Optional<FrameData::Pose>&& origin) { m_floorOrigin = WTFMove(origin); }
    79     void setEmulatedPosition(bool emulated) { m_emulatedPosition = emulated; }
    80     Vector<Ref<FakeXRView>>& views() { return m_views; }
     77    void setViewerOrigin(const Optional<FrameData::Pose>&);
     78    void setFloorOrigin(Optional<FrameData::Pose>&& origin) { m_frameData.floorTransform = WTFMove(origin); }
     79    void setEmulatedPosition(bool emulated) { m_frameData.isPositionEmulated = emulated; }
    8180    void setSupportsShutdownNotification(bool supportsShutdownNotification) { m_supportsShutdownNotification = supportsShutdownNotification; }
    8281    void simulateShutdownCompleted();
     
    9695    void frameTimerFired();
    9796
    98     Optional<Vector<FakeXRBoundsPoint>> m_nativeBoundsGeometry;
    99     Optional<FrameData::Pose> m_viewerOrigin;
    100     Optional<FrameData::Pose> m_floorOrigin;
    101     bool m_emulatedPosition { false };
    102     Vector<Ref<FakeXRView>> m_views;
     97    PlatformXR::Device::FrameData m_frameData;
    10398    bool m_supportsShutdownNotification { false };
    10499    Timer m_frameTimer;
    105100    RequestFrameCallback m_FrameCallback;
    106     Vector<Function<void()>> m_pendingUpdates;
    107     FrameData::StageParameters m_stageParameters;
    108101    RefPtr<WebCore::GraphicsContextGL> m_gl;
    109102    HashMap<PlatformXR::LayerHandle, PlatformGLObject> m_layers;
     
    116109
    117110    void setViews(const Vector<FakeXRViewInit>&);
    118 
    119111    void disconnect(DOMPromiseDeferred<void>&&);
    120 
    121112    void setViewerOrigin(FakeXRRigidTransformInit origin, bool emulatedPosition = false);
    122 
    123     void clearViewerOrigin();
    124 
     113    void clearViewerOrigin() { m_device.setViewerOrigin(WTF::nullopt); }
    125114    void simulateVisibilityChange(XRVisibilityState);
    126 
    127     void setBoundsGeometry(Vector<FakeXRBoundsPoint>&& boundsCoordinates);
    128 
     115    void setBoundsGeometry(Vector<FakeXRBoundsPoint>&& bounds) { m_device.setNativeBoundsGeometry(WTFMove(bounds)); }
    129116    void setFloorOrigin(FakeXRRigidTransformInit);
    130 
    131     void clearFloorOrigin();
    132 
     117    void clearFloorOrigin() { m_device.setFloorOrigin(WTF::nullopt); }
    133118    void simulateResetPose();
    134 
    135119    Ref<WebFakeXRInputController> simulateInputSourceConnection(FakeXRInputSourceInit);
    136 
    137120    static ExceptionOr<Ref<FakeXRView>> parseView(const FakeXRViewInit&);
    138 
    139121    SimulatedXRDevice& simulatedXRDevice() { return m_device; }
    140 
    141122    void setSupportsShutdownNotification();
    142 
    143123    void simulateShutdown();
    144124
  • trunk/Source/WebCore/testing/WebXRTest.cpp

    r274416 r275603  
    4242{
    4343    // https://immersive-web.github.io/webxr-test-api/#dom-xrtest-simulatedeviceconnection
    44     context.postTask([this, init, promise = WTFMove(promise)] (ScriptExecutionContext& context) mutable {
     44    context.postTask([this, protectedThis = makeRef(*this), init, promise = WTFMove(promise)] (ScriptExecutionContext& context) mutable {
    4545        auto device = WebFakeXRDevice::create();
    4646        auto& simulatedDevice = device->simulatedXRDevice();
    4747
    48         for (auto& viewInit : init.views) {
    49             auto view = WebFakeXRDevice::parseView(viewInit);
    50             if (view.hasException()) {
    51                 promise.reject(view.releaseException());
    52                 return;
    53             }
    54             simulatedDevice.views().append(view.releaseReturnValue());
    55         }
     48        device->setViews(init.views);
    5649
    5750        Vector<XRReferenceSpaceType> features;
Note: See TracChangeset for help on using the changeset viewer.