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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: services/ui/public/cpp/window_compositor_frame_sink.cc
diff --git a/services/ui/public/cpp/window_compositor_frame_sink.cc b/services/ui/public/cpp/window_compositor_frame_sink.cc
index 4b3f6759d5cc2f53ff9997e49280600d96613442..0d7bc651d4fdd9ff5c73ed566d15ae9c5e6da4f4 100644
--- a/services/ui/public/cpp/window_compositor_frame_sink.cc
+++ b/services/ui/public/cpp/window_compositor_frame_sink.cc
@@ -35,6 +35,25 @@ std::unique_ptr<WindowCompositorFrameSink> WindowCompositorFrameSink::Create(
WindowCompositorFrameSink::~WindowCompositorFrameSink() {}
+base::WeakPtr<WindowCompositorFrameSink>
+WindowCompositorFrameSink::GetWeakPtr() {
+ return factory_.GetWeakPtr();
+}
+
+void WindowCompositorFrameSink::SetLocalFrameId(
+ const cc::LocalFrameId& local_frame_id) {
+ // if (local_frame_id == local_frame_id_)
+ // return;
+ fprintf(stderr, ">>>WindowCompositorFrameSink::SetLocalFrameId(%s)\n",
+ local_frame_id.ToString().c_str());
+ DCHECK(local_frame_id.is_valid());
+ local_frame_id_ = local_frame_id;
+ if (pending_compositor_frame_) {
+ SubmitCompositorFrame(std::move(pending_compositor_frame_.value()));
+ pending_compositor_frame_.reset();
+ }
+}
+
bool WindowCompositorFrameSink::BindToClient(
cc::CompositorFrameSinkClient* client) {
if (!cc::CompositorFrameSink::BindToClient(client))
@@ -71,13 +90,19 @@ void WindowCompositorFrameSink::SubmitCompositorFrame(
gfx::Size frame_size = last_submitted_frame_size_;
if (!frame.render_pass_list.empty())
frame_size = frame.render_pass_list[0]->output_rect.size();
- if (!local_frame_id_.is_valid() || frame_size != last_submitted_frame_size_)
- local_frame_id_ = id_allocator_.GenerateId();
-
- compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
- std::move(frame));
- last_submitted_frame_size_ = frame_size;
+ // LocalFrameId is invalid if this Window has not been embedded anywhere yet.
+ if (local_frame_id_.is_valid()) {
+ // frame.metadata.respect_deadline = false;
+ fprintf(stderr, ">>>Submitting Frame %s\n",
+ cc::SurfaceId(frame_sink_id_, local_frame_id_).ToString().c_str());
+ compositor_frame_sink_->SubmitCompositorFrame(local_frame_id_,
+ std::move(frame));
+
+ last_submitted_frame_size_ = frame_size;
+ } else {
+ pending_compositor_frame_ = std::move(frame);
+ }
}
WindowCompositorFrameSink::WindowCompositorFrameSink(
@@ -92,7 +117,8 @@ WindowCompositorFrameSink::WindowCompositorFrameSink(
nullptr),
compositor_frame_sink_info_(std::move(compositor_frame_sink_info)),
client_request_(std::move(client_request)),
- frame_sink_id_(frame_sink_id) {}
+ frame_sink_id_(frame_sink_id),
+ factory_(this) {}
void WindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
DCHECK(thread_checker_);

Powered by Google App Engine
This is Rietveld 408576698