mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-27 19:09:47 +00:00
Bug 1410777 - Force a full transaction for WR when the window overlay changes. r=mstange
The window buttons are drawn as part of the AddWindowOverlayWebRenderCommands function which is invoked in the full-transaction codepath. It should be possible to have the empty transaction codepath simply update the image (without building a full WR display list) and do a recomposite. That would be more performant but it requires some plumbing to build and ship across a IpcResourceUpdateQueue on empty transactions. MozReview-Commit-ID: 2Mrb0wELD6E --HG-- extra : rebase_source : 9a94c32f94403050835bf3445176f4fe2c1579fa
This commit is contained in:
parent
75717cb048
commit
b7e231bc45
@ -28,6 +28,7 @@ namespace layers {
|
|||||||
WebRenderLayerManager::WebRenderLayerManager(nsIWidget* aWidget)
|
WebRenderLayerManager::WebRenderLayerManager(nsIWidget* aWidget)
|
||||||
: mWidget(aWidget)
|
: mWidget(aWidget)
|
||||||
, mLatestTransactionId(0)
|
, mLatestTransactionId(0)
|
||||||
|
, mWindowOverlayChanged(false)
|
||||||
, mNeedsComposite(false)
|
, mNeedsComposite(false)
|
||||||
, mIsFirstPaint(false)
|
, mIsFirstPaint(false)
|
||||||
, mTarget(nullptr)
|
, mTarget(nullptr)
|
||||||
@ -174,6 +175,16 @@ WebRenderLayerManager::BeginTransaction()
|
|||||||
bool
|
bool
|
||||||
WebRenderLayerManager::EndEmptyTransaction(EndTransactionFlags aFlags)
|
WebRenderLayerManager::EndEmptyTransaction(EndTransactionFlags aFlags)
|
||||||
{
|
{
|
||||||
|
if (mWindowOverlayChanged) {
|
||||||
|
// If the window overlay changed then we can't do an empty transaction
|
||||||
|
// because we need to repaint the window overlay which we only currently
|
||||||
|
// support in a full transaction.
|
||||||
|
// XXX If we end up hitting this branch a lot we can probably optimize it
|
||||||
|
// by just sending an updated window overlay image instead of rebuilding
|
||||||
|
// the entire WR display list.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// With the WebRenderLayerManager we reject attempts to set most kind of
|
// With the WebRenderLayerManager we reject attempts to set most kind of
|
||||||
// "pending data" for empty transactions. Any place that attempts to update
|
// "pending data" for empty transactions. Any place that attempts to update
|
||||||
// transforms or scroll offset, for example, will get failure return values
|
// transforms or scroll offset, for example, will get failure return values
|
||||||
@ -275,6 +286,8 @@ WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList,
|
|||||||
contentSize);
|
contentSize);
|
||||||
|
|
||||||
mWidget->AddWindowOverlayWebRenderCommands(WrBridge(), builder, resourceUpdates);
|
mWidget->AddWindowOverlayWebRenderCommands(WrBridge(), builder, resourceUpdates);
|
||||||
|
mWindowOverlayChanged = false;
|
||||||
|
|
||||||
WrBridge()->ClearReadLocks();
|
WrBridge()->ClearReadLocks();
|
||||||
|
|
||||||
if (AsyncPanZoomEnabled()) {
|
if (AsyncPanZoomEnabled()) {
|
||||||
|
@ -154,6 +154,7 @@ public:
|
|||||||
WebRenderScrollData& GetScrollData() { return mScrollData; }
|
WebRenderScrollData& GetScrollData() { return mScrollData; }
|
||||||
|
|
||||||
void WrUpdated();
|
void WrUpdated();
|
||||||
|
void WindowOverlayChanged() { mWindowOverlayChanged = true; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
@ -191,6 +192,7 @@ private:
|
|||||||
// APZ to do it's job
|
// APZ to do it's job
|
||||||
WebRenderScrollData mScrollData;
|
WebRenderScrollData mScrollData;
|
||||||
|
|
||||||
|
bool mWindowOverlayChanged;
|
||||||
bool mNeedsComposite;
|
bool mNeedsComposite;
|
||||||
bool mIsFirstPaint;
|
bool mIsFirstPaint;
|
||||||
FocusTarget mFocusTarget;
|
FocusTarget mFocusTarget;
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
#include "mozilla/layers/InputAPZContext.h"
|
#include "mozilla/layers/InputAPZContext.h"
|
||||||
#include "mozilla/layers/IpcResourceUpdateQueue.h"
|
#include "mozilla/layers/IpcResourceUpdateQueue.h"
|
||||||
#include "mozilla/layers/WebRenderBridgeChild.h"
|
#include "mozilla/layers/WebRenderBridgeChild.h"
|
||||||
|
#include "mozilla/layers/WebRenderLayerManager.h"
|
||||||
#include "mozilla/webrender/WebRenderAPI.h"
|
#include "mozilla/webrender/WebRenderAPI.h"
|
||||||
#include "mozilla/widget/CompositorWidget.h"
|
#include "mozilla/widget/CompositorWidget.h"
|
||||||
#include "gfxUtils.h"
|
#include "gfxUtils.h"
|
||||||
@ -4021,6 +4022,8 @@ NSEvent* gLastDragMouseDownEvent = nil;
|
|||||||
if ([self isUsingOpenGL]) {
|
if ([self isUsingOpenGL]) {
|
||||||
if (ShadowLayerForwarder* slf = mGeckoChild->GetLayerManager()->AsShadowForwarder()) {
|
if (ShadowLayerForwarder* slf = mGeckoChild->GetLayerManager()->AsShadowForwarder()) {
|
||||||
slf->WindowOverlayChanged();
|
slf->WindowOverlayChanged();
|
||||||
|
} else if (WebRenderLayerManager* wrlm = mGeckoChild->GetLayerManager()->AsWebRenderLayerManager()) {
|
||||||
|
wrlm->WindowOverlayChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user