| 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/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 bitmap_manager_(bitmap_manager), | 45 bitmap_manager_(bitmap_manager), |
| 46 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 46 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 47 settings_(settings), | 47 settings_(settings), |
| 48 compositor_surface_namespace_(compositor_surface_namespace), | 48 compositor_surface_namespace_(compositor_surface_namespace), |
| 49 begin_frame_source_(std::move(begin_frame_source)), | 49 begin_frame_source_(std::move(begin_frame_source)), |
| 50 output_surface_(std::move(output_surface)), | 50 output_surface_(std::move(output_surface)), |
| 51 scheduler_(std::move(scheduler)), | 51 scheduler_(std::move(scheduler)), |
| 52 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { | 52 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { |
| 53 DCHECK(surface_manager_); | 53 DCHECK(surface_manager_); |
| 54 DCHECK(output_surface_); | 54 DCHECK(output_surface_); |
| 55 DCHECK(texture_mailbox_deleter_); | |
| 56 DCHECK_EQ(!scheduler_, !begin_frame_source_); | 55 DCHECK_EQ(!scheduler_, !begin_frame_source_); |
| 57 | 56 |
| 58 surface_manager_->AddObserver(this); | 57 surface_manager_->AddObserver(this); |
| 59 | 58 |
| 60 if (scheduler_) | 59 if (scheduler_) |
| 61 scheduler_->SetClient(this); | 60 scheduler_->SetClient(this); |
| 62 } | 61 } |
| 63 | 62 |
| 64 Display::~Display() { | 63 Display::~Display() { |
| 65 // Only do this if Initialize() happened. | 64 // Only do this if Initialize() happened. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 std::unique_ptr<ResourceProvider> resource_provider(new ResourceProvider( | 155 std::unique_ptr<ResourceProvider> resource_provider(new ResourceProvider( |
| 157 output_surface_->context_provider(), bitmap_manager_, | 156 output_surface_->context_provider(), bitmap_manager_, |
| 158 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, | 157 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, |
| 159 settings_.texture_id_allocation_chunk_size, | 158 settings_.texture_id_allocation_chunk_size, |
| 160 output_surface_->capabilities().delegated_sync_points_required, | 159 output_surface_->capabilities().delegated_sync_points_required, |
| 161 settings_.use_gpu_memory_buffer_resources, | 160 settings_.use_gpu_memory_buffer_resources, |
| 162 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1, | 161 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1, |
| 163 GL_TEXTURE_2D))); | 162 GL_TEXTURE_2D))); |
| 164 | 163 |
| 165 if (output_surface_->context_provider()) { | 164 if (output_surface_->context_provider()) { |
| 165 DCHECK(texture_mailbox_deleter_); |
| 166 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( | 166 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( |
| 167 this, &settings_, output_surface_.get(), resource_provider.get(), | 167 this, &settings_, output_surface_.get(), resource_provider.get(), |
| 168 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 168 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); |
| 169 if (!renderer) | 169 if (!renderer) |
| 170 return; | 170 return; |
| 171 renderer_ = std::move(renderer); | 171 renderer_ = std::move(renderer); |
| 172 } else if (output_surface_->vulkan_context_provider()) { | 172 } else if (output_surface_->vulkan_context_provider()) { |
| 173 #if defined(ENABLE_VULKAN) | 173 #if defined(ENABLE_VULKAN) |
| 174 DCHECK(texture_mailbox_deleter_); |
| 174 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( | 175 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( |
| 175 this, &settings_, output_surface_.get(), resource_provider.get(), | 176 this, &settings_, output_surface_.get(), resource_provider.get(), |
| 176 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 177 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); |
| 177 if (!renderer) | 178 if (!renderer) |
| 178 return; | 179 return; |
| 179 renderer_ = std::move(renderer); | 180 renderer_ = std::move(renderer); |
| 180 #else | 181 #else |
| 181 NOTREACHED(); | 182 NOTREACHED(); |
| 182 #endif | 183 #endif |
| 183 } else { | 184 } else { |
| 184 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( | 185 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( |
| 185 this, &settings_, output_surface_.get(), resource_provider.get(), | 186 this, &settings_, output_surface_.get(), resource_provider.get()); |
| 186 true /* use_image_hijack_canvas */); | |
| 187 if (!renderer) | 187 if (!renderer) |
| 188 return; | 188 return; |
| 189 software_renderer_ = renderer.get(); |
| 189 renderer_ = std::move(renderer); | 190 renderer_ = std::move(renderer); |
| 190 } | 191 } |
| 191 | 192 |
| 192 renderer_->SetEnlargePassTextureAmount(enlarge_texture_amount_); | 193 renderer_->SetEnlargePassTextureAmount(enlarge_texture_amount_); |
| 193 | 194 |
| 194 resource_provider_ = std::move(resource_provider); | 195 resource_provider_ = std::move(resource_provider); |
| 195 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using | 196 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using |
| 196 // overlays. | 197 // overlays. |
| 197 bool output_partial_list = renderer_->Capabilities().using_partial_swap && | 198 bool output_partial_list = renderer_->Capabilities().using_partial_swap && |
| 198 !output_surface_->GetOverlayCandidateValidator(); | 199 !output_surface_->GetOverlayCandidateValidator(); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 if (output_surface_->SurfaceIsSuspendForRecycle()) { | 284 if (output_surface_->SurfaceIsSuspendForRecycle()) { |
| 284 TRACE_EVENT_INSTANT0("cc", "Surface is suspended for recycle.", | 285 TRACE_EVENT_INSTANT0("cc", "Surface is suspended for recycle.", |
| 285 TRACE_EVENT_SCOPE_THREAD); | 286 TRACE_EVENT_SCOPE_THREAD); |
| 286 should_draw = false; | 287 should_draw = false; |
| 287 } | 288 } |
| 288 | 289 |
| 289 if (should_draw) { | 290 if (should_draw) { |
| 290 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_); | 291 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_); |
| 291 gfx::Rect device_clip_rect = | 292 gfx::Rect device_clip_rect = |
| 292 external_clip_.IsEmpty() ? device_viewport_rect : external_clip_; | 293 external_clip_.IsEmpty() ? device_viewport_rect : external_clip_; |
| 293 bool disable_picture_quad_image_filtering = false; | 294 |
| 295 bool disable_image_filtering = |
| 296 frame.metadata.is_resourceless_software_draw_with_scroll_or_animation; |
| 297 if (software_renderer_) { |
| 298 software_renderer_->SetDisablePictureQuadImageFiltering( |
| 299 disable_image_filtering); |
| 300 } else { |
| 301 // This should only be set for software draws in synchronous compositor. |
| 302 DCHECK(!disable_image_filtering); |
| 303 } |
| 294 | 304 |
| 295 renderer_->DecideRenderPassAllocationsForFrame( | 305 renderer_->DecideRenderPassAllocationsForFrame( |
| 296 frame_data->render_pass_list); | 306 frame_data->render_pass_list); |
| 297 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, | 307 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, |
| 298 device_color_space_, device_viewport_rect, | 308 device_color_space_, device_viewport_rect, |
| 299 device_clip_rect, | 309 device_clip_rect); |
| 300 disable_picture_quad_image_filtering); | |
| 301 } else { | 310 } else { |
| 302 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); | 311 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); |
| 303 } | 312 } |
| 304 | 313 |
| 305 bool should_swap = should_draw && size_matches; | 314 bool should_swap = should_draw && size_matches; |
| 306 if (should_swap) { | 315 if (should_swap) { |
| 307 swapped_since_resize_ = true; | 316 swapped_since_resize_ = true; |
| 308 for (auto& latency : frame.metadata.latency_info) { | 317 for (auto& latency : frame.metadata.latency_info) { |
| 309 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", | 318 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
| 310 TRACE_ID_DONT_MANGLE(latency.trace_id()), | 319 TRACE_ID_DONT_MANGLE(latency.trace_id()), |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 | 424 |
| 416 if (surface_id == current_surface_id_) | 425 if (surface_id == current_surface_id_) |
| 417 UpdateRootSurfaceResourcesLocked(); | 426 UpdateRootSurfaceResourcesLocked(); |
| 418 } | 427 } |
| 419 | 428 |
| 420 SurfaceId Display::CurrentSurfaceId() { | 429 SurfaceId Display::CurrentSurfaceId() { |
| 421 return current_surface_id_; | 430 return current_surface_id_; |
| 422 } | 431 } |
| 423 | 432 |
| 424 } // namespace cc | 433 } // namespace cc |
| OLD | NEW |