| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/android/synchronous_compositor_frame_sink.h" | 5 #include "content/renderer/android/synchronous_compositor_frame_sink.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue) | 111 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue) |
| 112 : cc::CompositorFrameSink(std::move(context_provider), | 112 : cc::CompositorFrameSink(std::move(context_provider), |
| 113 std::move(worker_context_provider)), | 113 std::move(worker_context_provider)), |
| 114 routing_id_(routing_id), | 114 routing_id_(routing_id), |
| 115 compositor_frame_sink_id_(compositor_frame_sink_id), | 115 compositor_frame_sink_id_(compositor_frame_sink_id), |
| 116 registry_(registry), | 116 registry_(registry), |
| 117 sender_(RenderThreadImpl::current()->sync_compositor_message_filter()), | 117 sender_(RenderThreadImpl::current()->sync_compositor_message_filter()), |
| 118 memory_policy_(0u), | 118 memory_policy_(0u), |
| 119 frame_swap_message_queue_(frame_swap_message_queue), | 119 frame_swap_message_queue_(frame_swap_message_queue), |
| 120 surface_manager_(new cc::SurfaceManager), | 120 surface_manager_(new cc::SurfaceManager), |
| 121 surface_id_allocator_(new cc::SurfaceIdAllocator(kFrameSinkId)), | 121 surface_id_allocator_(new cc::SurfaceIdAllocator()), |
| 122 surface_factory_( | 122 surface_factory_( |
| 123 new cc::SurfaceFactory(kFrameSinkId, surface_manager_.get(), this)), | 123 new cc::SurfaceFactory(kFrameSinkId, surface_manager_.get(), this)), |
| 124 begin_frame_source_(std::move(begin_frame_source)) { | 124 begin_frame_source_(std::move(begin_frame_source)) { |
| 125 DCHECK(registry_); | 125 DCHECK(registry_); |
| 126 DCHECK(sender_); | 126 DCHECK(sender_); |
| 127 DCHECK(begin_frame_source_); | 127 DCHECK(begin_frame_source_); |
| 128 thread_checker_.DetachFromThread(); | 128 thread_checker_.DetachFromThread(); |
| 129 memory_policy_.priority_cutoff_when_visible = | 129 memory_policy_.priority_cutoff_when_visible = |
| 130 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE; | 130 gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE; |
| 131 } | 131 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 } | 190 } |
| 191 | 191 |
| 192 void SynchronousCompositorFrameSink::DetachFromClient() { | 192 void SynchronousCompositorFrameSink::DetachFromClient() { |
| 193 DCHECK(CalledOnValidThread()); | 193 DCHECK(CalledOnValidThread()); |
| 194 client_->SetBeginFrameSource(nullptr); | 194 client_->SetBeginFrameSource(nullptr); |
| 195 // Destroy the begin frame source on the same thread it was bound on. | 195 // Destroy the begin frame source on the same thread it was bound on. |
| 196 begin_frame_source_ = nullptr; | 196 begin_frame_source_ = nullptr; |
| 197 if (registered_) | 197 if (registered_) |
| 198 registry_->UnregisterCompositorFrameSink(routing_id_, this); | 198 registry_->UnregisterCompositorFrameSink(routing_id_, this); |
| 199 client_->SetTreeActivationCallback(base::Closure()); | 199 client_->SetTreeActivationCallback(base::Closure()); |
| 200 if (!root_surface_id_.is_null()) { | 200 if (!root_local_frame_id_.is_null()) { |
| 201 surface_factory_->Destroy(root_surface_id_); | 201 surface_factory_->Destroy(root_local_frame_id_); |
| 202 surface_factory_->Destroy(child_surface_id_); | 202 surface_factory_->Destroy(child_local_frame_id_); |
| 203 } | 203 } |
| 204 surface_manager_->UnregisterSurfaceFactoryClient(kFrameSinkId); | 204 surface_manager_->UnregisterSurfaceFactoryClient(kFrameSinkId); |
| 205 surface_manager_->InvalidateFrameSinkId(kFrameSinkId); | 205 surface_manager_->InvalidateFrameSinkId(kFrameSinkId); |
| 206 software_output_surface_ = nullptr; | 206 software_output_surface_ = nullptr; |
| 207 display_ = nullptr; | 207 display_ = nullptr; |
| 208 surface_factory_ = nullptr; | 208 surface_factory_ = nullptr; |
| 209 surface_id_allocator_ = nullptr; | 209 surface_id_allocator_ = nullptr; |
| 210 surface_manager_ = nullptr; | 210 surface_manager_ = nullptr; |
| 211 cc::CompositorFrameSink::DetachFromClient(); | 211 cc::CompositorFrameSink::DetachFromClient(); |
| 212 CancelFallbackTick(); | 212 CancelFallbackTick(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 226 return; | 226 return; |
| 227 } | 227 } |
| 228 | 228 |
| 229 cc::CompositorFrame swap_frame; | 229 cc::CompositorFrame swap_frame; |
| 230 | 230 |
| 231 if (in_software_draw_) { | 231 if (in_software_draw_) { |
| 232 // The frame we send to the client is actually just the metadata. Preserve | 232 // The frame we send to the client is actually just the metadata. Preserve |
| 233 // the |frame| for the software path below. | 233 // the |frame| for the software path below. |
| 234 swap_frame.metadata = frame.metadata.Clone(); | 234 swap_frame.metadata = frame.metadata.Clone(); |
| 235 | 235 |
| 236 if (root_surface_id_.is_null()) { | 236 if (root_local_frame_id_.is_null()) { |
| 237 root_surface_id_ = surface_id_allocator_->GenerateId(); | 237 root_local_frame_id_ = surface_id_allocator_->GenerateId(); |
| 238 surface_factory_->Create(root_surface_id_); | 238 surface_factory_->Create(root_local_frame_id_); |
| 239 child_surface_id_ = surface_id_allocator_->GenerateId(); | 239 child_local_frame_id_ = surface_id_allocator_->GenerateId(); |
| 240 surface_factory_->Create(child_surface_id_); | 240 surface_factory_->Create(child_local_frame_id_); |
| 241 } | 241 } |
| 242 | 242 |
| 243 display_->SetSurfaceId(root_surface_id_, | 243 display_->SetSurfaceId(cc::SurfaceId(kFrameSinkId, root_local_frame_id_), |
| 244 frame.metadata.device_scale_factor); | 244 frame.metadata.device_scale_factor); |
| 245 | 245 |
| 246 // The layer compositor should be giving a frame that covers the | 246 // The layer compositor should be giving a frame that covers the |
| 247 // |sw_viewport_for_current_draw_| but at 0,0. | 247 // |sw_viewport_for_current_draw_| but at 0,0. |
| 248 gfx::Size child_size = sw_viewport_for_current_draw_.size(); | 248 gfx::Size child_size = sw_viewport_for_current_draw_.size(); |
| 249 DCHECK(gfx::Rect(child_size) == | 249 DCHECK(gfx::Rect(child_size) == |
| 250 frame.delegated_frame_data->render_pass_list.back()->output_rect); | 250 frame.delegated_frame_data->render_pass_list.back()->output_rect); |
| 251 | 251 |
| 252 // Make a size that covers from 0,0 and includes the area coming from the | 252 // Make a size that covers from 0,0 and includes the area coming from the |
| 253 // layer compositor. | 253 // layer compositor. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 281 // The RenderPass has a single SurfaceDrawQuad (and SharedQuadState for it). | 281 // The RenderPass has a single SurfaceDrawQuad (and SharedQuadState for it). |
| 282 auto* shared_quad_state = | 282 auto* shared_quad_state = |
| 283 embed_render_pass->CreateAndAppendSharedQuadState(); | 283 embed_render_pass->CreateAndAppendSharedQuadState(); |
| 284 auto* surface_quad = | 284 auto* surface_quad = |
| 285 embed_render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); | 285 embed_render_pass->CreateAndAppendDrawQuad<cc::SurfaceDrawQuad>(); |
| 286 shared_quad_state->SetAll( | 286 shared_quad_state->SetAll( |
| 287 child_transform, child_size, gfx::Rect(child_size), | 287 child_transform, child_size, gfx::Rect(child_size), |
| 288 gfx::Rect() /* clip_rect */, false /* is_clipped */, 1.f /* opacity */, | 288 gfx::Rect() /* clip_rect */, false /* is_clipped */, 1.f /* opacity */, |
| 289 SkXfermode::kSrcOver_Mode, 0 /* sorting_context_id */); | 289 SkXfermode::kSrcOver_Mode, 0 /* sorting_context_id */); |
| 290 surface_quad->SetNew(shared_quad_state, gfx::Rect(child_size), | 290 surface_quad->SetNew(shared_quad_state, gfx::Rect(child_size), |
| 291 gfx::Rect(child_size), child_surface_id_); | 291 gfx::Rect(child_size), |
| 292 cc::SurfaceId(kFrameSinkId, child_local_frame_id_)); |
| 292 | 293 |
| 293 surface_factory_->SubmitCompositorFrame(child_surface_id_, std::move(frame), | 294 surface_factory_->SubmitCompositorFrame( |
| 294 base::Bind(&NoOpDrawCallback)); | 295 child_local_frame_id_, std::move(frame), base::Bind(&NoOpDrawCallback)); |
| 295 surface_factory_->SubmitCompositorFrame(root_surface_id_, | 296 surface_factory_->SubmitCompositorFrame(root_local_frame_id_, |
| 296 std::move(embed_frame), | 297 std::move(embed_frame), |
| 297 base::Bind(&NoOpDrawCallback)); | 298 base::Bind(&NoOpDrawCallback)); |
| 298 display_->DrawAndSwap(); | 299 display_->DrawAndSwap(); |
| 299 } else { | 300 } else { |
| 300 // For hardware draws we send the whole frame to the client so it can draw | 301 // For hardware draws we send the whole frame to the client so it can draw |
| 301 // the content in it. | 302 // the content in it. |
| 302 swap_frame = std::move(frame); | 303 swap_frame = std::move(frame); |
| 303 } | 304 } |
| 304 | 305 |
| 305 sync_client_->SwapBuffers(compositor_frame_sink_id_, std::move(swap_frame)); | 306 sync_client_->SwapBuffers(compositor_frame_sink_id_, std::move(swap_frame)); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 client_->ReclaimResources(resources); | 464 client_->ReclaimResources(resources); |
| 464 } | 465 } |
| 465 | 466 |
| 466 void SynchronousCompositorFrameSink::SetBeginFrameSource( | 467 void SynchronousCompositorFrameSink::SetBeginFrameSource( |
| 467 cc::BeginFrameSource* begin_frame_source) { | 468 cc::BeginFrameSource* begin_frame_source) { |
| 468 // Software output is synchronous and doesn't use a BeginFrameSource. | 469 // Software output is synchronous and doesn't use a BeginFrameSource. |
| 469 NOTREACHED(); | 470 NOTREACHED(); |
| 470 } | 471 } |
| 471 | 472 |
| 472 } // namespace content | 473 } // namespace content |
| OLD | NEW |