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