Bug 1342380 - Enable VsyncScheduler again r=kats

This commit is contained in:
sotaro 2017-02-27 09:27:04 +09:00
parent 652303c435
commit d489fa0451
8 changed files with 34 additions and 14 deletions

View File

@ -1592,7 +1592,7 @@ CompositorBridgeParent::AllocPWebRenderBridgeParent(const wr::PipelineId& aPipel
MOZ_ASSERT(api); // TODO have a fallback
api->SetRootPipeline(aPipelineId);
*aIdNamespace = api->GetNamespace().mHandle;
mWrBridge = new WebRenderBridgeParent(this, aPipelineId, mWidget, Move(api), Move(holder));
mWrBridge = new WebRenderBridgeParent(this, aPipelineId, mWidget, nullptr, Move(api), Move(holder));
mCompositorScheduler = mWrBridge->CompositorScheduler();
MOZ_ASSERT(mCompositorScheduler);

View File

@ -222,7 +222,7 @@ CrossProcessCompositorBridgeParent::AllocPWebRenderBridgeParent(const wr::Pipeli
WebRenderBridgeParent* parent = nullptr;
RefPtr<wr::WebRenderAPI> api = root->GetWebRenderAPI();
RefPtr<WebRenderCompositableHolder> holder = root->CompositableHolder();
parent = new WebRenderBridgeParent(this, aPipelineId, nullptr, Move(api), Move(holder));
parent = new WebRenderBridgeParent(this, aPipelineId, nullptr, root->CompositorScheduler(), Move(api), Move(holder));
parent->AddRef(); // IPDL reference
sIndirectLayerTrees[pipelineHandle].mCrossProcessParent = this;

View File

@ -78,6 +78,7 @@ private:
WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompositorBridge,
const wr::PipelineId& aPipelineId,
widget::CompositorWidget* aWidget,
CompositorVsyncScheduler* aScheduler,
RefPtr<wr::WebRenderAPI>&& aApi,
RefPtr<WebRenderCompositableHolder>&& aHolder)
: mCompositorBridge(aCompositorBridge)
@ -86,6 +87,7 @@ WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompos
, mBuilder(Nothing())
, mApi(aApi)
, mCompositableHolder(aHolder)
, mCompositorScheduler(aScheduler)
, mChildLayerObserverEpoch(0)
, mParentLayerObserverEpoch(0)
, mWrEpoch(0)
@ -93,6 +95,7 @@ WebRenderBridgeParent::WebRenderBridgeParent(CompositorBridgeParentBase* aCompos
{
MOZ_ASSERT(mCompositableHolder);
if (mWidget) {
MOZ_ASSERT(!mCompositorScheduler);
mCompositorScheduler = new CompositorVsyncScheduler(this, mWidget);
}
}
@ -471,6 +474,11 @@ WebRenderBridgeParent::RecvDPGetSnapshot(PTextureParent* aTexture)
// Assert the stride of the buffer is what webrender expects
MOZ_ASSERT((uint32_t)(size.width * 4) == stride);
if (mCompositorScheduler->NeedsComposite()) {
mCompositorScheduler->CancelCurrentCompositeTask();
mCompositorScheduler->ForceComposeToTarget(nullptr, nullptr);
}
MOZ_ASSERT(mBuilder.isSome());
mApi->Readback(size, buffer, buffer_size);
@ -568,9 +576,7 @@ WebRenderBridgeParent::ActorDestroy(ActorDestroyReason aWhy)
void
WebRenderBridgeParent::CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::IntRect* aRect)
{
// TODO(bug 1328602) With the RenderThread, calling SetRootStackingContext
// should trigger the composition on the render thread.
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
mApi->GenerateFrame();
}
void
@ -641,11 +647,9 @@ WebRenderBridgeParent::DeleteOldImages()
void
WebRenderBridgeParent::ScheduleComposition()
{
MOZ_ASSERT(mApi);
// TODO(bug 1328602) should probably send a message to the render
// thread and force rendering, although in most cases where this is
// called, rendering should be triggered automatically already (maybe
// not in the ImageBridge case).
if (mCompositorScheduler) {
mCompositorScheduler->ScheduleComposition();
}
}
void
@ -663,11 +667,10 @@ WebRenderBridgeParent::ClearResources()
if (mBuilder.isSome()) {
mBuilder.reset();
}
if (mCompositorScheduler) {
if (mWidget && mCompositorScheduler) {
mCompositorScheduler->Destroy();
mCompositorScheduler = nullptr;
}
mCompositorScheduler = nullptr;
mApi = nullptr;
mCompositorBridge = nullptr;
}

View File

@ -46,6 +46,7 @@ public:
WebRenderBridgeParent(CompositorBridgeParentBase* aCompositorBridge,
const wr::PipelineId& aPipelineId,
widget::CompositorWidget* aWidget,
CompositorVsyncScheduler* aScheduler,
RefPtr<wr::WebRenderAPI>&& aApi,
RefPtr<WebRenderCompositableHolder>&& aHolder);

View File

@ -150,6 +150,12 @@ WebRenderAPI::~WebRenderAPI()
wr_api_delete(mWrApi);
}
void
WebRenderAPI::GenerateFrame()
{
wr_api_generate_frame(mWrApi);
}
void
WebRenderAPI::SetRootDisplayList(gfx::Color aBgColor,
Epoch aEpoch,

View File

@ -41,6 +41,8 @@ public:
wr::WindowId GetId() const { return mId; }
void GenerateFrame();
void SetRootDisplayList(gfx::Color aBgColor,
wr::Epoch aEpoch,
LayerSize aViewportSize,

View File

@ -168,7 +168,11 @@ pub unsafe extern fn wr_api_set_root_display_list(api: &mut RenderApi,
LayoutSize::new(viewport_width, viewport_height),
frame_builder.dl_builder,
preserve_frame_state);
api.generate_frame(None);
}
#[no_mangle]
pub extern fn wr_api_generate_frame(api: &mut RenderApi) {
api.generate_frame(None);
}
// Call MakeCurrent before this.

View File

@ -446,6 +446,10 @@ WR_INLINE void
wr_api_set_root_display_list(WrAPI* api, WrState* state, WrEpoch epoch, float w, float h)
WR_FUNC;
WR_INLINE void
wr_api_generate_frame(WrAPI* api)
WR_FUNC;
WR_INLINE void
wr_api_send_external_event(WrAPI* api, uintptr_t evt)
WR_DESTRUCTOR_SAFE_FUNC;