OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_SURFACES_DISPLAY_H_ | 5 #ifndef CC_SURFACES_DISPLAY_H_ |
6 #define CC_SURFACES_DISPLAY_H_ | 6 #define CC_SURFACES_DISPLAY_H_ |
7 | 7 |
8 #include "cc/surfaces/display.h" | 8 #include "cc/surfaces/display.h" |
9 | 9 |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "cc/output/compositor_frame.h" | 11 #include "cc/output/compositor_frame.h" |
12 #include "cc/output/direct_renderer.h" | 12 #include "cc/output/direct_renderer.h" |
13 #include "cc/output/gl_renderer.h" | 13 #include "cc/output/gl_renderer.h" |
14 #include "cc/output/software_renderer.h" | |
14 #include "cc/surfaces/display_client.h" | 15 #include "cc/surfaces/display_client.h" |
15 #include "cc/surfaces/surface.h" | 16 #include "cc/surfaces/surface.h" |
16 #include "ui/gfx/frame_time.h" | |
17 | 17 |
18 namespace cc { | 18 namespace cc { |
19 static ResourceProvider::ResourceId ResourceRemapHelper( | |
20 bool* invalid_frame, | |
21 const ResourceProvider::ResourceIdMap& child_to_parent_map, | |
22 ResourceProvider::ResourceIdArray* resources_in_frame, | |
23 ResourceProvider::ResourceId id) { | |
24 ResourceProvider::ResourceIdMap::const_iterator it = | |
25 child_to_parent_map.find(id); | |
26 if (it == child_to_parent_map.end()) { | |
27 *invalid_frame = true; | |
28 return 0; | |
29 } | |
30 | |
31 DCHECK_EQ(it->first, id); | |
32 ResourceProvider::ResourceId remapped_id = it->second; | |
33 resources_in_frame->push_back(id); | |
34 return remapped_id; | |
35 } | |
19 | 36 |
20 Display::Display(DisplayClient* client, | 37 Display::Display(DisplayClient* client, |
21 SurfaceManager* manager, | 38 SurfaceManager* manager, |
22 SharedBitmapManager* bitmap_manager) | 39 SharedBitmapManager* bitmap_manager) |
23 : scheduled_draw_(false), | 40 : client_(client), |
24 client_(client), | |
25 manager_(manager), | 41 manager_(manager), |
26 aggregator_(manager), | 42 aggregator_(manager), |
27 bitmap_manager_(bitmap_manager), | 43 bitmap_manager_(bitmap_manager) { |
28 schedule_draw_factory_(this) { | |
29 } | 44 } |
30 | 45 |
31 Display::~Display() { | 46 Display::~Display() { |
32 } | 47 } |
33 | 48 |
34 void Display::Resize(const gfx::Size& size) { | 49 void Display::Resize(const gfx::Size& size) { |
35 current_surface_.reset(new Surface(manager_, this, size)); | 50 current_surface_.reset(new Surface(manager_, this, size)); |
36 } | 51 } |
37 | 52 |
38 bool Display::Draw() { | 53 bool Display::Draw() { |
39 if (!current_surface_) | 54 if (!current_surface_) |
40 return false; | 55 return false; |
41 | 56 |
57 if (!output_surface_) { | |
58 scoped_ptr<OutputSurface> output_surface = client_->CreateOutputSurface(); | |
jamesr
2014/06/09 02:39:27
this block is long enough to be its own function
| |
59 if (!output_surface->BindToClient(this)) | |
60 return false; | |
61 | |
62 int highp_threshold_min = 0; | |
63 bool use_rgba_4444_texture_format = false; | |
64 size_t id_allocation_chunk_size = 1; | |
65 bool use_distance_field_text = false; | |
66 scoped_ptr<ResourceProvider> resource_provider = | |
67 ResourceProvider::Create(output_surface.get(), | |
68 bitmap_manager_, | |
69 highp_threshold_min, | |
70 use_rgba_4444_texture_format, | |
71 id_allocation_chunk_size, | |
72 use_distance_field_text); | |
73 if (!resource_provider) | |
74 return false; | |
75 | |
76 LayerTreeSettings settings; | |
77 if (output_surface->context_provider()) { | |
78 TextureMailboxDeleter* texture_mailbox_deleter = NULL; | |
79 scoped_ptr<GLRenderer> renderer = | |
80 GLRenderer::Create(this, | |
81 &settings, | |
82 output_surface.get(), | |
83 resource_provider.get(), | |
84 texture_mailbox_deleter, | |
85 highp_threshold_min); | |
86 if (!renderer) | |
87 return false; | |
88 renderer_ = renderer.Pass(); | |
89 } else { | |
90 scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( | |
91 this, &settings, output_surface.get(), resource_provider.get()); | |
92 if (!renderer) | |
93 return false; | |
94 renderer_ = renderer.Pass(); | |
95 } | |
96 | |
97 output_surface_ = output_surface.Pass(); | |
98 resource_provider_ = resource_provider.Pass(); | |
99 child_id_ = resource_provider_->CreateChild( | |
100 base::Bind(&Display::ReturnResources, base::Unretained(this))); | |
101 } | |
102 | |
42 // TODO(jamesr): Use the surface aggregator instead. | 103 // TODO(jamesr): Use the surface aggregator instead. |
43 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 104 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
44 CompositorFrame* current_frame = current_surface_->GetEligibleFrame(); | 105 CompositorFrame* current_frame = current_surface_->GetEligibleFrame(); |
45 frame_data->resource_list = | 106 frame_data->resource_list = |
46 current_frame->delegated_frame_data->resource_list; | 107 current_frame->delegated_frame_data->resource_list; |
47 RenderPass::CopyAll(current_frame->delegated_frame_data->render_pass_list, | 108 RenderPass::CopyAll(current_frame->delegated_frame_data->render_pass_list, |
48 &frame_data->render_pass_list); | 109 &frame_data->render_pass_list); |
49 | 110 |
50 if (!layer_tree_host_) { | 111 if (frame_data->render_pass_list.empty()) |
51 // TODO(jbauman): Switch to use ResourceProvider and GLRenderer directly, | 112 return false; |
52 // as using LayerTreeHost from here is a layering violation. | 113 |
53 LayerTreeSettings settings; | 114 const ResourceProvider::ResourceIdMap& resource_map = |
54 layer_tree_host_ = LayerTreeHost::CreateSingleThreaded( | 115 resource_provider_->GetChildToParentMap(child_id_); |
55 this, this, bitmap_manager_, settings); | 116 resource_provider_->ReceiveFromChild(child_id_, frame_data->resource_list); |
jamesr
2014/06/09 02:39:27
i've got another patch in the queue that does the
| |
56 resource_collection_ = new DelegatedFrameResourceCollection; | 117 |
57 resource_collection_->SetClient(this); | 118 bool invalid_frame = false; |
58 layer_tree_host_->SetLayerTreeHostClientReady(); | 119 ResourceProvider::ResourceIdArray resources_in_frame; |
120 DrawQuad::ResourceIteratorCallback remap_resources_to_parent_callback = | |
121 base::Bind(&ResourceRemapHelper, | |
122 &invalid_frame, | |
123 resource_map, | |
124 &resources_in_frame); | |
125 for (size_t i = 0; i < frame_data->render_pass_list.size(); ++i) { | |
126 RenderPass* pass = frame_data->render_pass_list[i]; | |
127 for (size_t j = 0; j < pass->quad_list.size(); ++j) { | |
128 DrawQuad* quad = pass->quad_list[j]; | |
129 quad->IterateResources(remap_resources_to_parent_callback); | |
130 } | |
59 } | 131 } |
60 if (!delegated_frame_provider_ || | |
61 delegated_frame_provider_->frame_size() != | |
62 frame_data->render_pass_list.back()->output_rect.size()) { | |
63 delegated_frame_provider_ = | |
64 new DelegatedFrameProvider(resource_collection_, frame_data.Pass()); | |
65 delegated_layer_ = | |
66 DelegatedRendererLayer::Create(delegated_frame_provider_); | |
67 | 132 |
68 layer_tree_host_->SetRootLayer(delegated_layer_); | 133 if (invalid_frame) |
69 delegated_layer_->SetDisplaySize(current_surface_->size()); | 134 return false; |
70 delegated_layer_->SetBounds(current_surface_->size()); | 135 resource_provider_->DeclareUsedResourcesFromChild(child_id_, |
71 delegated_layer_->SetContentsOpaque(true); | 136 resources_in_frame); |
72 delegated_layer_->SetIsDrawable(true); | |
73 } else { | |
74 delegated_frame_provider_->SetFrameData(frame_data.Pass()); | |
75 } | |
76 layer_tree_host_->SetViewportSize(current_surface_->size()); | |
77 | 137 |
138 float device_scale_factor = 1.0f; | |
139 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_->size()); | |
140 gfx::Rect device_clip_rect = device_viewport_rect; | |
141 bool disable_picture_quad_image_filtering = false; | |
142 | |
143 renderer_->DrawFrame(&frame_data->render_pass_list, | |
144 device_scale_factor, | |
145 device_viewport_rect, | |
146 device_clip_rect, | |
147 disable_picture_quad_image_filtering); | |
148 CompositorFrameMetadata metadata; | |
149 renderer_->SwapBuffers(metadata); | |
78 return true; | 150 return true; |
79 } | 151 } |
80 | 152 |
81 scoped_ptr<OutputSurface> Display::CreateOutputSurface(bool fallback) { | 153 void Display::DeferredInitialize() { |
jamesr
2014/06/09 02:39:27
could these all be inline? the clang checker shoul
| |
82 return client_->CreateOutputSurface(); | 154 } |
155 void Display::ReleaseGL() { | |
156 } | |
157 void Display::CommitVSyncParameters(base::TimeTicks timebase, | |
158 base::TimeDelta interval) { | |
159 } | |
160 void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { | |
161 } | |
162 void Display::BeginFrame(const BeginFrameArgs& args) { | |
163 } | |
164 void Display::DidSwapBuffers() { | |
165 } | |
166 void Display::DidSwapBuffersComplete() { | |
167 } | |
168 void Display::ReclaimResources(const CompositorFrameAck* ack) { | |
169 } | |
170 void Display::DidLoseOutputSurface() { | |
171 } | |
172 void Display::SetExternalDrawConstraints(const gfx::Transform& transform, | |
173 const gfx::Rect& viewport, | |
174 const gfx::Rect& clip, | |
175 bool valid_for_tile_management) { | |
176 } | |
177 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | |
178 } | |
179 void Display::SetTreeActivationCallback(const base::Closure& callback) { | |
83 } | 180 } |
84 | 181 |
85 void Display::ScheduleComposite() { | 182 void Display::SetFullRootLayerDamage() { |
86 if (scheduled_draw_) | |
87 return; | |
88 | |
89 scheduled_draw_ = true; | |
90 | |
91 base::MessageLoop::current()->PostTask( | |
92 FROM_HERE, | |
93 base::Bind(&Display::DoComposite, schedule_draw_factory_.GetWeakPtr())); | |
94 } | |
95 | |
96 void Display::ScheduleAnimation() { | |
97 ScheduleComposite(); | |
98 } | |
99 | |
100 void Display::DoComposite() { | |
101 scheduled_draw_ = false; | |
102 layer_tree_host_->Composite(gfx::FrameTime::Now()); | |
103 } | 183 } |
104 | 184 |
105 int Display::CurrentSurfaceID() { | 185 int Display::CurrentSurfaceID() { |
106 return current_surface_ ? current_surface_->surface_id() : 0; | 186 return current_surface_ ? current_surface_->surface_id() : 0; |
107 } | 187 } |
108 | 188 |
109 void Display::ReturnResources(const ReturnedResourceArray& resources) { | 189 void Display::ReturnResources(const ReturnedResourceArray& resources) { |
110 // We never generate any resources, so we should never have any returned. | |
111 DCHECK(resources.empty()); | |
112 } | 190 } |
113 | 191 |
114 } // namespace cc | 192 } // namespace cc |
115 | 193 |
116 #endif // CC_SURFACES_DISPLAY_H_ | 194 #endif // CC_SURFACES_DISPLAY_H_ |
OLD | NEW |