Bug 1359748 - Extract a WebRenderLayer.{h,cpp} from WebRenderLayerManager.{h,cpp}. r=jrmuizel

Other than moving the code into new files, this just cleans up includes
in the modified and dependent files.

MozReview-Commit-ID: JpJ8rwOkfOO
This commit is contained in:
Kartikaya Gupta 2017-04-27 11:28:31 -04:00
parent 14eec8b500
commit 6e24ccd51b
12 changed files with 313 additions and 273 deletions

View File

@ -204,6 +204,7 @@ EXPORTS.mozilla.layers += [
'wr/WebRenderCompositableHolder.h',
'wr/WebRenderDisplayItemLayer.h',
'wr/WebRenderImageHost.h',
'wr/WebRenderLayer.h',
'wr/WebRenderLayerManager.h',
'wr/WebRenderLayersLogging.h',
'wr/WebRenderMessageUtils.h',
@ -401,6 +402,7 @@ UNIFIED_SOURCES += [
'wr/WebRenderDisplayItemLayer.cpp',
'wr/WebRenderImageHost.cpp',
'wr/WebRenderImageLayer.cpp',
'wr/WebRenderLayer.cpp',
'wr/WebRenderLayerManager.cpp',
'wr/WebRenderLayersLogging.cpp',
'wr/WebRenderPaintedLayer.cpp',

View File

@ -6,8 +6,9 @@
#ifndef GFX_WEBRENDERCANVASLAYER_H
#define GFX_WEBRENDERCANVASLAYER_H
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
#include "ShareableCanvasLayer.h"
#include "WebRenderLayerManager.h"
namespace mozilla {
namespace gfx {

View File

@ -7,7 +7,8 @@
#define GFX_WEBRENDERCOLORLAYER_H
#include "Layers.h"
#include "WebRenderLayerManager.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
namespace mozilla {
namespace layers {

View File

@ -8,7 +8,8 @@
#include "gfxPrefs.h"
#include "Layers.h"
#include "WebRenderLayerManager.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
namespace mozilla {
namespace layers {

View File

@ -9,9 +9,10 @@
#include "Layers.h"
#include "mozilla/layers/ImageClient.h"
#include "mozilla/layers/PWebRenderBridgeChild.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
#include "mozilla/Maybe.h"
#include "mozilla/webrender/WebRenderTypes.h"
#include "WebRenderLayerManager.h"
namespace mozilla {
namespace layers {

View File

@ -7,7 +7,8 @@
#define GFX_WEBRENDERIMAGELAYER_H
#include "ImageLayers.h"
#include "WebRenderLayerManager.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
namespace mozilla {
namespace layers {

View File

@ -0,0 +1,230 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "WebRenderLayer.h"
#include "gfxPrefs.h"
#include "LayersLogging.h"
#include "mozilla/layers/ImageClient.h"
#include "mozilla/layers/WebRenderBridgeChild.h"
#include "mozilla/layers/WebRenderLayerManager.h"
#include "nsThreadUtils.h"
namespace mozilla {
using namespace gfx;
namespace layers {
WebRenderLayerManager*
WebRenderLayer::WrManager()
{
return static_cast<WebRenderLayerManager*>(GetLayer()->Manager());
}
WebRenderBridgeChild*
WebRenderLayer::WrBridge()
{
return WrManager()->WrBridge();
}
WrImageKey
WebRenderLayer::GetImageKey()
{
WrImageKey key;
key.mNamespace = WrBridge()->GetNamespace();
key.mHandle = WrBridge()->GetNextResourceId();
return key;
}
Rect
WebRenderLayer::RelativeToVisible(Rect aRect)
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
aRect.MoveBy(-bounds.x, -bounds.y);
return aRect;
}
Rect
WebRenderLayer::RelativeToTransformedVisible(Rect aRect)
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
Rect transformed = GetLayer()->GetTransform().TransformBounds(IntRectToRect(bounds));
aRect.MoveBy(-transformed.x, -transformed.y);
return aRect;
}
Rect
WebRenderLayer::ParentStackingContextBounds()
{
// Walk up to find the parent stacking context. This will be created either
// by the nearest scrollable metrics, or by the parent layer which must be a
// ContainerLayer.
Layer* layer = GetLayer();
if (layer->GetParent()) {
return IntRectToRect(layer->GetParent()->GetVisibleRegion().GetBounds().ToUnknownRect());
}
return Rect();
}
Rect
WebRenderLayer::RelativeToParent(Rect aRect)
{
Rect parentBounds = ParentStackingContextBounds();
aRect.MoveBy(-parentBounds.x, -parentBounds.y);
return aRect;
}
Point
WebRenderLayer::GetOffsetToParent()
{
Rect parentBounds = ParentStackingContextBounds();
return parentBounds.TopLeft();
}
Rect
WebRenderLayer::VisibleBoundsRelativeToParent()
{
return RelativeToParent(IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect()));
}
Rect
WebRenderLayer::TransformedVisibleBoundsRelativeToParent()
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
Rect transformed = GetLayer()->GetTransform().TransformBounds(IntRectToRect(bounds));
return RelativeToParent(transformed);
}
Maybe<WrImageMask>
WebRenderLayer::BuildWrMaskLayer(bool aUnapplyLayerTransform)
{
if (GetLayer()->GetMaskLayer()) {
WebRenderLayer* maskLayer = ToWebRenderLayer(GetLayer()->GetMaskLayer());
// The size of mask layer is transformed, and we may set the layer transform
// to wr stacking context. So we should apply inverse transform for mask layer
// and reverse the offset of the stacking context.
gfx::Matrix4x4 transform = maskLayer->GetLayer()->GetTransform();
if (aUnapplyLayerTransform) {
gfx::Rect bounds = IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect());
transform = transform.PreTranslate(-bounds.x, -bounds.y, 0);
transform = transform * GetLayer()->GetTransform().Inverse();
}
return maskLayer->RenderMaskLayer(transform);
}
return Nothing();
}
gfx::Rect
WebRenderLayer::GetWrBoundsRect()
{
LayerIntRect bounds = GetLayer()->GetVisibleRegion().GetBounds();
return Rect(0, 0, bounds.width, bounds.height);
}
gfx::Rect
WebRenderLayer::GetWrClipRect(gfx::Rect& aRect)
{
gfx::Rect clip;
Layer* layer = GetLayer();
Matrix4x4 transform = layer->GetTransform();
if (layer->GetClipRect().isSome()) {
clip = RelativeToVisible(transform.Inverse().TransformBounds(
IntRectToRect(layer->GetClipRect().ref().ToUnknownRect()))
);
} else {
clip = aRect;
}
return clip;
}
gfx::Matrix4x4
WebRenderLayer::GetWrBoundTransform()
{
gfx::Matrix4x4 transform = GetLayer()->GetTransform();
transform._41 = 0.0f;
transform._42 = 0.0f;
transform._43 = 0.0f;
return transform;
}
gfx::Rect
WebRenderLayer::GetWrRelBounds()
{
gfx::Rect bounds = IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect());
gfx::Matrix4x4 transform = GetWrBoundTransform();
if (!transform.IsIdentity()) {
// WR will only apply the 'translate' of the transform, so we need to do the scale/rotation manually.
bounds.MoveTo(transform.TransformPoint(bounds.TopLeft()));
}
return RelativeToParent(bounds);
}
Maybe<wr::ImageKey>
WebRenderLayer::UpdateImageKey(ImageClientSingle* aImageClient,
ImageContainer* aContainer,
Maybe<wr::ImageKey>& aOldKey,
wr::ExternalImageId& aExternalImageId)
{
MOZ_ASSERT(aImageClient);
MOZ_ASSERT(aContainer);
uint32_t oldCounter = aImageClient->GetLastUpdateGenerationCounter();
bool ret = aImageClient->UpdateImage(aContainer, /* unused */0);
if (!ret || aImageClient->IsEmpty()) {
// Delete old key
if (aOldKey.isSome()) {
WrManager()->AddImageKeyForDiscard(aOldKey.value());
}
return Nothing();
}
// Reuse old key if generation is not updated.
if (oldCounter == aImageClient->GetLastUpdateGenerationCounter() && aOldKey.isSome()) {
return aOldKey;
}
// Delete old key, we are generating a new key.
if (aOldKey.isSome()) {
WrManager()->AddImageKeyForDiscard(aOldKey.value());
}
WrImageKey key = GetImageKey();
WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(aExternalImageId, key));
return Some(key);
}
void
WebRenderLayer::DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect)
{
if (!gfxPrefs::LayersDump()) {
return;
}
Matrix4x4 transform = GetLayer()->GetTransform();
Rect clip = GetWrClipRect(aRect);
Rect relBounds = GetWrRelBounds();
Rect overflow(0, 0, relBounds.width, relBounds.height);
WrMixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetLayer()->GetMixBlendMode());
printf_stderr("%s %p using bounds=%s, overflow=%s, transform=%s, rect=%s, clip=%s, mix-blend-mode=%s\n",
aLayerType,
GetLayer(),
Stringify(relBounds).c_str(),
Stringify(overflow).c_str(),
Stringify(transform).c_str(),
Stringify(aRect).c_str(),
Stringify(clip).c_str(),
Stringify(mixBlendMode).c_str());
}
} // namespace layers
} // namespace mozilla

View File

@ -0,0 +1,66 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef GFX_WEBRENDERLAYER_H
#define GFX_WEBRENDERLAYER_H
#include "Layers.h"
#include "mozilla/webrender/WebRenderTypes.h"
#include "mozilla/webrender/WebRenderAPI.h"
namespace mozilla {
namespace layers {
class ImageClientSingle;
class WebRenderBridgeChild;
class WebRenderLayerManager;
class WebRenderLayer
{
public:
virtual Layer* GetLayer() = 0;
virtual void RenderLayer(wr::DisplayListBuilder& aBuilder) = 0;
virtual Maybe<WrImageMask> RenderMaskLayer(const gfx::Matrix4x4& aTransform)
{
MOZ_ASSERT(false);
return Nothing();
}
virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() { return nullptr; }
static inline WebRenderLayer*
ToWebRenderLayer(Layer* aLayer)
{
return static_cast<WebRenderLayer*>(aLayer->ImplData());
}
Maybe<wr::ImageKey> UpdateImageKey(ImageClientSingle* aImageClient,
ImageContainer* aContainer,
Maybe<wr::ImageKey>& aOldKey,
wr::ExternalImageId& aExternalImageId);
WebRenderLayerManager* WrManager();
WebRenderBridgeChild* WrBridge();
WrImageKey GetImageKey();
gfx::Rect RelativeToVisible(gfx::Rect aRect);
gfx::Rect RelativeToTransformedVisible(gfx::Rect aRect);
gfx::Rect ParentStackingContextBounds();
gfx::Rect RelativeToParent(gfx::Rect aRect);
gfx::Rect VisibleBoundsRelativeToParent();
gfx::Point GetOffsetToParent();
gfx::Rect TransformedVisibleBoundsRelativeToParent();
protected:
gfx::Rect GetWrBoundsRect();
gfx::Rect GetWrRelBounds();
gfx::Rect GetWrClipRect(gfx::Rect& aRect);
gfx::Matrix4x4 GetWrBoundTransform();
void DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect);
Maybe<WrImageMask> BuildWrMaskLayer(bool aUnapplyLayerTransform);
};
} // namespace layers
} // namespace mozilla
#endif /* GFX_WEBRENDERLAYER_H */

View File

@ -5,20 +5,13 @@
#include "WebRenderLayerManager.h"
#include "apz/src/AsyncPanZoomController.h"
#include "gfxPrefs.h"
#include "LayersLogging.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/dom/TabChild.h"
#include "mozilla/gfx/GPUProcessManager.h"
#include "mozilla/layers/APZCTreeManager.h"
#include "mozilla/layers/AsyncCompositionManager.h"
#include "mozilla/layers/CompositorBridgeChild.h"
#include "mozilla/layers/TextureClient.h"
#include "mozilla/layers/WebRenderBridgeChild.h"
#include "mozilla/widget/PlatformWidgetTypes.h"
#include "nsThreadUtils.h"
#include "TreeTraversal.h"
#include "WebRenderCanvasLayer.h"
#include "WebRenderColorLayer.h"
#include "WebRenderContainerLayer.h"
@ -33,214 +26,6 @@ using namespace gfx;
namespace layers {
WebRenderLayerManager*
WebRenderLayer::WrManager()
{
return static_cast<WebRenderLayerManager*>(GetLayer()->Manager());
}
WebRenderBridgeChild*
WebRenderLayer::WrBridge()
{
return WrManager()->WrBridge();
}
WrImageKey
WebRenderLayer::GetImageKey()
{
WrImageKey key;
key.mNamespace = WrBridge()->GetNamespace();
key.mHandle = WrBridge()->GetNextResourceId();
return key;
}
Rect
WebRenderLayer::RelativeToVisible(Rect aRect)
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
aRect.MoveBy(-bounds.x, -bounds.y);
return aRect;
}
Rect
WebRenderLayer::RelativeToTransformedVisible(Rect aRect)
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
Rect transformed = GetLayer()->GetTransform().TransformBounds(IntRectToRect(bounds));
aRect.MoveBy(-transformed.x, -transformed.y);
return aRect;
}
Rect
WebRenderLayer::ParentStackingContextBounds()
{
// Walk up to find the parent stacking context. This will be created either
// by the nearest scrollable metrics, or by the parent layer which must be a
// ContainerLayer.
Layer* layer = GetLayer();
if (layer->GetParent()) {
return IntRectToRect(layer->GetParent()->GetVisibleRegion().GetBounds().ToUnknownRect());
}
return Rect();
}
Rect
WebRenderLayer::RelativeToParent(Rect aRect)
{
Rect parentBounds = ParentStackingContextBounds();
aRect.MoveBy(-parentBounds.x, -parentBounds.y);
return aRect;
}
Point
WebRenderLayer::GetOffsetToParent()
{
Rect parentBounds = ParentStackingContextBounds();
return parentBounds.TopLeft();
}
Rect
WebRenderLayer::VisibleBoundsRelativeToParent()
{
return RelativeToParent(IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect()));
}
Rect
WebRenderLayer::TransformedVisibleBoundsRelativeToParent()
{
IntRect bounds = GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect();
Rect transformed = GetLayer()->GetTransform().TransformBounds(IntRectToRect(bounds));
return RelativeToParent(transformed);
}
Maybe<WrImageMask>
WebRenderLayer::BuildWrMaskLayer(bool aUnapplyLayerTransform)
{
if (GetLayer()->GetMaskLayer()) {
WebRenderLayer* maskLayer = ToWebRenderLayer(GetLayer()->GetMaskLayer());
// The size of mask layer is transformed, and we may set the layer transform
// to wr stacking context. So we should apply inverse transform for mask layer
// and reverse the offset of the stacking context.
gfx::Matrix4x4 transform = maskLayer->GetLayer()->GetTransform();
if (aUnapplyLayerTransform) {
gfx::Rect bounds = IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect());
transform = transform.PreTranslate(-bounds.x, -bounds.y, 0);
transform = transform * GetLayer()->GetTransform().Inverse();
}
return maskLayer->RenderMaskLayer(transform);
}
return Nothing();
}
gfx::Rect
WebRenderLayer::GetWrBoundsRect()
{
LayerIntRect bounds = GetLayer()->GetVisibleRegion().GetBounds();
return Rect(0, 0, bounds.width, bounds.height);
}
gfx::Rect
WebRenderLayer::GetWrClipRect(gfx::Rect& aRect)
{
gfx::Rect clip;
Layer* layer = GetLayer();
Matrix4x4 transform = layer->GetTransform();
if (layer->GetClipRect().isSome()) {
clip = RelativeToVisible(transform.Inverse().TransformBounds(
IntRectToRect(layer->GetClipRect().ref().ToUnknownRect()))
);
} else {
clip = aRect;
}
return clip;
}
gfx::Matrix4x4
WebRenderLayer::GetWrBoundTransform()
{
gfx::Matrix4x4 transform = GetLayer()->GetTransform();
transform._41 = 0.0f;
transform._42 = 0.0f;
transform._43 = 0.0f;
return transform;
}
gfx::Rect
WebRenderLayer::GetWrRelBounds()
{
gfx::Rect bounds = IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect());
gfx::Matrix4x4 transform = GetWrBoundTransform();
if (!transform.IsIdentity()) {
// WR will only apply the 'translate' of the transform, so we need to do the scale/rotation manually.
bounds.MoveTo(transform.TransformPoint(bounds.TopLeft()));
}
return RelativeToParent(bounds);
}
Maybe<wr::ImageKey>
WebRenderLayer::UpdateImageKey(ImageClientSingle* aImageClient,
ImageContainer* aContainer,
Maybe<wr::ImageKey>& aOldKey,
wr::ExternalImageId& aExternalImageId)
{
MOZ_ASSERT(aImageClient);
MOZ_ASSERT(aContainer);
uint32_t oldCounter = aImageClient->GetLastUpdateGenerationCounter();
bool ret = aImageClient->UpdateImage(aContainer, /* unused */0);
if (!ret || aImageClient->IsEmpty()) {
// Delete old key
if (aOldKey.isSome()) {
WrManager()->AddImageKeyForDiscard(aOldKey.value());
}
return Nothing();
}
// Reuse old key if generation is not updated.
if (oldCounter == aImageClient->GetLastUpdateGenerationCounter() && aOldKey.isSome()) {
return aOldKey;
}
// Delete old key, we are generating a new key.
if (aOldKey.isSome()) {
WrManager()->AddImageKeyForDiscard(aOldKey.value());
}
WrImageKey key = GetImageKey();
WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(aExternalImageId, key));
return Some(key);
}
void
WebRenderLayer::DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect)
{
if (!gfxPrefs::LayersDump()) {
return;
}
Matrix4x4 transform = GetLayer()->GetTransform();
Rect clip = GetWrClipRect(aRect);
Rect relBounds = GetWrRelBounds();
Rect overflow(0, 0, relBounds.width, relBounds.height);
WrMixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetLayer()->GetMixBlendMode());
printf_stderr("%s %p using bounds=%s, overflow=%s, transform=%s, rect=%s, clip=%s, mix-blend-mode=%s\n",
aLayerType,
GetLayer(),
Stringify(relBounds).c_str(),
Stringify(overflow).c_str(),
Stringify(transform).c_str(),
Stringify(aRect).c_str(),
Stringify(clip).c_str(),
Stringify(mixBlendMode).c_str());
}
WebRenderLayerManager::WebRenderLayerManager(nsIWidget* aWidget)
: mWidget(aWidget)
, mLatestTransactionId(0)

View File

@ -8,12 +8,9 @@
#include "Layers.h"
#include "mozilla/ipc/MessageChannel.h"
#include "mozilla/layers/CompositorController.h"
#include "mozilla/layers/TransactionIdAllocator.h"
#include "mozilla/MozPromise.h"
#include "mozilla/webrender/webrender_ffi.h"
#include "mozilla/layers/TransactionIdAllocator.h"
#include "mozilla/webrender/WebRenderTypes.h"
#include "mozilla/webrender/WebRenderAPI.h"
class nsIWidget;
@ -21,59 +18,12 @@ namespace mozilla {
namespace layers {
class CompositorBridgeChild;
class ImageClientSingle;
class KnowsCompositor;
class PCompositorBridgeChild;
class WebRenderBridgeChild;
class WebRenderLayerManager;
class APZCTreeManager;
typedef MozPromise<mozilla::wr::PipelineId, mozilla::ipc::PromiseRejectReason, false> PipelineIdPromise;
class WebRenderLayer
{
public:
virtual Layer* GetLayer() = 0;
virtual void RenderLayer(wr::DisplayListBuilder& aBuilder) = 0;
virtual Maybe<WrImageMask> RenderMaskLayer(const gfx::Matrix4x4& aTransform)
{
MOZ_ASSERT(false);
return Nothing();
}
virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() { return nullptr; }
static inline WebRenderLayer*
ToWebRenderLayer(Layer* aLayer)
{
return static_cast<WebRenderLayer*>(aLayer->ImplData());
}
Maybe<wr::ImageKey> UpdateImageKey(ImageClientSingle* aImageClient,
ImageContainer* aContainer,
Maybe<wr::ImageKey>& aOldKey,
wr::ExternalImageId& aExternalImageId);
WebRenderLayerManager* WrManager();
WebRenderBridgeChild* WrBridge();
WrImageKey GetImageKey();
gfx::Rect RelativeToVisible(gfx::Rect aRect);
gfx::Rect RelativeToTransformedVisible(gfx::Rect aRect);
gfx::Rect ParentStackingContextBounds();
gfx::Rect RelativeToParent(gfx::Rect aRect);
gfx::Rect VisibleBoundsRelativeToParent();
gfx::Point GetOffsetToParent();
gfx::Rect TransformedVisibleBoundsRelativeToParent();
protected:
gfx::Rect GetWrBoundsRect();
gfx::Rect GetWrRelBounds();
gfx::Rect GetWrClipRect(gfx::Rect& aRect);
gfx::Matrix4x4 GetWrBoundTransform();
void DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect);
Maybe<WrImageMask> BuildWrMaskLayer(bool aUnapplyLayerTransform);
};
class WebRenderLayerManager final : public LayerManager
{
typedef nsTArray<RefPtr<Layer> > LayerRefArray;

View File

@ -9,7 +9,8 @@
#include "Layers.h"
#include "mozilla/layers/ContentClient.h"
#include "mozilla/layers/WebRenderBridgeChild.h"
#include "WebRenderLayerManager.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
#include "mozilla/webrender/WebRenderTypes.h"
namespace mozilla {

View File

@ -9,7 +9,8 @@
#include "gfxUtils.h"
#include "Layers.h"
#include "WebRenderLayerManager.h"
#include "mozilla/layers/WebRenderLayer.h"
#include "mozilla/layers/WebRenderLayerManager.h"
namespace mozilla {
namespace layers {