Use the scheduler to drive the Sky compositor

This CL lets us put up more than one frame by using the scheduler to schedule
the next frame.

R=ojan@chromium.org

Review URL: https://codereview.chromium.org/744753003
This commit is contained in:
Adam Barth
2014-11-20 14:13:36 -08:00
parent 410ea2c8a0
commit 0beeadcfe7
6 changed files with 24 additions and 14 deletions

View File

@@ -38,6 +38,7 @@ static_library("compositor") {
"//mojo/services/public/interfaces/surfaces:surface_id",
"//mojo/skia",
"//skia",
"//sky/scheduler",
"//ui/gfx/geometry",
]
}

View File

@@ -4,6 +4,7 @@
#include "sky/compositor/layer_host.h"
#include "base/message_loop/message_loop.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/gpu/gl_context.h"
#include "mojo/services/public/cpp/surfaces/surfaces_utils.h"
@@ -17,13 +18,17 @@ LayerHost::LayerHost(LayerHostClient* client)
surface_holder_(this, client->GetShell()),
gl_context_(mojo::GLContext::Create(client->GetShell())),
ganesh_context_(gl_context_),
resource_manager_(gl_context_) {
resource_manager_(gl_context_),
scheduler_(this, base::MessageLoop::current()->task_runner()) {
scheduler_.UpdateVSync(
TimeInterval(base::TimeTicks(), base::TimeDelta::FromSecondsD(1.0 / 60)));
}
LayerHost::~LayerHost() {
}
void LayerHost::SetNeedsAnimate() {
scheduler_.SetNeedsFrame();
}
void LayerHost::SetRootLayer(scoped_refptr<Layer> layer) {
@@ -32,12 +37,6 @@ void LayerHost::SetRootLayer(scoped_refptr<Layer> layer) {
root_layer_->set_host(this);
}
void LayerHost::OnReadyForNextFrame() {
client_->BeginFrame();
root_layer_->Display();
Upload(root_layer_.get());
}
void LayerHost::OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) {
client_->OnSurfaceIdAvailable(surface_id.Pass());
}
@@ -47,6 +46,13 @@ void LayerHost::ReturnResources(
resource_manager_.ReturnResources(resources.Pass());
}
void LayerHost::BeginFrame(base::TimeTicks frame_time,
base::TimeTicks deadline) {
client_->BeginFrame(frame_time);
root_layer_->Display();
Upload(root_layer_.get());
}
void LayerHost::Upload(Layer* layer) {
gfx::Size size = layer->size();
surface_holder_.SetSize(size);

View File

@@ -11,13 +11,14 @@
#include "sky/compositor/layer_host_client.h"
#include "sky/compositor/resource_manager.h"
#include "sky/compositor/surface_holder.h"
#include "sky/scheduler/scheduler.h"
namespace sky {
class ResourceManager;
class Layer;
class LayerHostClient;
class LayerHost : public SurfaceHolder::Client {
class LayerHost : public SurfaceHolder::Client, public Scheduler::Client {
public:
explicit LayerHost(LayerHostClient* client);
~LayerHost();
@@ -41,11 +42,14 @@ class LayerHost : public SurfaceHolder::Client {
private:
// SurfaceHolder::Client
void OnReadyForNextFrame() override;
void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) override;
void ReturnResources(
mojo::Array<mojo::ReturnedResourcePtr> resources) override;
// Scheduler::Client
void BeginFrame(base::TimeTicks frame_time,
base::TimeTicks deadline) override;
void Upload(Layer* layer);
LayerHostClient* client_;
@@ -53,6 +57,7 @@ class LayerHost : public SurfaceHolder::Client {
base::WeakPtr<mojo::GLContext> gl_context_;
mojo::GaneshContext ganesh_context_;
ResourceManager resource_manager_;
Scheduler scheduler_;
scoped_refptr<Layer> root_layer_;

View File

@@ -5,6 +5,7 @@
#ifndef SKY_COMPOSITOR_LAYER_HOST_CLIENT_H_
#define SKY_COMPOSITOR_LAYER_HOST_CLIENT_H_
#include "base/time/time.h"
#include "mojo/services/public/interfaces/surfaces/surface_id.mojom.h"
namespace mojo {
@@ -16,7 +17,7 @@ namespace sky {
class LayerHostClient {
public:
virtual mojo::Shell* GetShell() = 0;
virtual void BeginFrame() = 0;
virtual void BeginFrame(base::TimeTicks frame_time) = 0;
virtual void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) = 0;
protected:

View File

@@ -5,6 +5,7 @@
#include "sky/compositor/surface_holder.h"
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "mojo/public/cpp/application/connect.h"
#include "mojo/public/interfaces/application/shell.mojom.h"
@@ -58,7 +59,6 @@ void SurfaceHolder::ReturnResources(
if (!resources.size())
return;
client_->ReturnResources(resources.Pass());
client_->OnReadyForNextFrame();
}
void SurfaceHolder::OnSurfaceConnectionCreated(mojo::SurfacePtr surface,
@@ -66,8 +66,6 @@ void SurfaceHolder::OnSurfaceConnectionCreated(mojo::SurfacePtr surface,
surface_ = surface.Pass();
surface_.set_client(this);
surface_allocator_.reset(new SurfaceAllocator(id_namespace));
client_->OnReadyForNextFrame();
}
} // namespace sky

View File

@@ -23,7 +23,6 @@ class SurfaceHolder : public mojo::SurfaceClient {
public:
class Client {
public:
virtual void OnReadyForNextFrame() = 0;
virtual void OnSurfaceIdAvailable(mojo::SurfaceIdPtr surface_id) = 0;
virtual void ReturnResources(
mojo::Array<mojo::ReturnedResourcePtr> resources) = 0;