146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/aura/context_factory_mojo.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/bind.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/output/output_surface.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/output/software_output_device.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/resources/shared_bitmap_manager.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/aura/window_tree_host_mojo.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "skia/ext/platform_canvas.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/compositor/reflector.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace mojo {
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void FreeSharedBitmap(cc::SharedBitmap* shared_bitmap) {
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delete shared_bitmap->memory();
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void IgnoreSharedBitmap(cc::SharedBitmap* shared_bitmap) {}
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class SoftwareOutputDeviceViewManager : public cc::SoftwareOutputDevice {
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit SoftwareOutputDeviceViewManager(ui::Compositor* compositor)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      : compositor_(compositor) {
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~SoftwareOutputDeviceViewManager() {}
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // cc::SoftwareOutputDevice:
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void EndPaint(cc::SoftwareFrameData* frame_data) OVERRIDE {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    WindowTreeHostMojo* window_tree_host =
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        WindowTreeHostMojo::ForCompositor(compositor_);
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DCHECK(window_tree_host);
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    window_tree_host->SetContents(
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        skia::GetTopDevice(*canvas_)->accessBitmap(true));
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    SoftwareOutputDevice::EndPaint(frame_data);
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui::Compositor* compositor_;
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceViewManager);
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// TODO(sky): this is a copy from cc/test. Copy to a common place.
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestSharedBitmapManager : public cc::SharedBitmapManager {
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  TestSharedBitmapManager() {}
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~TestSharedBitmapManager() {}
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual scoped_ptr<cc::SharedBitmap> AllocateSharedBitmap(
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const gfx::Size& size) OVERRIDE {
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::AutoLock lock(lock_);
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<base::SharedMemory> memory(new base::SharedMemory);
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    memory->CreateAndMapAnonymous(size.GetArea() * 4);
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bitmap_map_[id] = memory.get();
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<cc::SharedBitmap>(
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new cc::SharedBitmap(memory.release(), id,
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             base::Bind(&FreeSharedBitmap)));
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual scoped_ptr<cc::SharedBitmap> GetSharedBitmapFromId(
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const gfx::Size&,
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const cc::SharedBitmapId& id) OVERRIDE {
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::AutoLock lock(lock_);
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (bitmap_map_.find(id) == bitmap_map_.end())
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return scoped_ptr<cc::SharedBitmap>();
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<cc::SharedBitmap>(
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new cc::SharedBitmap(bitmap_map_[id], id,
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             base::Bind(&IgnoreSharedBitmap)));
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual scoped_ptr<cc::SharedBitmap> GetBitmapForSharedMemory(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::SharedMemory* memory) OVERRIDE {
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::AutoLock lock(lock_);
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bitmap_map_[id] = memory;
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return scoped_ptr<cc::SharedBitmap>(
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        new cc::SharedBitmap(memory, id, base::Bind(&IgnoreSharedBitmap)));
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::Lock lock_;
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::map<cc::SharedBitmapId, base::SharedMemory*> bitmap_map_;
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestSharedBitmapManager);
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ContextFactoryMojo::ContextFactoryMojo()
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : shared_bitmap_manager_(new TestSharedBitmapManager()) {
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ContextFactoryMojo::~ContextFactoryMojo() {}
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_ptr<cc::OutputSurface> ContextFactoryMojo::CreateOutputSurface(
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ui::Compositor* compositor,
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool software_fallback) {
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<cc::SoftwareOutputDevice> output_device(
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new SoftwareOutputDeviceViewManager(compositor));
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return make_scoped_ptr(new cc::OutputSurface(output_device.Pass()));
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_refptr<ui::Reflector> ContextFactoryMojo::CreateReflector(
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ui::Compositor* mirroed_compositor,
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ui::Layer* mirroring_layer) {
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return new ui::Reflector();
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContextFactoryMojo::RemoveReflector(
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<ui::Reflector> reflector) {
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_refptr<cc::ContextProvider>
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ContextFactoryMojo::SharedMainThreadContextProvider() {
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return scoped_refptr<cc::ContextProvider>(NULL);
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ContextFactoryMojo::RemoveCompositor(ui::Compositor* compositor) {}
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ContextFactoryMojo::DoesCreateTestContexts() { return false; }
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)cc::SharedBitmapManager* ContextFactoryMojo::GetSharedBitmapManager() {
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return shared_bitmap_manager_.get();
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::MessageLoopProxy* ContextFactoryMojo::GetCompositorMessageLoop() {
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return NULL;
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace mojo
137