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

Side by Side Diff: cc/surfaces/display.cc

Issue 1535833002: Delete CC. (Closed) Base URL: git@github.com:domokit/mojo.git@moz-5
Patch Set: rebase Created 4 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
« no previous file with comments | « cc/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "cc/surfaces/display.h"
6
7 #include "base/message_loop/message_loop.h"
8 #include "base/trace_event/trace_event.h"
9 #include "cc/output/compositor_frame.h"
10 #include "cc/output/compositor_frame_ack.h"
11 #include "cc/output/direct_renderer.h"
12 #include "cc/output/gl_renderer.h"
13 #include "cc/output/renderer_settings.h"
14 #include "cc/output/software_renderer.h"
15 #include "cc/resources/texture_mailbox_deleter.h"
16 #include "cc/surfaces/display_client.h"
17 #include "cc/surfaces/surface.h"
18 #include "cc/surfaces/surface_aggregator.h"
19 #include "cc/surfaces/surface_manager.h"
20
21 namespace cc {
22
23 Display::Display(DisplayClient* client,
24 SurfaceManager* manager,
25 SharedBitmapManager* bitmap_manager,
26 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
27 const RendererSettings& settings)
28 : client_(client),
29 manager_(manager),
30 bitmap_manager_(bitmap_manager),
31 gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
32 settings_(settings),
33 device_scale_factor_(1.f),
34 texture_mailbox_deleter_(
35 new TextureMailboxDeleter(base::MessageLoopProxy::current())) {
36 manager_->AddObserver(this);
37 }
38
39 Display::~Display() {
40 manager_->RemoveObserver(this);
41 if (aggregator_) {
42 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
43 Surface* surface = manager_->GetSurfaceForId(id_entry.first);
44 if (surface)
45 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED);
46 }
47 }
48 }
49
50 bool Display::Initialize(scoped_ptr<OutputSurface> output_surface) {
51 output_surface_ = output_surface.Pass();
52 return output_surface_->BindToClient(this);
53 }
54
55 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) {
56 current_surface_id_ = id;
57 device_scale_factor_ = device_scale_factor;
58 client_->DisplayDamaged();
59 }
60
61 void Display::Resize(const gfx::Size& size) {
62 if (size == current_surface_size_)
63 return;
64 // Need to ensure all pending swaps have executed before the window is
65 // resized, or D3D11 will scale the swap output.
66 if (renderer_ && settings_.finish_rendering_on_resize)
67 renderer_->Finish();
68 current_surface_size_ = size;
69 client_->DisplayDamaged();
70 }
71
72 void Display::InitializeRenderer() {
73 if (resource_provider_)
74 return;
75
76 scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create(
77 output_surface_.get(), bitmap_manager_, gpu_memory_buffer_manager_,
78 nullptr, settings_.highp_threshold_min, settings_.use_rgba_4444_textures,
79 settings_.texture_id_allocation_chunk_size);
80 if (!resource_provider)
81 return;
82
83 if (output_surface_->context_provider()) {
84 scoped_ptr<GLRenderer> renderer = GLRenderer::Create(
85 this, &settings_, output_surface_.get(), resource_provider.get(),
86 texture_mailbox_deleter_.get(), settings_.highp_threshold_min);
87 if (!renderer)
88 return;
89 renderer_ = renderer.Pass();
90 } else {
91 scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create(
92 this, &settings_, output_surface_.get(), resource_provider.get());
93 if (!renderer)
94 return;
95 renderer_ = renderer.Pass();
96 }
97
98 resource_provider_ = resource_provider.Pass();
99 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get()));
100 }
101
102 void Display::DidLoseOutputSurface() {
103 client_->OutputSurfaceLost();
104 }
105
106 bool Display::Draw() {
107 if (current_surface_id_.is_null())
108 return false;
109
110 InitializeRenderer();
111 if (!output_surface_)
112 return false;
113
114 // TODO(skyostil): We should hold a BlockingTaskRunner::CapturePostTasks
115 // while Aggregate is called to immediately run release callbacks afterward.
116 scoped_ptr<CompositorFrame> frame =
117 aggregator_->Aggregate(current_surface_id_);
118 if (!frame)
119 return false;
120
121 TRACE_EVENT0("cc", "Display::Draw");
122
123 // Run callbacks early to allow pipelining.
124 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
125 Surface* surface = manager_->GetSurfaceForId(id_entry.first);
126 if (surface)
127 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN);
128 }
129 DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
130
131 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(),
132 stored_latency_info_.begin(),
133 stored_latency_info_.end());
134 stored_latency_info_.clear();
135 bool have_copy_requests = false;
136 for (const auto* pass : frame_data->render_pass_list) {
137 have_copy_requests |= !pass->copy_requests.empty();
138 }
139
140 gfx::Size surface_size;
141 bool have_damage = false;
142 if (!frame_data->render_pass_list.empty()) {
143 surface_size = frame_data->render_pass_list.back()->output_rect.size();
144 have_damage =
145 !frame_data->render_pass_list.back()->damage_rect.size().IsEmpty();
146 }
147 bool avoid_swap = surface_size != current_surface_size_;
148 bool should_draw = !frame->metadata.latency_info.empty() ||
149 have_copy_requests || (have_damage && !avoid_swap);
150
151 if (should_draw) {
152 gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_);
153 gfx::Rect device_clip_rect = device_viewport_rect;
154 bool disable_picture_quad_image_filtering = false;
155
156 renderer_->DecideRenderPassAllocationsForFrame(
157 frame_data->render_pass_list);
158 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_,
159 device_viewport_rect, device_clip_rect,
160 disable_picture_quad_image_filtering);
161 }
162
163 if (should_draw && !avoid_swap) {
164 renderer_->SwapBuffers(frame->metadata);
165 } else {
166 stored_latency_info_.insert(stored_latency_info_.end(),
167 frame->metadata.latency_info.begin(),
168 frame->metadata.latency_info.end());
169 DidSwapBuffers();
170 DidSwapBuffersComplete();
171 }
172
173 return true;
174 }
175
176 void Display::DidSwapBuffers() {
177 client_->DidSwapBuffers();
178 }
179
180 void Display::DidSwapBuffersComplete() {
181 client_->DidSwapBuffersComplete();
182 }
183
184 void Display::CommitVSyncParameters(base::TimeTicks timebase,
185 base::TimeDelta interval) {
186 client_->CommitVSyncParameters(timebase, interval);
187 }
188
189 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) {
190 if (aggregator_ &&
191 aggregator_->previous_contained_surfaces().count(surface_id)) {
192 Surface* surface = manager_->GetSurfaceForId(surface_id);
193 if (surface) {
194 const CompositorFrame* current_frame = surface->GetEligibleFrame();
195 if (!current_frame || !current_frame->delegated_frame_data ||
196 !current_frame->delegated_frame_data->resource_list.size())
197 aggregator_->ReleaseResources(surface_id);
198 }
199 client_->DisplayDamaged();
200 *changed = true;
201 } else if (surface_id == current_surface_id_) {
202 client_->DisplayDamaged();
203 *changed = true;
204 }
205 }
206
207 SurfaceId Display::CurrentSurfaceId() {
208 return current_surface_id_;
209 }
210
211 int Display::GetMaxFramesPending() {
212 int max_frames_pending =
213 output_surface_ ? output_surface_->capabilities().max_frames_pending : 0;
214 if (max_frames_pending <= 0)
215 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING;
216 return max_frames_pending;
217 }
218
219 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698