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 10 namespace content { 11 QueueMessageSwapPromise(scoped_refptr<IPC::SyncMessageFilter> message_sender,scoped_refptr<content::FrameSwapMessageQueue> message_queue,int source_frame_number)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 ~QueueMessageSwapPromise()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 DidSwap(cc::CompositorFrameMetadata * metadata)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 DidNotSwap(DidNotSwapReason reason)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 PromiseCompleted()59void QueueMessageSwapPromise::PromiseCompleted() { 60 #if DCHECK_IS_ON 61 completed_ = true; 62 #endif 63 } 64 TraceId() const65int64 QueueMessageSwapPromise::TraceId() const { 66 return 0; 67 } 68 69 } // namespace content 70