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:
@@ -38,6 +38,7 @@ static_library("compositor") {
|
||||
"//mojo/services/public/interfaces/surfaces:surface_id",
|
||||
"//mojo/skia",
|
||||
"//skia",
|
||||
"//sky/scheduler",
|
||||
"//ui/gfx/geometry",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user