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