15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "mojo/examples/compositor_app/compositor_host.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/layers/layer.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/layers/solid_color_layer.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/output/begin_frame_args.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/output/context_provider.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/output/output_surface.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/trees/layer_tree_host.h"
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/cc/context_provider_mojo.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace mojo {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace examples {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)CompositorHost::CompositorHost(ScopedMessagePipeHandle command_buffer_handle)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : command_buffer_handle_(command_buffer_handle.Pass()),
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      compositor_thread_("compositor") {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(command_buffer_handle_.is_valid());
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool started = compositor_thread_.Start();
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(started);
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cc::LayerTreeSettings settings;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tree_ = cc::LayerTreeHost::CreateThreaded(
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      this,
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NULL,
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      settings,
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::MessageLoopProxy::current(),
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      compositor_thread_.message_loop_proxy());
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetupScene();
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CompositorHost::~CompositorHost() {}
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CompositorHost::SetSize(const gfx::Size& viewport_size) {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tree_->SetViewportSize(viewport_size);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tree_->SetLayerTreeHostClientReady();
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::SetupScene() {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<cc::Layer> root_layer = cc::SolidColorLayer::Create();
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_layer->SetBounds(gfx::Size(500, 500));
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_layer->SetBackgroundColor(SK_ColorBLUE);
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_layer->SetIsDrawable(true);
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tree_->SetRootLayer(root_layer);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_ = cc::SolidColorLayer::Create();
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_->SetBounds(gfx::Size(100, 100));
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_->SetBackgroundColor(SK_ColorGREEN);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_->SetIsDrawable(true);
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Transform child_transform;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_transform.Translate(200, 200);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_->SetTransform(child_transform);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_layer->AddChild(child_layer_);
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::WillBeginMainFrame(int frame_id) {}
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::DidBeginMainFrame() {}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void CompositorHost::BeginMainFrame(const cc::BeginFrameArgs& args) {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(jamesr): Should use cc's animation system.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const double kDegreesPerSecond = 70.0;
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  double time_in_seconds = (args.frame_time - base::TimeTicks()).InSecondsF();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  double child_rotation_degrees = kDegreesPerSecond * time_in_seconds;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Transform child_transform;
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_transform.Translate(200, 200);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_transform.Rotate(child_rotation_degrees);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  child_layer_->SetTransform(child_transform);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  tree_->SetNeedsAnimate();
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::Layout() {}
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CompositorHost::ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         float page_scale,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         float top_controls_delta) {}
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CompositorHost::RequestNewOutputSurface(bool fallback) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  tree_->SetOutputSurface(make_scoped_ptr(new cc::OutputSurface(
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new ContextProviderMojo(command_buffer_handle_.Pass()))));
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid CompositorHost::DidInitializeOutputSurface() {
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::WillCommit() {}
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::DidCommit() {}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::DidCommitAndDrawFrame() {}
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CompositorHost::DidCompleteSwapBuffers() {}
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace examples
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace mojo
94