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

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

Issue 2471503002: Mus+Ash: Unify CompositorFrameSinks (Closed)
Patch Set: Updated deps 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<cc::ContextProvider> 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()),
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 surface_factory_.SubmitCompositorFrame( 84 surface_factory_.SubmitCompositorFrame(
66 local_frame_id_, std::move(frame), 85 local_frame_id_, std::move(frame),
67 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck, 86 base::Bind(&ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck,
68 base::Unretained(this))); 87 base::Unretained(this)));
88 if (display_) {
89 display_->SetSurfaceId(cc::SurfaceId(frame_sink_id_, local_frame_id_),
90 frame.metadata.device_scale_factor);
91 }
69 last_submitted_frame_size_ = frame_size; 92 last_submitted_frame_size_ = frame_size;
70 ServerWindow* window = manager_->window_; 93 ServerWindow* window = manager_->window_;
71 window->delegate()->OnScheduleWindowPaint(window); 94 window->delegate()->OnScheduleWindowPaint(window);
72 } 95 }
73 96
74 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() { 97 void ServerWindowCompositorFrameSink::DidReceiveCompositorFrameAck() {
75 if (!client_ || !base::MessageLoop::current()) 98 if (!client_ || !base::MessageLoop::current())
76 return; 99 return;
77 client_->DidReceiveCompositorFrameAck(); 100 client_->DidReceiveCompositorFrameAck();
78 } 101 }
79 102
103 void ServerWindowCompositorFrameSink::InitDisplay(
104 gfx::AcceleratedWidget widget,
105 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
106 scoped_refptr<cc::ContextProvider> context_provider) {
107 // TODO(rjkroege): If there is something better to do than CHECK, add it.
108 CHECK(context_provider->BindToCurrentThread());
109
110 std::unique_ptr<cc::SyntheticBeginFrameSource> synthetic_begin_frame_source(
111 new cc::DelayBasedBeginFrameSource(
112 base::MakeUnique<cc::DelayBasedTimeSource>(task_runner_.get())));
113
114 std::unique_ptr<cc::OutputSurface> display_output_surface;
115 if (context_provider->ContextCapabilities().surfaceless) {
116 #if defined(USE_OZONE)
117 display_output_surface = base::MakeUnique<DirectOutputSurfaceOzone>(
118 context_provider, widget, synthetic_begin_frame_source.get(),
119 gpu_memory_buffer_manager, GL_TEXTURE_2D, GL_RGB);
120 #else
121 NOTREACHED();
122 #endif
123 } else {
124 display_output_surface = base::MakeUnique<DirectOutputSurface>(
125 context_provider, synthetic_begin_frame_source.get());
126 }
127
128 int max_frames_pending =
129 display_output_surface->capabilities().max_frames_pending;
130 DCHECK_GT(max_frames_pending, 0);
131
132 std::unique_ptr<cc::DisplayScheduler> scheduler(
133 new cc::DisplayScheduler(synthetic_begin_frame_source.get(),
134 task_runner_.get(), max_frames_pending));
135
136 display_.reset(new cc::Display(
137 nullptr /* bitmap_manager */, gpu_memory_buffer_manager,
138 cc::RendererSettings(), std::move(synthetic_begin_frame_source),
139 std::move(display_output_surface), std::move(scheduler),
140 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner_.get())));
141 display_->Initialize(this, manager_->GetCompositorFrameSinkManager(),
142 frame_sink_id_);
143 display_->SetVisible(true);
144 }
145
146 void ServerWindowCompositorFrameSink::DisplayOutputSurfaceLost() {}
147
148 void ServerWindowCompositorFrameSink::DisplayWillDrawAndSwap(
149 bool will_draw_and_swap,
150 const cc::RenderPassList& render_passes) {}
151
152 void ServerWindowCompositorFrameSink::DisplayDidDrawAndSwap() {}
153
80 void ServerWindowCompositorFrameSink::ReturnResources( 154 void ServerWindowCompositorFrameSink::ReturnResources(
81 const cc::ReturnedResourceArray& resources) { 155 const cc::ReturnedResourceArray& resources) {
82 if (!client_ || !base::MessageLoop::current()) 156 if (!client_ || !base::MessageLoop::current())
83 return; 157 return;
84 client_->ReclaimResources(resources); 158 client_->ReclaimResources(resources);
85 } 159 }
86 160
87 void ServerWindowCompositorFrameSink::SetBeginFrameSource( 161 void ServerWindowCompositorFrameSink::SetBeginFrameSource(
88 cc::BeginFrameSource* begin_frame_source) { 162 cc::BeginFrameSource* begin_frame_source) {
89 // TODO(tansell): Implement this. 163 // TODO(tansell): Implement this.
90 } 164 }
91 165
92 } // namespace ws 166 } // namespace ws
93 } // namespace ui 167 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698