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