mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
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:
parent
14eec8b500
commit
6e24ccd51b
@ -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',
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
230
gfx/layers/wr/WebRenderLayer.cpp
Normal file
230
gfx/layers/wr/WebRenderLayer.cpp
Normal 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
|
66
gfx/layers/wr/WebRenderLayer.h
Normal file
66
gfx/layers/wr/WebRenderLayer.h
Normal 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 */
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user