OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CC_SURFACES_DISPLAY_H_ | |
6 #define CC_SURFACES_DISPLAY_H_ | |
7 | |
8 #include "cc/surfaces/display.h" | |
9 | |
10 #include "base/message_loop/message_loop.h" | |
11 #include "cc/output/compositor_frame.h" | |
12 #include "cc/output/direct_renderer.h" | |
13 #include "cc/output/gl_renderer.h" | |
14 #include "cc/surfaces/display_client.h" | |
15 #include "cc/surfaces/surface.h" | |
16 | |
17 namespace cc { | |
18 | |
19 Display::Display(DisplayClient* client, SurfaceManager* manager) | |
20 : scheduled_draw_(false), | |
21 client_(client), | |
22 manager_(manager), | |
23 aggregator_(manager) { | |
24 } | |
25 | |
26 Display::~Display() { | |
27 } | |
28 | |
29 void Display::Resize(const gfx::Size& size) { | |
30 current_surface_.reset(new Surface(manager_, this, size)); | |
31 } | |
32 | |
33 bool Display::Draw() { | |
34 if (!current_surface_) | |
35 return false; | |
36 | |
37 // TODO(jbauman): Use the surface aggregator instead. | |
38 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | |
39 CompositorFrame* current_frame = current_surface_->GetEligibleFrame(); | |
40 frame_data->resource_list = | |
41 current_frame->delegated_frame_data->resource_list; | |
42 RenderPass::CopyAll(current_frame->delegated_frame_data->render_pass_list, | |
43 &frame_data->render_pass_list); | |
44 | |
45 if (!layer_tree_host_) { | |
46 // TODO(jbauman): Switch to use ResourceProvider and GLRenderer directly, | |
47 // as using LayerTreeHost from here is a layering violation. | |
48 LayerTreeSettings settings; | |
49 layer_tree_host_ = | |
50 LayerTreeHost::CreateSingleThreaded(this, this, NULL, settings); | |
51 resource_collection_ = new DelegatedFrameResourceCollection; | |
52 resource_collection_->SetClient(this); | |
53 layer_tree_host_->SetLayerTreeHostClientReady(); | |
54 } | |
55 if (!delegated_frame_provider_ || | |
56 delegated_frame_provider_->frame_size() != | |
57 frame_data->render_pass_list.back()->output_rect.size()) { | |
58 delegated_frame_provider_ = | |
59 new DelegatedFrameProvider(resource_collection_, frame_data.Pass()); | |
60 delegated_layer_ = | |
61 DelegatedRendererLayer::Create(delegated_frame_provider_); | |
62 | |
63 layer_tree_host_->SetRootLayer(delegated_layer_); | |
64 delegated_layer_->SetDisplaySize(current_surface_->size()); | |
65 delegated_layer_->SetBounds(current_surface_->size()); | |
66 delegated_layer_->SetContentsOpaque(true); | |
67 delegated_layer_->SetIsDrawable(true); | |
68 } else { | |
69 delegated_frame_provider_->SetFrameData(frame_data.Pass()); | |
70 } | |
71 layer_tree_host_->SetViewportSize(current_surface_->size()); | |
72 | |
73 return true; | |
74 } | |
75 | |
76 scoped_ptr<OutputSurface> Display::CreateOutputSurface(bool fallback) { | |
77 return client_->CreateOutputSurface(); | |
78 } | |
79 | |
80 void Display::ScheduleComposite() { | |
81 if (scheduled_draw_) | |
82 return; | |
83 | |
84 scheduled_draw_ = true; | |
85 | |
86 base::MessageLoop::current()->PostTask( | |
87 FROM_HERE, base::Bind(&Display::DoComposite, base::Unretained(this))); | |
88 } | |
89 | |
90 void Display::DoComposite() { | |
91 scheduled_draw_ = false; | |
92 layer_tree_host_->Composite(base::TimeTicks::Now()); | |
jamesr
2014/05/28 23:15:47
should this be a gfx::FrameTime::Now() instead?
| |
93 } | |
94 | |
95 int Display::CurrentSurfaceID() { | |
96 return current_surface_ ? current_surface_->surface_id() : 0; | |
97 } | |
98 | |
99 void Display::ReturnResources(const ReturnedResourceArray& resources) { | |
100 // We never generate any resources, so we should never have any returned. | |
101 DCHECK(resources.empty()); | |
102 } | |
103 | |
104 } // namespace cc | |
105 | |
106 #endif // CC_SURFACES_DISPLAY_H_ | |
OLD | NEW |