Bug 1722258 - Convert more LayerManager usage to use WindowRenderer. r=miko

Differential Revision: https://phabricator.services.mozilla.com/D120920
This commit is contained in:
Matt Woodrow
2021-07-28 20:58:22 +00:00
parent 2ad605e75d
commit 5436ad0e68
20 changed files with 220 additions and 186 deletions

View File

@@ -141,7 +141,7 @@ void BrowserBridgeParent::Destroy() {
} }
IPCResult BrowserBridgeParent::RecvShow(const OwnerShowInfo& aOwnerInfo) { IPCResult BrowserBridgeParent::RecvShow(const OwnerShowInfo& aOwnerInfo) {
mBrowserParent->AttachLayerManager(); mBrowserParent->AttachWindowRenderer();
Unused << mBrowserParent->SendShow(mBrowserParent->GetShowInfo(), aOwnerInfo); Unused << mBrowserParent->SendShow(mBrowserParent->GetShowInfo(), aOwnerInfo);
return IPC_OK(); return IPC_OK();
} }

View File

@@ -2672,12 +2672,12 @@ mozilla::ipc::IPCResult BrowserChild::RecvRenderLayers(
MOZ_ASSERT(mPuppetWidget); MOZ_ASSERT(mPuppetWidget);
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
// We send the current layer observer epoch to the compositor so that
// We send the current layer observer epoch to the compositor so that // BrowserParent knows whether a layer update notification corresponds to
// BrowserParent knows whether a layer update notification corresponds to // the latest RecvRenderLayers request that was made.
// the latest RecvRenderLayers request that was made. lm->SetLayersObserverEpoch(mLayersObserverEpoch);
lm->SetLayersObserverEpoch(mLayersObserverEpoch); }
} }
mRenderLayers = aEnabled; mRenderLayers = aEnabled;
@@ -2855,8 +2855,9 @@ void BrowserChild::InitRenderingState(
InitAPZState(); InitAPZState();
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
lm->SetLayersObserverEpoch(mLayersObserverEpoch); lm->SetLayersObserverEpoch(mLayersObserverEpoch);
}
} else { } else {
NS_WARNING("Fallback to BasicLayerManager"); NS_WARNING("Fallback to BasicLayerManager");
mLayersConnected = Some(false); mLayersConnected = Some(false);
@@ -3154,7 +3155,9 @@ void BrowserChild::DidComposite(mozilla::layers::TransactionId aTransactionId,
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); MOZ_ASSERT(lm);
lm->DidComposite(aTransactionId, aCompositeStart, aCompositeEnd); if (lm) {
lm->DidComposite(aTransactionId, aCompositeStart, aCompositeEnd);
}
} }
void BrowserChild::DidRequestComposite(const TimeStamp& aCompositeReqStart, void BrowserChild::DidRequestComposite(const TimeStamp& aCompositeReqStart,
@@ -3185,9 +3188,9 @@ void BrowserChild::ClearCachedResources() {
MOZ_ASSERT(mPuppetWidget); MOZ_ASSERT(mPuppetWidget);
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
lm->ClearCachedResources();
lm->ClearCachedResources(); }
if (nsCOMPtr<Document> document = GetTopLevelDocument()) { if (nsCOMPtr<Document> document = GetTopLevelDocument()) {
nsPresContext* presContext = document->GetPresContext(); nsPresContext* presContext = document->GetPresContext();
@@ -3201,9 +3204,9 @@ void BrowserChild::InvalidateLayers() {
MOZ_ASSERT(mPuppetWidget); MOZ_ASSERT(mPuppetWidget);
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
FrameLayerBuilder::InvalidateAllLayers(lm);
FrameLayerBuilder::InvalidateAllLayers(lm); }
} }
void BrowserChild::SchedulePaint() { void BrowserChild::SchedulePaint() {
@@ -3259,8 +3262,9 @@ void BrowserChild::ReinitRendering() {
InitAPZState(); InitAPZState();
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
lm->SetLayersObserverEpoch(mLayersObserverEpoch); lm->SetLayersObserverEpoch(mLayersObserverEpoch);
}
nsCOMPtr<Document> doc(GetTopLevelDocument()); nsCOMPtr<Document> doc(GetTopLevelDocument());
doc->NotifyLayerManagerRecreated(); doc->NotifyLayerManagerRecreated();
@@ -3271,10 +3275,10 @@ void BrowserChild::ReinitRenderingForDeviceReset() {
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
if (WebRenderLayerManager* wlm = lm->AsWebRenderLayerManager()) { if (lm && lm->AsWebRenderLayerManager()) {
wlm->DoDestroy(/* aIsSync */ true); lm->AsWebRenderLayerManager()->DoDestroy(/* aIsSync */ true);
} else if (ClientLayerManager* clm = lm->AsClientLayerManager()) { } else if (lm && lm->AsClientLayerManager()) {
if (ShadowLayerForwarder* fwd = clm->AsShadowForwarder()) { if (ShadowLayerForwarder* fwd = lm->AsShadowForwarder()) {
// Force the LayerTransactionChild to synchronously shutdown. It is // Force the LayerTransactionChild to synchronously shutdown. It is
// okay to do this early, we'll simply stop sending messages. This // okay to do this early, we'll simply stop sending messages. This
// step is necessary since otherwise the compositor will think we // step is necessary since otherwise the compositor will think we
@@ -3312,8 +3316,9 @@ void BrowserChild::NotifyJankedAnimations(
MOZ_ASSERT(mPuppetWidget); MOZ_ASSERT(mPuppetWidget);
RefPtr<LayerManager> lm = RefPtr<LayerManager> lm =
mPuppetWidget->GetWindowRenderer()->AsLayerManager(); mPuppetWidget->GetWindowRenderer()->AsLayerManager();
MOZ_ASSERT(lm); if (lm) {
lm->UpdatePartialPrerenderedAnimations(aJankedAnimations); lm->UpdatePartialPrerenderedAnimations(aJankedAnimations);
}
} }
mozilla::ipc::IPCResult BrowserChild::RecvRequestNotifyAfterRemotePaint() { mozilla::ipc::IPCResult BrowserChild::RecvRequestNotifyAfterRemotePaint() {

View File

@@ -912,8 +912,8 @@ void BrowserParent::InitRendering() {
#endif #endif
} }
bool BrowserParent::AttachLayerManager() { bool BrowserParent::AttachWindowRenderer() {
return !!mRemoteLayerTreeOwner.AttachLayerManager(); return mRemoteLayerTreeOwner.AttachWindowRenderer();
} }
void BrowserParent::MaybeShowFrame() { void BrowserParent::MaybeShowFrame() {
@@ -931,7 +931,7 @@ bool BrowserParent::Show(const OwnerShowInfo& aOwnerInfo) {
} }
MOZ_ASSERT(mRemoteLayerTreeOwner.IsInitialized()); MOZ_ASSERT(mRemoteLayerTreeOwner.IsInitialized());
if (!mRemoteLayerTreeOwner.AttachLayerManager()) { if (!mRemoteLayerTreeOwner.AttachWindowRenderer()) {
return false; return false;
} }

View File

@@ -455,7 +455,7 @@ class BrowserParent final : public PBrowserParent,
void ResumeLoad(uint64_t aPendingSwitchID); void ResumeLoad(uint64_t aPendingSwitchID);
void InitRendering(); void InitRendering();
bool AttachLayerManager(); bool AttachWindowRenderer();
void MaybeShowFrame(); void MaybeShowFrame();
bool Show(const OwnerShowInfo&); bool Show(const OwnerShowInfo&);

View File

@@ -144,8 +144,6 @@ class DidCompositeObserver {
* root layer, and each container layer holds a reference to its children. * root layer, and each container layer holds a reference to its children.
*/ */
class LayerManager : public WindowRenderer { class LayerManager : public WindowRenderer {
NS_INLINE_DECL_REFCOUNTING(LayerManager)
protected: protected:
typedef mozilla::gfx::DrawTarget DrawTarget; typedef mozilla::gfx::DrawTarget DrawTarget;
typedef mozilla::gfx::IntSize IntSize; typedef mozilla::gfx::IntSize IntSize;
@@ -160,7 +158,7 @@ class LayerManager : public WindowRenderer {
* for its widget going away. After this call, only user data calls * for its widget going away. After this call, only user data calls
* are valid on the layer manager. * are valid on the layer manager.
*/ */
virtual void Destroy(); void Destroy() override;
bool IsDestroyed() { return mDestroyed; } bool IsDestroyed() { return mDestroyed; }
virtual LayerManager* AsLayerManager() override { return this; } virtual LayerManager* AsLayerManager() override { return this; }
@@ -507,15 +505,6 @@ class LayerManager : public WindowRenderer {
static bool IsLogEnabled(); static bool IsLogEnabled();
static mozilla::LogModule* GetLog(); static mozilla::LogModule* GetLog();
bool IsCompositingCheap(LayersBackend aBackend) {
// LayersBackend::LAYERS_NONE is an error state, but in that case we should
// try to avoid loading the compositor!
return LayersBackend::LAYERS_BASIC != aBackend &&
LayersBackend::LAYERS_NONE != aBackend;
}
virtual bool IsCompositingCheap() { return true; }
bool IsInTransaction() const { return mInTransaction; } bool IsInTransaction() const { return mInTransaction; }
virtual void SetRegionToClear(const nsIntRegion& aRegion) { virtual void SetRegionToClear(const nsIntRegion& aRegion) {
@@ -524,8 +513,6 @@ class LayerManager : public WindowRenderer {
virtual float RequestProperty(const nsAString& property) { return -1; } virtual float RequestProperty(const nsAString& property) { return -1; }
const TimeStamp& GetAnimationReadyTime() const { return mAnimationReadyTime; }
virtual bool AsyncPanZoomEnabled() const { return false; } virtual bool AsyncPanZoomEnabled() const { return false; }
static void LayerUserDataDestroy(void* data); static void LayerUserDataDestroy(void* data);
@@ -600,9 +587,6 @@ class LayerManager : public WindowRenderer {
// Used for tracking CONTENT_FRAME_TIME_WITH_SVG // Used for tracking CONTENT_FRAME_TIME_WITH_SVG
bool mContainsSVG; bool mContainsSVG;
// The time when painting most recently finished. This is recorded so that
// we can time any play-pending animations from this point.
TimeStamp mAnimationReadyTime;
// The count of pixels that were painted in the current transaction. // The count of pixels that were painted in the current transaction.
uint32_t mPaintedPixelCount; uint32_t mPaintedPixelCount;
// The payload associated with currently pending painting work, for // The payload associated with currently pending painting work, for

View File

@@ -766,8 +766,10 @@ ShadowableLayer* ClientLayerManager::Hold(Layer* aLayer) {
bool ClientLayerManager::IsCompositingCheap() { bool ClientLayerManager::IsCompositingCheap() {
// Whether compositing is cheap depends on the parent backend. // Whether compositing is cheap depends on the parent backend.
return mForwarder->mShadowManager && return mForwarder->mShadowManager &&
LayerManager::IsCompositingCheap( (mForwarder->GetCompositorBackendType() !=
mForwarder->GetCompositorBackendType()); LayersBackend::LAYERS_NONE &&
mForwarder->GetCompositorBackendType() !=
LayersBackend::LAYERS_BASIC);
} }
bool ClientLayerManager::AreComponentAlphaLayersEnabled() { bool ClientLayerManager::AreComponentAlphaLayersEnabled() {

View File

@@ -6438,6 +6438,8 @@ void PresShell::Paint(nsView* aViewToPaint, const nsRegion& aDirtyRegion,
return; return;
} }
bgcolor = NS_ComposeColors(bgcolor, mCanvasBackgroundColor);
if (!layerManager) { if (!layerManager) {
// TODO: Once we support WindowRenderers that aren't a LayerManager, // TODO: Once we support WindowRenderers that aren't a LayerManager,
// then we need to handle this single color case for them. // then we need to handle this single color case for them.
@@ -6445,10 +6447,8 @@ void PresShell::Paint(nsView* aViewToPaint, const nsRegion& aDirtyRegion,
} }
if (layerManager->GetBackendType() == layers::LayersBackend::LAYERS_WR) { if (layerManager->GetBackendType() == layers::LayersBackend::LAYERS_WR) {
nsPresContext* pc = GetPresContext();
LayoutDeviceRect bounds = LayoutDeviceRect::FromAppUnits( LayoutDeviceRect bounds = LayoutDeviceRect::FromAppUnits(
pc->GetVisibleArea(), pc->AppUnitsPerDevPixel()); presContext->GetVisibleArea(), presContext->AppUnitsPerDevPixel());
bgcolor = NS_ComposeColors(bgcolor, mCanvasBackgroundColor);
WebRenderBackgroundData data(wr::ToLayoutRect(bounds), WebRenderBackgroundData data(wr::ToLayoutRect(bounds),
wr::ToColorF(ToDeviceColor(bgcolor))); wr::ToColorF(ToDeviceColor(bgcolor)));
WrFiltersHolder wrFilters; WrFiltersHolder wrFilters;
@@ -6461,10 +6461,8 @@ void PresShell::Paint(nsView* aViewToPaint, const nsRegion& aDirtyRegion,
RefPtr<ColorLayer> root = layerManager->CreateColorLayer(); RefPtr<ColorLayer> root = layerManager->CreateColorLayer();
if (root) { if (root) {
nsPresContext* pc = GetPresContext(); nsIntRect bounds = presContext->GetVisibleArea().ToOutsidePixels(
nsIntRect bounds = presContext->AppUnitsPerDevPixel());
pc->GetVisibleArea().ToOutsidePixels(pc->AppUnitsPerDevPixel());
bgcolor = NS_ComposeColors(bgcolor, mCanvasBackgroundColor);
root->SetColor(ToDeviceColor(bgcolor)); root->SetColor(ToDeviceColor(bgcolor));
root->SetVisibleRegion(LayerIntRegion::FromUnknownRegion(bounds)); root->SetVisibleRegion(LayerIntRegion::FromUnknownRegion(bounds));
layerManager->SetRoot(root); layerManager->SetRoot(root);

View File

@@ -30,19 +30,17 @@ using namespace mozilla::layers;
namespace mozilla { namespace mozilla {
namespace layout { namespace layout {
static already_AddRefed<LayerManager> GetLayerManager( static already_AddRefed<WindowRenderer> GetWindowRenderer(
BrowserParent* aBrowserParent) { BrowserParent* aBrowserParent) {
RefPtr<LayerManager> lm; RefPtr<WindowRenderer> renderer;
if (Element* element = aBrowserParent->GetOwnerElement()) { if (Element* element = aBrowserParent->GetOwnerElement()) {
if (WindowRenderer* renderer = renderer = nsContentUtils::WindowRendererForContent(element);
nsContentUtils::WindowRendererForContent(element)) { if (renderer) {
lm = renderer->AsLayerManager(); return renderer.forget();
return lm.forget();
} }
if (WindowRenderer* renderer = renderer = nsContentUtils::WindowRendererForDocument(element->OwnerDoc());
nsContentUtils::WindowRendererForDocument(element->OwnerDoc())) { if (renderer) {
lm = renderer->AsLayerManager(); return renderer.forget();
return lm.forget();
} }
} }
return nullptr; return nullptr;
@@ -51,7 +49,6 @@ static already_AddRefed<LayerManager> GetLayerManager(
RemoteLayerTreeOwner::RemoteLayerTreeOwner() RemoteLayerTreeOwner::RemoteLayerTreeOwner()
: mLayersId{0}, : mLayersId{0},
mBrowserParent(nullptr), mBrowserParent(nullptr),
mLayerManager(nullptr),
mInitialized(false), mInitialized(false),
mLayersConnected(false) {} mLayersConnected(false) {}
@@ -63,9 +60,9 @@ bool RemoteLayerTreeOwner::Initialize(BrowserParent* aBrowserParent) {
} }
mBrowserParent = aBrowserParent; mBrowserParent = aBrowserParent;
RefPtr<LayerManager> lm = GetLayerManager(mBrowserParent); RefPtr<WindowRenderer> renderer = GetWindowRenderer(mBrowserParent);
PCompositorBridgeChild* compositor = PCompositorBridgeChild* compositor =
lm ? lm->GetCompositorBridgeChild() : nullptr; renderer ? renderer->GetCompositorBridgeChild() : nullptr;
mTabProcessId = mBrowserParent->Manager()->OtherPid(); mTabProcessId = mBrowserParent->Manager()->OtherPid();
// Our remote frame will push layers updates to the compositor, // Our remote frame will push layers updates to the compositor,
@@ -84,53 +81,56 @@ void RemoteLayerTreeOwner::Destroy() {
} }
mBrowserParent = nullptr; mBrowserParent = nullptr;
mLayerManager = nullptr; mWindowRenderer = nullptr;
} }
void RemoteLayerTreeOwner::EnsureLayersConnected( void RemoteLayerTreeOwner::EnsureLayersConnected(
CompositorOptions* aCompositorOptions) { CompositorOptions* aCompositorOptions) {
RefPtr<LayerManager> lm = GetLayerManager(mBrowserParent); RefPtr<WindowRenderer> renderer = GetWindowRenderer(mBrowserParent);
if (!lm) { if (!renderer) {
return; return;
} }
if (!lm->GetCompositorBridgeChild()) { if (!renderer->GetCompositorBridgeChild()) {
return; return;
} }
mLayersConnected = lm->GetCompositorBridgeChild()->SendNotifyChildRecreated( mLayersConnected =
mLayersId, &mCompositorOptions); renderer->GetCompositorBridgeChild()->SendNotifyChildRecreated(
mLayersId, &mCompositorOptions);
*aCompositorOptions = mCompositorOptions; *aCompositorOptions = mCompositorOptions;
} }
LayerManager* RemoteLayerTreeOwner::AttachLayerManager() { bool RemoteLayerTreeOwner::AttachWindowRenderer() {
RefPtr<LayerManager> lm; RefPtr<WindowRenderer> renderer;
if (mBrowserParent) { if (mBrowserParent) {
lm = GetLayerManager(mBrowserParent); renderer = GetWindowRenderer(mBrowserParent);
} }
// Perhaps the document containing this frame currently has no presentation? // Perhaps the document containing this frame currently has no presentation?
if (lm && lm->GetCompositorBridgeChild() && lm != mLayerManager) { if (renderer && renderer->GetCompositorBridgeChild() &&
renderer != mWindowRenderer) {
mLayersConnected = mLayersConnected =
lm->GetCompositorBridgeChild()->SendAdoptChild(mLayersId); renderer->GetCompositorBridgeChild()->SendAdoptChild(mLayersId);
FrameLayerBuilder::InvalidateAllLayers(lm); FrameLayerBuilder::InvalidateAllLayers(renderer->AsLayerManager());
} }
mLayerManager = std::move(lm); mWindowRenderer = std::move(renderer);
return mLayerManager; return !!mWindowRenderer;
} }
void RemoteLayerTreeOwner::OwnerContentChanged() { void RemoteLayerTreeOwner::OwnerContentChanged() {
Unused << AttachLayerManager(); Unused << AttachWindowRenderer();
} }
void RemoteLayerTreeOwner::GetTextureFactoryIdentifier( void RemoteLayerTreeOwner::GetTextureFactoryIdentifier(
TextureFactoryIdentifier* aTextureFactoryIdentifier) const { TextureFactoryIdentifier* aTextureFactoryIdentifier) const {
RefPtr<LayerManager> lm = RefPtr<WindowRenderer> renderer =
mBrowserParent ? GetLayerManager(mBrowserParent) : nullptr; mBrowserParent ? GetWindowRenderer(mBrowserParent) : nullptr;
// Perhaps the document containing this frame currently has no presentation? // Perhaps the document containing this frame currently has no presentation?
if (lm) { if (renderer && renderer->AsLayerManager()) {
*aTextureFactoryIdentifier = lm->GetTextureFactoryIdentifier(); *aTextureFactoryIdentifier =
renderer->AsLayerManager()->GetTextureFactoryIdentifier();
} else { } else {
*aTextureFactoryIdentifier = TextureFactoryIdentifier(); *aTextureFactoryIdentifier = TextureFactoryIdentifier();
} }

View File

@@ -49,7 +49,7 @@ class RemoteLayerTreeOwner final {
void Destroy(); void Destroy();
void EnsureLayersConnected(CompositorOptions* aCompositorOptions); void EnsureLayersConnected(CompositorOptions* aCompositorOptions);
LayerManager* AttachLayerManager(); bool AttachWindowRenderer();
void OwnerContentChanged(); void OwnerContentChanged();
LayersId GetLayersId() const { return mLayersId; } LayersId GetLayersId() const { return mLayersId; }
@@ -73,7 +73,7 @@ class RemoteLayerTreeOwner final {
CompositorOptions mCompositorOptions; CompositorOptions mCompositorOptions;
dom::BrowserParent* mBrowserParent; dom::BrowserParent* mBrowserParent;
RefPtr<LayerManager> mLayerManager; RefPtr<WindowRenderer> mWindowRenderer;
bool mInitialized; bool mInitialized;
// A flag that indicates whether or not the compositor knows about the // A flag that indicates whether or not the compositor knows about the

View File

@@ -12,8 +12,8 @@
#include "mozilla/layers/ScrollableLayerGuid.h" // for ScrollableLayerGuid, ScrollableLayerGuid::ViewID #include "mozilla/layers/ScrollableLayerGuid.h" // for ScrollableLayerGuid, ScrollableLayerGuid::ViewID
#include "nsRefPtrHashtable.h" // for nsRefPtrHashtable #include "nsRefPtrHashtable.h" // for nsRefPtrHashtable
class gfxContext;
namespace mozilla { namespace mozilla {
namespace layers { namespace layers {
class LayerManager; class LayerManager;
class WebRenderLayerManager; class WebRenderLayerManager;
@@ -81,7 +81,21 @@ class FrameRecorder {
FramesTimingRecording mRecording; FramesTimingRecording mRecording;
}; };
/**
* WindowRenderer is the retained rendering object owned by an nsIWidget for
* drawing the contents of that window, the role previously handled by
* LayerManager.
*
* It can be WebRender, (deprecated) Layers, or an immediate-mode
* FallbackRenderer.
*
* The intention is for LayerManager to be removed entirely in the near future,
* with WebRender inheriting directly from this class. It is likely that more
* cleanup can be done once that happens.
*/
class WindowRenderer : public FrameRecorder { class WindowRenderer : public FrameRecorder {
NS_INLINE_DECL_REFCOUNTING(WindowRenderer)
public: public:
// Cast to implementation types. // Cast to implementation types.
virtual layers::LayerManager* AsLayerManager() { return nullptr; } virtual layers::LayerManager* AsLayerManager() { return nullptr; }
@@ -117,6 +131,8 @@ class WindowRenderer : public FrameRecorder {
virtual bool EndEmptyTransaction( virtual bool EndEmptyTransaction(
EndTransactionFlags aFlags = END_DEFAULT) = 0; EndTransactionFlags aFlags = END_DEFAULT) = 0;
virtual void Destroy() {}
/** /**
* Type of layer manager this is. This is to be used sparsely in order to * Type of layer manager this is. This is to be used sparsely in order to
* avoid a lot of Layers backend specific code. It should be used only when * avoid a lot of Layers backend specific code. It should be used only when
@@ -154,6 +170,8 @@ class WindowRenderer : public FrameRecorder {
*/ */
virtual void WaitOnTransactionProcessed() {} virtual void WaitOnTransactionProcessed() {}
virtual bool IsCompositingCheap() { return true; }
/** /**
* Return the name of the layer manager's backend. * Return the name of the layer manager's backend.
*/ */
@@ -196,13 +214,21 @@ class WindowRenderer : public FrameRecorder {
void UpdatePartialPrerenderedAnimations( void UpdatePartialPrerenderedAnimations(
const nsTArray<uint64_t>& aJankedAnimations); const nsTArray<uint64_t>& aJankedAnimations);
const TimeStamp& GetAnimationReadyTime() const { return mAnimationReadyTime; }
protected: protected:
virtual ~WindowRenderer() = default;
// Transform animations which are not fully pre-rendered because it's on a // Transform animations which are not fully pre-rendered because it's on a
// large frame. We need to update the pre-rendered area once after we tried // large frame. We need to update the pre-rendered area once after we tried
// to composite area which is outside of the pre-rendered area on the // to composite area which is outside of the pre-rendered area on the
// compositor. // compositor.
nsRefPtrHashtable<nsUint64HashKey, dom::Animation> nsRefPtrHashtable<nsUint64HashKey, dom::Animation>
mPartialPrerenderedAnimations; mPartialPrerenderedAnimations;
// The time when painting most recently finished. This is recorded so that
// we can time any play-pending animations from this point.
TimeStamp mAnimationReadyTime;
}; };
} // namespace mozilla } // namespace mozilla

View File

@@ -2284,7 +2284,7 @@ static void TriggerPendingAnimations(Document& aDoc,
aDoc.EnumerateSubDocuments(recurse); aDoc.EnumerateSubDocuments(recurse);
} }
LayerManager* nsDisplayListBuilder::GetWidgetLayerManager(nsView** aView) { WindowRenderer* nsDisplayListBuilder::GetWidgetWindowRenderer(nsView** aView) {
if (aView) { if (aView) {
*aView = RootReferenceFrame()->GetView(); *aView = RootReferenceFrame()->GetView();
} }
@@ -2294,10 +2294,15 @@ LayerManager* nsDisplayListBuilder::GetWidgetLayerManager(nsView** aView) {
} }
nsIWidget* window = RootReferenceFrame()->GetNearestWidget(); nsIWidget* window = RootReferenceFrame()->GetNearestWidget();
if (window) { if (window) {
WindowRenderer* renderer = window->GetWindowRenderer(); return window->GetWindowRenderer();
if (renderer) { }
return renderer->AsLayerManager(); return nullptr;
} }
LayerManager* nsDisplayListBuilder::GetWidgetLayerManager(nsView** aView) {
WindowRenderer* renderer = GetWidgetWindowRenderer();
if (renderer) {
return renderer->AsLayerManager();
} }
return nullptr; return nullptr;
} }
@@ -2465,13 +2470,17 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
AUTO_PROFILER_LABEL("nsDisplayList::PaintRoot", GRAPHICS); AUTO_PROFILER_LABEL("nsDisplayList::PaintRoot", GRAPHICS);
RefPtr<LayerManager> layerManager; RefPtr<LayerManager> layerManager;
WindowRenderer* renderer = nullptr;
bool widgetTransaction = false; bool widgetTransaction = false;
bool doBeginTransaction = true; bool doBeginTransaction = true;
nsView* view = nullptr; nsView* view = nullptr;
if (aFlags & PAINT_USE_WIDGET_LAYERS) { if (aFlags & PAINT_USE_WIDGET_LAYERS) {
layerManager = aBuilder->GetWidgetLayerManager(&view); renderer = aBuilder->GetWidgetWindowRenderer(&view);
if (layerManager) { if (renderer) {
layerManager->SetContainsSVG(false); layerManager = renderer->AsLayerManager();
if (layerManager) {
layerManager->SetContainsSVG(false);
}
doBeginTransaction = !(aFlags & PAINT_EXISTING_TRANSACTION); doBeginTransaction = !(aFlags & PAINT_EXISTING_TRANSACTION);
widgetTransaction = true; widgetTransaction = true;
@@ -2483,7 +2492,7 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
PresShell* presShell = presContext->PresShell(); PresShell* presShell = presContext->PresShell();
Document* document = presShell->GetDocument(); Document* document = presShell->GetDocument();
if (!layerManager) { if (!renderer) {
if (!aCtx) { if (!aCtx) {
NS_WARNING("Nowhere to paint into"); NS_WARNING("Nowhere to paint into");
return nullptr; return nullptr;
@@ -2499,7 +2508,8 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
return nullptr; return nullptr;
} }
if (layerManager->GetBackendType() == LayersBackend::LAYERS_WR) { if (renderer->GetBackendType() == LayersBackend::LAYERS_WR) {
MOZ_ASSERT(layerManager);
if (doBeginTransaction) { if (doBeginTransaction) {
if (aCtx) { if (aCtx) {
if (!layerManager->BeginTransactionWithTarget(aCtx)) { if (!layerManager->BeginTransactionWithTarget(aCtx)) {
@@ -2571,39 +2581,40 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
UniquePtr<LayerProperties> props; UniquePtr<LayerProperties> props;
bool computeInvalidRect = bool computeInvalidRect =
(computeInvalidFunc || (!layerManager->IsCompositingCheap() && (computeInvalidFunc || (!renderer->IsCompositingCheap() &&
layerManager->NeedsWidgetInvalidation())) && renderer->NeedsWidgetInvalidation())) &&
widgetTransaction; widgetTransaction;
if (computeInvalidRect) { if (computeInvalidRect && layerManager) {
props = LayerProperties::CloneFrom(layerManager->GetRoot()); props = LayerProperties::CloneFrom(layerManager->GetRoot());
} }
if (doBeginTransaction) { if (doBeginTransaction) {
if (aCtx) { if (aCtx) {
MOZ_ASSERT(layerManager);
if (!layerManager->BeginTransactionWithTarget(aCtx)) { if (!layerManager->BeginTransactionWithTarget(aCtx)) {
return nullptr; return nullptr;
} }
} else { } else {
if (!layerManager->BeginTransaction()) { if (!renderer->BeginTransaction()) {
return nullptr; return nullptr;
} }
} }
} }
bool temp = bool temp = aBuilder->SetIsCompositingCheap(renderer->IsCompositingCheap());
aBuilder->SetIsCompositingCheap(layerManager->IsCompositingCheap());
LayerManager::EndTransactionFlags flags = LayerManager::END_DEFAULT; LayerManager::EndTransactionFlags flags = LayerManager::END_DEFAULT;
if (layerManager->NeedsWidgetInvalidation() && if (renderer->NeedsWidgetInvalidation() && (aFlags & PAINT_NO_COMPOSITE)) {
(aFlags & PAINT_NO_COMPOSITE)) {
flags = LayerManager::END_NO_COMPOSITE; flags = LayerManager::END_NO_COMPOSITE;
} }
MaybeSetupTransactionIdAllocator(layerManager, presContext); if (layerManager) {
MaybeSetupTransactionIdAllocator(layerManager, presContext);
}
bool sent = false; bool sent = false;
if (aFlags & PAINT_IDENTICAL_DISPLAY_LIST) { if (aFlags & PAINT_IDENTICAL_DISPLAY_LIST) {
sent = layerManager->EndEmptyTransaction(flags); sent = renderer->EndEmptyTransaction(flags);
} }
if (!sent) { if (!sent) {
@@ -2634,7 +2645,7 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
aBuilder->SetIsCompositingCheap(temp); aBuilder->SetIsCompositingCheap(temp);
if (document && widgetTransaction) { if (document && widgetTransaction && layerManager) {
TriggerPendingAnimations(*document, layerManager->GetAnimationReadyTime()); TriggerPendingAnimations(*document, layerManager->GetAnimationReadyTime());
} }
@@ -2644,11 +2655,11 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
computeInvalidFunc)) { computeInvalidFunc)) {
invalid = nsIntRect::MaxIntRect(); invalid = nsIntRect::MaxIntRect();
} }
} else if (widgetTransaction) { } else if (widgetTransaction && layerManager) {
LayerProperties::ClearInvalidations(layerManager->GetRoot()); LayerProperties::ClearInvalidations(layerManager->GetRoot());
} }
bool shouldInvalidate = layerManager->NeedsWidgetInvalidation(); bool shouldInvalidate = renderer->NeedsWidgetInvalidation();
if (view) { if (view) {
if (props) { if (props) {
@@ -2677,7 +2688,9 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(
} }
} }
layerManager->SetUserData(&gLayerManagerLayerBuilder, nullptr); if (layerManager) {
layerManager->SetUserData(&gLayerManagerLayerBuilder, nullptr);
}
return layerManager.forget(); return layerManager.forget();
} }

View File

@@ -422,6 +422,7 @@ class nsDisplayListBuilder {
mTemporaryItems.AppendElement(aItem); mTemporaryItems.AppendElement(aItem);
} }
WindowRenderer* GetWidgetWindowRenderer(nsView** aView = nullptr);
layers::LayerManager* GetWidgetLayerManager(nsView** aView = nullptr); layers::LayerManager* GetWidgetLayerManager(nsView** aView = nullptr);
/** /**

View File

@@ -336,6 +336,9 @@ void nsViewManager::Refresh(nsView* aView,
// Try to just Composite the current WindowRenderer contents. If // Try to just Composite the current WindowRenderer contents. If
// that fails then we need tor repaint, and request that it gets // that fails then we need tor repaint, and request that it gets
// composited as well. // composited as well.
// Once BasicLayerManager is removed, Composite will never succeed, so
// we can remove it and only have the call to Paint for
// FallbackRenderer.
if (!presShell->Composite(aView)) { if (!presShell->Composite(aView)) {
presShell->Paint(aView, damageRegion, PaintFlags::PaintComposite); presShell->Paint(aView, damageRegion, PaintFlags::PaintComposite);
} }

View File

@@ -21,6 +21,7 @@
#include "mozilla/PresShell.h" #include "mozilla/PresShell.h"
#include "mozilla/SchedulerGroup.h" #include "mozilla/SchedulerGroup.h"
#include "mozilla/StaticPrefs_browser.h" #include "mozilla/StaticPrefs_browser.h"
#include "mozilla/StaticPrefs_gfx.h"
#include "mozilla/TextComposition.h" #include "mozilla/TextComposition.h"
#include "mozilla/TextEventDispatcher.h" #include "mozilla/TextEventDispatcher.h"
#include "mozilla/TextEvents.h" #include "mozilla/TextEvents.h"
@@ -117,7 +118,7 @@ void PuppetWidget::InfallibleCreate(nsIWidget* aParent,
PuppetWidget* parent = static_cast<PuppetWidget*>(aParent); PuppetWidget* parent = static_cast<PuppetWidget*>(aParent);
if (parent) { if (parent) {
parent->SetChild(this); parent->SetChild(this);
mLayerManager = parent->GetWindowRenderer()->AsLayerManager(); mWindowRenderer = parent->GetWindowRenderer();
} else { } else {
Resize(mBounds.X(), mBounds.Y(), mBounds.Width(), mBounds.Height(), false); Resize(mBounds.X(), mBounds.Y(), mBounds.Width(), mBounds.Height(), false);
} }
@@ -165,10 +166,10 @@ void PuppetWidget::Destroy() {
mMemoryPressureObserver = nullptr; mMemoryPressureObserver = nullptr;
} }
mChild = nullptr; mChild = nullptr;
if (mLayerManager) { if (mWindowRenderer) {
mLayerManager->Destroy(); mWindowRenderer->Destroy();
} }
mLayerManager = nullptr; mWindowRenderer = nullptr;
mBrowserChild = nullptr; mBrowserChild = nullptr;
} }
@@ -586,13 +587,13 @@ bool PuppetWidget::GetEditCommands(NativeKeyBindingsType aType,
} }
WindowRenderer* PuppetWidget::GetWindowRenderer() { WindowRenderer* PuppetWidget::GetWindowRenderer() {
if (!mLayerManager) { if (!mWindowRenderer) {
if (XRE_IsParentProcess()) { if (XRE_IsParentProcess()) {
// On the parent process there is no CompositorBridgeChild which confuses // On the parent process there is no CompositorBridgeChild which confuses
// some layers code, so we use basic layers instead. Note that we create // some layers code, so we use basic layers instead. Note that we create
// a non-retaining layer manager since we don't care about performance. // a non-retaining layer manager since we don't care about performance.
mLayerManager = new BasicLayerManager(BasicLayerManager::BLM_OFFSCREEN); mWindowRenderer = new BasicLayerManager(BasicLayerManager::BLM_OFFSCREEN);
return mLayerManager; return mWindowRenderer;
} }
// If we know for sure that the parent side of this BrowserChild is not // If we know for sure that the parent side of this BrowserChild is not
@@ -601,10 +602,10 @@ WindowRenderer* PuppetWidget::GetWindowRenderer() {
// can do drawing in this process. // can do drawing in this process.
MOZ_ASSERT(!mBrowserChild || MOZ_ASSERT(!mBrowserChild ||
mBrowserChild->IsLayersConnected() != Some(true)); mBrowserChild->IsLayersConnected() != Some(true));
mLayerManager = new BasicLayerManager(this); mWindowRenderer = CreateBasicLayerManager();
} }
return mLayerManager; return mWindowRenderer;
} }
bool PuppetWidget::CreateRemoteLayerManager( bool PuppetWidget::CreateRemoteLayerManager(
@@ -626,7 +627,7 @@ bool PuppetWidget::CreateRemoteLayerManager(
// it if we successfully create its successor because a partially initialized // it if we successfully create its successor because a partially initialized
// layer manager is worse than a fully initialized but shutdown layer manager. // layer manager is worse than a fully initialized but shutdown layer manager.
DestroyLayerManager(); DestroyLayerManager();
mLayerManager = std::move(lm); mWindowRenderer = std::move(lm);
return true; return true;
} }
@@ -1006,8 +1007,9 @@ void PuppetWidget::PaintNowIfNeeded() {
void PuppetWidget::OnMemoryPressure(layers::MemoryPressureReason aWhy) { void PuppetWidget::OnMemoryPressure(layers::MemoryPressureReason aWhy) {
if (aWhy != MemoryPressureReason::LOW_MEMORY_ONGOING && !mVisible && if (aWhy != MemoryPressureReason::LOW_MEMORY_ONGOING && !mVisible &&
mLayerManager && XRE_IsContentProcess()) { mWindowRenderer && mWindowRenderer->AsLayerManager() &&
mLayerManager->ClearCachedResources(); XRE_IsContentProcess()) {
mWindowRenderer->AsLayerManager()->ClearCachedResources();
} }
} }

View File

@@ -181,7 +181,7 @@ class PuppetWidget : public nsBaseWidget,
bool CreateRemoteLayerManager( bool CreateRemoteLayerManager(
const std::function<bool(LayerManager*)>& aInitializeFunc); const std::function<bool(LayerManager*)>& aInitializeFunc);
bool HasLayerManager() { return !!mLayerManager; } bool HasLayerManager() { return !!mWindowRenderer; }
virtual void SetInputContext(const InputContext& aContext, virtual void SetInputContext(const InputContext& aContext,
const InputContextAction& aAction) override; const InputContextAction& aAction) override;

View File

@@ -2186,21 +2186,21 @@ nsresult nsWindow::MakeFullScreen(bool aFullScreen, nsIScreen*) {
} }
mozilla::WindowRenderer* nsWindow::GetWindowRenderer() { mozilla::WindowRenderer* nsWindow::GetWindowRenderer() {
if (mLayerManager) { if (mWindowRenderer) {
return mLayerManager; return mWindowRenderer;
} }
if (mIsDisablingWebRender) { if (mIsDisablingWebRender) {
CreateLayerManager(); CreateLayerManager();
mIsDisablingWebRender = false; mIsDisablingWebRender = false;
return mLayerManager; return mWindowRenderer;
} }
return nullptr; return nullptr;
} }
void nsWindow::CreateLayerManager() { void nsWindow::CreateLayerManager() {
if (mLayerManager) { if (mWindowRenderer) {
return; return;
} }
@@ -2216,7 +2216,7 @@ void nsWindow::CreateLayerManager() {
if (ShouldUseOffMainThreadCompositing()) { if (ShouldUseOffMainThreadCompositing()) {
LayoutDeviceIntRect rect = GetBounds(); LayoutDeviceIntRect rect = GetBounds();
CreateCompositor(rect.Width(), rect.Height()); CreateCompositor(rect.Width(), rect.Height());
if (mLayerManager) { if (mWindowRenderer) {
return; return;
} }
@@ -2226,7 +2226,7 @@ void nsWindow::CreateLayerManager() {
if (!ComputeShouldAccelerate() || sFailedToCreateGLContext) { if (!ComputeShouldAccelerate() || sFailedToCreateGLContext) {
printf_stderr(" -- creating basic, not accelerated\n"); printf_stderr(" -- creating basic, not accelerated\n");
mLayerManager = CreateBasicLayerManager(); mWindowRenderer = CreateBasicLayerManager();
} }
} }

View File

@@ -705,10 +705,10 @@ void nsWindow::Destroy() {
mCreated = false; mCreated = false;
/** Need to clean our LayerManager up while still alive */ /** Need to clean our LayerManager up while still alive */
if (mLayerManager) { if (mWindowRenderer) {
mLayerManager->Destroy(); mWindowRenderer->Destroy();
} }
mLayerManager = nullptr; mWindowRenderer = nullptr;
#ifdef MOZ_WAYLAND #ifdef MOZ_WAYLAND
// Shut down our local vsync source // Shut down our local vsync source
@@ -3529,7 +3529,8 @@ gboolean nsWindow::OnExposeEvent(cairo_t* cr) {
bool painted = false; bool painted = false;
{ {
if (renderer->GetBackendType() == LayersBackend::LAYERS_BASIC) { if (renderer->GetBackendType() == LayersBackend::LAYERS_NONE ||
renderer->GetBackendType() == LayersBackend::LAYERS_BASIC) {
if (GetTransparencyMode() == eTransparencyTransparent && if (GetTransparencyMode() == eTransparencyTransparent &&
layerBuffering == BufferMode::BUFFER_NONE && mHasAlphaVisual) { layerBuffering == BufferMode::BUFFER_NONE && mHasAlphaVisual) {
// If our draw target is unbuffered and we use an alpha channel, // If our draw target is unbuffered and we use an alpha channel,
@@ -6117,9 +6118,9 @@ LayoutDeviceIntSize nsWindow::GetSafeWindowSize(LayoutDeviceIntSize aSize) {
// we also must ensure that the window can fit in a Cairo surface. // we also must ensure that the window can fit in a Cairo surface.
LayoutDeviceIntSize result = aSize; LayoutDeviceIntSize result = aSize;
int32_t maxSize = 32767; int32_t maxSize = 32767;
if (mLayerManager && mLayerManager->AsKnowsCompositor()) { if (mWindowRenderer && mWindowRenderer->AsKnowsCompositor()) {
maxSize = std::min(maxSize, maxSize = std::min(
mLayerManager->AsKnowsCompositor()->GetMaxTextureSize()); maxSize, mWindowRenderer->AsKnowsCompositor()->GetMaxTextureSize());
} }
if (result.width > maxSize) { if (result.width > maxSize) {
result.width = maxSize; result.width = maxSize;
@@ -6135,9 +6136,9 @@ void nsWindow::EnsureGrabs(void) {
} }
void nsWindow::CleanLayerManagerRecursive(void) { void nsWindow::CleanLayerManagerRecursive(void) {
if (mLayerManager) { if (mWindowRenderer) {
mLayerManager->Destroy(); mWindowRenderer->Destroy();
mLayerManager = nullptr; mWindowRenderer = nullptr;
} }
DestroyCompositor(); DestroyCompositor();
@@ -8284,7 +8285,7 @@ nsIWidget::WindowRenderer* nsWindow::GetWindowRenderer() {
// Prevent external code from triggering the re-creation of the // Prevent external code from triggering the re-creation of the
// LayerManager/Compositor during shutdown. Just return what we currently // LayerManager/Compositor during shutdown. Just return what we currently
// have, which is most likely null. // have, which is most likely null.
return mLayerManager; return mWindowRenderer;
} }
return nsBaseWidget::GetWindowRenderer(); return nsBaseWidget::GetWindowRenderer();
@@ -8305,9 +8306,9 @@ void nsWindow::SetCompositorWidgetDelegate(CompositorWidgetDelegate* delegate) {
} }
void nsWindow::ClearCachedResources() { void nsWindow::ClearCachedResources() {
if (mLayerManager && mLayerManager->GetBackendType() == if (mWindowRenderer && mWindowRenderer->GetBackendType() ==
mozilla::layers::LayersBackend::LAYERS_BASIC) { mozilla::layers::LayersBackend::LAYERS_BASIC) {
mLayerManager->ClearCachedResources(); mWindowRenderer->AsLayerManager()->ClearCachedResources();
} }
GList* children = gdk_window_peek_children(mGdkWindow); GList* children = gdk_window_peek_children(mGdkWindow);

View File

@@ -154,7 +154,6 @@ nsBaseWidget::nsBaseWidget()
: mWidgetListener(nullptr), : mWidgetListener(nullptr),
mAttachedWidgetListener(nullptr), mAttachedWidgetListener(nullptr),
mPreviouslyAttachedWidgetListener(nullptr), mPreviouslyAttachedWidgetListener(nullptr),
mLayerManager(nullptr),
mCompositorVsyncDispatcher(nullptr), mCompositorVsyncDispatcher(nullptr),
mBorderStyle(eBorderStyle_none), mBorderStyle(eBorderStyle_none),
mBounds(0, 0, 0, 0), mBounds(0, 0, 0, 0),
@@ -390,10 +389,10 @@ void nsBaseWidget::DestroyCompositor() {
// This prevents the layer manager from starting a new transaction during // This prevents the layer manager from starting a new transaction during
// shutdown. // shutdown.
void nsBaseWidget::RevokeTransactionIdAllocator() { void nsBaseWidget::RevokeTransactionIdAllocator() {
if (!mLayerManager) { if (!mWindowRenderer || !mWindowRenderer->AsLayerManager()) {
return; return;
} }
mLayerManager->SetTransactionIdAllocator(nullptr); mWindowRenderer->AsLayerManager()->SetTransactionIdAllocator(nullptr);
} }
void nsBaseWidget::ReleaseContentController() { void nsBaseWidget::ReleaseContentController() {
@@ -404,9 +403,9 @@ void nsBaseWidget::ReleaseContentController() {
} }
void nsBaseWidget::DestroyLayerManager() { void nsBaseWidget::DestroyLayerManager() {
if (mLayerManager) { if (mWindowRenderer) {
mLayerManager->Destroy(); mWindowRenderer->Destroy();
mLayerManager = nullptr; mWindowRenderer = nullptr;
} }
DestroyCompositor(); DestroyCompositor();
} }
@@ -436,8 +435,9 @@ void nsBaseWidget::FreeLocalesChangedObserver() {
nsBaseWidget::~nsBaseWidget() { nsBaseWidget::~nsBaseWidget() {
IMEStateManager::WidgetDestroyed(this); IMEStateManager::WidgetDestroyed(this);
if (mLayerManager) { if (mWindowRenderer && mWindowRenderer->AsLayerManager()) {
if (BasicLayerManager* mgr = mLayerManager->AsBasicLayerManager()) { if (BasicLayerManager* mgr =
mWindowRenderer->AsLayerManager()->AsBasicLayerManager()) {
mgr->ClearRetainerWidget(); mgr->ClearRetainerWidget();
} }
} }
@@ -881,12 +881,10 @@ nsresult nsBaseWidget::MakeFullScreen(bool aFullScreen, nsIScreen* aScreen) {
} }
nsBaseWidget::AutoLayerManagerSetup::AutoLayerManagerSetup( nsBaseWidget::AutoLayerManagerSetup::AutoLayerManagerSetup(
nsBaseWidget* aWidget, gfxContext* aTarget, BufferMode aDoubleBuffering, nsBaseWidget* aWidget, gfxContext* aTarget, BufferMode aDoubleBuffering)
ScreenRotation aRotation)
: mWidget(aWidget) { : mWidget(aWidget) {
LayerManager* lm = mWidget->GetWindowRenderer() WindowRenderer* renderer = mWidget->GetWindowRenderer();
? mWidget->GetWindowRenderer()->AsLayerManager() LayerManager* lm = renderer ? renderer->AsLayerManager() : nullptr;
: nullptr;
NS_ASSERTION( NS_ASSERTION(
!lm || lm->GetBackendType() == LayersBackend::LAYERS_BASIC, !lm || lm->GetBackendType() == LayersBackend::LAYERS_BASIC,
"AutoLayerManagerSetup instantiated for non-basic layer backend!"); "AutoLayerManagerSetup instantiated for non-basic layer backend!");
@@ -894,7 +892,8 @@ nsBaseWidget::AutoLayerManagerSetup::AutoLayerManagerSetup(
mLayerManager = lm->AsBasicLayerManager(); mLayerManager = lm->AsBasicLayerManager();
if (mLayerManager) { if (mLayerManager) {
mLayerManager->SetDefaultTarget(aTarget); mLayerManager->SetDefaultTarget(aTarget);
mLayerManager->SetDefaultTargetConfiguration(aDoubleBuffering, aRotation); mLayerManager->SetDefaultTargetConfiguration(aDoubleBuffering,
ROTATION_0);
} }
} }
} }
@@ -1482,7 +1481,7 @@ void nsBaseWidget::CreateCompositor(int aWidth, int aHeight) {
WindowUsesOMTC(); WindowUsesOMTC();
mLayerManager = std::move(lm); mWindowRenderer = std::move(lm);
// Only track compositors for top-level windows, since other window types // Only track compositors for top-level windows, since other window types
// may use the basic compositor. Except on the OS X - see bug 1306383 // may use the basic compositor. Except on the OS X - see bug 1306383
@@ -1494,7 +1493,7 @@ void nsBaseWidget::CreateCompositor(int aWidth, int aHeight) {
if (getCompositorFromThisWindow) { if (getCompositorFromThisWindow) {
gfxPlatform::GetPlatform()->NotifyCompositorCreated( gfxPlatform::GetPlatform()->NotifyCompositorCreated(
mLayerManager->GetCompositorBackendType()); mWindowRenderer->GetCompositorBackendType());
} }
} }
@@ -1508,7 +1507,7 @@ bool nsBaseWidget::ShouldUseOffMainThreadCompositing() {
} }
WindowRenderer* nsBaseWidget::GetWindowRenderer() { WindowRenderer* nsBaseWidget::GetWindowRenderer() {
if (!mLayerManager) { if (!mWindowRenderer) {
if (!mShutdownObserver) { if (!mShutdownObserver) {
// We are shutting down, do not try to re-create a LayerManager // We are shutting down, do not try to re-create a LayerManager
return nullptr; return nullptr;
@@ -1518,14 +1517,14 @@ WindowRenderer* nsBaseWidget::GetWindowRenderer() {
CreateCompositor(); CreateCompositor();
} }
if (!mLayerManager) { if (!mWindowRenderer) {
mLayerManager = CreateBasicLayerManager(); mWindowRenderer = CreateBasicLayerManager();
} }
} }
return mLayerManager; return mWindowRenderer;
} }
LayerManager* nsBaseWidget::CreateBasicLayerManager() { WindowRenderer* nsBaseWidget::CreateBasicLayerManager() {
return new BasicLayerManager(this); return new BasicLayerManager(this);
} }
@@ -1534,10 +1533,10 @@ CompositorBridgeChild* nsBaseWidget::GetRemoteRenderer() {
} }
void nsBaseWidget::ClearCachedWebrenderResources() { void nsBaseWidget::ClearCachedWebrenderResources() {
if (!mLayerManager || !mLayerManager->AsWebRenderLayerManager()) { if (!mWindowRenderer || !mWindowRenderer->AsWebRender()) {
return; return;
} }
mLayerManager->ClearCachedResources(); mWindowRenderer->AsWebRender()->ClearCachedResources();
} }
already_AddRefed<gfx::DrawTarget> nsBaseWidget::StartRemoteDrawing() { already_AddRefed<gfx::DrawTarget> nsBaseWidget::StartRemoteDrawing() {

View File

@@ -43,6 +43,7 @@ class gfxContext;
namespace mozilla { namespace mozilla {
class CompositorVsyncDispatcher; class CompositorVsyncDispatcher;
class LiveResizeListener; class LiveResizeListener;
class FallbackRenderer;
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
namespace a11y { namespace a11y {
@@ -396,8 +397,7 @@ class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference {
class AutoLayerManagerSetup { class AutoLayerManagerSetup {
public: public:
AutoLayerManagerSetup(nsBaseWidget* aWidget, gfxContext* aTarget, AutoLayerManagerSetup(nsBaseWidget* aWidget, gfxContext* aTarget,
BufferMode aDoubleBuffering, BufferMode aDoubleBuffering);
ScreenRotation aRotation = mozilla::ROTATION_0);
~AutoLayerManagerSetup(); ~AutoLayerManagerSetup();
private: private:
@@ -574,7 +574,7 @@ class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference {
return nsIWidget::CreateChildWindow(); return nsIWidget::CreateChildWindow();
} }
LayerManager* CreateBasicLayerManager(); WindowRenderer* CreateBasicLayerManager();
nsPopupType PopupType() const { return mPopupType; } nsPopupType PopupType() const { return mPopupType; }
@@ -700,7 +700,7 @@ class nsBaseWidget : public nsIWidget, public nsSupportsWeakReference {
nsIWidgetListener* mWidgetListener; nsIWidgetListener* mWidgetListener;
nsIWidgetListener* mAttachedWidgetListener; nsIWidgetListener* mAttachedWidgetListener;
nsIWidgetListener* mPreviouslyAttachedWidgetListener; nsIWidgetListener* mPreviouslyAttachedWidgetListener;
RefPtr<LayerManager> mLayerManager; RefPtr<WindowRenderer> mWindowRenderer;
RefPtr<CompositorSession> mCompositorSession; RefPtr<CompositorSession> mCompositorSession;
RefPtr<CompositorBridgeChild> mCompositorBridgeChild; RefPtr<CompositorBridgeChild> mCompositorBridgeChild;

View File

@@ -2075,7 +2075,7 @@ void nsWindow::Move(double aX, double aY) {
// Workaround SetWindowPos bug with D3D9. If our window has a clip // Workaround SetWindowPos bug with D3D9. If our window has a clip
// region, some drivers or OSes may incorrectly copy into the clipped-out // region, some drivers or OSes may incorrectly copy into the clipped-out
// area. // area.
if (IsPlugin() && !mLayerManager && mClipRects && if (IsPlugin() && !mWindowRenderer && mClipRects &&
(mClipRectCount != 1 || (mClipRectCount != 1 ||
!mClipRects[0].IsEqualInterior( !mClipRects[0].IsEqualInterior(
LayoutDeviceIntRect(0, 0, mBounds.Width(), mBounds.Height())))) { LayoutDeviceIntRect(0, 0, mBounds.Width(), mBounds.Height())))) {
@@ -4081,8 +4081,8 @@ bool nsWindow::HasPendingInputEvent() {
**************************************************************/ **************************************************************/
WindowRenderer* nsWindow::GetWindowRenderer() { WindowRenderer* nsWindow::GetWindowRenderer() {
if (mLayerManager) { if (mWindowRenderer) {
return mLayerManager; return mWindowRenderer;
} }
if (!mLocalesChangedObserver) { if (!mLocalesChangedObserver) {
@@ -4093,12 +4093,12 @@ WindowRenderer* nsWindow::GetWindowRenderer() {
::GetClientRect(mWnd, &windowRect); ::GetClientRect(mWnd, &windowRect);
// Try OMTC first. // Try OMTC first.
if (!mLayerManager && ShouldUseOffMainThreadCompositing()) { if (!mWindowRenderer && ShouldUseOffMainThreadCompositing()) {
gfxWindowsPlatform::GetPlatform()->UpdateRenderMode(); gfxWindowsPlatform::GetPlatform()->UpdateRenderMode();
CreateCompositor(); CreateCompositor();
} }
if (!mLayerManager) { if (!mWindowRenderer) {
MOZ_ASSERT(!mCompositorSession && !mCompositorBridgeChild); MOZ_ASSERT(!mCompositorSession && !mCompositorBridgeChild);
MOZ_ASSERT(!mCompositorWidgetDelegate); MOZ_ASSERT(!mCompositorWidgetDelegate);
@@ -4113,15 +4113,15 @@ WindowRenderer* nsWindow::GetWindowRenderer() {
mBasicLayersSurface = mBasicLayersSurface =
new InProcessWinCompositorWidget(initData, options, this); new InProcessWinCompositorWidget(initData, options, this);
mCompositorWidgetDelegate = mBasicLayersSurface; mCompositorWidgetDelegate = mBasicLayersSurface;
mLayerManager = CreateBasicLayerManager(); mWindowRenderer = CreateBasicLayerManager();
} }
NS_ASSERTION(mLayerManager, "Couldn't provide a valid layer manager."); NS_ASSERTION(mWindowRenderer, "Couldn't provide a valid window renderer.");
if (mLayerManager) { if (mWindowRenderer) {
// Update the size constraints now that the layer manager has been // Update the size constraints now that the layer manager has been
// created. // created.
KnowsCompositor* knowsCompositor = mLayerManager->AsKnowsCompositor(); KnowsCompositor* knowsCompositor = mWindowRenderer->AsKnowsCompositor();
if (knowsCompositor) { if (knowsCompositor) {
SizeConstraints c = mSizeConstraints; SizeConstraints c = mSizeConstraints;
mMaxTextureSize = knowsCompositor->GetMaxTextureSize(); mMaxTextureSize = knowsCompositor->GetMaxTextureSize();
@@ -4131,7 +4131,7 @@ WindowRenderer* nsWindow::GetWindowRenderer() {
} }
} }
return mLayerManager; return mWindowRenderer;
} }
/************************************************************** /**************************************************************
@@ -8034,9 +8034,9 @@ BOOL CALLBACK nsWindow::ClearResourcesCallback(HWND aWnd, LPARAM aMsg) {
} }
void nsWindow::ClearCachedResources() { void nsWindow::ClearCachedResources() {
if (mLayerManager && if (mWindowRenderer &&
mLayerManager->GetBackendType() == LayersBackend::LAYERS_BASIC) { mWindowRenderer->GetBackendType() == LayersBackend::LAYERS_BASIC) {
mLayerManager->ClearCachedResources(); mWindowRenderer->AsLayerManager()->ClearCachedResources();
} }
::EnumChildWindows(mWnd, nsWindow::ClearResourcesCallback, 0); ::EnumChildWindows(mWnd, nsWindow::ClearResourcesCallback, 0);
} }