Chromium Code Reviews| 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 |