Skip to content
Permalink
Browse files
[Nicosia] Add Nicosia::PlatformLayer, Nicosia::CompositionLayer classes
https://bugs.webkit.org/show_bug.cgi?id=187693

Reviewed by Carlos Garcia Campos.

Add the Nicosia::PlatformLayer class. This will be the base platform
layer class from which different derivatives will be created, addressing
different use cases. The generic PlatformLayer type alias will point to
this class in the future.

First class deriving from Nicosia::PlatformLayer is
Nicosia::CompositionLayer, purpose of which will be to mirror the state
that's stored in the platform-specific GraphicsLayer derivative. It will
also allow making thread-safe updates to that state.

CoordinatedGraphicsLayer implementation now spawns a CompositionLayer
object and tracks state changes in a separate
CompositionLayer::LayerState::Delta object. During flushing, the changed
state is applied to the layer's pending state before the delta is nulled
out. The updated state isn't used anywhere yet, but future changes will
implement committing this state into the rendering pipeline.

There's bits of state not yet being managed by CompositionLayer, e.g.
debug visuals, filters and animations. These will be addressed later.

The m_solidColor member variable is added to CoordinatedGraphicsLayer in
order to properly store the solid color value. Normally this would be
contained by the parent GraphicsLayer class, but no such member variable
exists there.

* platform/TextureMapper.cmake:
* platform/graphics/nicosia/NicosiaPlatformLayer.cpp: Added.
(Nicosia::PlatformLayer::PlatformLayer):
(Nicosia::CompositionLayer::CompositionLayer):
* platform/graphics/nicosia/NicosiaPlatformLayer.h: Added.
(Nicosia::PlatformLayer::isCompositionLayer const):
(Nicosia::PlatformLayer::id const):
(Nicosia::CompositionLayer::create):
(Nicosia::CompositionLayer::LayerState::Flags::Flags):
(Nicosia::CompositionLayer::updateState):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::CoordinatedGraphicsLayer):
(WebCore::CoordinatedGraphicsLayer::setPosition):
(WebCore::CoordinatedGraphicsLayer::setAnchorPoint):
(WebCore::CoordinatedGraphicsLayer::setSize):
(WebCore::CoordinatedGraphicsLayer::setTransform):
(WebCore::CoordinatedGraphicsLayer::setChildrenTransform):
(WebCore::CoordinatedGraphicsLayer::setPreserves3D):
(WebCore::CoordinatedGraphicsLayer::setMasksToBounds):
(WebCore::CoordinatedGraphicsLayer::setDrawsContent):
(WebCore::CoordinatedGraphicsLayer::setContentsVisible):
(WebCore::CoordinatedGraphicsLayer::setContentsOpaque):
(WebCore::CoordinatedGraphicsLayer::setBackfaceVisibility):
(WebCore::CoordinatedGraphicsLayer::setOpacity):
(WebCore::CoordinatedGraphicsLayer::setContentsRect):
(WebCore::CoordinatedGraphicsLayer::setContentsTileSize):
(WebCore::CoordinatedGraphicsLayer::setContentsTilePhase):
(WebCore::CoordinatedGraphicsLayer::setContentsToSolidColor):
(WebCore::CoordinatedGraphicsLayer::setMaskLayer):
(WebCore::CoordinatedGraphicsLayer::setReplicatedByLayer):
(WebCore::CoordinatedGraphicsLayer::syncChildren):
(WebCore::CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h:


Canonical link: https://commits.webkit.org/202894@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233845 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
zdobersek committed Jul 16, 2018
1 parent 3a6f1c9 commit 020950f43435506124d8ae8b2c814cd40deb367b
Showing 6 changed files with 365 additions and 1 deletion.
@@ -1,3 +1,69 @@
2018-07-16 Zan Dobersek <zdobersek@igalia.com>

[Nicosia] Add Nicosia::PlatformLayer, Nicosia::CompositionLayer classes
https://bugs.webkit.org/show_bug.cgi?id=187693

Reviewed by Carlos Garcia Campos.

Add the Nicosia::PlatformLayer class. This will be the base platform
layer class from which different derivatives will be created, addressing
different use cases. The generic PlatformLayer type alias will point to
this class in the future.

First class deriving from Nicosia::PlatformLayer is
Nicosia::CompositionLayer, purpose of which will be to mirror the state
that's stored in the platform-specific GraphicsLayer derivative. It will
also allow making thread-safe updates to that state.

CoordinatedGraphicsLayer implementation now spawns a CompositionLayer
object and tracks state changes in a separate
CompositionLayer::LayerState::Delta object. During flushing, the changed
state is applied to the layer's pending state before the delta is nulled
out. The updated state isn't used anywhere yet, but future changes will
implement committing this state into the rendering pipeline.

There's bits of state not yet being managed by CompositionLayer, e.g.
debug visuals, filters and animations. These will be addressed later.

The m_solidColor member variable is added to CoordinatedGraphicsLayer in
order to properly store the solid color value. Normally this would be
contained by the parent GraphicsLayer class, but no such member variable
exists there.

* platform/TextureMapper.cmake:
* platform/graphics/nicosia/NicosiaPlatformLayer.cpp: Added.
(Nicosia::PlatformLayer::PlatformLayer):
(Nicosia::CompositionLayer::CompositionLayer):
* platform/graphics/nicosia/NicosiaPlatformLayer.h: Added.
(Nicosia::PlatformLayer::isCompositionLayer const):
(Nicosia::PlatformLayer::id const):
(Nicosia::CompositionLayer::create):
(Nicosia::CompositionLayer::LayerState::Flags::Flags):
(Nicosia::CompositionLayer::updateState):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:
(WebCore::CoordinatedGraphicsLayer::CoordinatedGraphicsLayer):
(WebCore::CoordinatedGraphicsLayer::setPosition):
(WebCore::CoordinatedGraphicsLayer::setAnchorPoint):
(WebCore::CoordinatedGraphicsLayer::setSize):
(WebCore::CoordinatedGraphicsLayer::setTransform):
(WebCore::CoordinatedGraphicsLayer::setChildrenTransform):
(WebCore::CoordinatedGraphicsLayer::setPreserves3D):
(WebCore::CoordinatedGraphicsLayer::setMasksToBounds):
(WebCore::CoordinatedGraphicsLayer::setDrawsContent):
(WebCore::CoordinatedGraphicsLayer::setContentsVisible):
(WebCore::CoordinatedGraphicsLayer::setContentsOpaque):
(WebCore::CoordinatedGraphicsLayer::setBackfaceVisibility):
(WebCore::CoordinatedGraphicsLayer::setOpacity):
(WebCore::CoordinatedGraphicsLayer::setContentsRect):
(WebCore::CoordinatedGraphicsLayer::setContentsTileSize):
(WebCore::CoordinatedGraphicsLayer::setContentsTilePhase):
(WebCore::CoordinatedGraphicsLayer::setContentsToSolidColor):
(WebCore::CoordinatedGraphicsLayer::setMaskLayer):
(WebCore::CoordinatedGraphicsLayer::setReplicatedByLayer):
(WebCore::CoordinatedGraphicsLayer::syncChildren):
(WebCore::CoordinatedGraphicsLayer::flushCompositingStateForThisLayerOnly):
* platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.h:

2018-07-15 Wenson Hsieh <wenson_hsieh@apple.com>

[iOS apps on macOS] Playing embedded Twitter videos in the News app crashes the web process
@@ -50,6 +50,7 @@ if (USE_COORDINATED_GRAPHICS)
platform/graphics/nicosia/NicosiaPaintingEngine.cpp
platform/graphics/nicosia/NicosiaPaintingEngineBasic.cpp
platform/graphics/nicosia/NicosiaPaintingEngineThreaded.cpp
platform/graphics/nicosia/NicosiaPlatformLayer.cpp

platform/graphics/nicosia/cairo/NicosiaCairoOperationRecorder.cpp
platform/graphics/nicosia/cairo/NicosiaPaintingContextCairo.cpp
@@ -0,0 +1,48 @@
/*
* Copyright (C) 2017 Metrological Group B.V.
* Copyright (C) 2017 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 "NicosiaPlatformLayer.h"

namespace Nicosia {

PlatformLayer::PlatformLayer(uint64_t id)
: m_id(id)
{
}

PlatformLayer::~PlatformLayer() = default;

CompositionLayer::CompositionLayer(uint64_t id)
: PlatformLayer(id)
{
}

CompositionLayer::~CompositionLayer() = default;

} // namespace Nicosia
@@ -0,0 +1,155 @@
/*
* Copyright (C) 2017 Metrological Group B.V.
* Copyright (C) 2017 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

#include "Color.h"
#include "FloatPoint.h"
#include "FloatPoint3D.h"
#include "FloatRect.h"
#include "FloatSize.h"
#include "TransformationMatrix.h"
#include <wtf/Lock.h>
#include <wtf/ThreadSafeRefCounted.h>
#include <wtf/TypeCasts.h>

namespace Nicosia {

class PlatformLayer : public ThreadSafeRefCounted<PlatformLayer> {
public:
virtual ~PlatformLayer();

virtual bool isCompositionLayer() const { return false; }

uint64_t id() const { return m_id; }

protected:
explicit PlatformLayer(uint64_t);

uint64_t m_id;

struct {
Lock lock;
} m_state;
};

class CompositionLayer : public PlatformLayer {
public:
static Ref<CompositionLayer> create(uint64_t id)
{
return adoptRef(*new CompositionLayer(id));
}
virtual ~CompositionLayer();

bool isCompositionLayer() const override { return true; }

struct LayerState {
struct Delta {
Delta() = default;

union {
struct {
bool positionChanged : 1;
bool anchorPointChanged : 1;
bool sizeChanged : 1;
bool transformChanged : 1;
bool childrenTransformChanged : 1;
bool contentsRectChanged : 1;
bool contentsTilingChanged : 1;
bool opacityChanged : 1;
bool solidColorChanged : 1;
bool childrenChanged : 1;
bool maskChanged : 1;
bool replicaChanged : 1;
bool flagsChanged : 1;
};
uint32_t value { 0 };
};
} delta;

struct Flags {
Flags()
: contentsVisible(true)
, backfaceVisible(true)
{ }

union {
struct {
bool contentsOpaque : 1;
bool drawsContent : 1;
bool contentsVisible : 1;
bool backfaceVisible : 1;
bool masksToBounds : 1;
bool preserves3D : 1;
};
uint32_t value { 0 };
};
} flags;

WebCore::FloatPoint position;
WebCore::FloatPoint3D anchorPoint;
WebCore::FloatSize size;

WebCore::TransformationMatrix transform;
WebCore::TransformationMatrix childrenTransform;

WebCore::FloatRect contentsRect;
WebCore::FloatSize contentsTilePhase;
WebCore::FloatSize contentsTileSize;

float opacity { 0 };
WebCore::Color solidColor;

Vector<RefPtr<CompositionLayer>> children;
RefPtr<CompositionLayer> replica;
RefPtr<CompositionLayer> mask;
};

template<typename T>
void updateState(const T& functor)
{
LockHolder locker(PlatformLayer::m_state.lock);
functor(m_state.pending);
}

private:
explicit CompositionLayer(uint64_t);

struct {
LayerState pending;
} m_state;
};

} // namespace Nicosia

#define SPECIALIZE_TYPE_TRAITS_NICOSIA_PLATFORMLAYER(ToClassName, predicate) \
SPECIALIZE_TYPE_TRAITS_BEGIN(Nicosia::ToClassName) \
static bool isType(const Nicosia::PlatformLayer& layer) { return layer.predicate; } \
SPECIALIZE_TYPE_TRAITS_END()

SPECIALIZE_TYPE_TRAITS_NICOSIA_PLATFORMLAYER(CompositionLayer, isCompositionLayer());

0 comments on commit 020950f

Please sign in to comment.