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