12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/bind.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 9b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "cc/output/compositor_frame_ack.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/output/output_surface_client.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/resources/returned_resource.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/test/begin_frame_args_test.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeOutputSurface::FakeOutputSurface( 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<ContextProvider> context_provider, 195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool delegated_rendering) 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : OutputSurface(context_provider), 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch client_(NULL), 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) num_sent_frames_(0), 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch needs_begin_frame_(false), 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) has_external_stencil_test_(false), 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fake_weak_ptr_factory_(this) { 265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (delegated_rendering) { 275e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.delegated_rendering = true; 285e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.max_frames_pending = 1; 295e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeOutputSurface::FakeOutputSurface( 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device, 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool delegated_rendering) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : OutputSurface(software_device.Pass()), 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch client_(NULL), 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) num_sent_frames_(0), 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) has_external_stencil_test_(false), 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fake_weak_ptr_factory_(this) { 405e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (delegated_rendering) { 415e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.delegated_rendering = true; 425e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.max_frames_pending = 1; 435e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)FakeOutputSurface::FakeOutputSurface( 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<ContextProvider> context_provider, 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device, 495e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool delegated_rendering) 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : OutputSurface(context_provider, software_device.Pass()), 51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch client_(NULL), 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) num_sent_frames_(0), 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) has_external_stencil_test_(false), 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fake_weak_ptr_factory_(this) { 555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (delegated_rendering) { 565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.delegated_rendering = true; 575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) capabilities_.max_frames_pending = 1; 585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FakeOutputSurface::~FakeOutputSurface() {} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 635e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)void FakeOutputSurface::SwapBuffers(CompositorFrame* frame) { 645e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) if (frame->software_frame_data || frame->delegated_frame_data || 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) !context_provider()) { 665e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) frame->AssignTo(&last_sent_frame_); 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (last_sent_frame_.delegated_frame_data) { 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_held_by_parent_.insert( 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_held_by_parent_.end(), 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_sent_frame_.delegated_frame_data->resource_list.begin(), 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch last_sent_frame_.delegated_frame_data->resource_list.end()); 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 755e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ++num_sent_frames_; 765e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) PostSwapBuffersComplete(); 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu client_->DidSwapBuffers(); 785e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } else { 795e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) OutputSurface::SwapBuffers(frame); 805e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) frame->AssignTo(&last_sent_frame_); 815e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ++num_sent_frames_; 825e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid FakeOutputSurface::SetNeedsBeginFrame(bool enable) { 86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch needs_begin_frame_ = enable; 87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OutputSurface::SetNeedsBeginFrame(enable); 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (enable) { 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::MessageLoop::current()->PostDelayedTask( 91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FROM_HERE, 92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&FakeOutputSurface::OnBeginFrame, 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch fake_weak_ptr_factory_.GetWeakPtr()), 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeDelta::FromMilliseconds(16)); 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid FakeOutputSurface::OnBeginFrame() { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_->BeginFrame(CreateBeginFrameArgsForTesting()); 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool FakeOutputSurface::BindToClient(OutputSurfaceClient* client) { 104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (OutputSurface::BindToClient(client)) { 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch client_ = client; 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (memory_policy_to_set_at_bind_) { 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) client_->SetMemoryPolicy(*memory_policy_to_set_at_bind_.get()); 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) memory_policy_to_set_at_bind_.reset(); 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid FakeOutputSurface::SetTreeActivationCallback( 117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const base::Closure& callback) { 118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(client_); 119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch client_->SetTreeActivationCallback(callback); 120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FakeOutputSurface::ReturnResource(unsigned id, CompositorFrameAck* ack) { 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TransferableResourceArray::iterator it; 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (it = resources_held_by_parent_.begin(); 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch it != resources_held_by_parent_.end(); 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ++it) { 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (it->id == id) 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch break; 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(it != resources_held_by_parent_.end()); 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ack->resources.push_back(it->ToReturnedResource()); 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resources_held_by_parent_.erase(it); 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool FakeOutputSurface::HasExternalStencilTest() const { 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return has_external_stencil_test_; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void FakeOutputSurface::SetMemoryPolicyToSetAtBind( 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ManagedMemoryPolicy> memory_policy_to_set_at_bind) { 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) memory_policy_to_set_at_bind_.swap(memory_policy_to_set_at_bind); 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 145