@@ -1810,8 +1810,34 @@ index ea8b9b08f3e6f6e99b8a4fa3fa427beb8c5f5945..a7ec2bd3afe53d500f0cd8f800223ee2
1810
1810
};
1811
1811
1812
1812
/**
1813
+ diff --git a/widget/InProcessCompositorWidget.cpp b/widget/InProcessCompositorWidget.cpp
1814
+ index 7d7ef5a5f9e6c092e643eb5c3feef239e90c0bb2..7c975244f26b3c2ec20d8174e5d84fc9938860a9 100644
1815
+ --- a/widget/InProcessCompositorWidget.cpp
1816
+ +++ b/widget/InProcessCompositorWidget.cpp
1817
+ @@ -4,6 +4,8 @@
1818
+
1819
+ #include "InProcessCompositorWidget.h"
1820
+
1821
+ + #include "HeadlessCompositorWidget.h"
1822
+ + #include "HeadlessWidget.h"
1823
+ #include "mozilla/VsyncDispatcher.h"
1824
+ #include "nsBaseWidget.h"
1825
+
1826
+ @@ -22,6 +24,12 @@ RefPtr<CompositorWidget> CompositorWidget::CreateLocal(
1827
+ const CompositorWidgetInitData& aInitData,
1828
+ const layers::CompositorOptions& aOptions, nsIWidget* aWidget) {
1829
+ MOZ_ASSERT(aWidget);
1830
+ + if (aInitData.type() ==
1831
+ + CompositorWidgetInitData::THeadlessCompositorWidgetInitData) {
1832
+ + return new HeadlessCompositorWidget(
1833
+ + aInitData.get_HeadlessCompositorWidgetInitData(), aOptions,
1834
+ + static_cast<HeadlessWidget*>(aWidget));
1835
+ + }
1836
+ # ifdef MOZ_WIDGET_ANDROID
1837
+ return new AndroidCompositorWidget(aOptions,
1838
+ static_cast<nsBaseWidget*>(aWidget));
1813
1839
diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
1814
- index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac068503639b33887 100644
1840
+ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823cd01d6001 100644
1815
1841
--- a/widget/headless/HeadlessCompositorWidget.cpp
1816
1842
+++ b/widget/headless/HeadlessCompositorWidget.cpp
1817
1843
@@ -3,6 +3,7 @@
@@ -1822,7 +1848,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
1822
1848
#include "mozilla/widget/PlatformWidgetTypes.h"
1823
1849
#include "HeadlessCompositorWidget.h"
1824
1850
#include "VsyncDispatcher.h"
1825
- @@ -17,6 +18,54 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1851
+ @@ -17,6 +18,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1826
1852
mClientSize = aInitData.InitialClientSize();
1827
1853
}
1828
1854
@@ -1839,6 +1865,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
1839
1865
+ MOZ_ASSERT(NS_IsInCompositorThread());
1840
1866
+ mSnapshotListener = std::move(listener);
1841
1867
+ UpdateDrawTarget();
1868
+ + PeriodicSnapshot();
1842
1869
+ }
1843
1870
+
1844
1871
+ already_AddRefed<gfx::DrawTarget> HeadlessCompositorWidget::StartRemoteDrawingInRegion(
@@ -1850,34 +1877,11 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
1850
1877
+ RefPtr<gfx::DrawTarget> result = mDrawTarget;
1851
1878
+ return result.forget();
1852
1879
+ }
1853
- +
1854
- + void HeadlessCompositorWidget::EndRemoteDrawingInRegion(
1855
- + gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) {
1856
- + if (!mDrawTarget)
1857
- + return;
1858
- +
1859
- + if (!mSnapshotListener)
1860
- + return;
1861
- +
1862
- + RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
1863
- + if (!snapshot) {
1864
- + fprintf(stderr, "Failed to get snapshot of draw target\n");
1865
- + return;
1866
- + }
1867
- +
1868
- + RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
1869
- + if (!dataSurface) {
1870
- + fprintf(stderr, "Failed to get data surface from snapshot\n");
1871
- + return;
1872
- + }
1873
- +
1874
- + mSnapshotListener(std::move(dataSurface));
1875
- + }
1876
1880
+
1877
1881
void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
1878
1882
if (RefPtr<CompositorVsyncDispatcher> cvd =
1879
1883
mWidget->GetCompositorVsyncDispatcher()) {
1880
- @@ -29,6 +78,25 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1884
+ @@ -29,6 +56,51 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1881
1885
void HeadlessCompositorWidget::NotifyClientSizeChanged(
1882
1886
const LayoutDeviceIntSize& aClientSize) {
1883
1887
mClientSize = aClientSize;
@@ -1900,14 +1904,40 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
1900
1904
+ // TODO: this is called on Main thread, while Start/End drawing are on Compositor thread.
1901
1905
+ mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
1902
1906
+ mozilla::gfx::BackendType::SKIA, size, format);
1907
+ + }
1908
+ +
1909
+ + void HeadlessCompositorWidget::PeriodicSnapshot() {
1910
+ + if (!mDrawTarget)
1911
+ + return;
1912
+ +
1913
+ + if (!mSnapshotListener)
1914
+ + return;
1915
+ +
1916
+ + RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
1917
+ + if (!snapshot) {
1918
+ + fprintf(stderr, "Failed to get snapshot of draw target\n");
1919
+ + return;
1920
+ + }
1921
+ +
1922
+ + RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
1923
+ + if (!dataSurface) {
1924
+ + fprintf(stderr, "Failed to get data surface from snapshot\n");
1925
+ + return;
1926
+ + }
1927
+ +
1928
+ + mSnapshotListener(std::move(dataSurface));
1929
+ +
1930
+ + NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
1931
+ + "HeadlessCompositorWidget::PeriodicSnapshot", this,
1932
+ + &HeadlessCompositorWidget::PeriodicSnapshot), 40);
1903
1933
}
1904
1934
1905
1935
LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
1906
1936
diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
1907
- index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935225869fc 100644
1937
+ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505fcc40e13 100644
1908
1938
--- a/widget/headless/HeadlessCompositorWidget.h
1909
1939
+++ b/widget/headless/HeadlessCompositorWidget.h
1910
- @@ -23,9 +23,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1940
+ @@ -23,9 +23,13 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1911
1941
HeadlessWidget* aWindow);
1912
1942
1913
1943
void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize);
@@ -1917,19 +1947,17 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935
1917
1947
1918
1948
+ already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
1919
1949
+ LayoutDeviceIntRegion& aInvalidRegion, layers::BufferMode* aBufferMode) override;
1920
- + void EndRemoteDrawingInRegion(
1921
- + gfx::DrawTarget* aDrawTarget,
1922
- + const LayoutDeviceIntRegion& aInvalidRegion) override;
1923
1950
+
1924
1951
uintptr_t GetWidgetKey() override;
1925
1952
1926
1953
LayoutDeviceIntSize GetClientSize() override;
1927
- @@ -42,9 +49,15 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1954
+ @@ -42,9 +46,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1928
1955
}
1929
1956
1930
1957
private:
1931
1958
+ void SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener);
1932
1959
+ void UpdateDrawTarget();
1960
+ + void PeriodicSnapshot();
1933
1961
+
1934
1962
HeadlessWidget* mWidget;
1935
1963
@@ -1941,10 +1969,19 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935
1941
1969
1942
1970
} // namespace widget
1943
1971
diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp
1944
- index 7589d8a1a886dab5431e423d20f7d0aa19c2af75..19dd67a330848b6b39bfc578a6940385329fff8e 100644
1972
+ index 7589d8a1a886dab5431e423d20f7d0aa19c2af75..b14925a7b6972c120a59f70fbbe70a1145a5cb4e 100644
1945
1973
--- a/widget/headless/HeadlessWidget.cpp
1946
1974
+++ b/widget/headless/HeadlessWidget.cpp
1947
- @@ -499,5 +499,13 @@ nsresult HeadlessWidget::SynthesizeNativeTouchPoint(
1975
+ @@ -104,6 +104,8 @@ void HeadlessWidget::Destroy() {
1976
+ }
1977
+ }
1978
+
1979
+ + SetSnapshotListener(nullptr);
1980
+ +
1981
+ nsBaseWidget::OnDestroy();
1982
+
1983
+ nsBaseWidget::Destroy();
1984
+ @@ -499,5 +501,13 @@ nsresult HeadlessWidget::SynthesizeNativeTouchPoint(
1948
1985
return NS_OK;
1949
1986
}
1950
1987
0 commit comments