| Index: cc/output/renderer_pixeltest.cc
 | 
| diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
 | 
| index d7d12116d2228c4b44461a3f1e52392ad06b58d1..9e9175e3fd37ce832e4cd8021ede0047dfb73876 100644
 | 
| --- a/cc/output/renderer_pixeltest.cc
 | 
| +++ b/cc/output/renderer_pixeltest.cc
 | 
| @@ -123,19 +123,14 @@ void CreateTestTextureDrawQuad(const gfx::Rect& rect,
 | 
|                            SkColorGetR(texel_color),
 | 
|                            SkColorGetG(texel_color),
 | 
|                            SkColorGetB(texel_color));
 | 
| -  std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
 | 
| +  size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height();
 | 
| +  std::vector<uint32_t> pixels(num_pixels, pixel_color);
 | 
|  
 | 
| -  ResourceProvider::ResourceId resource =
 | 
| -      resource_provider->CreateResource(rect.size(),
 | 
| -                                        GL_CLAMP_TO_EDGE,
 | 
| -                                        ResourceProvider::TextureHintImmutable,
 | 
| -                                        RGBA_8888);
 | 
| -  resource_provider->SetPixels(
 | 
| -      resource,
 | 
| -      reinterpret_cast<uint8_t*>(&pixels.front()),
 | 
| -      rect,
 | 
| -      rect,
 | 
| -      gfx::Vector2d());
 | 
| +  ResourceProvider::ResourceId resource = resource_provider->CreateResource(
 | 
| +      rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
 | 
| +      RGBA_8888);
 | 
| +  resource_provider->CopyToResource(
 | 
| +      resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size());
 | 
|  
 | 
|    float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
 | 
|  
 | 
| @@ -162,6 +157,13 @@ typedef ::testing::Types<GLRenderer,
 | 
|  TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
 | 
|  
 | 
|  template <typename RendererType>
 | 
| +class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {};
 | 
| +
 | 
| +typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport>
 | 
| +    SoftwareRendererTypes;
 | 
| +TYPED_TEST_CASE(SoftwareRendererPixelTest, SoftwareRendererTypes);
 | 
| +
 | 
| +template <typename RendererType>
 | 
|  class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator {
 | 
|   public:
 | 
|    explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha)
 | 
| @@ -872,18 +874,13 @@ TYPED_TEST(RendererPixelTest, RenderPassAndMaskWithPartialQuad) {
 | 
|  
 | 
|    ResourceProvider::ResourceId mask_resource_id =
 | 
|        this->resource_provider_->CreateResource(
 | 
| -          mask_rect.size(),
 | 
| -          GL_CLAMP_TO_EDGE,
 | 
| -          ResourceProvider::TextureHintImmutable,
 | 
| -          RGBA_8888);
 | 
| +          mask_rect.size(), GL_CLAMP_TO_EDGE,
 | 
| +          ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888);
 | 
|    {
 | 
|      SkAutoLockPixels lock(bitmap);
 | 
| -    this->resource_provider_->SetPixels(
 | 
| -        mask_resource_id,
 | 
| -        reinterpret_cast<uint8_t*>(bitmap.getPixels()),
 | 
| -        mask_rect,
 | 
| -        mask_rect,
 | 
| -        gfx::Vector2d());
 | 
| +    this->resource_provider_->CopyToResource(
 | 
| +        mask_resource_id, reinterpret_cast<uint8_t*>(bitmap.getPixels()),
 | 
| +        mask_rect.size());
 | 
|    }
 | 
|  
 | 
|    // This RenderPassDrawQuad does not include the full |viewport_rect| which is
 | 
| @@ -1379,7 +1376,7 @@ TEST_F(GLRendererPixelTest, AntiAliasingPerspective) {
 | 
|        FuzzyPixelOffByOneComparator(true)));
 | 
|  }
 | 
|  
 | 
| -TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
| +TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
|    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.
 | 
| @@ -1459,7 +1456,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadIdentityScale) {
 | 
|  }
 | 
|  
 | 
|  // Not WithSkiaGPUBackend since that path currently requires tiles for opacity.
 | 
| -TYPED_TEST(RendererPixelTest, PictureDrawQuadOpacity) {
 | 
| +TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadOpacity) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| @@ -1536,7 +1533,7 @@ bool IsSoftwareRenderer<SoftwareRendererWithExpandedViewport>() {
 | 
|  
 | 
|  // If we disable image filtering, then a 2x2 bitmap should appear as four
 | 
|  // huge sharp squares.
 | 
| -TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
| +TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
|    // We only care about this in software mode since bilinear filtering is
 | 
|    // cheap in hardware.
 | 
|    if (!IsSoftwareRenderer<TypeParam>())
 | 
| @@ -1593,7 +1590,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadDisableImageFiltering) {
 | 
|  }
 | 
|  
 | 
|  // This disables filtering by setting |nearest_neighbor| on the PictureDrawQuad.
 | 
| -TYPED_TEST(RendererPixelTest, PictureDrawQuadNearestNeighbor) {
 | 
| +TYPED_TEST(SoftwareRendererPixelTest, PictureDrawQuadNearestNeighbor) {
 | 
|    gfx::Size pile_tile_size(1000, 1000);
 | 
|    gfx::Rect viewport(this->device_viewport_size_);
 | 
|    ResourceFormat texture_format = RGBA_8888;
 | 
| @@ -1662,19 +1659,13 @@ TYPED_TEST(RendererPixelTest, TileDrawQuadNearestNeighbor) {
 | 
|    gfx::Size tile_size(2, 2);
 | 
|    ResourceProvider::ResourceId resource =
 | 
|        this->resource_provider_->CreateResource(
 | 
| -          tile_size,
 | 
| -          GL_CLAMP_TO_EDGE,
 | 
| -          ResourceProvider::TextureHintImmutable,
 | 
| +          tile_size, GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
 | 
|            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());
 | 
| +    this->resource_provider_->CopyToResource(
 | 
| +        resource, static_cast<uint8_t*>(bitmap.getPixels()), tile_size);
 | 
|    }
 | 
|  
 | 
|    RenderPassId id(1, 1);
 | 
| @@ -1700,7 +1691,7 @@ TYPED_TEST(RendererPixelTest, TileDrawQuadNearestNeighbor) {
 | 
|        ExactPixelComparator(true)));
 | 
|  }
 | 
|  
 | 
| -TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) {
 | 
| +TYPED_TEST(SoftwareRendererPixelTest, 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.
 | 
| @@ -2001,45 +1992,6 @@ TEST_F(GLRendererPixelTest, CheckReadbackSubset) {
 | 
|        &capture_rect));
 | 
|  }
 | 
|  
 | 
| -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;
 | 
| -  scoped_ptr<RenderPass> pass =
 | 
| -      CreateTestRenderPass(id, viewport, transform_to_root);
 | 
| -
 | 
| -  // One viewport-filling blue quad
 | 
| -  scoped_ptr<FakePicturePile> blue_recording =
 | 
| -      FakePicturePile::CreateFilledPile(pile_tile_size, viewport.size());
 | 
| -  SkPaint blue_paint;
 | 
| -  blue_paint.setColor(SK_ColorBLUE);
 | 
| -  blue_recording->add_draw_rect_with_paint(viewport, blue_paint);
 | 
| -  blue_recording->RerecordPile();
 | 
| -  scoped_refptr<FakePicturePileImpl> blue_pile =
 | 
| -      FakePicturePileImpl::CreateFromPile(blue_recording.get(), nullptr);
 | 
| -
 | 
| -  gfx::Transform blue_content_to_target_transform;
 | 
| -  SharedQuadState* blue_shared_state = CreateTestSharedQuadState(
 | 
| -      blue_content_to_target_transform, viewport, pass.get());
 | 
| -
 | 
| -  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(),
 | 
| -                    nearest_neighbor, texture_format, viewport, 1.f,
 | 
| -                    blue_pile.get());
 | 
| -
 | 
| -  RenderPassList pass_list;
 | 
| -  pass_list.push_back(pass.Pass());
 | 
| -
 | 
| -  EXPECT_TRUE(this->RunPixelTest(&pass_list,
 | 
| -                                 base::FilePath(FILE_PATH_LITERAL("blue.png")),
 | 
| -                                 ExactPixelComparator(true)));
 | 
| -}
 | 
| -
 | 
|  TYPED_TEST(RendererPixelTest, WrapModeRepeat) {
 | 
|    gfx::Rect rect(this->device_viewport_size_);
 | 
|  
 | 
| @@ -2049,7 +2001,7 @@ TYPED_TEST(RendererPixelTest, WrapModeRepeat) {
 | 
|    SharedQuadState* shared_state =
 | 
|        CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
 | 
|  
 | 
| -  gfx::Rect texture_rect(4, 4);
 | 
| +  gfx::Size texture_size(4, 4);
 | 
|    SkPMColor colors[4] = {
 | 
|      SkPreMultiplyColor(SkColorSetARGB(255, 0, 255, 0)),
 | 
|      SkPreMultiplyColor(SkColorSetARGB(255, 0, 128, 0)),
 | 
| @@ -2064,33 +2016,23 @@ TYPED_TEST(RendererPixelTest, WrapModeRepeat) {
 | 
|    };
 | 
|    ResourceProvider::ResourceId resource =
 | 
|        this->resource_provider_->CreateResource(
 | 
| -          texture_rect.size(),
 | 
| -          GL_REPEAT,
 | 
| -          ResourceProvider::TextureHintImmutable,
 | 
| +          texture_size, GL_REPEAT, ResourceProvider::TEXTURE_HINT_IMMUTABLE,
 | 
|            RGBA_8888);
 | 
| -  this->resource_provider_->SetPixels(
 | 
| -      resource,
 | 
| -      reinterpret_cast<uint8_t*>(pixels),
 | 
| -      texture_rect,
 | 
| -      texture_rect,
 | 
| -      gfx::Vector2d());
 | 
| +  this->resource_provider_->CopyToResource(
 | 
| +      resource, reinterpret_cast<uint8_t*>(pixels), texture_size);
 | 
|  
 | 
|    float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
 | 
|    TextureDrawQuad* texture_quad =
 | 
|        pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
 | 
|    texture_quad->SetNew(
 | 
| -      shared_state,
 | 
| -      gfx::Rect(this->device_viewport_size_),
 | 
| -      gfx::Rect(),
 | 
| -      gfx::Rect(this->device_viewport_size_),
 | 
| -      resource,
 | 
| +      shared_state, gfx::Rect(this->device_viewport_size_), gfx::Rect(),
 | 
| +      gfx::Rect(this->device_viewport_size_), resource,
 | 
|        true,                     // premultiplied_alpha
 | 
|        gfx::PointF(0.0f, 0.0f),  // uv_top_left
 | 
|        gfx::PointF(              // uv_bottom_right
 | 
| -          this->device_viewport_size_.width() / texture_rect.width(),
 | 
| -          this->device_viewport_size_.height() / texture_rect.height()),
 | 
| -      SK_ColorWHITE,
 | 
| -      vertex_opacity,
 | 
| +          this->device_viewport_size_.width() / texture_size.width(),
 | 
| +          this->device_viewport_size_.height() / texture_size.height()),
 | 
| +      SK_ColorWHITE, vertex_opacity,
 | 
|        false,   // flipped
 | 
|        false);  // nearest_neighbor
 | 
|  
 | 
| 
 |