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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 750643003: Android: Improve Composite-with-no-GPU-channel handling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
« no previous file with comments | « content/browser/renderer_host/compositor_impl_android.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 9
10 #include "base/android/jni_android.h" 10 #include "base/android/jni_android.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 surface_id_(0), 178 surface_id_(0),
179 client_(client), 179 client_(client),
180 root_window_(root_window), 180 root_window_(root_window),
181 did_post_swapbuffers_(false), 181 did_post_swapbuffers_(false),
182 ignore_schedule_composite_(false), 182 ignore_schedule_composite_(false),
183 needs_composite_(false), 183 needs_composite_(false),
184 needs_animate_(false), 184 needs_animate_(false),
185 will_composite_immediately_(false), 185 will_composite_immediately_(false),
186 composite_on_vsync_trigger_(DO_NOT_COMPOSITE), 186 composite_on_vsync_trigger_(DO_NOT_COMPOSITE),
187 pending_swapbuffers_(0U), 187 pending_swapbuffers_(0U),
188 defer_composite_for_gpu_channel_(false),
188 weak_factory_(this) { 189 weak_factory_(this) {
189 DCHECK(client); 190 DCHECK(client);
190 DCHECK(root_window); 191 DCHECK(root_window);
191 ImageTransportFactoryAndroid::AddObserver(this); 192 ImageTransportFactoryAndroid::AddObserver(this);
192 root_window->AttachCompositor(this); 193 root_window->AttachCompositor(this);
193 } 194 }
194 195
195 CompositorImpl::~CompositorImpl() { 196 CompositorImpl::~CompositorImpl() {
196 root_window_->DetachCompositor(); 197 root_window_->DetachCompositor();
197 ImageTransportFactoryAndroid::RemoveObserver(this); 198 ImageTransportFactoryAndroid::RemoveObserver(this);
198 // Clean-up any surface references. 199 // Clean-up any surface references.
199 SetSurface(NULL); 200 SetSurface(NULL);
200 } 201 }
201 202
202 void CompositorImpl::PostComposite(CompositingTrigger trigger) { 203 void CompositorImpl::PostComposite(CompositingTrigger trigger) {
203 DCHECK(needs_composite_); 204 DCHECK(needs_composite_);
204 DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); 205 DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY);
205 206
206 if (will_composite_immediately_ || 207 if (defer_composite_for_gpu_channel_ || will_composite_immediately_ ||
207 (trigger == COMPOSITE_EVENTUALLY && WillComposite())) { 208 (trigger == COMPOSITE_EVENTUALLY && WillComposite())) {
208 // We will already composite soon enough. 209 // We will already composite soon enough.
209 DCHECK(WillComposite()); 210 DCHECK(WillComposite());
210 return; 211 return;
211 } 212 }
212 213
213 if (DidCompositeThisFrame()) { 214 if (DidCompositeThisFrame()) {
214 DCHECK(!WillCompositeThisFrame()); 215 DCHECK(!WillCompositeThisFrame());
215 if (composite_on_vsync_trigger_ != COMPOSITE_IMMEDIATELY) { 216 if (composite_on_vsync_trigger_ != COMPOSITE_IMMEDIATELY) {
216 composite_on_vsync_trigger_ = trigger; 217 composite_on_vsync_trigger_ = trigger;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 if (current_composite_task_) 253 if (current_composite_task_)
253 current_composite_task_->Cancel(); 254 current_composite_task_->Cancel();
254 255
255 // Unretained because we cancel the task on shutdown. 256 // Unretained because we cancel the task on shutdown.
256 current_composite_task_.reset(new base::CancelableClosure( 257 current_composite_task_.reset(new base::CancelableClosure(
257 base::Bind(&CompositorImpl::Composite, base::Unretained(this), trigger))); 258 base::Bind(&CompositorImpl::Composite, base::Unretained(this), trigger)));
258 base::MessageLoop::current()->PostDelayedTask( 259 base::MessageLoop::current()->PostDelayedTask(
259 FROM_HERE, current_composite_task_->callback(), delay); 260 FROM_HERE, current_composite_task_->callback(), delay);
260 } 261 }
261 262
263 void CompositorImpl::OnGpuChannelEstablished() {
264 defer_composite_for_gpu_channel_ = false;
265
266 if (host_)
267 PostComposite(COMPOSITE_IMMEDIATELY);
268 }
269
262 void CompositorImpl::Composite(CompositingTrigger trigger) { 270 void CompositorImpl::Composite(CompositingTrigger trigger) {
271 if (trigger == COMPOSITE_IMMEDIATELY)
272 will_composite_immediately_ = false;
273
263 BrowserGpuChannelHostFactory* factory = 274 BrowserGpuChannelHostFactory* factory =
264 BrowserGpuChannelHostFactory::instance(); 275 BrowserGpuChannelHostFactory::instance();
265 if (!factory->GetGpuChannel() || factory->GetGpuChannel()->IsLost()) { 276 if (!factory->GetGpuChannel() || factory->GetGpuChannel()->IsLost()) {
266 CauseForGpuLaunch cause = 277 CauseForGpuLaunch cause =
267 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE; 278 CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE;
268 factory->EstablishGpuChannel(cause, 279 factory->EstablishGpuChannel(
269 base::Bind(&CompositorImpl::ScheduleComposite, 280 cause, base::Bind(&CompositorImpl::OnGpuChannelEstablished,
270 weak_factory_.GetWeakPtr())); 281 weak_factory_.GetWeakPtr()));
282 DCHECK(!defer_composite_for_gpu_channel_);
283 defer_composite_for_gpu_channel_ = true;
284 current_composite_task_.reset();
271 return; 285 return;
272 } 286 }
273 287
274 DCHECK(host_); 288 DCHECK(host_);
275 DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY); 289 DCHECK(trigger == COMPOSITE_IMMEDIATELY || trigger == COMPOSITE_EVENTUALLY);
276 DCHECK(needs_composite_); 290 DCHECK(needs_composite_);
277 DCHECK(!DidCompositeThisFrame()); 291 DCHECK(!DidCompositeThisFrame());
278 292
279 if (trigger == COMPOSITE_IMMEDIATELY)
280 will_composite_immediately_ = false;
281
282 DCHECK_LE(pending_swapbuffers_, kMaxSwapBuffers); 293 DCHECK_LE(pending_swapbuffers_, kMaxSwapBuffers);
283 if (pending_swapbuffers_ == kMaxSwapBuffers) { 294 if (pending_swapbuffers_ == kMaxSwapBuffers) {
284 TRACE_EVENT0("compositor", "CompositorImpl_SwapLimit"); 295 TRACE_EVENT0("compositor", "CompositorImpl_SwapLimit");
285 return; 296 return;
286 } 297 }
287 298
288 // Reset state before Layout+Composite since that might create more 299 // Reset state before Layout+Composite since that might create more
289 // requests to Composite that we need to respect. 300 // requests to Composite that we need to respect.
290 needs_composite_ = false; 301 needs_composite_ = false;
291 302
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 ui_resource_provider_.SetLayerTreeHost(NULL); 413 ui_resource_provider_.SetLayerTreeHost(NULL);
403 host_.reset(); 414 host_.reset();
404 display_client_.reset(); 415 display_client_.reset();
405 if (current_composite_task_) { 416 if (current_composite_task_) {
406 current_composite_task_->Cancel(); 417 current_composite_task_->Cancel();
407 current_composite_task_.reset(); 418 current_composite_task_.reset();
408 } 419 }
409 } else if (!host_) { 420 } else if (!host_) {
410 DCHECK(!WillComposite()); 421 DCHECK(!WillComposite());
411 needs_composite_ = false; 422 needs_composite_ = false;
423 defer_composite_for_gpu_channel_ = false;
412 pending_swapbuffers_ = 0; 424 pending_swapbuffers_ = 0;
413 cc::LayerTreeSettings settings; 425 cc::LayerTreeSettings settings;
414 settings.refresh_rate = 60.0; 426 settings.refresh_rate = 60.0;
415 settings.impl_side_painting = false; 427 settings.impl_side_painting = false;
416 settings.allow_antialiasing = false; 428 settings.allow_antialiasing = false;
417 settings.calculate_top_controls_position = false; 429 settings.calculate_top_controls_position = false;
418 settings.top_controls_height = 0.f; 430 settings.top_controls_height = 0.f;
419 settings.highp_threshold_min = 2048; 431 settings.highp_threshold_min = 2048;
420 432
421 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 433 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 } 681 }
670 682
671 void CompositorImpl::SetNeedsAnimate() { 683 void CompositorImpl::SetNeedsAnimate() {
672 if (!host_) 684 if (!host_)
673 return; 685 return;
674 686
675 host_->SetNeedsAnimate(); 687 host_->SetNeedsAnimate();
676 } 688 }
677 689
678 } // namespace content 690 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/compositor_impl_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698