- Revision
- 234883
- Author
- [email protected]
- Date
- 2018-08-14 23:15:23 -0700 (Tue, 14 Aug 2018)
Log Message
[Nicosia] Add Nicosia::BackingStoreTextureMapperImpl
https://bugs.webkit.org/show_bug.cgi?id=188548
Reviewed by Carlos Garcia Campos.
Add the Nicosia::BackingStoreTextureMapperImpl class, the
TextureMapper-specific implementation that will extend the BackingStore
class.
Purpose of this class is to manage content of painted layers. In the
LayerState object that will be exposed to the CoordinatedGraphicsLayer
owner we keep the current and previous TiledBackingStore objects that
will be used for painting. A TileUpdate object is used to store all tile
creation, removal and update changes that happen during the painting
that's performed during the CoordinatedGraphicsLayer flush.
At the point of synchronization under the Nicosia::Scene object, these
updates will be moved over to the pending TileUpdate object that will
then be accessed during the composition step. For that purpose we keep
in the CompositionState member object a reference to the
CoordinatedBackingStore object that will get updated with the tile
creation, removal and update changes (if there are any). The composition
step will use the takeUpdate() method to retrieve all these changes and
apply them outside of the point of synchronization (avoiding this sync
step to take too long).
This will be integrated into the CoordinatedGraphicsLayer class at a
later point, when the switch to the new infrastructure can be made in
one go.
* platform/TextureMapper.cmake:
* platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp: Added.
(Nicosia::BackingStoreTextureMapperImpl::createFactory):
(Nicosia::BackingStoreTextureMapperImpl::tiledBackingStoreHasPendingTileCreation):
(Nicosia::BackingStoreTextureMapperImpl::createTile):
(Nicosia::BackingStoreTextureMapperImpl::updateTile):
(Nicosia::BackingStoreTextureMapperImpl::removeTile):
(Nicosia::BackingStoreTextureMapperImpl::flushUpdate):
(Nicosia::BackingStoreTextureMapperImpl::takeUpdate):
* platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (234882 => 234883)
--- trunk/Source/WebCore/ChangeLog 2018-08-15 06:10:34 UTC (rev 234882)
+++ trunk/Source/WebCore/ChangeLog 2018-08-15 06:15:23 UTC (rev 234883)
@@ -1,3 +1,46 @@
+2018-08-14 Zan Dobersek <[email protected]>
+
+ [Nicosia] Add Nicosia::BackingStoreTextureMapperImpl
+ https://bugs.webkit.org/show_bug.cgi?id=188548
+
+ Reviewed by Carlos Garcia Campos.
+
+ Add the Nicosia::BackingStoreTextureMapperImpl class, the
+ TextureMapper-specific implementation that will extend the BackingStore
+ class.
+
+ Purpose of this class is to manage content of painted layers. In the
+ LayerState object that will be exposed to the CoordinatedGraphicsLayer
+ owner we keep the current and previous TiledBackingStore objects that
+ will be used for painting. A TileUpdate object is used to store all tile
+ creation, removal and update changes that happen during the painting
+ that's performed during the CoordinatedGraphicsLayer flush.
+
+ At the point of synchronization under the Nicosia::Scene object, these
+ updates will be moved over to the pending TileUpdate object that will
+ then be accessed during the composition step. For that purpose we keep
+ in the CompositionState member object a reference to the
+ CoordinatedBackingStore object that will get updated with the tile
+ creation, removal and update changes (if there are any). The composition
+ step will use the takeUpdate() method to retrieve all these changes and
+ apply them outside of the point of synchronization (avoiding this sync
+ step to take too long).
+
+ This will be integrated into the CoordinatedGraphicsLayer class at a
+ later point, when the switch to the new infrastructure can be made in
+ one go.
+
+ * platform/TextureMapper.cmake:
+ * platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp: Added.
+ (Nicosia::BackingStoreTextureMapperImpl::createFactory):
+ (Nicosia::BackingStoreTextureMapperImpl::tiledBackingStoreHasPendingTileCreation):
+ (Nicosia::BackingStoreTextureMapperImpl::createTile):
+ (Nicosia::BackingStoreTextureMapperImpl::updateTile):
+ (Nicosia::BackingStoreTextureMapperImpl::removeTile):
+ (Nicosia::BackingStoreTextureMapperImpl::flushUpdate):
+ (Nicosia::BackingStoreTextureMapperImpl::takeUpdate):
+ * platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h: Added.
+
2018-08-14 Fujii Hironori <[email protected]>
Unreviewed, rolling out r234874 and r234876.
Modified: trunk/Source/WebCore/platform/TextureMapper.cmake (234882 => 234883)
--- trunk/Source/WebCore/platform/TextureMapper.cmake 2018-08-15 06:10:34 UTC (rev 234882)
+++ trunk/Source/WebCore/platform/TextureMapper.cmake 2018-08-15 06:15:23 UTC (rev 234883)
@@ -58,6 +58,7 @@
platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp
platform/graphics/nicosia/cairo/NicosiaPaintingContextCairo.cpp
+ platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp
platform/graphics/nicosia/texmap/NicosiaCompositionLayerTextureMapperImpl.cpp
platform/graphics/nicosia/texmap/NicosiaContentLayerTextureMapperImpl.cpp
platform/graphics/nicosia/texmap/NicosiaGC3DLayer.cpp
Added: trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp (0 => 234883)
--- trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp (rev 0)
+++ trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp 2018-08-15 06:15:23 UTC (rev 234883)
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2018 Metrological Group B.V.
+ * Copyright (C) 2018 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "NicosiaBackingStoreTextureMapperImpl.h"
+
+#if USE(TEXTURE_MAPPER)
+
+namespace Nicosia {
+
+auto BackingStoreTextureMapperImpl::createFactory() -> Factory
+{
+ return Factory(
+ [](BackingStore&) {
+ return std::make_unique<BackingStoreTextureMapperImpl>();
+ });
+}
+
+BackingStoreTextureMapperImpl::BackingStoreTextureMapperImpl() = default;
+BackingStoreTextureMapperImpl::~BackingStoreTextureMapperImpl() = default;
+
+void BackingStoreTextureMapperImpl::tiledBackingStoreHasPendingTileCreation()
+{
+ m_layerState.hasPendingTileCreation = true;
+}
+
+void BackingStoreTextureMapperImpl::createTile(uint32_t tileID, float scale)
+{
+ ASSERT(m_layerState.isFlushing);
+ auto& update = m_layerState.update;
+
+ // Assert no tile with this ID has been registered yet.
+#if !ASSERT_DISABLED
+ auto matchesTile = [tileID](auto& tile) { return tile.tileID == tileID; };
+#endif
+ ASSERT(std::none_of(update.tilesToCreate.begin(), update.tilesToCreate.end(), matchesTile));
+ ASSERT(std::none_of(update.tilesToUpdate.begin(), update.tilesToUpdate.end(), matchesTile));
+ ASSERT(std::none_of(update.tilesToRemove.begin(), update.tilesToRemove.end(), matchesTile));
+
+ update.tilesToCreate.append({ tileID, scale });
+}
+
+void BackingStoreTextureMapperImpl::updateTile(uint32_t tileID, const WebCore::SurfaceUpdateInfo& updateInfo, const WebCore::IntRect& tileRect)
+{
+ ASSERT(m_layerState.isFlushing);
+ auto& update = m_layerState.update;
+
+ // Assert no tile with this ID has been registered for removal yet. It might have
+ // already been created in a previous update, so it makes no sense to check tilesToCreate.
+ ASSERT(std::none_of(update.tilesToRemove.begin(), update.tilesToRemove.end(),
+ [tileID](auto& tile) { return tile.tileID == tileID; }));
+
+ update.tilesToUpdate.append({ tileID, tileRect, updateInfo });
+}
+
+void BackingStoreTextureMapperImpl::removeTile(uint32_t tileID)
+{
+ ASSERT(m_layerState.isFlushing || m_layerState.isPurging);
+ auto& update = m_layerState.update;
+
+ // Remove any creations or updates registered for this tile ID.
+ auto matchesTile = [tileID](auto& tile) { return tile.tileID == tileID; };
+ update.tilesToCreate.removeAllMatching(matchesTile);
+ update.tilesToUpdate.removeAllMatching(matchesTile);
+
+ // Assert no tile with this ID has been registered for removal yet.
+ ASSERT(std::none_of(update.tilesToRemove.begin(), update.tilesToRemove.end(), matchesTile));
+
+ update.tilesToRemove.append(TileUpdate::RemovalData { tileID });
+}
+
+void BackingStoreTextureMapperImpl::flushUpdate()
+{
+ ASSERT(!m_layerState.isFlushing);
+ m_layerState.hasPendingTileCreation = false;
+
+ // Incrementally store updates as they are being flushed from the layer-side.
+ {
+ LockHolder locker(m_update.lock);
+ m_update.pending.tilesToCreate.appendVector(m_layerState.update.tilesToCreate);
+ m_update.pending.tilesToUpdate.appendVector(m_layerState.update.tilesToUpdate);
+ m_update.pending.tilesToRemove.appendVector(m_layerState.update.tilesToRemove);
+ }
+
+ m_layerState.update = { };
+}
+
+auto BackingStoreTextureMapperImpl::takeUpdate() -> TileUpdate
+{
+ LockHolder locker(m_update.lock);
+ return WTFMove(m_update.pending);
+}
+
+} // namespace Nicosia
+
+#endif // USE(TEXTURE_MAPPER)
Added: trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h (0 => 234883)
--- trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h 2018-08-15 06:15:23 UTC (rev 234883)
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2018 Metrological Group B.V.
+ * Copyright (C) 2018 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if USE(TEXTURE_MAPPER)
+
+#include "CoordinatedBackingStore.h"
+#include "NicosiaPlatformLayer.h"
+#include "SurfaceUpdateInfo.h"
+#include "TiledBackingStore.h"
+#include "TiledBackingStoreClient.h"
+#include <memory>
+#include <wtf/Lock.h>
+
+namespace Nicosia {
+
+class BackingStoreTextureMapperImpl final : public BackingStore::Impl, public WebCore::TiledBackingStoreClient {
+public:
+ static Factory createFactory();
+
+ BackingStoreTextureMapperImpl();
+ virtual ~BackingStoreTextureMapperImpl();
+ bool isTextureMapperImpl() const override { return true; }
+
+ // A move-only tile update container.
+ struct TileUpdate {
+ TileUpdate() = default;
+ TileUpdate(const TileUpdate&) = delete;
+ TileUpdate& operator=(const TileUpdate&) = delete;
+ TileUpdate(TileUpdate&&) = default;
+ TileUpdate& operator=(TileUpdate&&) = default;
+
+ struct CreationData {
+ uint32_t tileID;
+ float scale;
+ };
+ Vector<CreationData> tilesToCreate;
+
+ struct UpdateData {
+ uint32_t tileID;
+ WebCore::IntRect tileRect;
+ WebCore::SurfaceUpdateInfo updateInfo;
+ };
+ Vector<UpdateData> tilesToUpdate;
+
+ struct RemovalData {
+ uint32_t tileID;
+ };
+ Vector<RemovalData> tilesToRemove;
+ };
+
+ // An immutable layer-side state object. flushUpdate() prepares
+ // the current update for consumption by the composition-side.
+ struct LayerState {
+ LayerState() = default;
+ LayerState(const LayerState&) = delete;
+ LayerState& operator=(const LayerState&) = delete;
+ LayerState(LayerState&&) = delete;
+ LayerState& operator=(LayerState&&) = delete;
+
+ std::unique_ptr<WebCore::TiledBackingStore> mainBackingStore;
+ std::unique_ptr<WebCore::TiledBackingStore> previousBackingStore;
+
+ TileUpdate update;
+ bool isFlushing { false };
+ bool isPurging { false };
+ bool hasPendingTileCreation { false };
+ };
+ LayerState& layerState() { return m_layerState; }
+
+ void flushUpdate();
+
+ // An immutable composition-side state object. takeUpdate() returns the accumulated
+ // tile update information that's to be fed to the CoordinatedBackingStore object.
+ struct CompositionState {
+ CompositionState() = default;
+ CompositionState(const CompositionState&) = delete;
+ CompositionState& operator=(const CompositionState&) = delete;
+ CompositionState(CompositionState&&) = delete;
+ CompositionState& operator=(CompositionState&&) = delete;
+
+ RefPtr<WebCore::CoordinatedBackingStore> backingStore;
+ };
+ CompositionState& compositionState() { return m_compositionState; }
+
+ TileUpdate takeUpdate();
+
+ // TiledBackingStoreClient
+ // FIXME: Move these to private once updateTile() is not called from CoordinatedGrahpicsLayer.
+ void tiledBackingStoreHasPendingTileCreation() override;
+ void createTile(uint32_t, float) override;
+ void updateTile(uint32_t, const WebCore::SurfaceUpdateInfo&, const WebCore::IntRect&) override;
+ void removeTile(uint32_t) override;
+
+private:
+ LayerState m_layerState;
+ CompositionState m_compositionState;
+
+ struct {
+ Lock lock;
+ TileUpdate pending;
+ } m_update;
+};
+
+} // namespace Nicosia
+
+SPECIALIZE_TYPE_TRAITS_NICOSIA_BACKINGSTORE_IMPL(BackingStoreTextureMapperImpl, isTextureMapperImpl());
+
+#endif // USE(TEXTURE_MAPPER)