summaryrefslogtreecommitdiffstats
path: root/content/renderer/android/synchronous_compositor_external_begin_frame_source.cc
blob: c5337d0f122b1e9bb61052a0b6c633434a8abb6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2014 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 "content/renderer/android/synchronous_compositor_external_begin_frame_source.h"

#include "cc/output/begin_frame_args.h"
#include "content/renderer/android/synchronous_compositor_registry.h"

namespace content {

SynchronousCompositorExternalBeginFrameSource::
    SynchronousCompositorExternalBeginFrameSource(
        int routing_id,
        SynchronousCompositorRegistry* registry)
    : routing_id_(routing_id),
      registry_(registry),
      registered_(false),
      client_(nullptr) {
  thread_checker_.DetachFromThread();
}

SynchronousCompositorExternalBeginFrameSource::
    ~SynchronousCompositorExternalBeginFrameSource() {
  DCHECK(CalledOnValidThread());

  if (registered_) {
    registry_->UnregisterBeginFrameSource(routing_id_, this);
  }
  DCHECK(!client_);
}

void SynchronousCompositorExternalBeginFrameSource::BeginFrame(
    const cc::BeginFrameArgs& args) {
  DCHECK(CalledOnValidThread());
  CallOnBeginFrame(args);
}

void SynchronousCompositorExternalBeginFrameSource::SetClient(
    SynchronousCompositorExternalBeginFrameSourceClient* client) {
  DCHECK(CalledOnValidThread());
  if (client_ == client)
    return;

  if (client_)
    client_->OnNeedsBeginFramesChange(false);

  client_ = client;

  if (client_)
    client_->OnNeedsBeginFramesChange(needs_begin_frames_);

  // State without client is paused, and default client state is not paused.
  SetBeginFrameSourcePaused(!client_);
}

void SynchronousCompositorExternalBeginFrameSource::OnNeedsBeginFramesChange(
    bool needs_begin_frames) {
  DCHECK(CalledOnValidThread());
  if (client_)
    client_->OnNeedsBeginFramesChange(needs_begin_frames);
}

void SynchronousCompositorExternalBeginFrameSource::SetClientReady() {
  DCHECK(CalledOnValidThread());
  registry_->RegisterBeginFrameSource(routing_id_, this);
  registered_ = true;
}

bool
SynchronousCompositorExternalBeginFrameSource::CalledOnValidThread() const {
  return thread_checker_.CalledOnValidThread();
}

}  // namespace content