15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/renderer/gpu/queue_message_swap_promise.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/renderer/gpu/frame_swap_message_queue.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ipc/ipc_sync_message_filter.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace content {
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)QueueMessageSwapPromise::QueueMessageSwapPromise(
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_refptr<IPC::SyncMessageFilter> message_sender,
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_refptr<content::FrameSwapMessageQueue> message_queue,
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int source_frame_number)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    : message_sender_(message_sender),
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      message_queue_(message_queue),
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      source_frame_number_(source_frame_number)
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if DCHECK_IS_ON
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ,
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      completed_(false)
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(message_sender_.get());
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(message_queue_.get());
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)QueueMessageSwapPromise::~QueueMessageSwapPromise() {
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The promise should have either been kept or broken before it's deleted.
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if DCHECK_IS_ON
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(completed_);
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void QueueMessageSwapPromise::DidSwap(cc::CompositorFrameMetadata* metadata) {
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if DCHECK_IS_ON
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!completed_);
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_queue_->DidSwap(source_frame_number_);
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The OutputSurface will take care of the Drain+Send.
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PromiseCompleted();
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void QueueMessageSwapPromise::DidNotSwap(DidNotSwapReason reason) {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if DCHECK_IS_ON
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(!completed_);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<IPC::Message> messages;
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_queue_->DidNotSwap(source_frame_number_, reason, &messages);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for (ScopedVector<IPC::Message>::iterator i = messages.begin();
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       i != messages.end();
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       ++i) {
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    message_sender_->Send(*i);
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  messages.weak_clear();
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PromiseCompleted();
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void QueueMessageSwapPromise::PromiseCompleted() {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if DCHECK_IS_ON
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  completed_ = true;
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)int64 QueueMessageSwapPromise::TraceId() const {
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return 0;
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace content
70