Index: cc/output/direct_renderer.cc |
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc |
index 51ac56a1d932e68ad95daee619701438539fa876..aad41ed293f212da2fcedb88cde55532576b001d 100644 |
--- a/cc/output/direct_renderer.cc |
+++ b/cc/output/direct_renderer.cc |
@@ -333,19 +333,34 @@ void DirectRenderer::DrawRenderPass(DrawingFrame* frame, |
bool using_scissor_as_optimization = |
Capabilities().using_partial_swap && allow_partial_swap; |
gfx::RectF render_pass_scissor; |
+ bool draw_rect_covers_full_surface = true; |
+ if (frame->current_render_pass == frame->root_render_pass && |
+ !client_->DeviceViewport().Contains( |
+ gfx::Rect(output_surface_->SurfaceSize()))) |
+ draw_rect_covers_full_surface = false; |
if (using_scissor_as_optimization) { |
render_pass_scissor = ComputeScissorRectForRenderPass(frame); |
SetScissorTestRectInDrawSpace(frame, render_pass_scissor); |
+ if (!render_pass_scissor.Contains(frame->current_render_pass->output_rect)) |
+ draw_rect_covers_full_surface = false; |
} |
if (frame->current_render_pass != frame->root_render_pass || |
settings_->should_clear_root_render_pass) { |
- if (NeedDeviceClip(frame)) |
+ if (NeedDeviceClip(frame)) { |
SetScissorTestRect(DeviceClipRect(frame)); |
- else if (!using_scissor_as_optimization) |
+ draw_rect_covers_full_surface = false; |
+ } else if (!using_scissor_as_optimization) { |
EnsureScissorTestDisabled(); |
- ClearFramebuffer(frame); |
+ } |
+ |
+ bool has_external_stencil_test = |
+ output_surface_->HasExternalStencilTest() && |
+ frame->current_render_pass == frame->root_render_pass; |
+ |
+ DiscardPixels(has_external_stencil_test, draw_rect_covers_full_surface); |
+ ClearFramebuffer(frame, has_external_stencil_test); |
} |
const QuadList& quad_list = render_pass->quad_list; |