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