提交 372355ad 编写于 作者: F Florian Loitsch

Make rasterizer a mojo service.

上级 cf9ed589
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//mojo/public/tools/bindings/mojom.gni")
mojom("interfaces") {
sources = [
"rasterizer.mojom",
]
}
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module rasterizer;
interface Rasterizer {
Draw(uint64 layer_tree_ptr) => ();
};
......@@ -52,6 +52,7 @@ source_set("common") {
"//sky/engine/wtf",
"//sky/services/engine:interfaces",
"//sky/services/pointer:interfaces",
"//sky/services/rasterizer:interfaces",
"//sky/shell/dart",
"//ui/gfx",
"//ui/gfx/geometry",
......
......@@ -29,7 +29,8 @@ scoped_ptr<Rasterizer> Rasterizer::Create() {
}
RasterizerDirect::RasterizerDirect()
: share_group_(new gfx::GLShareGroup()), weak_factory_(this) {
: share_group_(new gfx::GLShareGroup()), binding_(this),
weak_factory_(this) {
}
RasterizerDirect::~RasterizerDirect() {
......@@ -39,8 +40,13 @@ base::WeakPtr<RasterizerDirect> RasterizerDirect::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
RasterCallback RasterizerDirect::GetRasterCallback() {
return base::Bind(&RasterizerDirect::Draw, weak_factory_.GetWeakPtr());
base::WeakPtr<Rasterizer> RasterizerDirect::GetWeakRasterizerPtr() {
return GetWeakPtr();
}
void RasterizerDirect::ConnectToRasterizer(
mojo::InterfaceRequest<rasterizer::Rasterizer> request) {
binding_.Bind(request.Pass());
}
void RasterizerDirect::OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget) {
......@@ -49,11 +55,17 @@ void RasterizerDirect::OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widge
CHECK(surface_) << "GLSurface required.";
}
void RasterizerDirect::Draw(scoped_ptr<compositor::LayerTree> layer_tree) {
void RasterizerDirect::Draw(uint64_t layer_tree_ptr,
const DrawCallback& callback) {
TRACE_EVENT0("flutter", "RasterizerDirect::Draw");
if (!surface_)
if (!surface_) {
callback.Run();
return;
}
scoped_ptr<compositor::LayerTree> layer_tree(
reinterpret_cast<compositor::LayerTree*>(layer_tree_ptr));
gfx::Size size(layer_tree->frame_size().width(),
layer_tree->frame_size().height());
......@@ -98,6 +110,8 @@ void RasterizerDirect::Draw(scoped_ptr<compositor::LayerTree> layer_tree) {
paint_context_.AcquireFrame(path.AsUTF8Unsafe(), size);
layer_tree->root_layer()->Paint(to_file_frame);
}
callback.Run();
}
void RasterizerDirect::OnOutputSurfaceDestroyed() {
......
......@@ -30,13 +30,18 @@ class RasterizerDirect : public Rasterizer {
~RasterizerDirect() override;
base::WeakPtr<RasterizerDirect> GetWeakPtr();
RasterCallback GetRasterCallback() override;
base::WeakPtr<::sky::shell::Rasterizer> GetWeakRasterizerPtr() override;
void ConnectToRasterizer(
mojo::InterfaceRequest<rasterizer::Rasterizer> request) override;
void OnAcceleratedWidgetAvailable(gfx::AcceleratedWidget widget);
void OnOutputSurfaceDestroyed();
private:
void Draw(scoped_ptr<compositor::LayerTree> layer_tree);
void Draw(uint64_t layer_tree_ptr, const DrawCallback& callback) override;
void EnsureGLContext();
void EnsureGaneshSurface(intptr_t window_fbo, const gfx::Size& size);
......@@ -49,6 +54,8 @@ class RasterizerDirect : public Rasterizer {
compositor::PaintContext paint_context_;
mojo::Binding<rasterizer::Rasterizer> binding_;
base::WeakPtrFactory<RasterizerDirect> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RasterizerDirect);
......
......@@ -24,7 +24,7 @@ scoped_ptr<Rasterizer> Rasterizer::Create() {
return make_scoped_ptr(new RasterizerMojo());
}
RasterizerMojo::RasterizerMojo() : weak_factory_(this) {
RasterizerMojo::RasterizerMojo() : binding_(this), weak_factory_(this) {
}
RasterizerMojo::~RasterizerMojo() {
......@@ -34,12 +34,22 @@ base::WeakPtr<RasterizerMojo> RasterizerMojo::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
RasterCallback RasterizerMojo::GetRasterCallback() {
return base::Bind(&RasterizerMojo::Draw, weak_factory_.GetWeakPtr());
base::WeakPtr<Rasterizer> RasterizerMojo::GetWeakRasterizerPtr() {
return GetWeakPtr();
}
void RasterizerMojo::Draw(scoped_ptr<compositor::LayerTree> layer_tree) {
void RasterizerMojo::ConnectToRasterizer (
mojo::InterfaceRequest<rasterizer::Rasterizer> request ) {
binding_.Bind(request.Pass());
}
void RasterizerMojo::Draw(uint64_t layer_tree_ptr,
const DrawCallback& callback) {
TRACE_EVENT0("flutter", "RasterizerMojo::Draw");
scoped_ptr<compositor::LayerTree> layer_tree(
reinterpret_cast<compositor::LayerTree*>(layer_tree_ptr));
MGLResizeSurface(layer_tree->frame_size().width(),
layer_tree->frame_size().height());
SkCanvas* canvas = ganesh_canvas_.GetCanvas(0, layer_tree->frame_size());
......@@ -49,6 +59,7 @@ void RasterizerMojo::Draw(scoped_ptr<compositor::LayerTree> layer_tree) {
layer_tree->root_layer()->Paint(frame);
canvas->flush();
MGLSwapBuffers();
callback.Run();
}
void RasterizerMojo::OnContextProviderAvailable(
......
......@@ -16,14 +16,17 @@
namespace sky {
namespace shell {
class RasterizerMojo : public Rasterizer {
class RasterizerMojo : public ::sky::shell::Rasterizer {
public:
explicit RasterizerMojo();
~RasterizerMojo() override;
base::WeakPtr<RasterizerMojo> GetWeakPtr();
RasterCallback GetRasterCallback() override;
base::WeakPtr<::sky::shell::Rasterizer> GetWeakRasterizerPtr() override;
void ConnectToRasterizer(
mojo::InterfaceRequest<rasterizer::Rasterizer> request) override;
void OnContextProviderAvailable(
mojo::InterfacePtrInfo<mojo::ContextProvider> context_provder);
......@@ -32,7 +35,8 @@ class RasterizerMojo : public Rasterizer {
private:
void OnContextCreated(mojo::CommandBufferPtr command_buffer);
void Draw(scoped_ptr<compositor::LayerTree> layer_tree);
void Draw(uint64_t layer_tree_ptr, const DrawCallback& callback) override;
mojo::ContextProviderPtr context_provider_;
skia::RefPtr<GrGLInterface> gr_gl_interface_;
......@@ -41,6 +45,8 @@ class RasterizerMojo : public Rasterizer {
compositor::PaintContext paint_context_;
mojo::Binding<rasterizer::Rasterizer> binding_;
base::WeakPtrFactory<RasterizerMojo> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RasterizerMojo);
......
......@@ -9,17 +9,20 @@
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "sky/compositor/layer_tree.h"
#include "sky/services/rasterizer/rasterizer.mojom.h"
namespace sky {
namespace shell {
typedef base::Callback<void(scoped_ptr<compositor::LayerTree>)> RasterCallback;
class Rasterizer {
class Rasterizer : public rasterizer::Rasterizer {
public:
virtual ~Rasterizer();
virtual RasterCallback GetRasterCallback() = 0;
~Rasterizer() override;
virtual void ConnectToRasterizer(
mojo::InterfaceRequest<rasterizer::Rasterizer> request) = 0;
virtual base::WeakPtr<::sky::shell::Rasterizer> GetWeakRasterizerPtr() = 0;
// Implemented by each GPU backend.
static scoped_ptr<Rasterizer> Create();
......
......@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/single_thread_task_runner.h"
#include "sky/services/rasterizer/rasterizer.mojom.h"
#include "sky/shell/platform_view.h"
#include "sky/shell/rasterizer.h"
#include "sky/shell/shell.h"
......@@ -40,8 +41,14 @@ ShellView::~ShellView() {
void ShellView::CreateEngine() {
Engine::Config config;
config.gpu_task_runner = shell_.gpu_task_runner();
config.raster_callback = rasterizer_->GetRasterCallback();
engine_.reset(new Engine(config));
rasterizer::RasterizerPtr rasterizer;
mojo::InterfaceRequest<rasterizer::Rasterizer> request = mojo::GetProxy(
&rasterizer);
shell_.gpu_task_runner()->PostTask(
FROM_HERE,
base::Bind(&Rasterizer::ConnectToRasterizer,
rasterizer_->GetWeakRasterizerPtr(), base::Passed(&request)));
engine_.reset(new Engine(config, rasterizer.Pass()));
}
void ShellView::CreatePlatformView() {
......
......@@ -7,14 +7,17 @@
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "base/trace_event/trace_event.h"
#include "sky/services/rasterizer/rasterizer.mojom.h"
namespace sky {
namespace shell {
const int kPipelineDepth = 3;
Animator::Animator(const Engine::Config& config, Engine* engine)
Animator::Animator(const Engine::Config& config,
rasterizer::RasterizerPtr rasterizer, Engine* engine)
: config_(config),
rasterizer_(rasterizer.Pass()),
engine_(engine),
outstanding_requests_(0),
did_defer_frame_request_(false),
......@@ -79,9 +82,7 @@ void Animator::BeginFrame(int64_t time_stamp) {
return;
}
config_.gpu_task_runner->PostTaskAndReply(
FROM_HERE,
base::Bind(config_.raster_callback, base::Passed(&layer_tree)),
rasterizer_->Draw(reinterpret_cast<uint64_t>(layer_tree.release()),
base::Bind(&Animator::OnFrameComplete, weak_factory_.GetWeakPtr()));
}
......
......@@ -14,7 +14,8 @@ namespace shell {
class Animator {
public:
explicit Animator(const Engine::Config& config, Engine* engine);
explicit Animator(const Engine::Config& config,
rasterizer::RasterizerPtr rasterizer, Engine* engine);
~Animator();
void RequestFrame();
......@@ -32,6 +33,7 @@ class Animator {
bool AwaitVSync();
Engine::Config config_;
rasterizer::RasterizerPtr rasterizer_;
Engine* engine_;
vsync::VSyncProviderPtr vsync_provider_;
int outstanding_requests_;
......
......@@ -53,9 +53,9 @@ Engine::Config::Config() {
Engine::Config::~Config() {
}
Engine::Engine(const Config& config)
Engine::Engine(const Config& config, rasterizer::RasterizerPtr rasterizer)
: config_(config),
animator_(new Animator(config, this)),
animator_(new Animator(config, rasterizer.Pass(), this)),
binding_(this),
activity_running_(false),
have_surface_(false),
......
......@@ -18,6 +18,7 @@
#include "skia/ext/refptr.h"
#include "sky/engine/public/sky/sky_view.h"
#include "sky/engine/public/sky/sky_view_client.h"
#include "sky/services/rasterizer/rasterizer.mojom.h"
#include "sky/shell/rasterizer.h"
#include "sky/shell/ui_delegate.h"
#include "third_party/skia/include/core/SkPicture.h"
......@@ -36,11 +37,10 @@ class Engine : public UIDelegate,
Config();
~Config();
RasterCallback raster_callback;
scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner;
};
explicit Engine(const Config& config);
explicit Engine(const Config& config, rasterizer::RasterizerPtr rasterizer);
~Engine() override;
base::WeakPtr<Engine> GetWeakPtr();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册