Index: cc/surfaces/display.cc |
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc |
index a8ae27a6055f63c6b7f366c38881c4ec49435ae9..9257446a2eb8e96f793beb6a93467ff0b355e06a 100644 |
--- a/cc/surfaces/display.cc |
+++ b/cc/surfaces/display.cc |
@@ -49,15 +49,23 @@ bool Display::Initialize(scoped_ptr<OutputSurface> output_surface) { |
return output_surface_->BindToClient(this); |
} |
-void Display::Resize(SurfaceId id, |
- const gfx::Size& size, |
- float device_scale_factor) { |
+void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
current_surface_id_ = id; |
- current_surface_size_ = size; |
device_scale_factor_ = device_scale_factor; |
client_->DisplayDamaged(); |
} |
+void Display::Resize(const gfx::Size& size) { |
+ if (size == current_surface_size_) |
+ return; |
+ // Need to ensure all pending swaps have executed before the window is |
+ // resized, or D3D11 will scale the swap output. |
+ if (renderer_ && settings_.finish_rendering_on_resize) |
+ renderer_->Finish(); |
+ current_surface_size_ = size; |
+ client_->DisplayDamaged(); |
+} |
+ |
void Display::InitializeRenderer() { |
if (resource_provider_) |
return; |
@@ -112,6 +120,9 @@ bool Display::Draw() { |
benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); |
DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); |
+ gfx::Size surface_size = |
+ frame_data->render_pass_list.back()->output_rect.size(); |
+ |
gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_); |
gfx::Rect device_clip_rect = device_viewport_rect; |
bool disable_picture_quad_image_filtering = false; |
@@ -122,7 +133,14 @@ bool Display::Draw() { |
device_viewport_rect, |
device_clip_rect, |
disable_picture_quad_image_filtering); |
- renderer_->SwapBuffers(frame->metadata); |
+ |
+ bool disable_swap = surface_size != current_surface_size_; |
+ if (disable_swap) { |
+ DidSwapBuffers(); |
+ } else { |
+ renderer_->SwapBuffers(frame->metadata); |
+ } |
+ |
for (SurfaceAggregator::SurfaceIndexMap::iterator it = |
aggregator_->previous_contained_surfaces().begin(); |
it != aggregator_->previous_contained_surfaces().end(); |
@@ -131,6 +149,8 @@ bool Display::Draw() { |
if (surface) |
surface->RunDrawCallbacks(); |
} |
+ if (disable_swap) |
+ DidSwapBuffersComplete(); |
return true; |
} |