1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/gpu/queue_message_swap_promise.h"
6
7#include "content/renderer/gpu/frame_swap_message_queue.h"
8#include "ipc/ipc_sync_message_filter.h"
9
10namespace content {
11
12QueueMessageSwapPromise::QueueMessageSwapPromise(
13    scoped_refptr<IPC::SyncMessageFilter> message_sender,
14    scoped_refptr<content::FrameSwapMessageQueue> message_queue,
15    int source_frame_number)
16    : message_sender_(message_sender),
17      message_queue_(message_queue),
18      source_frame_number_(source_frame_number)
19#if DCHECK_IS_ON
20      ,
21      completed_(false)
22#endif
23{
24  DCHECK(message_sender_.get());
25  DCHECK(message_queue_.get());
26}
27
28QueueMessageSwapPromise::~QueueMessageSwapPromise() {
29  // The promise should have either been kept or broken before it's deleted.
30#if DCHECK_IS_ON
31  DCHECK(completed_);
32#endif
33}
34
35void QueueMessageSwapPromise::DidSwap(cc::CompositorFrameMetadata* metadata) {
36#if DCHECK_IS_ON
37  DCHECK(!completed_);
38#endif
39  message_queue_->DidSwap(source_frame_number_);
40  // The OutputSurface will take care of the Drain+Send.
41  PromiseCompleted();
42}
43
44void QueueMessageSwapPromise::DidNotSwap(DidNotSwapReason reason) {
45#if DCHECK_IS_ON
46  DCHECK(!completed_);
47#endif
48  ScopedVector<IPC::Message> messages;
49  message_queue_->DidNotSwap(source_frame_number_, reason, &messages);
50  for (ScopedVector<IPC::Message>::iterator i = messages.begin();
51       i != messages.end();
52       ++i) {
53    message_sender_->Send(*i);
54  }
55  messages.weak_clear();
56  PromiseCompleted();
57}
58
59void QueueMessageSwapPromise::PromiseCompleted() {
60#if DCHECK_IS_ON
61  completed_ = true;
62#endif
63}
64
65int64 QueueMessageSwapPromise::TraceId() const {
66  return 0;
67}
68
69}  // namespace content
70