WebKit Bugzilla
Attachment 347068 Details for
Bug 188548
: [Nicosia] Add Nicosia::BackingStoreTextureMapperImpl
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188548-20180814143328.patch (text/plain), 13.97 KB, created by
Zan Dobersek
on 2018-08-14 05:33:29 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Zan Dobersek
Created:
2018-08-14 05:33:29 PDT
Size:
13.97 KB
patch
obsolete
>Subversion Revision: 234842 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 59c416ac9000e1a2447236c0920ba3853ab2c4c8..a646c8f1c1e24dcc7ebf5f39c2a64439158cb1d4 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,46 @@ >+2018-08-14 Zan Dobersek <zdobersek@igalia.com> >+ >+ [Nicosia] Add Nicosia::BackingStoreTextureMapperImpl >+ https://bugs.webkit.org/show_bug.cgi?id=188548 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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 Rob Buis <rbuis@igalia.com> > > Fetch: content-length header is being added to the safe-list >diff --git a/Source/WebCore/platform/TextureMapper.cmake b/Source/WebCore/platform/TextureMapper.cmake >index 3c78fea50c001564d82c64ab2d3536fb9a1a502b..9572f3dacbba81a0c3cce8daa03c05c95217ab29 100644 >--- a/Source/WebCore/platform/TextureMapper.cmake >+++ b/Source/WebCore/platform/TextureMapper.cmake >@@ -58,6 +58,7 @@ if (USE_COORDINATED_GRAPHICS) > 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 >diff --git a/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp b/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..d4c9b605b4cd28e348efd85335038b58c9a4ddfa >--- /dev/null >+++ b/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.cpp >@@ -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) >diff --git a/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h b/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h >new file mode 100644 >index 0000000000000000000000000000000000000000..16e1145185596cc1d4f8c63886c4f2a2b1c7781a >--- /dev/null >+++ b/Source/WebCore/platform/graphics/nicosia/texmap/NicosiaBackingStoreTextureMapperImpl.h >@@ -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)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188548
: 347068