| Index: cc/output/renderer_pixeltest.cc
 | 
| diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
 | 
| index cb14db37dec2a5124e3f84189e72777fbfb541b5..58205a91869e87e60a68e70659bc898e23549251 100644
 | 
| --- a/cc/output/renderer_pixeltest.cc
 | 
| +++ b/cc/output/renderer_pixeltest.cc
 | 
| @@ -1384,6 +1384,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    // TODO(enne): the renderer should figure this out on its own.
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| +  bool nearest_neighbor = false;
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
|    gfx::Transform transform_to_root;
 | 
| @@ -1420,8 +1421,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
|    blue_quad->SetNew(blue_shared_state,
 | 
|                      viewport,  // Intentionally bigger than clip.
 | 
|                      gfx::Rect(), viewport, gfx::RectF(viewport),
 | 
| -                    viewport.size(), texture_format, viewport, 1.f,
 | 
| -                    blue_pile.get());
 | 
| +                    viewport.size(), nearest_neighbor, texture_format, viewport,
 | 
| +                    1.f, blue_pile.get());
 | 
|  
 | 
|    // One viewport-filling green quad.
 | 
|    scoped_refptr<FakePicturePileImpl> green_pile =
 | 
| @@ -1439,7 +1440,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
|        pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    green_quad->SetNew(green_shared_state, viewport, gfx::Rect(), viewport,
 | 
|                       gfx::RectF(0.f, 0.f, 1.f, 1.f), viewport.size(),
 | 
| -                     texture_format, viewport, 1.f, green_pile.get());
 | 
| +                     nearest_neighbor, texture_format, viewport, 1.f,
 | 
| +                     green_pile.get());
 | 
|  
 | 
|    RenderPassList pass_list;
 | 
|    pass_list.push_back(pass.Pass());
 | 
| @@ -1455,6 +1457,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| +  bool nearest_neighbor = false;
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
|    gfx::Transform transform_to_root;
 | 
| @@ -1477,8 +1480,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
 | 
|    PictureDrawQuad* green_quad =
 | 
|        pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    green_quad->SetNew(green_shared_state, viewport, gfx::Rect(), viewport,
 | 
| -                     gfx::RectF(0, 0, 1, 1), viewport.size(), texture_format,
 | 
| -                     viewport, 1.f, green_pile.get());
 | 
| +                     gfx::RectF(0, 0, 1, 1), viewport.size(), nearest_neighbor,
 | 
| +                     texture_format, viewport, 1.f, green_pile.get());
 | 
|  
 | 
|    // One viewport-filling white quad.
 | 
|    scoped_refptr<FakePicturePileImpl> white_pile =
 | 
| @@ -1495,8 +1498,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
 | 
|    PictureDrawQuad* white_quad =
 | 
|        pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    white_quad->SetNew(white_shared_state, viewport, gfx::Rect(), viewport,
 | 
| -                     gfx::RectF(0, 0, 1, 1), viewport.size(), texture_format,
 | 
| -                     viewport, 1.f, white_pile.get());
 | 
| +                     gfx::RectF(0, 0, 1, 1), viewport.size(), nearest_neighbor,
 | 
| +                     texture_format, viewport, 1.f, white_pile.get());
 | 
|  
 | 
|    RenderPassList pass_list;
 | 
|    pass_list.push_back(pass.Pass());
 | 
| @@ -1532,6 +1535,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| +  bool nearest_neighbor = false;
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
|    gfx::Transform transform_to_root;
 | 
| @@ -1562,8 +1566,8 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
|  
 | 
|    PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    quad->SetNew(shared_state, viewport, gfx::Rect(), viewport,
 | 
| -               gfx::RectF(0, 0, 2, 2), viewport.size(), texture_format,
 | 
| -               viewport, 1.f, pile.get());
 | 
| +               gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor,
 | 
| +               texture_format, viewport, 1.f, pile.get());
 | 
|  
 | 
|    RenderPassList pass_list;
 | 
|    pass_list.push_back(pass.Pass());
 | 
| @@ -1576,11 +1580,118 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
|        ExactPixelComparator(true)));
 | 
|  }
 | 
|  
 | 
| +// This disables filtering by setting |nearest_neighbor| on the PictureDrawQuad.
 | 
| +TYPED_TEST(RendererPixelTest, PictureDrawQuadNearestNeighbor) {
 | 
| +  gfx::Size pile_tile_size(1000, 1000);
 | 
| +  gfx::Rect viewport(this->device_viewport_size_);
 | 
| +  ResourceFormat texture_format = RGBA_8888;
 | 
| +  bool nearest_neighbor = true;
 | 
| +
 | 
| +  RenderPassId id(1, 1);
 | 
| +  gfx::Transform transform_to_root;
 | 
| +  scoped_ptr<RenderPass> pass =
 | 
| +      CreateTestRenderPass(id, viewport, transform_to_root);
 | 
| +
 | 
| +  SkBitmap bitmap;
 | 
| +  bitmap.allocN32Pixels(2, 2);
 | 
| +  {
 | 
| +    SkAutoLockPixels lock(bitmap);
 | 
| +    SkCanvas canvas(bitmap);
 | 
| +    canvas.drawPoint(0, 0, SK_ColorGREEN);
 | 
| +    canvas.drawPoint(0, 1, SK_ColorBLUE);
 | 
| +    canvas.drawPoint(1, 0, SK_ColorBLUE);
 | 
| +    canvas.drawPoint(1, 1, SK_ColorGREEN);
 | 
| +  }
 | 
| +
 | 
| +  scoped_refptr<FakePicturePileImpl> pile =
 | 
| +      FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
 | 
| +  SkPaint paint;
 | 
| +  paint.setFilterLevel(SkPaint::kLow_FilterLevel);
 | 
| +  pile->add_draw_bitmap_with_paint(bitmap, gfx::Point(), paint);
 | 
| +  pile->RerecordPile();
 | 
| +
 | 
| +  gfx::Transform content_to_target_transform;
 | 
| +  SharedQuadState* shared_state = CreateTestSharedQuadState(
 | 
| +      content_to_target_transform, viewport, pass.get());
 | 
| +
 | 
| +  PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
| +  quad->SetNew(shared_state, viewport, gfx::Rect(), viewport,
 | 
| +               gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor,
 | 
| +               texture_format, viewport, 1.f, pile.get());
 | 
| +
 | 
| +  RenderPassList pass_list;
 | 
| +  pass_list.push_back(pass.Pass());
 | 
| +
 | 
| +  EXPECT_TRUE(this->RunPixelTest(
 | 
| +      &pass_list,
 | 
| +      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
 | 
| +      ExactPixelComparator(true)));
 | 
| +}
 | 
| +
 | 
| +// This disables filtering by setting |nearest_neighbor| on the TileDrawQuad.
 | 
| +TYPED_TEST(RendererPixelTest, TileDrawQuadNearestNeighbor) {
 | 
| +  gfx::Rect viewport(this->device_viewport_size_);
 | 
| +  bool swizzle_contents = true;
 | 
| +  bool nearest_neighbor = true;
 | 
| +
 | 
| +  SkBitmap bitmap;
 | 
| +  bitmap.allocN32Pixels(2, 2);
 | 
| +  {
 | 
| +    SkAutoLockPixels lock(bitmap);
 | 
| +    SkCanvas canvas(bitmap);
 | 
| +    canvas.drawPoint(0, 0, SK_ColorGREEN);
 | 
| +    canvas.drawPoint(0, 1, SK_ColorBLUE);
 | 
| +    canvas.drawPoint(1, 0, SK_ColorBLUE);
 | 
| +    canvas.drawPoint(1, 1, SK_ColorGREEN);
 | 
| +  }
 | 
| +
 | 
| +  gfx::Size tile_size(2, 2);
 | 
| +  ResourceProvider::ResourceId resource =
 | 
| +      this->resource_provider_->CreateResource(
 | 
| +          tile_size,
 | 
| +          GL_CLAMP_TO_EDGE,
 | 
| +          ResourceProvider::TextureHintImmutable,
 | 
| +          RGBA_8888);
 | 
| +
 | 
| +  {
 | 
| +    SkAutoLockPixels lock(bitmap);
 | 
| +    this->resource_provider_->SetPixels(
 | 
| +        resource,
 | 
| +        static_cast<uint8_t*>(bitmap.getPixels()),
 | 
| +        gfx::Rect(tile_size),
 | 
| +        gfx::Rect(tile_size),
 | 
| +        gfx::Vector2d());
 | 
| +  }
 | 
| +
 | 
| +  RenderPassId id(1, 1);
 | 
| +  gfx::Transform transform_to_root;
 | 
| +  scoped_ptr<RenderPass> pass =
 | 
| +      CreateTestRenderPass(id, viewport, transform_to_root);
 | 
| +
 | 
| +  gfx::Transform content_to_target_transform;
 | 
| +  SharedQuadState* shared_state = CreateTestSharedQuadState(
 | 
| +      content_to_target_transform, viewport, pass.get());
 | 
| +
 | 
| +  TileDrawQuad* quad = pass->CreateAndAppendDrawQuad<TileDrawQuad>();
 | 
| +  quad->SetNew(shared_state, viewport, gfx::Rect(), viewport, resource,
 | 
| +               gfx::Rect(tile_size), tile_size, swizzle_contents,
 | 
| +               nearest_neighbor);
 | 
| +
 | 
| +  RenderPassList pass_list;
 | 
| +  pass_list.push_back(pass.Pass());
 | 
| +
 | 
| +  EXPECT_TRUE(this->RunPixelTest(
 | 
| +      &pass_list,
 | 
| +      base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
 | 
| +      ExactPixelComparator(true)));
 | 
| +}
 | 
| +
 | 
|  TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    // TODO(enne): the renderer should figure this out on its own.
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| +  bool nearest_neighbor = false;
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
|    gfx::Transform transform_to_root;
 | 
| @@ -1613,15 +1724,15 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
 | 
|        pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    green_quad1->SetNew(top_right_green_shared_quad_state, green_rect1,
 | 
|                        gfx::Rect(), green_rect1, gfx::RectF(green_rect1.size()),
 | 
| -                      green_rect1.size(), texture_format, green_rect1, 1.f,
 | 
| -                      green_pile.get());
 | 
| +                      green_rect1.size(), nearest_neighbor, texture_format,
 | 
| +                      green_rect1, 1.f, green_pile.get());
 | 
|  
 | 
|    PictureDrawQuad* green_quad2 =
 | 
|        pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    green_quad2->SetNew(top_right_green_shared_quad_state, green_rect2,
 | 
|                        gfx::Rect(), green_rect2, gfx::RectF(green_rect2.size()),
 | 
| -                      green_rect2.size(), texture_format, green_rect2, 1.f,
 | 
| -                      green_pile.get());
 | 
| +                      green_rect2.size(), nearest_neighbor, texture_format,
 | 
| +                      green_rect2, 1.f, green_pile.get());
 | 
|  
 | 
|    // Add a green clipped checkerboard in the bottom right to help test
 | 
|    // interleaving picture quad content and solid color content.
 | 
| @@ -1689,7 +1800,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
 | 
|    PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    blue_quad->SetNew(blue_shared_state, quad_content_rect, gfx::Rect(),
 | 
|                      quad_content_rect, gfx::RectF(quad_content_rect),
 | 
| -                    content_union_rect.size(), texture_format,
 | 
| +                    content_union_rect.size(), nearest_neighbor, texture_format,
 | 
|                      content_union_rect, contents_scale, pile.get());
 | 
|  
 | 
|    // Fill left half of viewport with green.
 | 
| @@ -1874,6 +1985,7 @@ TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    ResourceFormat texture_format = RGBA_4444;
 | 
| +  bool nearest_neighbor = false;
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
|    gfx::Transform transform_to_root;
 | 
| @@ -1895,7 +2007,8 @@ TEST_F(GLRendererPixelTest, PictureDrawQuadTexture4444) {
 | 
|    PictureDrawQuad* blue_quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>();
 | 
|    blue_quad->SetNew(blue_shared_state, viewport, gfx::Rect(), viewport,
 | 
|                      gfx::RectF(0.f, 0.f, 1.f, 1.f), viewport.size(),
 | 
| -                    texture_format, viewport, 1.f, blue_pile.get());
 | 
| +                    nearest_neighbor, texture_format, viewport, 1.f,
 | 
| +                    blue_pile.get());
 | 
|  
 | 
|    RenderPassList pass_list;
 | 
|    pass_list.push_back(pass.Pass());
 | 
| 
 |