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

Side by Side Diff: services/ui/ws/server_window_compositor_frame_sink.cc

Issue 2471503002: Mus+Ash: Unify CompositorFrameSinks (Closed)
Patch Set: Remove unnecessary FrameGenerator::DidDraw Created 4 years, 1 month 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/ws/server_window_compositor_frame_sink.h" 5 #include "services/ui/ws/server_window_compositor_frame_sink.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/output_surface.h"
11 #include "cc/output/texture_mailbox_deleter.h"
10 #include "cc/quads/shared_quad_state.h" 12 #include "cc/quads/shared_quad_state.h"
11 #include "cc/quads/surface_draw_quad.h" 13 #include "cc/quads/surface_draw_quad.h"
14 #include "cc/scheduler/begin_frame_source.h"
15 #include "cc/surfaces/display_scheduler.h"
16 #include "services/ui/surfaces/direct_output_surface.h"
12 #include "services/ui/surfaces/display_compositor.h" 17 #include "services/ui/surfaces/display_compositor.h"
13 #include "services/ui/ws/server_window.h" 18 #include "services/ui/ws/server_window.h"
14 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h" 19 #include "services/ui/ws/server_window_compositor_frame_sink_manager.h"
15 #include "services/ui/ws/server_window_delegate.h" 20 #include "services/ui/ws/server_window_delegate.h"
16 21
22 #if defined(USE_OZONE)
23 #include "gpu/command_buffer/client/gles2_interface.h"
24 #include "services/ui/surfaces/direct_output_surface_ozone.h"
25 #endif
26
17 namespace ui { 27 namespace ui {
18 namespace ws { 28 namespace ws {
19 29
20 ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink( 30 ServerWindowCompositorFrameSink::ServerWindowCompositorFrameSink(
21 ServerWindowCompositorFrameSinkManager* manager, 31 ServerWindowCompositorFrameSinkManager* manager,
22 const cc::FrameSinkId& frame_sink_id, 32 const cc::FrameSinkId& frame_sink_id,
33 gfx::AcceleratedWidget widget,
34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
35 scoped_refptr<SurfacesContextProvider> context_provider,
23 cc::mojom::MojoCompositorFrameSinkRequest request, 36 cc::mojom::MojoCompositorFrameSinkRequest request,
24 cc::mojom::MojoCompositorFrameSinkClientPtr client) 37 cc::mojom::MojoCompositorFrameSinkClientPtr client)
25 : frame_sink_id_(frame_sink_id), 38 : frame_sink_id_(frame_sink_id),
39 task_runner_(base::ThreadTaskRunnerHandle::Get()),
kylechar 2016/11/02 13:22:36 Does task_runner_ need to be a class variable? It'
Fady Samuel 2016/11/02 13:48:18 I'm just refactoring in this CL, but if I recall c
26 manager_(manager), 40 manager_(manager),
27 surface_factory_(frame_sink_id_, 41 surface_factory_(frame_sink_id_,
28 manager_->GetCompositorFrameSinkManager(), 42 manager_->GetCompositorFrameSinkManager(),
29 this), 43 this),
30 client_(std::move(client)), 44 client_(std::move(client)),
31 binding_(this, std::move(request)) { 45 binding_(this, std::move(request)) {
32 cc::SurfaceManager* surface_manager = 46 cc::SurfaceManager* surface_manager =
33 manager_->GetCompositorFrameSinkManager(); 47 manager_->GetCompositorFrameSinkManager();
34 surface_manager->RegisterFrameSinkId(frame_sink_id_); 48 surface_manager->RegisterFrameSinkId(frame_sink_id_);
35 surface_manager->RegisterSurfaceFactoryClient(frame_sink_id_, this); 49 surface_manager->RegisterSurfaceFactoryClient(frame_sink_id_, this);
50
51 if (widget != gfx::kNullAcceleratedWidget)
52 InitDisplay(widget, gpu_memory_buffer_manager, std::move(context_provider));
36 } 53 }
37 54
38 ServerWindowCompositorFrameSink::~ServerWindowCompositorFrameSink() { 55 ServerWindowCompositorFrameSink::~ServerWindowCompositorFrameSink() {
39 // SurfaceFactory's destructor will attempt to return resources which will 56 // SurfaceFactory's destructor will attempt to return resources which will
40 // call back into here and access |client_| so we should destroy 57 // call back into here and access |client_| so we should destroy
41 // |surface_factory_|'s resources early on. 58 // |surface_factory_|'s resources early on.
42 surface_factory_.DestroyAll(); 59 surface_factory_.DestroyAll();
43 cc::SurfaceManager* surface_manager = 60 cc::SurfaceManager* surface_manager =
44 manager_->GetCompositorFrameSinkManager(); 61 manager_->GetCompositorFrameSinkManager();
45 surface_manager->UnregisterSurfaceFactoryClient(frame_sink_id_); 62 surface_manager->UnregisterSurfaceFactoryClient(frame_sink_id_);
46 surface_manager->InvalidateFrameSinkId(frame_sink_id_); 63 surface_manager->InvalidateFrameSinkId(frame_sink_id_);
47 } 64 }
48 65
49 void ServerWindowCompositorFrameSink::SetNeedsBeginFrame( 66 void ServerWindowCompositorFrameSink::SetNeedsBeginFrame(
50 bool needs_begin_frame) { 67 bool needs_begin_frame) {
51 // TODO(fsamuel): Implement this. 68 // TODO(fsamuel): Implement this.
52 } 69 }
53 70
54 void ServerWindowCompositorFrameSink::SubmitCompositorFrame( 71 void ServerWindowCompositorFrameSink::SubmitCompositorFrame(
55 cc::CompositorFrame frame) { 72 cc::CompositorFrame frame) {
56 gfx::Size frame_size = frame.render_pass_list[0]->output_rect.size(); 73 gfx::Size frame_size = frame.render_pass_list[0]->output_rect.size();
57 // If the size of the CompostiorFrame has changed then destroy the existing 74 // If the size of the CompostiorFrame has changed then destroy the existing
58 // Surface and create a new one of the appropriate size. 75 // Surface and create a new one of the appropriate size.
59 if (local_frame_id_.is_null() || frame_size != last_submitted_frame_size_) { 76 if (local_frame_id_.is_null() || frame_size != last_submitted_frame_size_) {
60 if (!local_frame_id_.is_null()) 77 if (!local_frame_id_.is_null())
61 surface_factory_.Destroy(local_frame_id_); 78 surface_factory_.Destroy(local_frame_id_);
62 local_frame_id_ = surface_id_allocator_.GenerateId(); 79 local_frame_id_ = surface_id_allocator_.GenerateId();
63 surface_factory_.Create(local_frame_id_); 80 surface_factory_.Create(local_frame_id_);
81 if (display_)
82 display_->Resize(frame_size);
64 } 83 }
65 ++ack_pending_count_; 84 ++ack_pending_count_;
66 surface_factory_.SubmitCompositorFrame( 85 surface_factory_.SubmitCompositorFrame(
67 local_frame_id_, std::move(frame), 86 local_frame_id_, std::move(frame),
68 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck, 87 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck,
69 base::Unretained(this))); 88 base::Unretained(this)));
89 if (display_) {
90 display_->SetSurfaceId(cc::SurfaceId(frame_sink_id_, local_frame_id_),
91 frame.metadata.device_scale_factor);
92 }
70 last_submitted_frame_size_ = frame_size; 93 last_submitted_frame_size_ = frame_size;
71 ServerWindow* window = manager_->window_; 94 ServerWindow* window = manager_->window_;
72 window->delegate()->OnScheduleWindowPaint(window); 95 window->delegate()->OnScheduleWindowPaint(window);
73 } 96 }
74 97
75 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() { 98 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
76 if (!client_) 99 if (!client_)
77 return; 100 return;
78 client_->DidReceiveCompositorFrameAck(); 101 client_->DidReceiveCompositorFrameAck();
79 DCHECK_GT(ack_pending_count_, 0); 102 DCHECK_GT(ack_pending_count_, 0);
80 if (!surface_returned_resources_.empty()) { 103 if (!surface_returned_resources_.empty()) {
81 client_->ReclaimResources(surface_returned_resources_); 104 client_->ReclaimResources(surface_returned_resources_);
82 surface_returned_resources_.clear(); 105 surface_returned_resources_.clear();
83 } 106 }
84 ack_pending_count_--; 107 ack_pending_count_--;
85 } 108 }
86 109
110 void ServerWindowCompositorFrameSink::InitDisplay(
111 gfx::AcceleratedWidget widget,
112 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
113 scoped_refptr<SurfacesContextProvider> context_provider) {
114 // TODO(rjkroege): If there is something better to do than CHECK, add it.
115 CHECK(context_provider->BindToCurrentThread());
116
117 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source(
118 new cc::DelayBasedBeginFrameSource(
119 base::MakeUnique<cc::DelayBasedTimeSource>(task_runner_.get())));
120
121 std::unique_ptr<cc::OutputSurface> display_output_surface;
122 if (context_provider->ContextCapabilities().surfaceless) {
123 #if defined(USE_OZONE)
124 display_output_surface = base::MakeUnique<DirectOutputSurfaceOzone>(
125 context_provider, widget, synthetic_begin_frame_source.get(),
126 gpu_memory_buffer_manager, GL_TEXTURE_2D, GL_RGB);
127 #else
128 NOTREACHED();
129 #endif
130 } else {
131 display_output_surface = base::MakeUnique<DirectOutputSurface>(
132 context_provider, synthetic_begin_frame_source.get());
133 }
134
135 int max_frames_pending =
136 display_output_surface->capabilities().max_frames_pending;
137 DCHECK_GT(max_frames_pending, 0);
138
139 std::unique_ptr<cc::DisplayScheduler> scheduler(
140 new cc::DisplayScheduler(synthetic_begin_frame_source.get(),
141 task_runner_.get(), max_frames_pending));
142
143 display_.reset(new cc::Display(
144 nullptr /* bitmap_manager */, gpu_memory_buffer_manager,
145 cc::RendererSettings(), std::move(synthetic_begin_frame_source),
146 std::move(display_output_surface), std::move(scheduler),
147 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner_.get())));
148 display_->Initialize(this, manager_->GetCompositorFrameSinkManager(),
149 frame_sink_id_);
150 display_->SetVisible(true);
151 }
152
153 void ServerWindowCompositorFrameSink::DisplayOutputSurfaceLost() {}
154
155 void ServerWindowCompositorFrameSink::DisplayWillDrawAndSwap(
156 bool will_draw_and_swap,
157 const cc::RenderPassList& render_passes) {}
158
159 void ServerWindowCompositorFrameSink::DisplayDidDrawAndSwap() {}
160
87 void ServerWindowCompositorFrameSink::ReturnResources( 161 void ServerWindowCompositorFrameSink::ReturnResources(
88 const cc::ReturnedResourceArray& resources) { 162 const cc::ReturnedResourceArray& resources) {
89 if (resources.empty()) 163 if (resources.empty())
90 return; 164 return;
91 165
92 if (!ack_pending_count_ && client_) { 166 if (!ack_pending_count_ && client_) {
93 client_->ReclaimResources(resources); 167 client_->ReclaimResources(resources);
94 return; 168 return;
95 } 169 }
96 170
97 std::copy(resources.begin(), resources.end(), 171 std::copy(resources.begin(), resources.end(),
98 std::back_inserter(surface_returned_resources_)); 172 std::back_inserter(surface_returned_resources_));
99 } 173 }
100 174
101 void ServerWindowCompositorFrameSink::SetBeginFrameSource( 175 void ServerWindowCompositorFrameSink::SetBeginFrameSource(
102 cc::BeginFrameSource* begin_frame_source) { 176 cc::BeginFrameSource* begin_frame_source) {
103 // TODO(tansell): Implement this. 177 // TODO(tansell): Implement this.
104 } 178 }
105 179
106 } // namespace ws 180 } // namespace ws
107 } // namespace ui 181 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698