mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This CL fixes two bugs: 1) We need to enter the Ganesh context in order to destroy the GrContext. 2) We had a race condition whereby we'd try to upload a frame to a surface that didn't yet exist. This CL fixes that race by adding a state to LayerHost to wait for the surface to be created before trying to upload to it. R=esprehn@chromium.org Review URL: https://codereview.chromium.org/753643002
78 lines
2.0 KiB
C++
78 lines
2.0 KiB
C++
// Copyright 2014 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.
|
|
|
|
#ifndef SKY_COMPOSITOR_LAYER_HOST_H_
|
|
#define SKY_COMPOSITOR_LAYER_HOST_H_
|
|
|
|
#include "base/memory/ref_counted.h"
|
|
#include "base/memory/scoped_ptr.h"
|
|
#include "mojo/skia/ganesh_context.h"
|
|
#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, public Scheduler::Client {
|
|
public:
|
|
explicit LayerHost(LayerHostClient* client);
|
|
~LayerHost();
|
|
|
|
LayerHostClient* client() const { return client_; }
|
|
|
|
const base::WeakPtr<mojo::GLContext>& gl_context() const {
|
|
return gl_context_;
|
|
}
|
|
|
|
mojo::GaneshContext* ganesh_context() const {
|
|
return const_cast<mojo::GaneshContext*>(&ganesh_context_);
|
|
}
|
|
|
|
ResourceManager* resource_manager() const {
|
|
return const_cast<ResourceManager*>(&resource_manager_);
|
|
}
|
|
|
|
void SetNeedsAnimate();
|
|
void SetRootLayer(scoped_refptr<Layer> layer);
|
|
|
|
private:
|
|
enum State {
|
|
kIdle,
|
|
kWaitingForBeginFrame,
|
|
kProducingFrame,
|
|
kWaitingForSurfaceToUploadFrame,
|
|
};
|
|
|
|
// SurfaceHolder::Client
|
|
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_;
|
|
State state_;
|
|
SurfaceHolder surface_holder_;
|
|
base::WeakPtr<mojo::GLContext> gl_context_;
|
|
mojo::GaneshContext ganesh_context_;
|
|
ResourceManager resource_manager_;
|
|
Scheduler scheduler_;
|
|
|
|
scoped_refptr<Layer> root_layer_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(LayerHost);
|
|
};
|
|
|
|
} // namespace sky
|
|
|
|
#endif // SKY_COMPOSITOR_LAYER_HOST_H_
|