| Index: third_party/WebKit/Source/web/CompositorMutatorImpl.cpp
|
| diff --git a/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp b/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e3c52ac299d794b93f11c6551117d36cf6f7d111
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/web/CompositorMutatorImpl.cpp
|
| @@ -0,0 +1,87 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "web/CompositorMutatorImpl.h"
|
| +
|
| +#include "core/animation/CustomCompositorAnimationManager.h"
|
| +#include "core/dom/CompositorProxy.h"
|
| +#include "platform/ThreadSafeFunctional.h"
|
| +#include "platform/TraceEvent.h"
|
| +#include "platform/WaitableEvent.h"
|
| +#include "platform/graphics/CompositorMutationsTarget.h"
|
| +#include "platform/graphics/CompositorMutatorClient.h"
|
| +#include "platform/heap/Handle.h"
|
| +#include "public/platform/Platform.h"
|
| +#include "web/CompositorProxyClientImpl.h"
|
| +
|
| +namespace blink {
|
| +
|
| +namespace {
|
| +
|
| +void createCompositorMutatorClient(std::unique_ptr<CompositorMutatorClient>* ptr, WaitableEvent* doneEvent)
|
| +{
|
| + CompositorMutatorImpl* mutator = CompositorMutatorImpl::create();
|
| + ptr->reset(new CompositorMutatorClient(mutator, mutator->animationManager()));
|
| + mutator->setClient(ptr->get());
|
| + doneEvent->signal();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +CompositorMutatorImpl::CompositorMutatorImpl()
|
| + : m_animationManager(adoptPtr(new CustomCompositorAnimationManager))
|
| + , m_client(nullptr)
|
| +{
|
| +}
|
| +
|
| +std::unique_ptr<CompositorMutatorClient> CompositorMutatorImpl::createClient()
|
| +{
|
| + std::unique_ptr<CompositorMutatorClient> mutatorClient;
|
| + WaitableEvent doneEvent;
|
| + if (WebThread* compositorThread = Platform::current()->compositorThread()) {
|
| + compositorThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&createCompositorMutatorClient, AllowCrossThreadAccess(&mutatorClient), AllowCrossThreadAccess(&doneEvent)));
|
| + } else {
|
| + createCompositorMutatorClient(&mutatorClient, &doneEvent);
|
| + }
|
| + // TODO(flackr): Instead of waiting for this event, we may be able to just set the
|
| + // mutator on the CompositorProxyClient directly from the compositor thread before
|
| + // it gets used there. We still need to make sure we only create one mutator though.
|
| + doneEvent.wait();
|
| + return mutatorClient;
|
| +}
|
| +
|
| +CompositorMutatorImpl* CompositorMutatorImpl::create()
|
| +{
|
| + return new CompositorMutatorImpl();
|
| +}
|
| +
|
| +bool CompositorMutatorImpl::mutate(double monotonicTimeNow)
|
| +{
|
| + TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::mutate");
|
| + bool needToReinvoke = false;
|
| + // TODO(vollick): we should avoid executing the animation frame
|
| + // callbacks if none of the proxies in the global scope are affected by
|
| + // m_mutations.
|
| + for (CompositorProxyClientImpl* client : m_proxyClients) {
|
| + if (client->mutate(monotonicTimeNow))
|
| + needToReinvoke = true;
|
| + }
|
| +
|
| + return needToReinvoke;
|
| +}
|
| +
|
| +void CompositorMutatorImpl::registerProxyClient(CompositorProxyClientImpl* client)
|
| +{
|
| + TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::registerClient");
|
| + m_proxyClients.add(client);
|
| + setNeedsMutate();
|
| +}
|
| +
|
| +void CompositorMutatorImpl::setNeedsMutate()
|
| +{
|
| + TRACE_EVENT0("compositor-worker", "CompositorMutatorImpl::setNeedsMutate");
|
| + m_client->setNeedsMutate();
|
| +}
|
| +
|
| +} // namespace blink
|
|
|