Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: cc/surfaces/display.cc

Issue 319133010: Switch Display to use ResourceProvider and *Renderer directly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/surfaces/display.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_
OLDNEW
« no previous file with comments | « cc/surfaces/display.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698