| Index: cc/surfaces/display.cc
|
| diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..262366e00772b5e4351ee500baa77ef64f83e656
|
| --- /dev/null
|
| +++ b/cc/surfaces/display.cc
|
| @@ -0,0 +1,99 @@
|
| +// 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 CC_SURFACES_DISPLAY_H_
|
| +#define CC_SURFACES_DISPLAY_H_
|
| +
|
| +#include "cc/surfaces/display.h"
|
| +
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "cc/output/compositor_frame.h"
|
| +#include "cc/output/direct_renderer.h"
|
| +#include "cc/output/gl_renderer.h"
|
| +#include "cc/surfaces/display_client.h"
|
| +#include "cc/surfaces/surface.h"
|
| +
|
| +namespace cc {
|
| +
|
| +Display::Display(DisplayClient* client, SurfaceManager* manager)
|
| + : scheduled_draw_(false),
|
| + client_(client),
|
| + manager_(manager),
|
| + aggregator_(manager) {
|
| +}
|
| +
|
| +Display::~Display() {
|
| +}
|
| +
|
| +void Display::Resize(const gfx::Size& size) {
|
| + current_surface_.reset(new Surface(manager_, this, size));
|
| +}
|
| +
|
| +bool Display::Draw() {
|
| + if (!current_surface_)
|
| + return false;
|
| +
|
| + scoped_ptr<CompositorFrame> frame = current_surface_->TakeFrame();
|
| +
|
| + if (!layer_tree_host_) {
|
| + LayerTreeSettings settings;
|
| + layer_tree_host_ =
|
| + LayerTreeHost::CreateSingleThreaded(this, this, NULL, settings);
|
| + resource_collection_ = new DelegatedFrameResourceCollection;
|
| + resource_collection_->SetClient(this);
|
| + layer_tree_host_->SetLayerTreeHostClientReady();
|
| + }
|
| + if (!delegated_frame_provider_ ||
|
| + delegated_frame_provider_->frame_size() !=
|
| + frame->delegated_frame_data->render_pass_list.back()
|
| + ->output_rect.size()) {
|
| + delegated_frame_provider_ = new DelegatedFrameProvider(
|
| + resource_collection_, frame->delegated_frame_data.Pass());
|
| + delegated_layer_ =
|
| + DelegatedRendererLayer::Create(delegated_frame_provider_);
|
| +
|
| + layer_tree_host_->SetRootLayer(delegated_layer_);
|
| + delegated_layer_->SetDisplaySize(current_surface_->size());
|
| + delegated_layer_->SetBounds(current_surface_->size());
|
| + delegated_layer_->SetContentsOpaque(true);
|
| + delegated_layer_->SetIsDrawable(true);
|
| + } else {
|
| + delegated_frame_provider_->SetFrameData(frame->delegated_frame_data.Pass());
|
| + }
|
| + layer_tree_host_->SetViewportSize(current_surface_->size());
|
| +
|
| + return true;
|
| +}
|
| +
|
| +scoped_ptr<OutputSurface> Display::CreateOutputSurface(bool fallback) {
|
| + return client_->CreateOutputSurface();
|
| +}
|
| +
|
| +void Display::ScheduleComposite() {
|
| + if (scheduled_draw_)
|
| + return;
|
| +
|
| + scheduled_draw_ = true;
|
| +
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(&Display::DoComposite, base::Unretained(this)));
|
| +}
|
| +
|
| +void Display::DoComposite() {
|
| + scheduled_draw_ = false;
|
| + layer_tree_host_->Composite(base::TimeTicks::Now());
|
| +}
|
| +
|
| +int Display::CurrentSurfaceID() {
|
| + return current_surface_ ? current_surface_->surface_id() : 0;
|
| +}
|
| +
|
| +void Display::ReturnResources(const ReturnedResourceArray& resources) {
|
| + // We never generate any resources, so we should never have any returned.
|
| + DCHECK(resources.empty());
|
| +}
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_SURFACES_DISPLAY_H_
|
|
|