cc: Add visible_rect to Draw*Quad::SetNew().

Currently the visible_rect is implicitly set to the quad's |rect| value
then later changed by the occlusion/culling code. Instead we want to
compute this value up front and set it on the quad when the quad is
created. So add it to the SetNew() method. Currently it should always
be set to the same value as the |rect|.

R=enne
BUG=344962

Review URL: https://codereview.chromium.org/185563008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255662 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/cc/layers/delegated_frame_provider_unittest.cc b/cc/layers/delegated_frame_provider_unittest.cc
index f29488d..a8e1683 100644
--- a/cc/layers/delegated_frame_provider_unittest.cc
+++ b/cc/layers/delegated_frame_provider_unittest.cc
@@ -50,6 +50,7 @@
     quad->SetNew(sqs.get(),
                  gfx::Rect(0, 0, 10, 10),
                  gfx::Rect(0, 0, 10, 10),
+                 gfx::Rect(0, 0, 10, 10),
                  resource_id,
                  false,
                  gfx::PointF(0.f, 0.f),
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
index fc3c448..31b52920 100644
--- a/cc/layers/delegated_renderer_layer_impl.cc
+++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -364,12 +364,14 @@
 
     if (!top.IsEmpty()) {
       scoped_ptr<SolidColorDrawQuad> top_quad = SolidColorDrawQuad::Create();
-      top_quad->SetNew(shared_quad_state, top, colors[i % kNumColors], false);
+      top_quad->SetNew(
+          shared_quad_state, top, top, colors[i % kNumColors], false);
       quad_sink->Append(top_quad.PassAs<DrawQuad>(), append_quads_data);
 
       scoped_ptr<SolidColorDrawQuad> bottom_quad = SolidColorDrawQuad::Create();
       bottom_quad->SetNew(shared_quad_state,
                           bottom,
+                          bottom,
                           colors[kNumColors - 1 - (i % kNumColors)],
                           false);
       quad_sink->Append(bottom_quad.PassAs<DrawQuad>(), append_quads_data);
@@ -378,13 +380,14 @@
       scoped_ptr<SolidColorDrawQuad> left_quad = SolidColorDrawQuad::Create();
       left_quad->SetNew(shared_quad_state,
                         left,
+                        left,
                         colors[kNumColors - 1 - (i % kNumColors)],
                         false);
       quad_sink->Append(left_quad.PassAs<DrawQuad>(), append_quads_data);
 
       scoped_ptr<SolidColorDrawQuad> right_quad = SolidColorDrawQuad::Create();
       right_quad->SetNew(
-          shared_quad_state, right, colors[i % kNumColors], false);
+          shared_quad_state, right, right, colors[i % kNumColors], false);
       quad_sink->Append(right_quad.PassAs<DrawQuad>(), append_quads_data);
     }
   }
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc
index 5b6a890a..f3988941 100644
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -552,11 +552,19 @@
 
       scoped_ptr<SolidColorDrawQuad> color_quad;
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(20, 20, 3, 7),
+                         gfx::Rect(20, 20, 3, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(23, 20, 4, 7),
+                         gfx::Rect(23, 20, 4, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
     }
 
@@ -589,31 +597,48 @@
         RenderPassDrawQuad::Create();
     render_pass_quad->SetNew(
         shared_quad_state,
-        gfx::Rect(5, 5, 7, 7),  // rect
+        gfx::Rect(5, 5, 7, 7),  // quad_rect
+        gfx::Rect(5, 5, 7, 7),  // visible_rect
         RenderPass::Id(10, 7),  // render_pass_id
-        false,  // is_replica
-        0,  // mask_resource_id
-        child_pass_rect,  // contents_changed_since_last_frame
-        gfx::RectF(),  // mask_uv_rect
-        FilterOperations(),  // filters
-        FilterOperations());  // background_filters
+        false,                  // is_replica
+        0,                      // mask_resource_id
+        child_pass_rect,        // contents_changed_since_last_frame
+        gfx::RectF(),           // mask_uv_rect
+        FilterOperations(),     // filters
+        FilterOperations());    // background_filters
     quad_sink.Append(render_pass_quad.PassAs<DrawQuad>(), &data);
 
     scoped_ptr<SolidColorDrawQuad> color_quad;
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 0, 10, 10),
+                       gfx::Rect(0, 0, 10, 10),
+                       1u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 10, 10, 10),
+                       gfx::Rect(0, 10, 10, 10),
+                       2u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 0, 10, 10),
+                       gfx::Rect(10, 0, 10, 10),
+                       3u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 10, 10, 10),
+                       gfx::Rect(10, 10, 10, 10),
+                       4u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     delegated_renderer_layer->SetFrameDataForRenderPasses(
@@ -960,11 +985,19 @@
 
       scoped_ptr<SolidColorDrawQuad> color_quad;
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(20, 20, 3, 7),
+                         gfx::Rect(20, 20, 3, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
       color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u, false);
+      color_quad->SetNew(shared_quad_state,
+                         gfx::Rect(23, 20, 4, 7),
+                         gfx::Rect(23, 20, 4, 7),
+                         1u,
+                         false);
       quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
     }
 
@@ -995,31 +1028,48 @@
         RenderPassDrawQuad::Create();
     render_pass_quad->SetNew(
         shared_quad_state,
-        gfx::Rect(5, 5, 7, 7),  // rect
+        gfx::Rect(5, 5, 7, 7),  // quad_rect
+        gfx::Rect(5, 5, 7, 7),  // visible_quad_rect
         RenderPass::Id(10, 7),  // render_pass_id
-        false,  // is_replica
-        0,  // mask_resource_id
-        child_pass_rect,  // contents_changed_since_last_frame
-        gfx::RectF(),  // mask_uv_rect
-        FilterOperations(),  // filters
-        FilterOperations());  // background_filters
+        false,                  // is_replica
+        0,                      // mask_resource_id
+        child_pass_rect,        // contents_changed_since_last_frame
+        gfx::RectF(),           // mask_uv_rect
+        FilterOperations(),     // filters
+        FilterOperations());    // background_filters
     quad_sink.Append(render_pass_quad.PassAs<DrawQuad>(), &data);
 
     scoped_ptr<SolidColorDrawQuad> color_quad;
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 0, 10, 10),
+                       gfx::Rect(0, 0, 10, 10),
+                       1u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(0, 10, 10, 10),
+                       gfx::Rect(0, 10, 10, 10),
+                       2u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 0, 10, 10),
+                       gfx::Rect(10, 0, 10, 10),
+                       3u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     color_quad = SolidColorDrawQuad::Create();
-    color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u, false);
+    color_quad->SetNew(shared_quad_state,
+                       gfx::Rect(10, 10, 10, 10),
+                       gfx::Rect(10, 10, 10, 10),
+                       4u,
+                       false);
     quad_sink.Append(color_quad.PassAs<DrawQuad>(), &data);
 
     delegated_renderer_layer->SetFrameDataForRenderPasses(
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index be5af99..e98880a 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -115,6 +115,7 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   bool premultiplied_alpha = true;
   gfx::PointF uv_top_left(0.f, 0.f);
   gfx::PointF uv_bottom_right(1.f, 1.f);
@@ -124,6 +125,7 @@
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                hud_resource_->id(),
                premultiplied_alpha,
                uv_top_left,
diff --git a/cc/layers/io_surface_layer_impl.cc b/cc/layers/io_surface_layer_impl.cc
index b8d6919..8779086 100644
--- a/cc/layers/io_surface_layer_impl.cc
+++ b/cc/layers/io_surface_layer_impl.cc
@@ -113,10 +113,12 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<IOSurfaceDrawQuad> quad = IOSurfaceDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                io_surface_size_,
                io_surface_resource_id_,
                IOSurfaceDrawQuad::FLIPPED);
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 05f3e1b..46fa012 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -304,10 +304,12 @@
   if (!ShowDebugBorders())
     return;
 
-  gfx::Rect content_rect(content_bounds());
+  gfx::Rect quad_rect(content_bounds());
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
       DebugBorderDrawQuad::Create();
-  debug_border_quad->SetNew(shared_quad_state, content_rect, color, width);
+  debug_border_quad->SetNew(
+      shared_quad_state, quad_rect, visible_quad_rect, color, width);
   quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/nine_patch_layer_impl.cc b/cc/layers/nine_patch_layer_impl.cc
index a053d5e1..4d364464 100644
--- a/cc/layers/nine_patch_layer_impl.cc
+++ b/cc/layers/nine_patch_layer_impl.cc
@@ -224,6 +224,7 @@
   quad->SetNew(shared_quad_state,
                layer_top_left,
                opaque_rect,
+               layer_top_left,
                resource,
                premultiplied_alpha,
                uv_top_left.origin(),
@@ -237,6 +238,7 @@
   quad->SetNew(shared_quad_state,
                layer_top_right,
                opaque_rect,
+               layer_top_right,
                resource,
                premultiplied_alpha,
                uv_top_right.origin(),
@@ -250,6 +252,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom_left,
                opaque_rect,
+               layer_bottom_left,
                resource,
                premultiplied_alpha,
                uv_bottom_left.origin(),
@@ -263,6 +266,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom_right,
                opaque_rect,
+               layer_bottom_right,
                resource,
                premultiplied_alpha,
                uv_bottom_right.origin(),
@@ -276,6 +280,7 @@
   quad->SetNew(shared_quad_state,
                layer_top,
                opaque_rect,
+               layer_top,
                resource,
                premultiplied_alpha,
                uv_top.origin(),
@@ -289,6 +294,7 @@
   quad->SetNew(shared_quad_state,
                layer_left,
                opaque_rect,
+               layer_left,
                resource,
                premultiplied_alpha,
                uv_left.origin(),
@@ -302,6 +308,7 @@
   quad->SetNew(shared_quad_state,
                layer_right,
                opaque_rect,
+               layer_right,
                resource,
                premultiplied_alpha,
                uv_right.origin(),
@@ -315,6 +322,7 @@
   quad->SetNew(shared_quad_state,
                layer_bottom,
                opaque_rect,
+               layer_bottom,
                resource,
                premultiplied_alpha,
                uv_bottom.origin(),
@@ -329,6 +337,7 @@
     quad->SetNew(shared_quad_state,
                  layer_center,
                  opaque_rect,
+                 layer_center,
                  resource,
                  premultiplied_alpha,
                  uv_center.origin(),
diff --git a/cc/layers/painted_scrollbar_layer_impl.cc b/cc/layers/painted_scrollbar_layer_impl.cc
index 2af722d..bddd7e1 100644
--- a/cc/layers/painted_scrollbar_layer_impl.cc
+++ b/cc/layers/painted_scrollbar_layer_impl.cc
@@ -83,6 +83,7 @@
   AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
 
   gfx::Rect thumb_quad_rect = ComputeThumbQuadRect();
+  gfx::Rect visible_thumb_quad_rect = thumb_quad_rect;
 
   ResourceProvider::ResourceId thumb_resource_id =
       layer_tree_impl()->ResourceIdForUIResource(thumb_ui_resource_id_);
@@ -96,6 +97,7 @@
     quad->SetNew(shared_quad_state,
                  thumb_quad_rect,
                  opaque_rect,
+                 visible_thumb_quad_rect,
                  thumb_resource_id,
                  premultipled_alpha,
                  uv_top_left,
@@ -107,6 +109,7 @@
   }
 
   gfx::Rect track_quad_rect = content_bounds_rect;
+  gfx::Rect visible_track_quad_rect = track_quad_rect;
   if (track_resource_id && !track_quad_rect.IsEmpty()) {
     gfx::Rect opaque_rect(contents_opaque() ? track_quad_rect : gfx::Rect());
     const float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
@@ -114,6 +117,7 @@
     quad->SetNew(shared_quad_state,
                  track_quad_rect,
                  opaque_rect,
+                 visible_track_quad_rect,
                  track_resource_id,
                  premultipled_alpha,
                  uv_top_left,
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index fc8647c..f2c3c3e 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -139,6 +139,7 @@
 
     gfx::Rect geometry_rect = rect;
     gfx::Rect opaque_rect = contents_opaque() ? geometry_rect : gfx::Rect();
+    gfx::Rect visible_geometry_rect = geometry_rect;
     gfx::Size texture_size = rect.size();
     gfx::RectF texture_rect = gfx::RectF(texture_size);
     gfx::Rect quad_content_rect = rect;
@@ -148,6 +149,7 @@
     quad->SetNew(shared_quad_state,
                  geometry_rect,
                  opaque_rect,
+                 visible_geometry_rect,
                  texture_rect,
                  texture_size,
                  RGBA_8888,
@@ -198,7 +200,12 @@
       scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
           DebugBorderDrawQuad::Create();
       gfx::Rect geometry_rect = iter.geometry_rect();
-      debug_border_quad->SetNew(shared_quad_state, geometry_rect, color, width);
+      gfx::Rect visible_geometry_rect = geometry_rect;
+      debug_border_quad->SetNew(shared_quad_state,
+                                geometry_rect,
+                                visible_geometry_rect,
+                                color,
+                                width);
       quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(),
                         append_quads_data);
     }
@@ -213,18 +220,24 @@
        iter;
        ++iter) {
     gfx::Rect geometry_rect = iter.geometry_rect();
+    gfx::Rect visible_geometry_rect = geometry_rect;
     if (!*iter || !iter->IsReadyToDraw()) {
       if (DrawCheckerboardForMissingTiles()) {
         // TODO(enne): Figure out how to show debug "invalidated checker" color
         scoped_ptr<CheckerboardDrawQuad> quad = CheckerboardDrawQuad::Create();
         SkColor color = DebugColors::DefaultCheckerboardColor();
-        quad->SetNew(shared_quad_state, geometry_rect, color);
+        quad->SetNew(
+            shared_quad_state, geometry_rect, visible_geometry_rect, color);
         if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data))
           append_quads_data->num_missing_tiles++;
       } else {
         SkColor color = SafeOpaqueBackgroundColor();
         scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-        quad->SetNew(shared_quad_state, geometry_rect, color, false);
+        quad->SetNew(shared_quad_state,
+                     geometry_rect,
+                     visible_geometry_rect,
+                     color,
+                     false);
         if (quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data))
           append_quads_data->num_missing_tiles++;
       }
@@ -249,6 +262,7 @@
         quad->SetNew(shared_quad_state,
                      geometry_rect,
                      opaque_rect,
+                     visible_geometry_rect,
                      tile_version.get_resource_id(),
                      texture_rect,
                      iter.texture_size(),
@@ -269,6 +283,7 @@
         quad->SetNew(shared_quad_state,
                      geometry_rect,
                      opaque_rect,
+                     visible_geometry_rect,
                      texture_rect,
                      iter.texture_size(),
                      format,
@@ -282,6 +297,7 @@
         scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
         quad->SetNew(shared_quad_state,
                      geometry_rect,
+                     visible_geometry_rect,
                      tile_version.get_solid_color(),
                      false);
         draw_quad = quad.PassAs<DrawQuad>();
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc
index 6c0ec34..a87d692 100644
--- a/cc/layers/render_surface_impl.cc
+++ b/cc/layers/render_surface_impl.cc
@@ -154,6 +154,8 @@
                             owning_layer_->blend_mode());
 
   if (owning_layer_->ShowDebugBorders()) {
+    gfx::Rect quad_rect = content_rect_;
+    gfx::Rect visible_quad_rect = quad_rect;
     SkColor color = for_replica ?
                     DebugColors::SurfaceReplicaBorderColor() :
                     DebugColors::SurfaceBorderColor();
@@ -164,7 +166,8 @@
                       owning_layer_->layer_tree_impl());
     scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
         DebugBorderDrawQuad::Create();
-    debug_border_quad->SetNew(shared_quad_state, content_rect_, color, width);
+    debug_border_quad->SetNew(
+        shared_quad_state, quad_rect, visible_quad_rect, color, width);
     quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(), append_quads_data);
   }
 
@@ -209,6 +212,7 @@
         uv_scale_y);
   }
 
+  gfx::Rect visible_content_rect(content_rect_);
   ResourceProvider::ResourceId mask_resource_id =
       mask_layer ? mask_layer->ContentsResourceId() : 0;
   gfx::Rect contents_changed_since_last_frame =
@@ -217,6 +221,7 @@
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                content_rect_,
+               visible_content_rect,
                render_pass_id,
                for_replica,
                mask_resource_id,
diff --git a/cc/layers/solid_color_layer_impl.cc b/cc/layers/solid_color_layer_impl.cc
index faa967be..b5514e74 100644
--- a/cc/layers/solid_color_layer_impl.cc
+++ b/cc/layers/solid_color_layer_impl.cc
@@ -34,13 +34,17 @@
   int height = content_bounds().height();
   for (int x = 0; x < width; x += tile_size_) {
     for (int y = 0; y < height; y += tile_size_) {
-      gfx::Rect solid_tile_rect(x,
-                              y,
-                              std::min(width - x, tile_size_),
-                              std::min(height - y, tile_size_));
+      gfx::Rect quad_rect(x,
+                          y,
+                          std::min(width - x, tile_size_),
+                          std::min(height - y, tile_size_));
+      gfx::Rect visible_quad_rect(quad_rect);
       scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-      quad->SetNew(
-          shared_quad_state, solid_tile_rect, background_color(), false);
+      quad->SetNew(shared_quad_state,
+                   quad_rect,
+                   visible_quad_rect,
+                   background_color(),
+                   false);
       quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
     }
   }
diff --git a/cc/layers/solid_color_scrollbar_layer_impl.cc b/cc/layers/solid_color_scrollbar_layer_impl.cc
index 0cfc853..027e122 100644
--- a/cc/layers/solid_color_scrollbar_layer_impl.cc
+++ b/cc/layers/solid_color_scrollbar_layer_impl.cc
@@ -91,14 +91,16 @@
 
 void SolidColorScrollbarLayerImpl::AppendQuads(QuadSink* quad_sink,
                            AppendQuadsData* append_quads_data) {
-  gfx::Rect thumb_quad_rect = ComputeThumbQuadRect();
+  gfx::Rect thumb_quad_rect(ComputeThumbQuadRect());
+  gfx::Rect visible_quad_rect(thumb_quad_rect);
 
   SharedQuadState* shared_quad_state =
       quad_sink->UseSharedQuadState(CreateSharedQuadState());
   AppendDebugBorderQuad(quad_sink, shared_quad_state, append_quads_data);
 
   scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-  quad->SetNew(shared_quad_state, thumb_quad_rect, color_, false);
+  quad->SetNew(
+      shared_quad_state, thumb_quad_rect, visible_quad_rect, color_, false);
   quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/surface_layer_impl.cc b/cc/layers/surface_layer_impl.cc
index 6906f4e..1d7f735 100644
--- a/cc/layers/surface_layer_impl.cc
+++ b/cc/layers/surface_layer_impl.cc
@@ -46,7 +46,8 @@
 
   scoped_ptr<SurfaceDrawQuad> quad = SurfaceDrawQuad::Create();
   gfx::Rect quad_rect(content_bounds());
-  quad->SetNew(shared_quad_state, quad_rect, surface_id_);
+  gfx::Rect visible_quad_rect(quad_rect);
+  quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, surface_id_);
   quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data);
 }
 
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc
index cafe542..5deb73a 100644
--- a/cc/layers/texture_layer_impl.cc
+++ b/cc/layers/texture_layer_impl.cc
@@ -172,12 +172,14 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect = opaque ? quad_rect : gfx::Rect();
+  gfx::Rect visible_quad_rect(quad_rect);
   scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
   ResourceProvider::ResourceId id =
       valid_texture_copy_ ? texture_copy_->id() : external_texture_resource_;
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                id,
                premultiplied_alpha_,
                uv_top_left_,
diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc
index d2767cf..cc58112 100644
--- a/cc/layers/tiled_layer_impl.cc
+++ b/cc/layers/tiled_layer_impl.cc
@@ -170,6 +170,7 @@
       for (int i = left; i <= right; ++i) {
         DrawableTile* tile = TileAt(i, j);
         gfx::Rect tile_rect = tiler_->tile_bounds(i, j);
+        gfx::Rect visible_tile_rect = tile_rect;
         SkColor border_color;
         float border_width;
 
@@ -182,8 +183,11 @@
         }
         scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
             DebugBorderDrawQuad::Create();
-        debug_border_quad->SetNew(
-            shared_quad_state, tile_rect, border_color, border_width);
+        debug_border_quad->SetNew(shared_quad_state,
+                                  tile_rect,
+                                  visible_tile_rect,
+                                  border_color,
+                                  border_width);
         quad_sink->Append(debug_border_quad.PassAs<DrawQuad>(),
                           append_quads_data);
       }
@@ -199,6 +203,7 @@
       gfx::Rect tile_rect = tiler_->tile_bounds(i, j);
       gfx::Rect display_rect = tile_rect;
       tile_rect.Intersect(content_rect);
+      gfx::Rect visible_tile_rect = tile_rect;
 
       // Skip empty tiles.
       if (tile_rect.IsEmpty())
@@ -217,7 +222,7 @@
         scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
             CheckerboardDrawQuad::Create();
         checkerboard_quad->SetNew(
-            shared_quad_state, tile_rect, checker_color);
+            shared_quad_state, tile_rect, visible_tile_rect, checker_color);
         if (quad_sink->Append(checkerboard_quad.PassAs<DrawQuad>(),
                               append_quads_data))
           append_quads_data->num_missing_tiles++;
@@ -244,6 +249,7 @@
       quad->SetNew(shared_quad_state,
                    tile_rect,
                    tile_opaque_rect,
+                   visible_tile_rect,
                    tile->resource_id(),
                    tex_coord_rect,
                    texture_size,
diff --git a/cc/layers/ui_resource_layer_impl.cc b/cc/layers/ui_resource_layer_impl.cc
index ad7fd2c..65b930c 100644
--- a/cc/layers/ui_resource_layer_impl.cc
+++ b/cc/layers/ui_resource_layer_impl.cc
@@ -111,17 +111,17 @@
 
   DCHECK(!bounds().IsEmpty());
 
-  gfx::Rect quad_rect(bounds());
-
   bool opaque = layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_) ||
                 contents_opaque();
-  gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect());
-  scoped_ptr<TextureDrawQuad> quad;
 
-  quad = TextureDrawQuad::Create();
+  gfx::Rect quad_rect(bounds());
+  gfx::Rect opaque_rect(opaque ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
+  scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create();
   quad->SetNew(shared_quad_state,
                quad_rect,
                opaque_rect,
+               visible_quad_rect,
                resource,
                premultiplied_alpha,
                uv_top_left_,
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc
index 9a772c5..20c8c44 100644
--- a/cc/layers/video_layer_impl.cc
+++ b/cc/layers/video_layer_impl.cc
@@ -134,6 +134,7 @@
 
   gfx::Rect quad_rect(content_bounds());
   gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect());
+  gfx::Rect visible_quad_rect(quad_rect);
   gfx::Rect visible_rect = frame_->visible_rect();
   gfx::Size coded_size = frame_->coded_size();
 
@@ -159,6 +160,7 @@
       texture_quad->SetNew(shared_quad_state,
                            quad_rect,
                            opaque_rect,
+                           visible_quad_rect,
                            software_resources_[0],
                            premultiplied_alpha,
                            uv_top_left,
@@ -175,15 +177,16 @@
         break;
       gfx::SizeF tex_scale(tex_width_scale, tex_height_scale);
       scoped_ptr<YUVVideoDrawQuad> yuv_video_quad = YUVVideoDrawQuad::Create();
-      yuv_video_quad->SetNew(shared_quad_state,
-                             quad_rect,
-                             opaque_rect,
-                             tex_scale,
-                             frame_resources_[0],
-                             frame_resources_[1],
-                             frame_resources_[2],
-                             frame_resources_.size() > 3 ?
-                                 frame_resources_[3] : 0);
+      yuv_video_quad->SetNew(
+          shared_quad_state,
+          quad_rect,
+          opaque_rect,
+          visible_quad_rect,
+          tex_scale,
+          frame_resources_[0],
+          frame_resources_[1],
+          frame_resources_[2],
+          frame_resources_.size() > 3 ? frame_resources_[3] : 0);
       quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data);
       break;
     }
@@ -200,6 +203,7 @@
       texture_quad->SetNew(shared_quad_state,
                            quad_rect,
                            opaque_rect,
+                           visible_quad_rect,
                            frame_resources_[0],
                            premultiplied_alpha,
                            uv_top_left,
@@ -222,6 +226,7 @@
           shared_quad_state,
           quad_rect,
           opaque_rect,
+          visible_quad_rect,
           frame_resources_[0],
           scale * provider_client_impl_->stream_texture_matrix());
       quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(),
@@ -238,6 +243,7 @@
       io_surface_quad->SetNew(shared_quad_state,
                               quad_rect,
                               opaque_rect,
+                              visible_quad_rect,
                               visible_size,
                               frame_resources_[0],
                               IOSurfaceDrawQuad::UNFLIPPED);
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 3157e48..d934d17 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -92,6 +92,7 @@
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
   quad->SetNew(shared_state,
                rect,
+               rect,
                pass_id,
                false,                 // is_replica
                0,                     // mask_resource_id
@@ -136,6 +137,7 @@
   quad->SetNew(shared_state,
                rect,
                gfx::Rect(),
+               rect,
                resource,
                premultiplied_alpha,
                gfx::PointF(0.0f, 0.0f),  // uv_top_left
@@ -205,7 +207,7 @@
       CreateTestSharedQuadState(gfx::Transform(), rect);
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN, false);
+  color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorGREEN, false);
 
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
@@ -231,7 +233,8 @@
       CreateTestSharedQuadState(gfx::Transform(), small_rect);
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(child_shared_state.get(), rect, SK_ColorGREEN, false);
+  color_quad->SetNew(
+      child_shared_state.get(), rect, rect, SK_ColorGREEN, false);
   child_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
   RenderPass::Id root_id(1, 1);
@@ -280,7 +283,7 @@
   pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
+  color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -315,7 +318,7 @@
   scoped_ptr<SharedQuadState> color_quad_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
+  color_quad->SetNew(color_quad_state.get(), rect, rect, SK_ColorWHITE, false);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -348,7 +351,7 @@
   pass->quad_list.push_back(texture_quad.PassAs<DrawQuad>());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
+  color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -384,7 +387,7 @@
   scoped_ptr<SharedQuadState> color_quad_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(color_quad_state.get(), rect, SK_ColorWHITE, false);
+  color_quad->SetNew(color_quad_state.get(), rect, rect, SK_ColorWHITE, false);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -461,8 +464,15 @@
     }
 
     scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create();
-    yuv_quad->SetNew(shared_state, rect, opaque_rect, gfx::Size(),
-                     y_resource, u_resource, v_resource, a_resource);
+    yuv_quad->SetNew(shared_state,
+                     rect,
+                     opaque_rect,
+                     rect,
+                     gfx::Size(),
+                     y_resource,
+                     u_resource,
+                     v_resource,
+                     a_resource);
     return yuv_quad.Pass();
   }
 };
@@ -506,7 +516,7 @@
   pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(shared_state.get(), rect, SK_ColorWHITE, false);
+  color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorWHITE, false);
 
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
@@ -535,7 +545,7 @@
   pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(shared_state.get(), rect, SK_ColorBLACK, false);
+  color_quad->SetNew(shared_state.get(), rect, rect, SK_ColorBLACK, false);
 
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
 
@@ -567,31 +577,26 @@
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
   shared_state->opacity = 0.5f;
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   scoped_ptr<SharedQuadState> blank_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
   scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
-  white->SetNew(blank_state.get(),
-                viewport_rect,
-                SK_ColorWHITE,
-                false);
+  white->SetNew(
+      blank_state.get(), viewport_rect, viewport_rect, SK_ColorWHITE, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -627,6 +632,7 @@
       RenderPassDrawQuad::Create();
   render_pass_quad->SetNew(pass_shared_state.get(),
                            pass_rect,
+                           pass_rect,
                            child_pass_id,
                            false,
                            0,
@@ -668,31 +674,26 @@
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
   shared_state->opacity = 0.5f;
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   scoped_ptr<SharedQuadState> blank_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
   scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
-  white->SetNew(blank_state.get(),
-                viewport_rect,
-                SK_ColorWHITE,
-                false);
+  white->SetNew(
+      blank_state.get(), viewport_rect, viewport_rect, SK_ColorWHITE, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -708,6 +709,7 @@
       RenderPassDrawQuad::Create();
   render_pass_quad->SetNew(pass_shared_state.get(),
                            pass_rect,
+                           pass_rect,
                            child_pass_id,
                            false,
                            0,
@@ -747,31 +749,26 @@
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
   shared_state->opacity = 0.5f;
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   scoped_ptr<SharedQuadState> blank_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
   scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
-  white->SetNew(blank_state.get(),
-                viewport_rect,
-                SK_ColorWHITE,
-                false);
+  white->SetNew(
+      blank_state.get(), viewport_rect, viewport_rect, SK_ColorWHITE, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -788,6 +785,7 @@
       RenderPassDrawQuad::Create();
   render_pass_quad->SetNew(pass_shared_state.get(),
                            pass_rect,
+                           pass_rect,
                            child_pass_id,
                            false,
                            0,
@@ -827,31 +825,26 @@
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
   shared_state->opacity = 0.5f;
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   scoped_ptr<SharedQuadState> blank_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
   scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
-  white->SetNew(blank_state.get(),
-                viewport_rect,
-                SK_ColorWHITE,
-                false);
+  white->SetNew(
+      blank_state.get(), viewport_rect, viewport_rect, SK_ColorWHITE, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -890,6 +883,7 @@
       RenderPassDrawQuad::Create();
   render_pass_quad->SetNew(pass_shared_state.get(),
                            pass_rect,
+                           pass_rect,
                            child_pass_id,
                            false,
                            0,
@@ -930,22 +924,19 @@
   scoped_ptr<SharedQuadState> shared_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -987,22 +978,19 @@
   scoped_ptr<SharedQuadState> shared_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height() / 2),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
+  gfx::Rect yellow_rect(0,
+                        this->device_viewport_size_.height() / 2,
+                        this->device_viewport_size_.width(),
+                        this->device_viewport_size_.height() / 2);
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(shared_state.get(),
-                 gfx::Rect(0,
-                           this->device_viewport_size_.height() / 2,
-                           this->device_viewport_size_.width(),
-                           this->device_viewport_size_.height() / 2),
-                 SK_ColorYELLOW,
-                 false);
+  yellow->SetNew(
+      shared_state.get(), yellow_rect, yellow_rect, SK_ColorYELLOW, false);
 
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
@@ -1022,6 +1010,7 @@
   scoped_ptr<SolidColorDrawQuad> background = SolidColorDrawQuad::Create();
   background->SetNew(root_shared_state.get(),
                      gfx::Rect(this->device_viewport_size_),
+                     gfx::Rect(this->device_viewport_size_),
                      SK_ColorWHITE,
                      false);
   root_pass->quad_list.push_back(background.PassAs<DrawQuad>());
@@ -1060,7 +1049,11 @@
   // The child render pass is just a green box.
   static const SkColor kCSSGreen = 0xff008000;
   scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
-  green->SetNew(child_pass_shared_state.get(), viewport_rect, kCSSGreen, false);
+  green->SetNew(child_pass_shared_state.get(),
+                viewport_rect,
+                viewport_rect,
+                kCSSGreen,
+                false);
   child_pass->quad_list.push_back(green.PassAs<DrawQuad>());
 
   // Make a mask.
@@ -1112,6 +1105,7 @@
   scoped_ptr<RenderPassDrawQuad> mask_quad = RenderPassDrawQuad::Create();
   mask_quad->SetNew(root_pass_shared_state.get(),
                     sub_rect,
+                    sub_rect,
                     child_pass_id,
                     false,  // is_replica
                     mask_resource_id,
@@ -1123,8 +1117,11 @@
 
   // White background behind the masked render pass.
   scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create();
-  white->SetNew(
-      root_pass_shared_state.get(), viewport_rect, SK_ColorWHITE, false);
+  white->SetNew(root_pass_shared_state.get(),
+                viewport_rect,
+                viewport_rect,
+                SK_ColorWHITE,
+                false);
   root_pass->quad_list.push_back(white.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -1167,6 +1164,7 @@
       scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
       color_quad->SetNew(shared_state.get(),
                          filter_pass_content_rect_,
+                         filter_pass_content_rect_,
                          SK_ColorTRANSPARENT,
                          false);
       filter_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
@@ -1182,12 +1180,13 @@
       filter_pass_quad->SetNew(
           shared_state.get(),
           filter_pass_content_rect_,
+          filter_pass_content_rect_,
           filter_pass_id,
-          false,  // is_replica
-          0,  // mask_resource_id
+          false,                      // is_replica
+          0,                          // mask_resource_id
           filter_pass_content_rect_,  // contents_changed_since_last_frame
-          gfx::RectF(),  // mask_uv_rect
-          FilterOperations(),  // filters
+          gfx::RectF(),               // mask_uv_rect
+          FilterOperations(),         // filters
           this->background_filters_);
       root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>());
       root_pass->shared_quad_state_list.push_back(shared_state.Pass());
@@ -1201,7 +1200,8 @@
           CreateTestSharedQuadState(identity_content_to_target_transform,
                                     left_rect);
       scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN, false);
+      color_quad->SetNew(
+          shared_state.get(), left_rect, left_rect, SK_ColorGREEN, false);
       root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
       root_pass->shared_quad_state_list.push_back(shared_state.Pass());
       left_rect += gfx::Vector2d(0, left_rect.height() + 1);
@@ -1213,7 +1213,8 @@
           CreateTestSharedQuadState(identity_content_to_target_transform,
                                     middle_rect);
       scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED, false);
+      color_quad->SetNew(
+          shared_state.get(), middle_rect, middle_rect, SK_ColorRED, false);
       root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
       root_pass->shared_quad_state_list.push_back(shared_state.Pass());
       middle_rect += gfx::Vector2d(0, middle_rect.height() + 1);
@@ -1225,7 +1226,8 @@
           CreateTestSharedQuadState(identity_content_to_target_transform,
                                     right_rect);
       scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-      color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE, false);
+      color_quad->SetNew(
+          shared_state.get(), right_rect, right_rect, SK_ColorBLUE, false);
       root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
       root_pass->shared_quad_state_list.push_back(shared_state.Pass());
       right_rect += gfx::Vector2d(0, right_rect.height() + 1);
@@ -1238,6 +1240,7 @@
         SolidColorDrawQuad::Create();
     background_quad->SetNew(shared_state.get(),
                             device_viewport_rect,
+                            device_viewport_rect,
                             SK_ColorWHITE,
                             false);
     root_pass->quad_list.push_back(background_quad.PassAs<DrawQuad>());
@@ -1322,7 +1325,7 @@
   scoped_ptr<SharedQuadState> blue_shared_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
+  blue->SetNew(blue_shared_state.get(), rect, rect, SK_ColorBLUE, false);
   pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   pass->has_transparent_background = false;
   RenderPassList pass_list;
@@ -1346,7 +1349,7 @@
   scoped_ptr<SharedQuadState> green_shared_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
-  green->SetNew(green_shared_state.get(), rect, SK_ColorGREEN, false);
+  green->SetNew(green_shared_state.get(), rect, rect, SK_ColorGREEN, false);
   pass->quad_list.push_back(green.PassAs<DrawQuad>());
   RenderPassList pass_list;
   pass_list.push_back(pass.Pass());
@@ -1381,14 +1384,12 @@
   scoped_ptr<SharedQuadState> shared_state =
       CreateTestSharedQuadState(content_to_target_transform, viewport_rect);
 
+  gfx::Rect blue_rect(0,
+                      0,
+                      this->device_viewport_size_.width(),
+                      this->device_viewport_size_.height());
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(shared_state.get(),
-               gfx::Rect(0,
-                         0,
-                         this->device_viewport_size_.width(),
-                         this->device_viewport_size_.height()),
-               SK_ColorBLUE,
-               false);
+  blue->SetNew(shared_state.get(), blue_rect, blue_rect, SK_ColorBLUE, false);
   child_pass->quad_list.push_back(blue.PassAs<DrawQuad>());
 
   scoped_ptr<SharedQuadState> pass_shared_state =
@@ -1421,7 +1422,7 @@
   scoped_ptr<SharedQuadState> blue_shared_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
+  blue->SetNew(blue_shared_state.get(), rect, rect, SK_ColorBLUE, false);
   pass->quad_list.push_back(blue.PassAs<DrawQuad>());
   RenderPassList pass_list;
   pass_list.push_back(pass.Pass());
@@ -1446,7 +1447,7 @@
       CreateTestSharedQuadState(red_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
-  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
+  red->SetNew(red_shared_state.get(), rect, rect, SK_ColorRED, false);
 
   pass->quad_list.push_back(red.PassAs<DrawQuad>());
 
@@ -1456,7 +1457,7 @@
       CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
+  yellow->SetNew(yellow_shared_state.get(), rect, rect, SK_ColorYELLOW, false);
 
   pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
 
@@ -1465,7 +1466,7 @@
       CreateTestSharedQuadState(blue_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
+  blue->SetNew(blue_shared_state.get(), rect, rect, SK_ColorBLUE, false);
 
   pass->quad_list.push_back(blue.PassAs<DrawQuad>());
 
@@ -1498,7 +1499,7 @@
       CreateTestSharedQuadState(red_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
-  red->SetNew(red_shared_state.get(), rect, SK_ColorRED, false);
+  red->SetNew(red_shared_state.get(), rect, rect, SK_ColorRED, false);
 
   pass->quad_list.push_back(red.PassAs<DrawQuad>());
 
@@ -1509,7 +1510,7 @@
       CreateTestSharedQuadState(yellow_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create();
-  yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW, false);
+  yellow->SetNew(yellow_shared_state.get(), rect, rect, SK_ColorYELLOW, false);
 
   pass->quad_list.push_back(yellow.PassAs<DrawQuad>());
 
@@ -1518,7 +1519,7 @@
       CreateTestSharedQuadState(blue_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
+  blue->SetNew(blue_shared_state.get(), rect, rect, SK_ColorBLUE, false);
 
   pass->quad_list.push_back(blue.PassAs<DrawQuad>());
 
@@ -1560,7 +1561,7 @@
       CreateTestSharedQuadState(green_content_to_target_transform, rect);
 
   scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
-  green->SetNew(green_shared_state.get(), rect, SK_ColorGREEN, false);
+  green->SetNew(green_shared_state.get(), rect, rect, SK_ColorGREEN, false);
 
   pass->quad_list.push_back(green.PassAs<DrawQuad>());
 
@@ -1589,20 +1590,21 @@
   scoped_ptr<SharedQuadState> red_shared_state =
       CreateTestSharedQuadState(red_content_to_target_transform, red_rect);
   scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create();
-  red->SetNew(red_shared_state.get(), red_rect, SK_ColorRED, false);
+  red->SetNew(red_shared_state.get(), red_rect, red_rect, SK_ColorRED, false);
   pass->quad_list.push_back(red.PassAs<DrawQuad>());
 
   gfx::Rect green_rect(19, 7, 180, 10);
   scoped_ptr<SharedQuadState> green_shared_state =
       CreateTestSharedQuadState(gfx::Transform(), green_rect);
   scoped_ptr<SolidColorDrawQuad> green = SolidColorDrawQuad::Create();
-  green->SetNew(green_shared_state.get(), green_rect, SK_ColorGREEN, false);
+  green->SetNew(
+      green_shared_state.get(), green_rect, green_rect, SK_ColorGREEN, false);
   pass->quad_list.push_back(green.PassAs<DrawQuad>());
 
   scoped_ptr<SharedQuadState> blue_shared_state =
       CreateTestSharedQuadState(gfx::Transform(), rect);
   scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create();
-  blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE, false);
+  blue->SetNew(blue_shared_state.get(), rect, rect, SK_ColorBLUE, false);
   pass->quad_list.push_back(blue.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -1656,6 +1658,7 @@
                     viewport,  // Intentionally bigger than clip.
                     gfx::Rect(),
                     viewport,
+                    gfx::RectF(viewport),
                     viewport.size(),
                     texture_format,
                     viewport,
@@ -1679,6 +1682,7 @@
   green_quad->SetNew(green_shared_state.get(),
                      viewport,
                      gfx::Rect(),
+                     viewport,
                      gfx::RectF(0.f, 0.f, 1.f, 1.f),
                      viewport.size(),
                      texture_format,
@@ -1725,6 +1729,7 @@
   green_quad->SetNew(green_shared_state.get(),
                      viewport,
                      gfx::Rect(),
+                     viewport,
                      gfx::RectF(0, 0, 1, 1),
                      viewport.size(),
                      texture_format,
@@ -1749,6 +1754,7 @@
   white_quad->SetNew(white_shared_state.get(),
                      viewport,
                      gfx::Rect(),
+                     viewport,
                      gfx::RectF(0, 0, 1, 1),
                      viewport.size(),
                      texture_format,
@@ -1823,14 +1829,15 @@
 
   scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create();
   quad->SetNew(shared_state.get(),
-                     viewport,
-                     gfx::Rect(),
-                     gfx::RectF(0, 0, 2, 2),
-                     viewport.size(),
-                     texture_format,
-                     viewport,
-                     1.f,
-                     pile);
+               viewport,
+               gfx::Rect(),
+               viewport,
+               gfx::RectF(0, 0, 2, 2),
+               viewport.size(),
+               texture_format,
+               viewport,
+               1.f,
+               pile);
   pass->quad_list.push_back(quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -1881,6 +1888,7 @@
   green_quad1->SetNew(top_right_green_shared_quad_state.get(),
                       green_rect1,
                       gfx::Rect(),
+                      green_rect1,
                       gfx::RectF(green_rect1.size()),
                       green_rect1.size(),
                       texture_format,
@@ -1893,6 +1901,7 @@
   green_quad2->SetNew(top_right_green_shared_quad_state.get(),
                       green_rect2,
                       gfx::Rect(),
+                      green_rect2,
                       gfx::RectF(green_rect2.size()),
                       green_rect2.size(),
                       texture_format,
@@ -1911,8 +1920,11 @@
           green_content_to_target_transform, viewport, bottom_right_rect);
   scoped_ptr<SolidColorDrawQuad> bottom_right_color_quad =
       SolidColorDrawQuad::Create();
-  bottom_right_color_quad->SetNew(
-      bottom_right_green_shared_state.get(), viewport, SK_ColorGREEN, false);
+  bottom_right_color_quad->SetNew(bottom_right_green_shared_state.get(),
+                                  viewport,
+                                  viewport,
+                                  SK_ColorGREEN,
+                                  false);
   pass->quad_list.push_back(bottom_right_color_quad.PassAs<DrawQuad>());
 
   // Add two blue checkerboards taking up the bottom left and top right,
@@ -1965,6 +1977,7 @@
                     quad_content_rect,
                     gfx::Rect(),
                     quad_content_rect,
+                    gfx::RectF(quad_content_rect),
                     content_union_rect.size(),
                     texture_format,
                     content_union_rect,
@@ -1979,8 +1992,11 @@
       CreateTestSharedQuadState(half_green_content_to_target_transform,
                                 half_green_rect);
   scoped_ptr<SolidColorDrawQuad> half_color_quad = SolidColorDrawQuad::Create();
-  half_color_quad->SetNew(
-      half_green_shared_state.get(), half_green_rect, SK_ColorGREEN, false);
+  half_color_quad->SetNew(half_green_shared_state.get(),
+                          half_green_rect,
+                          half_green_rect,
+                          SK_ColorGREEN,
+                          false);
   pass->quad_list.push_back(half_color_quad.PassAs<DrawQuad>());
 
   RenderPassList pass_list;
@@ -2034,10 +2050,11 @@
       shared_state.get(),
       gfx::Rect(this->device_viewport_size_),
       gfx::Rect(),
+      gfx::Rect(this->device_viewport_size_),
       resource,
-      true,  // premultiplied_alpha
+      true,                     // premultiplied_alpha
       gfx::PointF(0.0f, 0.0f),  // uv_top_left
-      gfx::PointF(  // uv_bottom_right
+      gfx::PointF(              // uv_bottom_right
           this->device_viewport_size_.width() / texture_rect.width(),
           this->device_viewport_size_.height() / texture_rect.height()),
       SK_ColorWHITE,
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc
index c4ffdc2..3673314 100644
--- a/cc/output/software_renderer_unittest.cc
+++ b/cc/output/software_renderer_unittest.cc
@@ -78,9 +78,10 @@
       root_render_pass_id, outer_rect, outer_rect, gfx::Transform());
   scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create();
   outer_quad->SetNew(
-      shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false);
+      shared_quad_state.get(), outer_rect, outer_rect, SK_ColorYELLOW, false);
   scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create();
-  inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false);
+  inner_quad->SetNew(
+      shared_quad_state.get(), inner_rect, inner_rect, SK_ColorCYAN, false);
   inner_quad->visible_rect = visible_rect;
   root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>());
   root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>());
@@ -173,6 +174,7 @@
   outer_quad->SetNew(shared_quad_state.get(),
                      outer_rect,
                      outer_rect,
+                     outer_rect,
                      resource_yellow,
                      gfx::RectF(outer_size),
                      outer_size,
@@ -181,6 +183,7 @@
   inner_quad->SetNew(shared_quad_state.get(),
                      inner_rect,
                      inner_rect,
+                     inner_rect,
                      resource_cyan,
                      gfx::RectF(inner_size),
                      inner_size,
@@ -262,6 +265,7 @@
   quad->SetNew(shared_quad_state.get(),
                tile_rect,
                tile_rect,
+               tile_rect,
                resource_cyan,
                gfx::RectF(tile_size),
                tile_size,
diff --git a/cc/quads/checkerboard_draw_quad.cc b/cc/quads/checkerboard_draw_quad.cc
index 57f776d..921a553 100644
--- a/cc/quads/checkerboard_draw_quad.cc
+++ b/cc/quads/checkerboard_draw_quad.cc
@@ -17,9 +17,9 @@
 
 void CheckerboardDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                                   const gfx::Rect& rect,
+                                  const gfx::Rect& visible_rect,
                                   SkColor color) {
   gfx::Rect opaque_rect = SkColorGetA(color) == 255 ? rect : gfx::Rect();
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::CHECKERBOARD, rect, opaque_rect,
                    visible_rect, needs_blending);
diff --git a/cc/quads/checkerboard_draw_quad.h b/cc/quads/checkerboard_draw_quad.h
index ffa016f3..d59e53f 100644
--- a/cc/quads/checkerboard_draw_quad.h
+++ b/cc/quads/checkerboard_draw_quad.h
@@ -18,6 +18,7 @@
 
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
+              const gfx::Rect& visible_rect,
               SkColor color);
 
   void SetAll(const SharedQuadState* shared_quad_state,
diff --git a/cc/quads/content_draw_quad_base.cc b/cc/quads/content_draw_quad_base.cc
index a802b195..18d3d10 100644
--- a/cc/quads/content_draw_quad_base.cc
+++ b/cc/quads/content_draw_quad_base.cc
@@ -21,10 +21,10 @@
                                  DrawQuad::Material material,
                                  const gfx::Rect& rect,
                                  const gfx::Rect& opaque_rect,
+                                 const gfx::Rect& visible_rect,
                                  const gfx::RectF& tex_coord_rect,
                                  const gfx::Size& texture_size,
                                  bool swizzle_contents) {
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, material, rect, opaque_rect,
                    visible_rect, needs_blending);
diff --git a/cc/quads/content_draw_quad_base.h b/cc/quads/content_draw_quad_base.h
index 44f8bd0c..a286e100 100644
--- a/cc/quads/content_draw_quad_base.h
+++ b/cc/quads/content_draw_quad_base.h
@@ -20,6 +20,7 @@
               DrawQuad::Material material,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               const gfx::RectF& tex_coord_rect,
               const gfx::Size& texture_size,
               bool swizzle_contents);
diff --git a/cc/quads/debug_border_draw_quad.cc b/cc/quads/debug_border_draw_quad.cc
index dc79a22..9c575aa 100644
--- a/cc/quads/debug_border_draw_quad.cc
+++ b/cc/quads/debug_border_draw_quad.cc
@@ -20,10 +20,10 @@
 
 void DebugBorderDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                                  const gfx::Rect& rect,
+                                 const gfx::Rect& visible_rect,
                                  SkColor color,
                                  int width) {
   gfx::Rect opaque_rect;
-  gfx::Rect visible_rect = rect;
   bool needs_blending = SkColorGetA(color) < 255;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::DEBUG_BORDER, rect, opaque_rect,
                    visible_rect, needs_blending);
diff --git a/cc/quads/debug_border_draw_quad.h b/cc/quads/debug_border_draw_quad.h
index bcdaff9..2bfccc4 100644
--- a/cc/quads/debug_border_draw_quad.h
+++ b/cc/quads/debug_border_draw_quad.h
@@ -18,6 +18,7 @@
 
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
+              const gfx::Rect& visible_rect,
               SkColor color,
               int width);
 
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index 316accd..1918a515 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -329,11 +329,13 @@
     SETUP_AND_COPY_QUAD_ALL(Type, quad_all);
 
 TEST(DrawQuadTest, CopyCheckerboardDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0xfabb0011;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_1_NEW(CheckerboardDrawQuad, color);
+  CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
   EXPECT_EQ(DrawQuad::CHECKERBOARD, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(color, copy_quad->color);
 
   CREATE_QUAD_1_ALL(CheckerboardDrawQuad, color);
@@ -342,12 +344,14 @@
 }
 
 TEST(DrawQuadTest, CopyDebugBorderDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0xfabb0011;
   int width = 99;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_2_NEW(DebugBorderDrawQuad, color, width);
+  CREATE_QUAD_3_NEW(DebugBorderDrawQuad, visible_rect, color, width);
   EXPECT_EQ(DrawQuad::DEBUG_BORDER, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(color, copy_quad->color);
   EXPECT_EQ(width, copy_quad->width);
 
@@ -359,14 +363,20 @@
 
 TEST(DrawQuadTest, CopyIOSurfaceDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::Size size(58, 95);
   ResourceProvider::ResourceId resource_id = 72;
   IOSurfaceDrawQuad::Orientation orientation = IOSurfaceDrawQuad::UNFLIPPED;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_4_NEW(
-      IOSurfaceDrawQuad, opaque_rect, size, resource_id, orientation);
+  CREATE_QUAD_5_NEW(IOSurfaceDrawQuad,
+                    opaque_rect,
+                    visible_rect,
+                    size,
+                    resource_id,
+                    orientation);
   EXPECT_EQ(DrawQuad::IO_SURFACE_CONTENT, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
   EXPECT_EQ(size, copy_quad->io_surface_size);
   EXPECT_EQ(resource_id, copy_quad->io_surface_resource_id);
@@ -380,6 +390,7 @@
 }
 
 TEST(DrawQuadTest, CopyRenderPassDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   RenderPass::Id render_pass_id(22, 64);
   bool is_replica = true;
   ResourceProvider::ResourceId mask_resource_id = 78;
@@ -394,7 +405,8 @@
   RenderPass::Id copied_render_pass_id(235, 11);
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_7_NEW_1(RenderPassDrawQuad,
+  CREATE_QUAD_8_NEW_1(RenderPassDrawQuad,
+                      visible_rect,
                       render_pass_id,
                       is_replica,
                       mask_resource_id,
@@ -404,6 +416,7 @@
                       background_filters,
                       copied_render_pass_id);
   EXPECT_EQ(DrawQuad::RENDER_PASS, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(copied_render_pass_id, copy_quad->render_pass_id);
   EXPECT_EQ(is_replica, copy_quad->is_replica);
   EXPECT_EQ(mask_resource_id, copy_quad->mask_resource_id);
@@ -434,12 +447,15 @@
 }
 
 TEST(DrawQuadTest, CopySolidColorDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0x49494949;
   bool force_anti_aliasing_off = false;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_2_NEW(SolidColorDrawQuad, color, force_anti_aliasing_off);
+  CREATE_QUAD_3_NEW(
+      SolidColorDrawQuad, visible_rect, color, force_anti_aliasing_off);
   EXPECT_EQ(DrawQuad::SOLID_COLOR, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(color, copy_quad->color);
   EXPECT_EQ(force_anti_aliasing_off, copy_quad->force_anti_aliasing_off);
 
@@ -451,12 +467,15 @@
 
 TEST(DrawQuadTest, CopyStreamVideoDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   ResourceProvider::ResourceId resource_id = 64;
   gfx::Transform matrix = gfx::Transform(0.5, 0.25, 1, 0.75, 0, 1);
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_3_NEW(StreamVideoDrawQuad, opaque_rect, resource_id, matrix);
+  CREATE_QUAD_4_NEW(
+      StreamVideoDrawQuad, opaque_rect, visible_rect, resource_id, matrix);
   EXPECT_EQ(DrawQuad::STREAM_VIDEO_CONTENT, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
   EXPECT_EQ(resource_id, copy_quad->resource_id);
   EXPECT_EQ(matrix, copy_quad->matrix);
@@ -468,11 +487,13 @@
 }
 
 TEST(DrawQuadTest, CopySurfaceDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   int surface_id = 1234;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_1_NEW(SurfaceDrawQuad, surface_id);
+  CREATE_QUAD_2_NEW(SurfaceDrawQuad, visible_rect, surface_id);
   EXPECT_EQ(DrawQuad::SURFACE_CONTENT, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(surface_id, copy_quad->surface_id);
 
   CREATE_QUAD_1_ALL(SurfaceDrawQuad, surface_id);
@@ -483,6 +504,7 @@
 
 TEST(DrawQuadTest, CopyTextureDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   unsigned resource_id = 82;
   bool premultiplied_alpha = true;
   gfx::PointF uv_top_left(0.5f, 224.f);
@@ -491,8 +513,9 @@
   bool flipped = true;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_8_NEW(TextureDrawQuad,
+  CREATE_QUAD_9_NEW(TextureDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     resource_id,
                     premultiplied_alpha,
                     uv_top_left,
@@ -501,6 +524,7 @@
                     vertex_opacity,
                     flipped);
   EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, copy_quad->material);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
   EXPECT_EQ(resource_id, copy_quad->resource_id);
   EXPECT_EQ(premultiplied_alpha, copy_quad->premultiplied_alpha);
@@ -528,20 +552,23 @@
 
 TEST(DrawQuadTest, CopyTileDrawQuad) {
   gfx::Rect opaque_rect(33, 44, 22, 33);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   unsigned resource_id = 104;
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   bool swizzle_contents = true;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_5_NEW(TileDrawQuad,
+  CREATE_QUAD_6_NEW(TileDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     resource_id,
                     tex_coord_rect,
                     texture_size,
                     swizzle_contents);
   EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(resource_id, copy_quad->resource_id);
   EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
   EXPECT_EQ(texture_size, copy_quad->texture_size);
@@ -561,6 +588,7 @@
 
 TEST(DrawQuadTest, CopyYUVVideoDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::SizeF tex_scale(0.75f, 0.5f);
   ResourceProvider::ResourceId y_plane_resource_id = 45;
   ResourceProvider::ResourceId u_plane_resource_id = 532;
@@ -568,8 +596,9 @@
   ResourceProvider::ResourceId a_plane_resource_id = 63;
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_6_NEW(YUVVideoDrawQuad,
+  CREATE_QUAD_7_NEW(YUVVideoDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     tex_scale,
                     y_plane_resource_id,
                     u_plane_resource_id,
@@ -577,6 +606,7 @@
                     a_plane_resource_id);
   EXPECT_EQ(DrawQuad::YUV_VIDEO_CONTENT, copy_quad->material);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(tex_scale, copy_quad->tex_scale);
   EXPECT_EQ(y_plane_resource_id, copy_quad->y_plane_resource_id);
   EXPECT_EQ(u_plane_resource_id, copy_quad->u_plane_resource_id);
@@ -599,6 +629,7 @@
 
 TEST(DrawQuadTest, CopyPictureDrawQuad) {
   gfx::Rect opaque_rect(33, 44, 22, 33);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   ResourceFormat texture_format = RGBA_8888;
@@ -607,8 +638,9 @@
   scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create();
   CREATE_SHARED_STATE();
 
-  CREATE_QUAD_7_NEW(PictureDrawQuad,
+  CREATE_QUAD_8_NEW(PictureDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     tex_coord_rect,
                     texture_size,
                     texture_format,
@@ -617,6 +649,7 @@
                     picture_pile);
   EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material);
   EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect);
+  EXPECT_RECT_EQ(visible_rect, copy_quad->visible_rect);
   EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect);
   EXPECT_EQ(texture_size, copy_quad->texture_size);
   EXPECT_EQ(texture_format, copy_quad->texture_format);
@@ -660,37 +693,45 @@
 };
 
 TEST_F(DrawQuadIteratorTest, CheckerboardDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0xfabb0011;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_1_NEW(CheckerboardDrawQuad, color);
+  CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
   EXPECT_EQ(0, IterateAndCount(quad_new.get()));
 }
 
 TEST_F(DrawQuadIteratorTest, DebugBorderDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0xfabb0011;
   int width = 99;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_2_NEW(DebugBorderDrawQuad, color, width);
+  CREATE_QUAD_3_NEW(DebugBorderDrawQuad, visible_rect, color, width);
   EXPECT_EQ(0, IterateAndCount(quad_new.get()));
 }
 
 TEST_F(DrawQuadIteratorTest, IOSurfaceDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::Size size(58, 95);
   ResourceProvider::ResourceId resource_id = 72;
   IOSurfaceDrawQuad::Orientation orientation = IOSurfaceDrawQuad::UNFLIPPED;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_4_NEW(
-      IOSurfaceDrawQuad, opaque_rect, size, resource_id, orientation);
+  CREATE_QUAD_5_NEW(IOSurfaceDrawQuad,
+                    opaque_rect,
+                    visible_rect,
+                    size,
+                    resource_id,
+                    orientation);
   EXPECT_EQ(resource_id, quad_new->io_surface_resource_id);
   EXPECT_EQ(1, IterateAndCount(quad_new.get()));
   EXPECT_EQ(resource_id + 1, quad_new->io_surface_resource_id);
 }
 
 TEST_F(DrawQuadIteratorTest, RenderPassDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   RenderPass::Id render_pass_id(22, 64);
   bool is_replica = true;
   ResourceProvider::ResourceId mask_resource_id = 78;
@@ -705,7 +746,8 @@
   RenderPass::Id copied_render_pass_id(235, 11);
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_7_NEW_1(RenderPassDrawQuad,
+  CREATE_QUAD_8_NEW_1(RenderPassDrawQuad,
+                      visible_rect,
                       render_pass_id,
                       is_replica,
                       mask_resource_id,
@@ -723,36 +765,42 @@
 }
 
 TEST_F(DrawQuadIteratorTest, SolidColorDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   SkColor color = 0x49494949;
   bool force_anti_aliasing_off = false;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_2_NEW(SolidColorDrawQuad, color, force_anti_aliasing_off);
+  CREATE_QUAD_3_NEW(
+      SolidColorDrawQuad, visible_rect, color, force_anti_aliasing_off);
   EXPECT_EQ(0, IterateAndCount(quad_new.get()));
 }
 
 TEST_F(DrawQuadIteratorTest, StreamVideoDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   ResourceProvider::ResourceId resource_id = 64;
   gfx::Transform matrix = gfx::Transform(0.5, 0.25, 1, 0.75, 0, 1);
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_3_NEW(StreamVideoDrawQuad, opaque_rect, resource_id, matrix);
+  CREATE_QUAD_4_NEW(
+      StreamVideoDrawQuad, opaque_rect, visible_rect, resource_id, matrix);
   EXPECT_EQ(resource_id, quad_new->resource_id);
   EXPECT_EQ(1, IterateAndCount(quad_new.get()));
   EXPECT_EQ(resource_id + 1, quad_new->resource_id);
 }
 
 TEST_F(DrawQuadIteratorTest, SurfaceDrawQuad) {
+  gfx::Rect visible_rect(40, 50, 30, 20);
   int surface_id = 4321;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_1_NEW(SurfaceDrawQuad, surface_id);
+  CREATE_QUAD_2_NEW(SurfaceDrawQuad, visible_rect, surface_id);
   EXPECT_EQ(0, IterateAndCount(quad_new.get()));
 }
 
 TEST_F(DrawQuadIteratorTest, TextureDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   unsigned resource_id = 82;
   bool premultiplied_alpha = true;
   gfx::PointF uv_top_left(0.5f, 224.f);
@@ -761,8 +809,9 @@
   bool flipped = true;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_8_NEW(TextureDrawQuad,
+  CREATE_QUAD_9_NEW(TextureDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     resource_id,
                     premultiplied_alpha,
                     uv_top_left,
@@ -777,14 +826,16 @@
 
 TEST_F(DrawQuadIteratorTest, TileDrawQuad) {
   gfx::Rect opaque_rect(33, 44, 22, 33);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   unsigned resource_id = 104;
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   bool swizzle_contents = true;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_5_NEW(TileDrawQuad,
+  CREATE_QUAD_6_NEW(TileDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     resource_id,
                     tex_coord_rect,
                     texture_size,
@@ -796,6 +847,7 @@
 
 TEST_F(DrawQuadIteratorTest, YUVVideoDrawQuad) {
   gfx::Rect opaque_rect(33, 47, 10, 12);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::SizeF tex_scale(0.75f, 0.5f);
   ResourceProvider::ResourceId y_plane_resource_id = 45;
   ResourceProvider::ResourceId u_plane_resource_id = 532;
@@ -803,8 +855,9 @@
   ResourceProvider::ResourceId a_plane_resource_id = 63;
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_6_NEW(YUVVideoDrawQuad,
+  CREATE_QUAD_7_NEW(YUVVideoDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     tex_scale,
                     y_plane_resource_id,
                     u_plane_resource_id,
@@ -825,6 +878,7 @@
 // Disabled until picture draw quad is supported for ubercomp: crbug.com/231715
 TEST_F(DrawQuadIteratorTest, DISABLED_PictureDrawQuad) {
   gfx::Rect opaque_rect(33, 44, 22, 33);
+  gfx::Rect visible_rect(40, 50, 30, 20);
   gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f);
   gfx::Size texture_size(85, 32);
   ResourceFormat texture_format = RGBA_8888;
@@ -833,8 +887,9 @@
   scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create();
 
   CREATE_SHARED_STATE();
-  CREATE_QUAD_7_NEW(PictureDrawQuad,
+  CREATE_QUAD_8_NEW(PictureDrawQuad,
                     opaque_rect,
+                    visible_rect,
                     tex_coord_rect,
                     texture_size,
                     texture_format,
diff --git a/cc/quads/io_surface_draw_quad.cc b/cc/quads/io_surface_draw_quad.cc
index d19b2ad..a7a8f69 100644
--- a/cc/quads/io_surface_draw_quad.cc
+++ b/cc/quads/io_surface_draw_quad.cc
@@ -22,10 +22,10 @@
 void IOSurfaceDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                                const gfx::Rect& rect,
                                const gfx::Rect& opaque_rect,
+                               const gfx::Rect& visible_rect,
                                const gfx::Size& io_surface_size,
                                unsigned io_surface_resource_id,
                                Orientation orientation) {
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::IO_SURFACE_CONTENT, rect,
                    opaque_rect, visible_rect, needs_blending);
diff --git a/cc/quads/io_surface_draw_quad.h b/cc/quads/io_surface_draw_quad.h
index 39975c82a..a23e54c4 100644
--- a/cc/quads/io_surface_draw_quad.h
+++ b/cc/quads/io_surface_draw_quad.h
@@ -25,6 +25,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               const gfx::Size& io_surface_size,
               unsigned io_surface_resource_id,
               Orientation orientation);
diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc
index a092c8d4..37bb07e 100644
--- a/cc/quads/picture_draw_quad.cc
+++ b/cc/quads/picture_draw_quad.cc
@@ -23,20 +23,22 @@
 void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                              const gfx::Rect& rect,
                              const gfx::Rect& opaque_rect,
+                             const gfx::Rect& visible_rect,
                              const gfx::RectF& tex_coord_rect,
                              const gfx::Size& texture_size,
                              ResourceFormat texture_format,
                              const gfx::Rect& content_rect,
                              float contents_scale,
                              scoped_refptr<PicturePileImpl> picture_pile) {
-  ContentDrawQuadBase::SetNew(shared_quad_state,
-                              DrawQuad::PICTURE_CONTENT,
-                              rect,
-                              opaque_rect,
-                              tex_coord_rect,
-                              texture_size,
-                              !PlatformColor::SameComponentOrder(
-                                  texture_format));
+  ContentDrawQuadBase::SetNew(
+      shared_quad_state,
+      DrawQuad::PICTURE_CONTENT,
+      rect,
+      opaque_rect,
+      visible_rect,
+      tex_coord_rect,
+      texture_size,
+      !PlatformColor::SameComponentOrder(texture_format));
   this->content_rect = content_rect;
   this->contents_scale = contents_scale;
   this->picture_pile = picture_pile;
diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h
index 76d64b0b..ea1735f 100644
--- a/cc/quads/picture_draw_quad.h
+++ b/cc/quads/picture_draw_quad.h
@@ -25,6 +25,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               const gfx::RectF& tex_coord_rect,
               const gfx::Size& texture_size,
               ResourceFormat texture_format,
diff --git a/cc/quads/render_pass_draw_quad.cc b/cc/quads/render_pass_draw_quad.cc
index b26eaf9..81b0da2 100644
--- a/cc/quads/render_pass_draw_quad.cc
+++ b/cc/quads/render_pass_draw_quad.cc
@@ -37,6 +37,7 @@
 void RenderPassDrawQuad::SetNew(
     const SharedQuadState* shared_quad_state,
     const gfx::Rect& rect,
+    const gfx::Rect& visible_rect,
     RenderPass::Id render_pass_id,
     bool is_replica,
     ResourceProvider::ResourceId mask_resource_id,
@@ -48,7 +49,6 @@
   DCHECK_GE(render_pass_id.index, 0);
 
   gfx::Rect opaque_rect;
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   SetAll(shared_quad_state, rect, opaque_rect, visible_rect, needs_blending,
          render_pass_id, is_replica, mask_resource_id,
diff --git a/cc/quads/render_pass_draw_quad.h b/cc/quads/render_pass_draw_quad.h
index 28b58dbf..1f6217dd 100644
--- a/cc/quads/render_pass_draw_quad.h
+++ b/cc/quads/render_pass_draw_quad.h
@@ -22,6 +22,7 @@
 
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
+              const gfx::Rect& visible_rect,
               RenderPass::Id render_pass_id,
               bool is_replica,
               ResourceProvider::ResourceId mask_resource_id,
diff --git a/cc/quads/render_pass_unittest.cc b/cc/quads/render_pass_unittest.cc
index e70a33dd..fd58523 100644
--- a/cc/quads/render_pass_unittest.cc
+++ b/cc/quads/render_pass_unittest.cc
@@ -92,7 +92,7 @@
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
       CheckerboardDrawQuad::Create();
   checkerboard_quad->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(), SkColor());
+      pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor());
   pass->quad_list.push_back(checkerboard_quad.PassAs<DrawQuad>());
 
   RenderPass::Id new_id(63, 4);
@@ -142,14 +142,18 @@
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad1 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad1->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(1, 1, 1, 1), SkColor());
+  checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(1, 1, 1, 1),
+                             gfx::Rect(1, 1, 1, 1),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad1.PassAs<DrawQuad>());
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad2 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad2->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(2, 2, 2, 2), SkColor());
+  checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(2, 2, 2, 2),
+                             gfx::Rect(2, 2, 2, 2),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad2.PassAs<DrawQuad>());
 
   // And two quads using another shared state.
@@ -165,14 +169,18 @@
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad3 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad3->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(3, 3, 3, 3), SkColor());
+  checkerboard_quad3->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(3, 3, 3, 3),
+                             gfx::Rect(3, 3, 3, 3),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad3.PassAs<DrawQuad>());
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad4 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad4->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(4, 4, 4, 4), SkColor());
+  checkerboard_quad4->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(4, 4, 4, 4),
+                             gfx::Rect(4, 4, 4, 4),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad4.PassAs<DrawQuad>());
 
   // A second render pass with a quad.
@@ -202,14 +210,17 @@
 
   scoped_ptr<CheckerboardDrawQuad> contrib_quad =
       CheckerboardDrawQuad::Create();
-  contrib_quad->SetNew(
-      contrib->shared_quad_state_list.back(), gfx::Rect(3, 3, 3, 3), SkColor());
+  contrib_quad->SetNew(contrib->shared_quad_state_list.back(),
+                       gfx::Rect(3, 3, 3, 3),
+                       gfx::Rect(3, 3, 3, 3),
+                       SkColor());
   contrib->quad_list.push_back(contrib_quad.PassAs<DrawQuad>());
 
   // And a RenderPassDrawQuad for the contributing pass.
   scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
   pass_quad->SetNew(pass->shared_quad_state_list.back(),
                     contrib_output_rect,
+                    contrib_output_rect,
                     contrib_id,
                     false,  // is_replica
                     0,      // mask_resource_id
@@ -259,8 +270,10 @@
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad1 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad1->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(1, 1, 1, 1), SkColor());
+  checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(1, 1, 1, 1),
+                             gfx::Rect(1, 1, 1, 1),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad1.PassAs<DrawQuad>());
 
   // A shared state with no quads, they were culled.
@@ -298,8 +311,10 @@
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad2 =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad2->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(3, 3, 3, 3), SkColor());
+  checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
+                             gfx::Rect(3, 3, 3, 3),
+                             gfx::Rect(3, 3, 3, 3),
+                             SkColor());
   pass->quad_list.push_back(checkerboard_quad2.PassAs<DrawQuad>());
 
   pass_list.push_back(pass.PassAs<RenderPass>());
diff --git a/cc/quads/solid_color_draw_quad.cc b/cc/quads/solid_color_draw_quad.cc
index d0b9ec84..7c0b554 100644
--- a/cc/quads/solid_color_draw_quad.cc
+++ b/cc/quads/solid_color_draw_quad.cc
@@ -18,10 +18,10 @@
 
 void SolidColorDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                                 const gfx::Rect& rect,
+                                const gfx::Rect& visible_rect,
                                 SkColor color,
                                 bool force_anti_aliasing_off) {
   gfx::Rect opaque_rect = SkColorGetA(color) == 255 ? rect : gfx::Rect();
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::SOLID_COLOR, rect, opaque_rect,
                    visible_rect, needs_blending);
diff --git a/cc/quads/solid_color_draw_quad.h b/cc/quads/solid_color_draw_quad.h
index a13e8ee8..4b8b9a3 100644
--- a/cc/quads/solid_color_draw_quad.h
+++ b/cc/quads/solid_color_draw_quad.h
@@ -18,6 +18,7 @@
 
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
+              const gfx::Rect& visible_rect,
               SkColor color,
               bool force_anti_aliasing_off);
 
diff --git a/cc/quads/stream_video_draw_quad.cc b/cc/quads/stream_video_draw_quad.cc
index 0ae3962..a9a75bcf 100644
--- a/cc/quads/stream_video_draw_quad.cc
+++ b/cc/quads/stream_video_draw_quad.cc
@@ -19,9 +19,9 @@
 void StreamVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                                  const gfx::Rect& rect,
                                  const gfx::Rect& opaque_rect,
+                                 const gfx::Rect& visible_rect,
                                  unsigned resource_id,
                                  const gfx::Transform& matrix) {
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::STREAM_VIDEO_CONTENT, rect,
                    opaque_rect, visible_rect, needs_blending);
diff --git a/cc/quads/stream_video_draw_quad.h b/cc/quads/stream_video_draw_quad.h
index 27a6765..bc85325 100644
--- a/cc/quads/stream_video_draw_quad.h
+++ b/cc/quads/stream_video_draw_quad.h
@@ -19,6 +19,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               unsigned resource_id,
               const gfx::Transform& matrix);
 
diff --git a/cc/quads/surface_draw_quad.cc b/cc/quads/surface_draw_quad.cc
index e079108..e7d09d5e 100644
--- a/cc/quads/surface_draw_quad.cc
+++ b/cc/quads/surface_draw_quad.cc
@@ -16,21 +16,20 @@
 }
 
 void SurfaceDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
-                             gfx::Rect rect,
+                             const gfx::Rect& rect,
+                             const gfx::Rect& visible_rect,
                              int surface_id) {
   gfx::Rect opaque_rect;
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::SURFACE_CONTENT, rect,
                    opaque_rect, visible_rect, needs_blending);
   this->surface_id = surface_id;
 }
 
-
 void SurfaceDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
-                             gfx::Rect rect,
-                             gfx::Rect opaque_rect,
-                             gfx::Rect visible_rect,
+                             const gfx::Rect& rect,
+                             const gfx::Rect& opaque_rect,
+                             const gfx::Rect& visible_rect,
                              bool needs_blending,
                              int surface_id) {
   DrawQuad::SetAll(shared_quad_state, DrawQuad::SURFACE_CONTENT, rect,
diff --git a/cc/quads/surface_draw_quad.h b/cc/quads/surface_draw_quad.h
index b1e614122..f3092114 100644
--- a/cc/quads/surface_draw_quad.h
+++ b/cc/quads/surface_draw_quad.h
@@ -16,13 +16,14 @@
   static scoped_ptr<SurfaceDrawQuad> Create();
 
   void SetNew(const SharedQuadState* shared_quad_state,
-              gfx::Rect rect,
+              const gfx::Rect& rect,
+              const gfx::Rect& visible_rect,
               int surface_id);
 
   void SetAll(const SharedQuadState* shared_quad_state,
-              gfx::Rect rect,
-              gfx::Rect opaque_rect,
-              gfx::Rect visible_rect,
+              const gfx::Rect& rect,
+              const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               bool needs_blending,
               int surface_id);
 
diff --git a/cc/quads/texture_draw_quad.cc b/cc/quads/texture_draw_quad.cc
index 31fd07ad..fd57feb1 100644
--- a/cc/quads/texture_draw_quad.cc
+++ b/cc/quads/texture_draw_quad.cc
@@ -29,13 +29,14 @@
 void TextureDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                              const gfx::Rect& rect,
                              const gfx::Rect& opaque_rect,
-                             unsigned resource_id, bool premultiplied_alpha,
+                             const gfx::Rect& visible_rect,
+                             unsigned resource_id,
+                             bool premultiplied_alpha,
                              const gfx::PointF& uv_top_left,
                              const gfx::PointF& uv_bottom_right,
                              SkColor background_color,
                              const float vertex_opacity[4],
                              bool flipped) {
-  gfx::Rect visible_rect = rect;
   bool needs_blending = vertex_opacity[0] != 1.0f || vertex_opacity[1] != 1.0f
       || vertex_opacity[2] != 1.0f || vertex_opacity[3] != 1.0f;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::TEXTURE_CONTENT, rect,
diff --git a/cc/quads/texture_draw_quad.h b/cc/quads/texture_draw_quad.h
index 19b54834..7fba6349 100644
--- a/cc/quads/texture_draw_quad.h
+++ b/cc/quads/texture_draw_quad.h
@@ -19,6 +19,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               unsigned resource_id,
               bool premultiplied_alpha,
               const gfx::PointF& uv_top_left,
diff --git a/cc/quads/tile_draw_quad.cc b/cc/quads/tile_draw_quad.cc
index c17bb994..6e286077f 100644
--- a/cc/quads/tile_draw_quad.cc
+++ b/cc/quads/tile_draw_quad.cc
@@ -24,12 +24,18 @@
 void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                           const gfx::Rect& rect,
                           const gfx::Rect& opaque_rect,
+                          const gfx::Rect& visible_rect,
                           unsigned resource_id,
                           const gfx::RectF& tex_coord_rect,
                           const gfx::Size& texture_size,
                           bool swizzle_contents) {
-  ContentDrawQuadBase::SetNew(shared_quad_state, DrawQuad::TILED_CONTENT, rect,
-                              opaque_rect, tex_coord_rect, texture_size,
+  ContentDrawQuadBase::SetNew(shared_quad_state,
+                              DrawQuad::TILED_CONTENT,
+                              rect,
+                              opaque_rect,
+                              visible_rect,
+                              tex_coord_rect,
+                              texture_size,
                               swizzle_contents);
   this->resource_id = resource_id;
 }
diff --git a/cc/quads/tile_draw_quad.h b/cc/quads/tile_draw_quad.h
index 75eb4d48..71911ea 100644
--- a/cc/quads/tile_draw_quad.h
+++ b/cc/quads/tile_draw_quad.h
@@ -17,6 +17,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               unsigned resource_id,
               const gfx::RectF& tex_coord_rect,
               const gfx::Size& texture_size,
diff --git a/cc/quads/yuv_video_draw_quad.cc b/cc/quads/yuv_video_draw_quad.cc
index ea5363e..e410757c 100644
--- a/cc/quads/yuv_video_draw_quad.cc
+++ b/cc/quads/yuv_video_draw_quad.cc
@@ -24,12 +24,12 @@
 void YUVVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
                               const gfx::Rect& rect,
                               const gfx::Rect& opaque_rect,
+                              const gfx::Rect& visible_rect,
                               const gfx::SizeF& tex_scale,
                               unsigned y_plane_resource_id,
                               unsigned u_plane_resource_id,
                               unsigned v_plane_resource_id,
                               unsigned a_plane_resource_id) {
-  gfx::Rect visible_rect = rect;
   bool needs_blending = false;
   DrawQuad::SetAll(shared_quad_state, DrawQuad::YUV_VIDEO_CONTENT, rect,
                    opaque_rect, visible_rect, needs_blending);
diff --git a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h
index 175b41a..3ac2336 100644
--- a/cc/quads/yuv_video_draw_quad.h
+++ b/cc/quads/yuv_video_draw_quad.h
@@ -22,6 +22,7 @@
   void SetNew(const SharedQuadState* shared_quad_state,
               const gfx::Rect& rect,
               const gfx::Rect& opaque_rect,
+              const gfx::Rect& visible_rect,
               const gfx::SizeF& tex_scale,
               unsigned y_plane_resource_id,
               unsigned u_plane_resource_id,
diff --git a/cc/surfaces/surface_aggregator_test_helpers.cc b/cc/surfaces/surface_aggregator_test_helpers.cc
index a1bb0be94..d484d7e 100644
--- a/cc/surfaces/surface_aggregator_test_helpers.cc
+++ b/cc/surfaces/surface_aggregator_test_helpers.cc
@@ -46,8 +46,10 @@
 
   scoped_ptr<SurfaceDrawQuad> surface_quad = SurfaceDrawQuad::Create();
   gfx::Rect quad_rect = gfx::Rect(surface_size);
-  surface_quad->SetNew(
-      pass->shared_quad_state_list.back(), gfx::Rect(surface_size), surface_id);
+  surface_quad->SetNew(pass->shared_quad_state_list.back(),
+                       gfx::Rect(surface_size),
+                       gfx::Rect(surface_size),
+                       surface_id);
   pass->quad_list.push_back(surface_quad.PassAs<DrawQuad>());
 }
 void AddTestRenderPassQuad(TestRenderPass* pass,
@@ -67,6 +69,7 @@
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
   quad->SetNew(shared_state,
                output_rect,
+               output_rect,
                render_pass_id,
                false,
                0,
diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc
index 83fddea..0e23389 100644
--- a/cc/surfaces/surface_aggregator_unittest.cc
+++ b/cc/surfaces/surface_aggregator_unittest.cc
@@ -431,6 +431,7 @@
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
   color_quad->SetNew(pass->shared_quad_state_list.back(),
                      visible_content_rect,
+                     visible_content_rect,
                      SK_ColorGREEN,
                      force_anti_aliasing_off);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
@@ -498,6 +499,7 @@
       SurfaceDrawQuad::Create();
   grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(),
                                   gfx::Rect(surface_size),
+                                  gfx::Rect(surface_size),
                                   grandchild_surface.surface_id());
   child_one_pass->quad_list.push_back(
       grandchild_surface_quad.PassAs<DrawQuad>());
@@ -523,6 +525,7 @@
       SurfaceDrawQuad::Create();
   child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(),
                                  gfx::Rect(surface_size),
+                                 gfx::Rect(surface_size),
                                  child_one_surface.surface_id());
   root_pass->quad_list.push_back(child_one_surface_quad.PassAs<DrawQuad>());
   AddSolidColorQuadWithBlendMode(surface_size, root_pass.get(), blend_modes[4]);
@@ -530,6 +533,7 @@
       SurfaceDrawQuad::Create();
   child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(),
                                  gfx::Rect(surface_size),
+                                 gfx::Rect(surface_size),
                                  child_two_surface.surface_id());
   root_pass->quad_list.push_back(child_two_surface_quad.PassAs<DrawQuad>());
   AddSolidColorQuadWithBlendMode(surface_size, root_pass.get(), blend_modes[6]);
diff --git a/cc/surfaces/surfaces_pixeltest.cc b/cc/surfaces/surfaces_pixeltest.cc
index 54d40d7..fd5951c 100644
--- a/cc/surfaces/surfaces_pixeltest.cc
+++ b/cc/surfaces/surfaces_pixeltest.cc
@@ -57,6 +57,7 @@
   bool force_anti_aliasing_off = false;
   color_quad->SetNew(pass->shared_quad_state_list.back(),
                      rect,
+                     rect,
                      SK_ColorGREEN,
                      force_anti_aliasing_off);
   pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
@@ -102,6 +103,7 @@
     scoped_ptr<SurfaceDrawQuad> surface_quad = SurfaceDrawQuad::Create();
     surface_quad->SetNew(pass->shared_quad_state_list.back(),
                          gfx::Rect(child_size),
+                         gfx::Rect(child_size),
                          child_surface.surface_id());
     pass->quad_list.push_back(surface_quad.PassAs<DrawQuad>());
 
@@ -109,6 +111,7 @@
     bool force_anti_aliasing_off = false;
     color_quad->SetNew(pass->shared_quad_state_list.back(),
                        rect,
+                       rect,
                        SK_ColorYELLOW,
                        force_anti_aliasing_off);
     pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
@@ -135,6 +138,7 @@
     bool force_anti_aliasing_off = false;
     color_quad->SetNew(pass->shared_quad_state_list.back(),
                        rect,
+                       rect,
                        SK_ColorBLUE,
                        force_anti_aliasing_off);
     pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
@@ -190,6 +194,7 @@
     scoped_ptr<SurfaceDrawQuad> left_surface_quad = SurfaceDrawQuad::Create();
     left_surface_quad->SetNew(pass->shared_quad_state_list.back(),
                               gfx::Rect(child_size),
+                              gfx::Rect(child_size),
                               left_child.surface_id());
     pass->quad_list.push_back(left_surface_quad.PassAs<DrawQuad>());
 
@@ -200,6 +205,7 @@
     scoped_ptr<SurfaceDrawQuad> right_surface_quad = SurfaceDrawQuad::Create();
     right_surface_quad->SetNew(pass->shared_quad_state_list.back(),
                                gfx::Rect(child_size),
+                               gfx::Rect(child_size),
                                right_child.surface_id());
     pass->quad_list.push_back(right_surface_quad.PassAs<DrawQuad>());
 
@@ -226,6 +232,7 @@
     bool force_anti_aliasing_off = false;
     top_color_quad->SetNew(pass->shared_quad_state_list.back(),
                            gfx::Rect(quad_size),
+                           gfx::Rect(quad_size),
                            SK_ColorGREEN,
                            force_anti_aliasing_off);
     pass->quad_list.push_back(top_color_quad.PassAs<DrawQuad>());
@@ -234,6 +241,7 @@
         SolidColorDrawQuad::Create();
     bottom_color_quad->SetNew(pass->shared_quad_state_list.back(),
                               gfx::Rect(0, 100, 100, 100),
+                              gfx::Rect(0, 100, 100, 100),
                               SK_ColorBLUE,
                               force_anti_aliasing_off);
     pass->quad_list.push_back(bottom_color_quad.PassAs<DrawQuad>());
@@ -261,6 +269,7 @@
     bool force_anti_aliasing_off = false;
     top_color_quad->SetNew(pass->shared_quad_state_list.back(),
                            gfx::Rect(quad_size),
+                           gfx::Rect(quad_size),
                            SK_ColorBLUE,
                            force_anti_aliasing_off);
     pass->quad_list.push_back(top_color_quad.PassAs<DrawQuad>());
@@ -269,6 +278,7 @@
         SolidColorDrawQuad::Create();
     bottom_color_quad->SetNew(pass->shared_quad_state_list.back(),
                               gfx::Rect(0, 100, 100, 100),
+                              gfx::Rect(0, 100, 100, 100),
                               SK_ColorGREEN,
                               force_anti_aliasing_off);
     pass->quad_list.push_back(bottom_color_quad.PassAs<DrawQuad>());
diff --git a/cc/test/render_pass_test_common.cc b/cc/test/render_pass_test_common.cc
index 72467dd..70df149 100644
--- a/cc/test/render_pass_test_common.cc
+++ b/cc/test/render_pass_test_common.cc
@@ -32,6 +32,7 @@
     RenderPass::Id child_pass) {
   gfx::Rect rect(0, 0, 100, 100);
   gfx::Rect opaque_rect(10, 10, 80, 80);
+  gfx::Rect visible_rect(0, 0, 100, 100);
   const float vertex_opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
   ResourceProvider::ResourceId resource1 = resource_provider->CreateResource(
       gfx::Size(45, 5),
@@ -87,23 +88,21 @@
 
   scoped_ptr<CheckerboardDrawQuad> checkerboard_quad =
       CheckerboardDrawQuad::Create();
-  checkerboard_quad->SetNew(shared_state.get(),
-                            rect,
-                            SK_ColorRED);
+  checkerboard_quad->SetNew(
+      shared_state.get(), rect, visible_rect, SK_ColorRED);
   AppendQuad(checkerboard_quad.PassAs<DrawQuad>());
 
   scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
       DebugBorderDrawQuad::Create();
-  debug_border_quad->SetNew(shared_state.get(),
-                            rect,
-                            SK_ColorRED,
-                            1);
+  debug_border_quad->SetNew(
+      shared_state.get(), rect, visible_rect, SK_ColorRED, 1);
   AppendQuad(debug_border_quad.PassAs<DrawQuad>());
 
   scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = IOSurfaceDrawQuad::Create();
   io_surface_quad->SetNew(shared_state.get(),
                           rect,
                           opaque_rect,
+                          visible_rect,
                           gfx::Size(50, 50),
                           resource7,
                           IOSurfaceDrawQuad::FLIPPED);
@@ -114,6 +113,7 @@
         RenderPassDrawQuad::Create();
     render_pass_quad->SetNew(shared_state.get(),
                              rect,
+                             visible_rect,
                              child_pass,
                              false,
                              resource5,
@@ -127,6 +127,7 @@
         RenderPassDrawQuad::Create();
     render_pass_replica_quad->SetNew(shared_state.get(),
                                      rect,
+                                     visible_rect,
                                      child_pass,
                                      true,
                                      resource5,
@@ -139,10 +140,8 @@
 
   scoped_ptr<SolidColorDrawQuad> solid_color_quad =
       SolidColorDrawQuad::Create();
-  solid_color_quad->SetNew(shared_state.get(),
-                           rect,
-                           SK_ColorRED,
-                           false);
+  solid_color_quad->SetNew(
+      shared_state.get(), rect, visible_rect, SK_ColorRED, false);
   AppendQuad(solid_color_quad.PassAs<DrawQuad>());
 
   scoped_ptr<StreamVideoDrawQuad> stream_video_quad =
@@ -150,6 +149,7 @@
   stream_video_quad->SetNew(shared_state.get(),
                             rect,
                             opaque_rect,
+                            visible_rect,
                             resource6,
                             gfx::Transform());
   AppendQuad(stream_video_quad.PassAs<DrawQuad>());
@@ -158,6 +158,7 @@
   texture_quad->SetNew(shared_state.get(),
                        rect,
                        opaque_rect,
+                       visible_rect,
                        resource1,
                        false,
                        gfx::PointF(0.f, 0.f),
@@ -171,6 +172,7 @@
   scaled_tile_quad->SetNew(shared_state.get(),
                            rect,
                            opaque_rect,
+                           visible_rect,
                            resource2,
                            gfx::RectF(0, 0, 50, 50),
                            gfx::Size(50, 50),
@@ -186,6 +188,7 @@
   transformed_tile_quad->SetNew(transformed_state.get(),
                                 rect,
                                 opaque_rect,
+                                visible_rect,
                                 resource3,
                                 gfx::RectF(0, 0, 100, 100),
                                 gfx::Size(100, 100),
@@ -205,6 +208,7 @@
   tile_quad->SetNew(shared_state2.get(),
                     rect,
                     opaque_rect,
+                    visible_rect,
                     resource4,
                     gfx::RectF(0, 0, 100, 100),
                     gfx::Size(100, 100),
@@ -225,6 +229,7 @@
   yuv_quad->SetNew(shared_state2.get(),
                    rect,
                    opaque_rect,
+                   visible_rect,
                    gfx::Size(100, 100),
                    plane_resources[0],
                    plane_resources[1],
diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc
index 8b018cf..5db6799 100644
--- a/cc/test/render_pass_test_utils.cc
+++ b/cc/test/render_pass_test_utils.cc
@@ -44,7 +44,7 @@
                        1,
                        SkXfermode::kSrcOver_Mode);
   scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-  quad->SetNew(shared_state, rect, color, false);
+  quad->SetNew(shared_state, rect, rect, color, false);
   SolidColorDrawQuad* quad_ptr = quad.get();
   quad_sink.Append(quad.PassAs<DrawQuad>(), &data);
   return quad_ptr;
@@ -65,7 +65,7 @@
                        1,
                        SkXfermode::kSrcOver_Mode);
   scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-  quad->SetNew(shared_state, rect, color, false);
+  quad->SetNew(shared_state, rect, rect, color, false);
   SolidColorDrawQuad* quad_ptr = quad.get();
   quad_sink.Append(quad.PassAs<DrawQuad>(), &data);
   return quad_ptr;
@@ -82,7 +82,7 @@
   shared_state->SetAll(
       transform, rect.size(), rect, rect, false, 1, SkXfermode::kSrcOver_Mode);
   scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-  quad->SetNew(shared_state, rect, color, false);
+  quad->SetNew(shared_state, rect, rect, color, false);
   SolidColorDrawQuad* quad_ptr = quad.get();
   quad_sink.Append(quad.PassAs<DrawQuad>(), &data);
   return quad_ptr;
@@ -104,8 +104,15 @@
                        1,
                        SkXfermode::kSrcOver_Mode);
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
-  quad->SetNew(shared_state, output_rect, contributing_pass->id, false, 0,
-               output_rect, gfx::RectF(), FilterOperations(),
+  quad->SetNew(shared_state,
+               output_rect,
+               output_rect,
+               contributing_pass->id,
+               false,
+               0,
+               output_rect,
+               gfx::RectF(),
+               FilterOperations(),
                FilterOperations());
   quad_sink.Append(quad.PassAs<DrawQuad>(), &data);
 }
@@ -129,8 +136,15 @@
                        1,
                        SkXfermode::kSrcOver_Mode);
   scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
-  quad->SetNew(shared_state, output_rect, contributing_pass->id, false,
-               mask_resource_id, output_rect, gfx::RectF(), filters,
+  quad->SetNew(shared_state,
+               output_rect,
+               output_rect,
+               contributing_pass->id,
+               false,
+               mask_resource_id,
+               output_rect,
+               gfx::RectF(),
+               filters,
                FilterOperations());
   quad_sink.Append(quad.PassAs<DrawQuad>(), &data);
 }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 480fe3b..f34432f 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -662,11 +662,15 @@
        fill_rects.has_rect();
        fill_rects.next()) {
     gfx::Rect screen_space_rect = fill_rects.rect();
+    gfx::Rect visible_screen_space_rect = screen_space_rect;
     // Skip the quad culler and just append the quads directly to avoid
     // occlusion checks.
     scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create();
-    quad->SetNew(
-        shared_quad_state, screen_space_rect, screen_background_color, false);
+    quad->SetNew(shared_quad_state,
+                 screen_space_rect,
+                 visible_screen_space_rect,
+                 screen_background_color,
+                 false);
     quad_culler.Append(quad.PassAs<DrawQuad>(), &append_quads_data);
   }
   for (Region::Iterator fill_rects(overhang_region);
@@ -674,12 +678,15 @@
        fill_rects.next()) {
     DCHECK(overhang_resource_id);
     gfx::Rect screen_space_rect = fill_rects.rect();
+    gfx::Rect opaque_screen_space_rect = screen_space_rect;
+    gfx::Rect visible_screen_space_rect = screen_space_rect;
     scoped_ptr<TextureDrawQuad> tex_quad = TextureDrawQuad::Create();
     const float vertex_opacity[4] = {1.f, 1.f, 1.f, 1.f};
     tex_quad->SetNew(
         shared_quad_state,
         screen_space_rect,
-        screen_space_rect,
+        opaque_screen_space_rect,
+        visible_screen_space_rect,
         overhang_resource_id,
         false,
         gfx::PointF(
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 006ac196..95018a72 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -3171,6 +3171,7 @@
       opaque_rect = quad_rect_;
     else
       opaque_rect = opaque_content_rect_;
+    gfx::Rect visible_quad_rect = quad_rect_;
 
     SharedQuadState* shared_quad_state =
         quad_sink->UseSharedQuadState(CreateSharedQuadState());
@@ -3178,6 +3179,7 @@
     test_blending_draw_quad->SetNew(shared_quad_state,
                                     quad_rect_,
                                     opaque_rect,
+                                    visible_quad_rect,
                                     resource_id_,
                                     gfx::RectF(0.f, 0.f, 1.f, 1.f),
                                     gfx::Size(1, 1),
@@ -3956,8 +3958,10 @@
 
     SkColor gray = SkColorSetRGB(100, 100, 100);
     gfx::Rect quad_rect(content_bounds());
+    gfx::Rect visible_quad_rect(quad_rect);
     scoped_ptr<SolidColorDrawQuad> my_quad = SolidColorDrawQuad::Create();
-    my_quad->SetNew(shared_quad_state, quad_rect, gray, false);
+    my_quad->SetNew(
+        shared_quad_state, quad_rect, visible_quad_rect, gray, false);
     quad_sink->Append(my_quad.PassAs<DrawQuad>(), append_quads_data);
   }
 
diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc
index 7fe0ece..6ba1df4 100644
--- a/cc/trees/layer_tree_host_unittest_delegated.cc
+++ b/cc/trees/layer_tree_host_unittest_delegated.cc
@@ -103,6 +103,7 @@
 
     gfx::Rect rect = root_output_rect;
     gfx::Rect opaque_rect = root_output_rect;
+    gfx::Rect visible_rect = root_output_rect;
     // An invalid resource id! The resource isn't part of the frame.
     unsigned resource_id = 5;
     bool premultiplied_alpha = false;
@@ -116,6 +117,7 @@
     invalid_draw_quad->SetNew(shared_quad_state.get(),
                               rect,
                               opaque_rect,
+                              visible_rect,
                               resource_id,
                               premultiplied_alpha,
                               uv_top_left,
@@ -152,6 +154,7 @@
     quad->SetNew(sqs.get(),
                  gfx::Rect(0, 0, 10, 10),
                  gfx::Rect(0, 0, 10, 10),
+                 gfx::Rect(0, 0, 10, 10),
                  resource_id,
                  false,
                  gfx::PointF(0.f, 0.f),
@@ -184,9 +187,10 @@
 
     quad->SetNew(sqs.get(),
                  output_rect,
+                 output_rect,
                  id,
                  false,  // is_replica
-                 0,  // mask_resource_id
+                 0,      // mask_resource_id
                  damage_rect,
                  gfx::Rect(0, 0, 1, 1),  // mask_uv_rect
                  filters,
diff --git a/cc/trees/quad_culler.cc b/cc/trees/quad_culler.cc
index f4a8e27..bbbca9ef 100644
--- a/cc/trees/quad_culler.cc
+++ b/cc/trees/quad_culler.cc
@@ -66,8 +66,11 @@
           layer ? layer->layer_tree_impl() : NULL);
       scoped_ptr<DebugBorderDrawQuad> debug_border_quad =
           DebugBorderDrawQuad::Create();
-      debug_border_quad->SetNew(
-          draw_quad->shared_quad_state, draw_quad->visible_rect, color, width);
+      debug_border_quad->SetNew(draw_quad->shared_quad_state,
+                                draw_quad->visible_rect,
+                                draw_quad->visible_rect,
+                                color,
+                                width);
       quad_list->push_back(debug_border_quad.PassAs<DrawQuad>());
     }
 
diff --git a/cc/trees/quad_culler_unittest.cc b/cc/trees/quad_culler_unittest.cc
index 27e3de5..c716955 100644
--- a/cc/trees/quad_culler_unittest.cc
+++ b/cc/trees/quad_culler_unittest.cc
@@ -802,11 +802,13 @@
   SharedQuadState* sqs = culler.UseSharedQuadState(SharedQuadState::Create());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(sqs, gfx::Rect(100, 100), SK_ColorRED, false);
+  color_quad->SetNew(
+      sqs, gfx::Rect(100, 100), gfx::Rect(100, 100), SK_ColorRED, false);
 
   scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
   pass_quad->SetNew(sqs,
                     gfx::Rect(100, 100),
+                    gfx::Rect(100, 100),
                     RenderPass::Id(10, 10),
                     false,
                     0,
@@ -818,6 +820,7 @@
   scoped_ptr<RenderPassDrawQuad> replica_quad = RenderPassDrawQuad::Create();
   replica_quad->SetNew(sqs,
                        gfx::Rect(100, 100),
+                       gfx::Rect(100, 100),
                        RenderPass::Id(10, 10),
                        true,
                        0,
@@ -878,11 +881,13 @@
   SharedQuadState* sqs = culler.UseSharedQuadState(SharedQuadState::Create());
 
   scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
-  color_quad->SetNew(sqs, gfx::Rect(100, 100), SK_ColorRED, false);
+  color_quad->SetNew(
+      sqs, gfx::Rect(100, 100), gfx::Rect(100, 100), SK_ColorRED, false);
 
   scoped_ptr<RenderPassDrawQuad> pass_quad = RenderPassDrawQuad::Create();
   pass_quad->SetNew(sqs,
                     gfx::Rect(100, 100),
+                    gfx::Rect(100, 100),
                     RenderPass::Id(10, 10),
                     false,
                     0,
@@ -894,6 +899,7 @@
   scoped_ptr<RenderPassDrawQuad> replica_quad = RenderPassDrawQuad::Create();
   replica_quad->SetNew(sqs,
                        gfx::Rect(100, 100),
+                       gfx::Rect(100, 100),
                        RenderPass::Id(10, 10),
                        true,
                        0,