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

Unified Diff: cc/trees/single_thread_proxy.cc

Issue 12662021: cc: Don't draw and swap if the frame will not change. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add perf test Created 7 years, 9 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: cc/trees/single_thread_proxy.cc
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index d2df4ffc3523a0552ca6933c52f672eda7a58151..ca854ee9712c81e554ebfdb9048f533f643d77ac 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -55,7 +55,12 @@ bool SingleThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) {
TRACE_EVENT0("cc", "SingleThreadProxy::CompositeAndReadback");
DCHECK(Proxy::IsMainThread());
- if (!CommitAndComposite(base::TimeTicks::Now()))
+ gfx::Rect device_viewport_damage_rect = rect;
+
+ LayerTreeHostImpl::FrameData frame;
+ if (!CommitAndComposite(base::TimeTicks::Now(),
+ device_viewport_damage_rect,
+ &frame))
return false;
{
@@ -65,7 +70,7 @@ bool SingleThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) {
if (layer_tree_host_impl_->IsContextLost())
return false;
- layer_tree_host_impl_->SwapBuffers();
+ layer_tree_host_impl_->SwapBuffers(frame);
}
DidSwapFrame();
@@ -334,8 +339,13 @@ void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() {
// Called by the legacy scheduling path (e.g. where render_widget does the
// scheduling)
void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) {
- if (CommitAndComposite(frame_begin_time)) {
- layer_tree_host_impl_->SwapBuffers();
+ gfx::Rect device_viewport_damage_rect;
+
+ LayerTreeHostImpl::FrameData frame;
+ if (CommitAndComposite(frame_begin_time,
+ device_viewport_damage_rect,
+ &frame)) {
+ layer_tree_host_impl_->SwapBuffers(frame);
DidSwapFrame();
}
}
@@ -364,7 +374,10 @@ void SingleThreadProxy::ForceSerializeOnSwapBuffers() {
void SingleThreadProxy::OnSwapBuffersCompleteOnImplThread() { NOTREACHED(); }
-bool SingleThreadProxy::CommitAndComposite(base::TimeTicks frame_begin_time) {
+bool SingleThreadProxy::CommitAndComposite(
+ base::TimeTicks frame_begin_time,
+ gfx::Rect device_viewport_damage_rect,
+ LayerTreeHostImpl::FrameData* frame) {
DCHECK(Proxy::IsMainThread());
if (!layer_tree_host_->InitializeRendererIfNeeded())
@@ -388,14 +401,19 @@ bool SingleThreadProxy::CommitAndComposite(base::TimeTicks frame_begin_time) {
layer_tree_host_->WillCommit();
DoCommit(queue.Pass());
- bool result = DoComposite(offscreen_context_provider, frame_begin_time);
+ bool result = DoComposite(offscreen_context_provider,
+ frame_begin_time,
+ device_viewport_damage_rect,
+ frame);
layer_tree_host_->DidBeginFrame();
return result;
}
bool SingleThreadProxy::DoComposite(
scoped_refptr<cc::ContextProvider> offscreen_context_provider,
- base::TimeTicks frame_begin_time) {
+ base::TimeTicks frame_begin_time,
+ gfx::Rect device_viewport_damage_rect,
+ LayerTreeHostImpl::FrameData* frame) {
DCHECK(!output_surface_lost_);
{
DebugScopedSetImplThread impl(this);
@@ -416,10 +434,9 @@ bool SingleThreadProxy::DoComposite(
if (!layer_tree_host_impl_->CanDraw())
return false;
- LayerTreeHostImpl::FrameData frame;
- layer_tree_host_impl_->PrepareToDraw(&frame);
- layer_tree_host_impl_->DrawLayers(&frame, frame_begin_time);
- layer_tree_host_impl_->DidDrawAllLayers(frame);
+ layer_tree_host_impl_->PrepareToDraw(frame, device_viewport_damage_rect);
+ layer_tree_host_impl_->DrawLayers(frame, frame_begin_time);
+ layer_tree_host_impl_->DidDrawAllLayers(*frame);
output_surface_lost_ = layer_tree_host_impl_->IsContextLost();
layer_tree_host_impl_->BeginNextFrame();

Powered by Google App Engine
This is Rietveld 408576698