| 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 #include "cc/surfaces/display.h" | 5 #include "cc/surfaces/display.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 // they are ready to receive a BeginFrameSource. | 81 // they are ready to receive a BeginFrameSource. |
| 82 if (begin_frame_source_) { | 82 if (begin_frame_source_) { |
| 83 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), | 83 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), |
| 84 compositor_surface_namespace_); | 84 compositor_surface_namespace_); |
| 85 } | 85 } |
| 86 | 86 |
| 87 bool ok = output_surface_->BindToClient(this); | 87 bool ok = output_surface_->BindToClient(this); |
| 88 // The context given to the Display's OutputSurface should already be | 88 // The context given to the Display's OutputSurface should already be |
| 89 // initialized, so Bind can not fail. | 89 // initialized, so Bind can not fail. |
| 90 DCHECK(ok); | 90 DCHECK(ok); |
| 91 InitializeRenderer(); |
| 91 } | 92 } |
| 92 | 93 |
| 93 void Display::SetSurfaceId(const SurfaceId& id, float device_scale_factor) { | 94 void Display::SetSurfaceId(const SurfaceId& id, float device_scale_factor) { |
| 94 DCHECK_EQ(id.client_id(), compositor_surface_namespace_); | 95 DCHECK_EQ(id.client_id(), compositor_surface_namespace_); |
| 95 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 96 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
| 96 return; | 97 return; |
| 97 | 98 |
| 98 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 99 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
| 99 current_surface_id_ = id; | 100 current_surface_id_ = id; |
| 100 device_scale_factor_ = device_scale_factor; | 101 device_scale_factor_ = device_scale_factor; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 | 145 |
| 145 if (aggregator_) { | 146 if (aggregator_) { |
| 146 aggregator_->set_output_is_secure(secure); | 147 aggregator_->set_output_is_secure(secure); |
| 147 // Force a redraw. | 148 // Force a redraw. |
| 148 if (!current_surface_id_.is_null()) | 149 if (!current_surface_id_.is_null()) |
| 149 aggregator_->SetFullDamageForSurface(current_surface_id_); | 150 aggregator_->SetFullDamageForSurface(current_surface_id_); |
| 150 } | 151 } |
| 151 } | 152 } |
| 152 | 153 |
| 153 void Display::InitializeRenderer() { | 154 void Display::InitializeRenderer() { |
| 154 if (resource_provider_) | 155 resource_provider_.reset(new ResourceProvider( |
| 155 return; | |
| 156 | |
| 157 std::unique_ptr<ResourceProvider> resource_provider(new ResourceProvider( | |
| 158 output_surface_->context_provider(), bitmap_manager_, | 156 output_surface_->context_provider(), bitmap_manager_, |
| 159 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, | 157 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, |
| 160 settings_.texture_id_allocation_chunk_size, | 158 settings_.texture_id_allocation_chunk_size, |
| 161 output_surface_->capabilities().delegated_sync_points_required, | 159 output_surface_->capabilities().delegated_sync_points_required, |
| 162 settings_.use_gpu_memory_buffer_resources, | 160 settings_.use_gpu_memory_buffer_resources, |
| 163 settings_.buffer_to_texture_target_map)); | 161 settings_.buffer_to_texture_target_map)); |
| 164 | 162 |
| 165 if (output_surface_->context_provider()) { | 163 if (output_surface_->context_provider()) { |
| 166 DCHECK(texture_mailbox_deleter_); | 164 DCHECK(texture_mailbox_deleter_); |
| 167 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( | 165 renderer_ = base::MakeUnique<GLRenderer>( |
| 168 this, &settings_, output_surface_.get(), resource_provider.get(), | 166 this, &settings_, output_surface_.get(), resource_provider_.get(), |
| 169 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 167 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); |
| 170 if (!renderer) | |
| 171 return; | |
| 172 renderer_ = std::move(renderer); | |
| 173 } else if (output_surface_->vulkan_context_provider()) { | 168 } else if (output_surface_->vulkan_context_provider()) { |
| 174 #if defined(ENABLE_VULKAN) | 169 #if defined(ENABLE_VULKAN) |
| 175 DCHECK(texture_mailbox_deleter_); | 170 DCHECK(texture_mailbox_deleter_); |
| 176 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( | 171 renderer_ = base::MakeUnique<VulkanRenderer>( |
| 177 this, &settings_, output_surface_.get(), resource_provider.get(), | 172 this, &settings_, output_surface_.get(), resource_provider_.get(), |
| 178 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 173 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); |
| 179 if (!renderer) | |
| 180 return; | |
| 181 renderer_ = std::move(renderer); | |
| 182 #else | 174 #else |
| 183 NOTREACHED(); | 175 NOTREACHED(); |
| 184 #endif | 176 #endif |
| 185 } else { | 177 } else { |
| 186 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( | 178 auto renderer = base::MakeUnique<SoftwareRenderer>( |
| 187 this, &settings_, output_surface_.get(), resource_provider.get()); | 179 this, &settings_, output_surface_.get(), resource_provider_.get()); |
| 188 if (!renderer) | |
| 189 return; | |
| 190 software_renderer_ = renderer.get(); | 180 software_renderer_ = renderer.get(); |
| 191 renderer_ = std::move(renderer); | 181 renderer_ = std::move(renderer); |
| 192 } | 182 } |
| 193 | 183 |
| 194 renderer_->SetEnlargePassTextureAmount(enlarge_texture_amount_); | 184 renderer_->SetEnlargePassTextureAmount(enlarge_texture_amount_); |
| 195 | 185 |
| 196 resource_provider_ = std::move(resource_provider); | |
| 197 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using | 186 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using |
| 198 // overlays. | 187 // overlays. |
| 199 bool output_partial_list = renderer_->Capabilities().using_partial_swap && | 188 bool output_partial_list = renderer_->Capabilities().using_partial_swap && |
| 200 !output_surface_->GetOverlayCandidateValidator(); | 189 !output_surface_->GetOverlayCandidateValidator(); |
| 201 aggregator_.reset(new SurfaceAggregator( | 190 aggregator_.reset(new SurfaceAggregator( |
| 202 surface_manager_, resource_provider_.get(), output_partial_list)); | 191 surface_manager_, resource_provider_.get(), output_partial_list)); |
| 203 aggregator_->set_output_is_secure(output_is_secure_); | 192 aggregator_->set_output_is_secure(output_is_secure_); |
| 204 } | 193 } |
| 205 | 194 |
| 206 void Display::DidLoseOutputSurface() { | 195 void Display::DidLoseOutputSurface() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 220 } | 209 } |
| 221 | 210 |
| 222 bool Display::DrawAndSwap() { | 211 bool Display::DrawAndSwap() { |
| 223 TRACE_EVENT0("cc", "Display::DrawAndSwap"); | 212 TRACE_EVENT0("cc", "Display::DrawAndSwap"); |
| 224 | 213 |
| 225 if (current_surface_id_.is_null()) { | 214 if (current_surface_id_.is_null()) { |
| 226 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); | 215 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); |
| 227 return false; | 216 return false; |
| 228 } | 217 } |
| 229 | 218 |
| 230 InitializeRenderer(); | |
| 231 if (!output_surface_) { | 219 if (!output_surface_) { |
| 232 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); | 220 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); |
| 233 return false; | 221 return false; |
| 234 } | 222 } |
| 235 | 223 |
| 236 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_); | 224 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_); |
| 237 if (!frame.delegated_frame_data) { | 225 if (!frame.delegated_frame_data) { |
| 238 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", | 226 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", |
| 239 TRACE_EVENT_SCOPE_THREAD); | 227 TRACE_EVENT_SCOPE_THREAD); |
| 240 return false; | 228 return false; |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 415 |
| 428 if (surface_id == current_surface_id_) | 416 if (surface_id == current_surface_id_) |
| 429 UpdateRootSurfaceResourcesLocked(); | 417 UpdateRootSurfaceResourcesLocked(); |
| 430 } | 418 } |
| 431 | 419 |
| 432 const SurfaceId& Display::CurrentSurfaceId() { | 420 const SurfaceId& Display::CurrentSurfaceId() { |
| 433 return current_surface_id_; | 421 return current_surface_id_; |
| 434 } | 422 } |
| 435 | 423 |
| 436 } // namespace cc | 424 } // namespace cc |
| OLD | NEW |