author | sotaro <sotaro.ikeda.g@gmail.com> |
Tue, 02 Oct 2018 12:13:22 +0900 | |
changeset 439041 | aa6baa1cd577a16cf471e36c1eee51d19b74d201 |
parent 439040 | 181d337b15bd2354fa1b910e735c1521ee8d7807 |
child 439042 | 31941d904a7c3df53ed5b4c9ecdc40025d865dfb |
push id | 108495 |
push user | sikeda@mozilla.com |
push date | Tue, 02 Oct 2018 03:13:45 +0000 |
treeherder | mozilla-inbound@aa6baa1cd577 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | nical |
bugs | 1495352 |
milestone | 64.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/webrender_bindings/RenderThread.cpp +++ b/gfx/webrender_bindings/RenderThread.cpp @@ -237,28 +237,29 @@ RenderThread::GetRenderer(wr::WindowId a size_t RenderThread::RendererCount() { MOZ_ASSERT(IsInRenderThread()); return mRenderers.size(); } void -RenderThread::NewFrameReady(wr::WindowId aWindowId) +RenderThread::HandleFrame(wr::WindowId aWindowId, bool aRender) { if (mHasShutdown) { return; } if (!IsInRenderThread()) { Loop()->PostTask( - NewRunnableMethod<wr::WindowId>("wr::RenderThread::NewFrameReady", - this, - &RenderThread::NewFrameReady, - aWindowId)); + NewRunnableMethod<wr::WindowId, bool>("wr::RenderThread::NewFrameReady", + this, + &RenderThread::HandleFrame, + aWindowId, + aRender)); return; } if (IsDestroyed(aWindowId)) { return; } if (mHandlingDeviceReset) { @@ -271,17 +272,17 @@ RenderThread::NewFrameReady(wr::WindowId MutexAutoLock lock(mFrameCountMapLock); auto it = mWindowInfos.find(AsUint64(aWindowId)); MOZ_ASSERT(it != mWindowInfos.end()); WindowInfo* info = it->second; MOZ_ASSERT(info->mPendingCount > 0); startTime = info->mStartTimes.front(); } - UpdateAndRender(aWindowId, startTime); + UpdateAndRender(aWindowId, startTime, aRender, /* aReadback */ false); FrameRenderingComplete(aWindowId); } void RenderThread::WakeUp(wr::WindowId aWindowId) { if (mHasShutdown) { return; @@ -348,33 +349,35 @@ NotifyDidRender(layers::CompositorBridge } wr_pipeline_info_delete(aInfo); } void RenderThread::UpdateAndRender(wr::WindowId aWindowId, const TimeStamp& aStartTime, + bool aRender, bool aReadback) { AUTO_PROFILER_TRACING("Paint", "Composite"); MOZ_ASSERT(IsInRenderThread()); + MOZ_ASSERT(aRender || !aReadback); auto it = mRenderers.find(aWindowId); MOZ_ASSERT(it != mRenderers.end()); if (it == mRenderers.end()) { return; } auto& renderer = it->second; - bool ret = renderer->UpdateAndRender(aReadback); - if (!ret) { - // Render did not happen, do not call NotifyDidRender. - return; + if (aRender) { + renderer->UpdateAndRender(aReadback); + } else { + renderer->Update(); } TimeStamp end = TimeStamp::Now(); auto info = renderer->FlushPipelineInfo(); RefPtr<layers::AsyncImagePipelineManager> pipelineMgr = renderer->GetCompositorBridge()->GetAsyncImagePipelineManager(); // pipelineMgr should always be non-null here because it is only nulled out @@ -745,35 +748,35 @@ WebRenderProgramCache::~WebRenderProgram wr_program_cache_delete(mProgramCache); } } // namespace wr } // namespace mozilla extern "C" { -static void NewFrameReady(mozilla::wr::WrWindowId aWindowId) +static void HandleFrame(mozilla::wr::WrWindowId aWindowId, bool aRender) { mozilla::wr::RenderThread::Get()->IncRenderingFrameCount(aWindowId); - mozilla::wr::RenderThread::Get()->NewFrameReady(aWindowId); + mozilla::wr::RenderThread::Get()->HandleFrame(aWindowId, aRender); } void wr_notifier_wake_up(mozilla::wr::WrWindowId aWindowId) { mozilla::wr::RenderThread::Get()->WakeUp(aWindowId); } void wr_notifier_new_frame_ready(mozilla::wr::WrWindowId aWindowId) { - NewFrameReady(aWindowId); + HandleFrame(aWindowId, /* aRender */ true); } void wr_notifier_nop_frame_done(mozilla::wr::WrWindowId aWindowId) { - mozilla::wr::RenderThread::Get()->DecPendingFrameCount(aWindowId); + HandleFrame(aWindowId, /* aRender */ false); } void wr_notifier_external_event(mozilla::wr::WrWindowId aWindowId, size_t aRawEvent) { mozilla::UniquePtr<mozilla::wr::RendererEvent> evt( reinterpret_cast<mozilla::wr::RendererEvent*>(aRawEvent)); mozilla::wr::RenderThread::Get()->RunEvent(mozilla::wr::WindowId(aWindowId), std::move(evt));
--- a/gfx/webrender_bindings/RenderThread.h +++ b/gfx/webrender_bindings/RenderThread.h @@ -121,29 +121,29 @@ public: void RemoveRenderer(wr::WindowId aWindowId); /// Can only be called from the render thread. RendererOGL* GetRenderer(wr::WindowId aWindowId); // RenderNotifier implementation /// Automatically forwarded to the render thread. - void NewFrameReady(wr::WindowId aWindowId); + void HandleFrame(wr::WindowId aWindowId, bool aRender); /// Automatically forwarded to the render thread. void WakeUp(wr::WindowId aWindowId); /// Automatically forwarded to the render thread. void PipelineSizeChanged(wr::WindowId aWindowId, uint64_t aPipelineId, float aWidth, float aHeight); /// Automatically forwarded to the render thread. void RunEvent(wr::WindowId aWindowId, UniquePtr<RendererEvent> aCallBack); /// Can only be called from the render thread. - void UpdateAndRender(wr::WindowId aWindowId, const TimeStamp& aStartTime, bool aReadback = false); + void UpdateAndRender(wr::WindowId aWindowId, const TimeStamp& aStartTime, bool aRender, bool aReadback); void Pause(wr::WindowId aWindowId); bool Resume(wr::WindowId aWindowId); /// Can be called from any thread. void RegisterExternalImage(uint64_t aExternalImageId, already_AddRefed<RenderTextureHost> aTexture); /// Can be called from any thread.
--- a/gfx/webrender_bindings/WebRenderAPI.cpp +++ b/gfx/webrender_bindings/WebRenderAPI.cpp @@ -411,17 +411,17 @@ WebRenderAPI::Readback(const TimeStamp& ~Readback() { MOZ_COUNT_DTOR(Readback); } virtual void Run(RenderThread& aRenderThread, WindowId aWindowId) override { - aRenderThread.UpdateAndRender(aWindowId, mStartTime, /* aReadback */ true); + aRenderThread.UpdateAndRender(aWindowId, mStartTime, /* aRender */ true, /* aReadback */ true); wr_renderer_readback(aRenderThread.GetRenderer(aWindowId)->GetRenderer(), mSize.width, mSize.height, mBuffer, mBufferSize); layers::AutoCompleteTask complete(mTask); } layers::SynchronousTask* mTask; TimeStamp mStartTime; gfx::IntSize mSize;