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

Side by Side Diff: services/ui/public/cpp/window_compositor_frame_sink.cc

Issue 2582823002: WIP: Surface Synchronization System
Patch Set: Only create ClientSurfaceEmbedder if window is visible. Trash it otherwise. Created 3 years, 11 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
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 #include "services/ui/public/cpp/window_compositor_frame_sink.h" 5 #include "services/ui/public/cpp/window_compositor_frame_sink.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_sink_client.h" 10 #include "cc/output/compositor_frame_sink_client.h"
(...skipping 17 matching lines...) Expand all
28 MakeRequest(&compositor_frame_sink), 28 MakeRequest(&compositor_frame_sink),
29 compositor_frame_sink_client.PassInterface())); 29 compositor_frame_sink_client.PassInterface()));
30 return base::WrapUnique(new WindowCompositorFrameSink( 30 return base::WrapUnique(new WindowCompositorFrameSink(
31 frame_sink_id, std::move(context_provider), gpu_memory_buffer_manager, 31 frame_sink_id, std::move(context_provider), gpu_memory_buffer_manager,
32 compositor_frame_sink.PassInterface(), 32 compositor_frame_sink.PassInterface(),
33 std::move(compositor_frame_sink_client_request))); 33 std::move(compositor_frame_sink_client_request)));
34 } 34 }
35 35
36 WindowCompositorFrameSink::~WindowCompositorFrameSink() {} 36 WindowCompositorFrameSink::~WindowCompositorFrameSink() {}
37 37
38 base::WeakPtr<WindowCompositorFrameSink>
39 WindowCompositorFrameSink::GetWeakPtr() {
40 return factory_.GetWeakPtr();
41 }
42
43 void WindowCompositorFrameSink::SetLocalFrameId(
44 const cc::LocalFrameId& local_frame_id) {
45 // if (local_frame_id == local_frame_id_)
46 // return;
47 fprintf(stderr, ">>>WindowCompositorFrameSink::SetLocalFrameId(%s)\n",
48 local_frame_id.ToString().c_str());
49 DCHECK(local_frame_id.is_valid());
50 local_frame_id_ = local_frame_id;
51 if (pending_compositor_frame_) {
52 SubmitCompositorFrame(std::move(pending_compositor_frame_.value()));
53 pending_compositor_frame_.reset();
54 }
55 }
56
38 bool WindowCompositorFrameSink::BindToClient( 57 bool WindowCompositorFrameSink::BindToClient(
39 cc::CompositorFrameSinkClient* client) { 58 cc::CompositorFrameSinkClient* client) {
40 if (!cc::CompositorFrameSink::BindToClient(client)) 59 if (!cc::CompositorFrameSink::BindToClient(client))
41 return false; 60 return false;
42 61
43 DCHECK(!thread_checker_); 62 DCHECK(!thread_checker_);
44 thread_checker_.reset(new base::ThreadChecker()); 63 thread_checker_.reset(new base::ThreadChecker());
45 compositor_frame_sink_.Bind(std::move(compositor_frame_sink_info_)); 64 compositor_frame_sink_.Bind(std::move(compositor_frame_sink_info_));
46 client_binding_.reset( 65 client_binding_.reset(
47 new mojo::Binding<cc::mojom::MojoCompositorFrameSinkClient>( 66 new mojo::Binding<cc::mojom::MojoCompositorFrameSinkClient>(
(...skipping 16 matching lines...) Expand all
64 void WindowCompositorFrameSink::SubmitCompositorFrame( 83 void WindowCompositorFrameSink::SubmitCompositorFrame(
65 cc::CompositorFrame frame) { 84 cc::CompositorFrame frame) {
66 DCHECK(thread_checker_); 85 DCHECK(thread_checker_);
67 DCHECK(thread_checker_->CalledOnValidThread()); 86 DCHECK(thread_checker_->CalledOnValidThread());
68 if (!compositor_frame_sink_) 87 if (!compositor_frame_sink_)
69 return; 88 return;
70 89
71 gfx::Size frame_size = last_submitted_frame_size_; 90 gfx::Size frame_size = last_submitted_frame_size_;
72 if (!frame.render_pass_list.empty()) 91 if (!frame.render_pass_list.empty())
73 frame_size = frame.render_pass_list[0]->output_rect.size(); 92 frame_size = frame.render_pass_list[0]->output_rect.size();
74 if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_)
75 local_frame_id_ = id_allocator_.GenerateId();
76 93
77 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_, 94 // LocalFrameId is invalid if this Window has not been embedded anywhere yet.
78 std::move(frame)); 95 if (local_frame_id_.is_valid()) {
96 // frame.metadata.respect_deadline = false;
97 fprintf(stderr, ">>>Submitting Frame %s\n",
98 cc::SurfaceId(frame_sink_id_, local_frame_id_).ToString().c_str());
99 compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
100 std::move(frame));
79 101
80 last_submitted_frame_size_ = frame_size; 102 last_submitted_frame_size_ = frame_size;
103 } else {
104 pending_compositor_frame_ = std::move(frame);
105 }
81 } 106 }
82 107
83 WindowCompositorFrameSink::WindowCompositorFrameSink( 108 WindowCompositorFrameSink::WindowCompositorFrameSink(
84 const cc::FrameSinkId& frame_sink_id, 109 const cc::FrameSinkId& frame_sink_id,
85 scoped_refptr<cc::ContextProvider> context_provider, 110 scoped_refptr<cc::ContextProvider> context_provider,
86 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 111 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
87 cc::mojom::MojoCompositorFrameSinkPtrInfo compositor_frame_sink_info, 112 cc::mojom::MojoCompositorFrameSinkPtrInfo compositor_frame_sink_info,
88 cc::mojom::MojoCompositorFrameSinkClientRequest client_request) 113 cc::mojom::MojoCompositorFrameSinkClientRequest client_request)
89 : cc::CompositorFrameSink(std::move(context_provider), 114 : cc::CompositorFrameSink(std::move(context_provider),
90 nullptr, 115 nullptr,
91 gpu_memory_buffer_manager, 116 gpu_memory_buffer_manager,
92 nullptr), 117 nullptr),
93 compositor_frame_sink_info_(std::move(compositor_frame_sink_info)), 118 compositor_frame_sink_info_(std::move(compositor_frame_sink_info)),
94 client_request_(std::move(client_request)), 119 client_request_(std::move(client_request)),
95 frame_sink_id_(frame_sink_id) {} 120 frame_sink_id_(frame_sink_id),
121 factory_(this) {}
96 122
97 void WindowCompositorFrameSink::DidReceiveCompositorFrameAck() { 123 void WindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
98 DCHECK(thread_checker_); 124 DCHECK(thread_checker_);
99 DCHECK(thread_checker_->CalledOnValidThread()); 125 DCHECK(thread_checker_->CalledOnValidThread());
100 if (!client_) 126 if (!client_)
101 return; 127 return;
102 client_->DidReceiveCompositorFrameAck(); 128 client_->DidReceiveCompositorFrameAck();
103 } 129 }
104 130
105 void WindowCompositorFrameSink::OnBeginFrame( 131 void WindowCompositorFrameSink::OnBeginFrame(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 WindowCompositorFrameSinkBinding::TakeFrameSinkRequest() { 163 WindowCompositorFrameSinkBinding::TakeFrameSinkRequest() {
138 return std::move(compositor_frame_sink_request_); 164 return std::move(compositor_frame_sink_request_);
139 } 165 }
140 166
141 cc::mojom::MojoCompositorFrameSinkClientPtrInfo 167 cc::mojom::MojoCompositorFrameSinkClientPtrInfo
142 WindowCompositorFrameSinkBinding::TakeFrameSinkClient() { 168 WindowCompositorFrameSinkBinding::TakeFrameSinkClient() {
143 return std::move(compositor_frame_sink_client_); 169 return std::move(compositor_frame_sink_client_);
144 } 170 }
145 171
146 } // namespace ui 172 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698