mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 23:35:34 +00:00
Bug 1342380 - Enable VsyncScheduler again r=kats
This commit is contained in:
parent
652303c435
commit
d489fa0451
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ public:
|
||||
WebRenderBridgeParent(CompositorBridgeParentBase* aCompositorBridge,
|
||||
const wr::PipelineId& aPipelineId,
|
||||
widget::CompositorWidget* aWidget,
|
||||
CompositorVsyncScheduler* aScheduler,
|
||||
RefPtr<wr::WebRenderAPI>&& aApi,
|
||||
RefPtr<WebRenderCompositableHolder>&& aHolder);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -41,6 +41,8 @@ public:
|
||||
|
||||
wr::WindowId GetId() const { return mId; }
|
||||
|
||||
void GenerateFrame();
|
||||
|
||||
void SetRootDisplayList(gfx::Color aBgColor,
|
||||
wr::Epoch aEpoch,
|
||||
LayerSize aViewportSize,
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user