зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1363958 - Fix WebRenderLayerManager::FlushRendering() r=nical
This commit is contained in:
Родитель
2d1da95e46
Коммит
e155c862e7
|
@ -532,6 +532,11 @@ CompositorBridgeParent::RecvWaitOnTransactionProcessed()
|
|||
mozilla::ipc::IPCResult
|
||||
CompositorBridgeParent::RecvFlushRendering()
|
||||
{
|
||||
if (gfxVars::UseWebRender()) {
|
||||
mWrBridge->FlushRendering(/* aSync */ true);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
if (mCompositorScheduler->NeedsComposite()) {
|
||||
CancelCurrentCompositeTask();
|
||||
ForceComposeToTarget(nullptr);
|
||||
|
@ -542,6 +547,11 @@ CompositorBridgeParent::RecvFlushRendering()
|
|||
mozilla::ipc::IPCResult
|
||||
CompositorBridgeParent::RecvFlushRenderingAsync()
|
||||
{
|
||||
if (gfxVars::UseWebRender()) {
|
||||
mWrBridge->FlushRendering(/* aSync */ false);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
return RecvFlushRendering();
|
||||
}
|
||||
|
||||
|
|
|
@ -123,7 +123,7 @@ WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompos
|
|||
, mIdNameSpace(AllocIdNameSpace())
|
||||
, mPaused(false)
|
||||
, mDestroyed(false)
|
||||
, mIsSnapshotting(false)
|
||||
, mForceRendering(false)
|
||||
{
|
||||
MOZ_ASSERT(mCompositableHolder);
|
||||
mCompositableHolder->AddPipeline(mPipelineId);
|
||||
|
@ -618,7 +618,7 @@ WebRenderBridgeParent::RecvDPGetSnapshot(PTextureParent* aTexture)
|
|||
// Assert the stride of the buffer is what webrender expects
|
||||
MOZ_ASSERT((uint32_t)(size.width * 4) == stride);
|
||||
|
||||
mIsSnapshotting = true;
|
||||
mForceRendering = true;
|
||||
|
||||
if (mCompositorScheduler->NeedsComposite()) {
|
||||
mCompositorScheduler->CancelCurrentCompositeTask();
|
||||
|
@ -627,7 +627,7 @@ WebRenderBridgeParent::RecvDPGetSnapshot(PTextureParent* aTexture)
|
|||
|
||||
mApi->Readback(size, buffer, buffer_size);
|
||||
|
||||
mIsSnapshotting = false;
|
||||
mForceRendering = false;
|
||||
|
||||
return IPC_OK();
|
||||
}
|
||||
|
@ -822,7 +822,7 @@ WebRenderBridgeParent::CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::In
|
|||
|
||||
const uint32_t maxPendingFrameCount = 2;
|
||||
|
||||
if (!mIsSnapshotting &&
|
||||
if (!mForceRendering &&
|
||||
wr::RenderThread::Get()->GetPendingFrameCount(mApi->GetId()) > maxPendingFrameCount) {
|
||||
// Render thread is busy, try next time.
|
||||
ScheduleComposition();
|
||||
|
@ -938,6 +938,26 @@ WebRenderBridgeParent::ScheduleComposition()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
WebRenderBridgeParent::FlushRendering(bool aIsSync)
|
||||
{
|
||||
if (mDestroyed) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mCompositorScheduler->NeedsComposite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
mForceRendering = true;
|
||||
mCompositorScheduler->CancelCurrentCompositeTask();
|
||||
mCompositorScheduler->ForceComposeToTarget(nullptr, nullptr);
|
||||
if (aIsSync) {
|
||||
mApi->WaitFlushed();
|
||||
}
|
||||
mForceRendering = false;
|
||||
}
|
||||
|
||||
void
|
||||
WebRenderBridgeParent::Pause()
|
||||
{
|
||||
|
|
|
@ -177,6 +177,8 @@ public:
|
|||
return ++sIdNameSpace;
|
||||
}
|
||||
|
||||
void FlushRendering(bool aIsSync);
|
||||
|
||||
private:
|
||||
virtual ~WebRenderBridgeParent();
|
||||
|
||||
|
@ -252,7 +254,7 @@ private:
|
|||
|
||||
bool mPaused;
|
||||
bool mDestroyed;
|
||||
bool mIsSnapshotting;
|
||||
bool mForceRendering;
|
||||
|
||||
// Can only be accessed on the compositor thread.
|
||||
WebRenderScrollData mScrollData;
|
||||
|
|
|
@ -464,9 +464,16 @@ WebRenderLayerManager::RemoveDidCompositeObserver(DidCompositeObserver* aObserve
|
|||
void
|
||||
WebRenderLayerManager::FlushRendering()
|
||||
{
|
||||
CompositorBridgeChild* bridge = GetCompositorBridgeChild();
|
||||
if (bridge) {
|
||||
bridge->SendFlushRendering();
|
||||
CompositorBridgeChild* cBridge = GetCompositorBridgeChild();
|
||||
if (!cBridge) {
|
||||
return;
|
||||
}
|
||||
MOZ_ASSERT(mWidget);
|
||||
|
||||
if (mWidget->SynchronouslyRepaintOnResize() || gfxPrefs::LayersForceSynchronousResize()) {
|
||||
cBridge->SendFlushRendering();
|
||||
} else {
|
||||
cBridge->SendFlushRenderingAsync();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ class CompositorWidget;
|
|||
|
||||
namespace layers {
|
||||
class CompositorBridgeParentBase;
|
||||
class WebRenderBridgeParent;
|
||||
}
|
||||
|
||||
namespace wr {
|
||||
|
@ -125,6 +126,7 @@ protected:
|
|||
bool mUseANGLE;
|
||||
|
||||
friend class DisplayListBuilder;
|
||||
friend class layers::WebRenderBridgeParent;
|
||||
};
|
||||
|
||||
/// This is a simple C++ wrapper around WrState defined in the rust bindings.
|
||||
|
|
Загрузка…
Ссылка в новой задаче