diff options
24 files changed, 258 insertions, 56 deletions
diff --git a/cc/blink/web_image_layer_impl.cc b/cc/blink/web_image_layer_impl.cc index ee80ca6..afd551a 100644 --- a/cc/blink/web_image_layer_impl.cc +++ b/cc/blink/web_image_layer_impl.cc @@ -35,4 +35,11 @@ void WebImageLayerImpl::setImageBitmap(const SkBitmap& bitmap) { } } +void WebImageLayerImpl::setNearestNeighbor(bool nearest_neighbor) { + if (WebLayerImpl::UsingPictureLayer()) { + static_cast<cc::PictureImageLayer*>(layer_->layer()) + ->SetNearestNeighbor(nearest_neighbor); + } +} + } // namespace cc_blink diff --git a/cc/blink/web_image_layer_impl.h b/cc/blink/web_image_layer_impl.h index e0591aa..48c31ea 100644 --- a/cc/blink/web_image_layer_impl.h +++ b/cc/blink/web_image_layer_impl.h @@ -22,6 +22,7 @@ class WebImageLayerImpl : public blink::WebImageLayer { // blink::WebImageLayer implementation. virtual blink::WebLayer* layer(); virtual void setImageBitmap(const SkBitmap& bitmap); + virtual void setNearestNeighbor(bool nearest_neighbor); private: scoped_ptr<WebLayerImpl> layer_; diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index 8a4fd67..48f3f73 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc @@ -24,7 +24,8 @@ PictureLayer::PictureLayer(ContentLayerClient* client) instrumentation_object_tracker_(id()), update_source_frame_number_(-1), can_use_lcd_text_for_update_(true), - is_mask_(false) { + is_mask_(false), + nearest_neighbor_(false) { } PictureLayer::PictureLayer(ContentLayerClient* client, @@ -65,6 +66,8 @@ void PictureLayer::PushPropertiesTo(LayerImpl* base_layer) { recording_source_->SetEmptyBounds(); } + layer_impl->SetNearestNeighbor(nearest_neighbor_); + scoped_refptr<RasterSource> raster_source = recording_source_->CreateRasterSource(); raster_source->SetBackgoundColor(SafeOpaqueBackgroundColor()); @@ -205,6 +208,14 @@ void PictureLayer::ClearClient() { UpdateDrawsContent(HasDrawableContent()); } +void PictureLayer::SetNearestNeighbor(bool nearest_neighbor) { + if (nearest_neighbor_ == nearest_neighbor) + return; + + nearest_neighbor_ = nearest_neighbor; + SetNeedsCommit(); +} + bool PictureLayer::HasDrawableContent() const { return client_ && Layer::HasDrawableContent(); } diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h index 04c5f8f..648d1c9 100644 --- a/cc/layers/picture_layer.h +++ b/cc/layers/picture_layer.h @@ -23,6 +23,8 @@ class CC_EXPORT PictureLayer : public Layer { void ClearClient(); + void SetNearestNeighbor(bool nearest_neighbor); + // Layer interface. scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override; void SetLayerTreeHost(LayerTreeHost* host) override; @@ -69,6 +71,7 @@ class CC_EXPORT PictureLayer : public Layer { int update_source_frame_number_; bool can_use_lcd_text_for_update_; bool is_mask_; + bool nearest_neighbor_; DISALLOW_COPY_AND_ASSIGN(PictureLayer); }; diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index b8444de..392450a3 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -85,7 +85,8 @@ PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, needs_post_commit_initialization_(true), should_update_tile_priorities_(false), only_used_low_res_last_append_quads_(false), - is_mask_(is_mask) { + is_mask_(is_mask), + nearest_neighbor_(false) { layer_tree_impl()->RegisterPictureLayerImpl(this); } @@ -141,6 +142,8 @@ void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { twin_layer_ = layer_impl; layer_impl->twin_layer_ = this; + layer_impl->SetNearestNeighbor(nearest_neighbor_); + // Solid color layers have no tilings. DCHECK_IMPLIES(raster_source_->IsSolidColor(), tilings_->num_tilings() == 0); // The pending tree should only have a high res (and possibly low res) tiling. @@ -241,8 +244,9 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass, PictureDrawQuad* quad = render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); quad->SetNew(shared_quad_state, geometry_rect, opaque_rect, - visible_geometry_rect, texture_rect, texture_size, RGBA_8888, - quad_content_rect, max_contents_scale, raster_source_); + visible_geometry_rect, texture_rect, texture_size, + nearest_neighbor_, RGBA_8888, quad_content_rect, + max_contents_scale, raster_source_); return; } @@ -354,7 +358,8 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass, draw_info.get_resource_id(), texture_rect, iter.texture_size(), - draw_info.contents_swizzled()); + draw_info.contents_swizzled(), + nearest_neighbor_); has_draw_quad = true; break; } @@ -376,8 +381,8 @@ void PictureLayerImpl::AppendQuads(RenderPass* render_pass, render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); quad->SetNew(shared_quad_state, geometry_rect, opaque_rect, visible_geometry_rect, texture_rect, iter.texture_size(), - format, iter->content_rect(), iter->contents_scale(), - raster_source_); + nearest_neighbor_, format, iter->content_rect(), + iter->contents_scale(), raster_source_); has_draw_quad = true; break; } @@ -810,6 +815,14 @@ void PictureLayerImpl::GetContentsResourceId( *resource_size = iter.texture_size(); } +void PictureLayerImpl::SetNearestNeighbor(bool nearest_neighbor) { + if (nearest_neighbor_ == nearest_neighbor) + return; + + nearest_neighbor_ = nearest_neighbor; + NoteLayerPropertyChanged(); +} + void PictureLayerImpl::DoPostCommitInitialization() { // TODO(danakj): Remove this. DCHECK(needs_post_commit_initialization_); diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h index 0b94f41..f17743d 100644 --- a/cc/layers/picture_layer_impl.h +++ b/cc/layers/picture_layer_impl.h @@ -85,6 +85,8 @@ class CC_EXPORT PictureLayerImpl void GetContentsResourceId(ResourceProvider::ResourceId* resource_id, gfx::Size* resource_size) const override; + void SetNearestNeighbor(bool nearest_neighbor); + size_t GPUMemoryUsageInBytes() const override; void RunMicroBenchmark(MicroBenchmarkImpl* benchmark) override; @@ -173,6 +175,8 @@ class CC_EXPORT PictureLayerImpl bool only_used_low_res_last_append_quads_; const bool is_mask_; + bool nearest_neighbor_; + // Any draw properties derived from |transform|, |viewport|, and |clip| // parameters in LayerTreeHostImpl::SetExternalDrawConstraints are not valid // for prioritizing tiles during resourceless software draws. This is because diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc index c66e124..a36c030 100644 --- a/cc/layers/tiled_layer_impl.cc +++ b/cc/layers/tiled_layer_impl.cc @@ -262,7 +262,8 @@ void TiledLayerImpl::AppendQuads(RenderPass* render_pass, tile->resource_id(), tex_coord_rect, texture_size, - tile->contents_swizzled()); + tile->contents_swizzled(), + false); } } } diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index 13a98f6..ee94a4c 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc @@ -1626,7 +1626,8 @@ void GLRenderer::DrawContentQuadAA(const DrawingFrame* frame, SetupQuadForAntialiasing(device_transform, quad, &local_quad, edge); ResourceProvider::ScopedSamplerGL quad_resource_lock( - resource_provider_, resource_id, GL_LINEAR); + resource_provider_, resource_id, + quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR); SamplerType sampler = SamplerTypeFromTextureTarget(quad_resource_lock.target()); @@ -1710,7 +1711,8 @@ void GLRenderer::DrawContentQuadNoAA(const DrawingFrame* frame, bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f); GLenum filter = - (scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation()) + (scaled || !quad->quadTransform().IsIdentityOrIntegerTranslation()) && + !quad->nearest_neighbor ? GL_LINEAR : GL_NEAREST; diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index 53b5b98..b51aef6 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc @@ -1725,6 +1725,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; @@ -1761,8 +1762,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 = @@ -1780,7 +1781,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()); @@ -1796,6 +1798,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; @@ -1818,8 +1821,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 = @@ -1836,8 +1839,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()); @@ -1873,6 +1876,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; @@ -1903,8 +1907,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()); @@ -1917,11 +1921,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; @@ -1954,15 +2065,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. @@ -2030,7 +2141,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. @@ -2215,6 +2326,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; @@ -2236,7 +2348,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()); diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index ddd3473..1b18648 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -347,7 +347,8 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame, // (http://crbug.com/280374). skia::RefPtr<SkDrawFilter> opacity_filter = skia::AdoptRef(new skia::OpacityDrawFilter( - quad->opacity(), frame->disable_picture_quad_image_filtering)); + quad->opacity(), frame->disable_picture_quad_image_filtering || + quad->nearest_neighbor)); DCHECK(!current_canvas_->getDrawFilter()); current_canvas_->setDrawFilter(opacity_filter.get()); @@ -449,7 +450,9 @@ void SoftwareRenderer::DrawTileQuad(const DrawingFrame* frame, QuadVertexRect(), quad->rect, quad->visible_rect); SkRect uv_rect = gfx::RectFToSkRect(visible_tex_coord_rect); - current_paint_.setFilterLevel(SkPaint::kLow_FilterLevel); + current_paint_.setFilterLevel(quad->nearest_neighbor + ? SkPaint::kNone_FilterLevel + : SkPaint::kLow_FilterLevel); current_canvas_->drawBitmapRectToRect( *lock.sk_bitmap(), &uv_rect, diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc index ea584ee..7f689a8 100644 --- a/cc/output/software_renderer_unittest.cc +++ b/cc/output/software_renderer_unittest.cc @@ -211,6 +211,7 @@ TEST_F(SoftwareRendererTest, TileQuad) { resource_cyan, gfx::RectF(inner_size), inner_size, + false, false); TileDrawQuad* outer_quad = root_render_pass->CreateAndAppendDrawQuad<TileDrawQuad>(); @@ -221,6 +222,7 @@ TEST_F(SoftwareRendererTest, TileQuad) { resource_yellow, gfx::RectF(outer_size), outer_size, + false, false); RenderPassList list; @@ -294,6 +296,7 @@ TEST_F(SoftwareRendererTest, TileQuadVisibleRect) { resource_cyan, gfx::RectF(tile_size), tile_size, + false, false); quad->visible_rect = visible_rect; diff --git a/cc/quads/content_draw_quad_base.cc b/cc/quads/content_draw_quad_base.cc index fd6e91b..7304498 100644 --- a/cc/quads/content_draw_quad_base.cc +++ b/cc/quads/content_draw_quad_base.cc @@ -25,13 +25,15 @@ void ContentDrawQuadBase::SetNew(const SharedQuadState* shared_quad_state, const gfx::Rect& visible_rect, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents) { + bool swizzle_contents, + bool nearest_neighbor) { bool needs_blending = false; DrawQuad::SetAll(shared_quad_state, material, rect, opaque_rect, visible_rect, needs_blending); this->tex_coord_rect = tex_coord_rect; this->texture_size = texture_size; this->swizzle_contents = swizzle_contents; + this->nearest_neighbor = nearest_neighbor; } void ContentDrawQuadBase::SetAll(const SharedQuadState* shared_quad_state, @@ -42,12 +44,14 @@ void ContentDrawQuadBase::SetAll(const SharedQuadState* shared_quad_state, bool needs_blending, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents) { + bool swizzle_contents, + bool nearest_neighbor) { DrawQuad::SetAll(shared_quad_state, material, rect, opaque_rect, visible_rect, needs_blending); this->tex_coord_rect = tex_coord_rect; this->texture_size = texture_size; this->swizzle_contents = swizzle_contents; + this->nearest_neighbor = nearest_neighbor; } void ContentDrawQuadBase::ExtendValue(base::debug::TracedValue* value) const { @@ -60,6 +64,7 @@ void ContentDrawQuadBase::ExtendValue(base::debug::TracedValue* value) const { value->EndDictionary(); value->SetBoolean("swizzle_contents", swizzle_contents); + value->SetBoolean("nearest_neighbor", nearest_neighbor); } } // namespace cc diff --git a/cc/quads/content_draw_quad_base.h b/cc/quads/content_draw_quad_base.h index b0e53dc..58aa727 100644 --- a/cc/quads/content_draw_quad_base.h +++ b/cc/quads/content_draw_quad_base.h @@ -23,7 +23,8 @@ class CC_EXPORT ContentDrawQuadBase : public DrawQuad { const gfx::Rect& visible_rect, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents); + bool swizzle_contents, + bool nearest_neighbor); void SetAll(const SharedQuadState* shared_quad_state, DrawQuad::Material material, @@ -33,11 +34,13 @@ class CC_EXPORT ContentDrawQuadBase : public DrawQuad { bool needs_blending, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents); + bool swizzle_contents, + bool nearest_neighbor); gfx::RectF tex_coord_rect; gfx::Size texture_size; bool swizzle_contents; + bool nearest_neighbor; protected: ContentDrawQuadBase(); diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc index e65b326..97fea32 100644 --- a/cc/quads/draw_quad_unittest.cc +++ b/cc/quads/draw_quad_unittest.cc @@ -600,15 +600,17 @@ TEST(DrawQuadTest, CopyTileDrawQuad) { gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f); gfx::Size texture_size(85, 32); bool swizzle_contents = true; + bool nearest_neighbor = true; CREATE_SHARED_STATE(); - CREATE_QUAD_6_NEW(TileDrawQuad, + CREATE_QUAD_7_NEW(TileDrawQuad, opaque_rect, visible_rect, resource_id, tex_coord_rect, texture_size, - swizzle_contents); + swizzle_contents, + nearest_neighbor); EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material); EXPECT_EQ(opaque_rect, copy_quad->opaque_rect); EXPECT_EQ(visible_rect, copy_quad->visible_rect); @@ -616,17 +618,20 @@ TEST(DrawQuadTest, CopyTileDrawQuad) { EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect); EXPECT_EQ(texture_size, copy_quad->texture_size); EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents); + EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor); - CREATE_QUAD_4_ALL(TileDrawQuad, + CREATE_QUAD_5_ALL(TileDrawQuad, resource_id, tex_coord_rect, texture_size, - swizzle_contents); + swizzle_contents, + nearest_neighbor); EXPECT_EQ(DrawQuad::TILED_CONTENT, copy_quad->material); 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); EXPECT_EQ(swizzle_contents, copy_quad->swizzle_contents); + EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor); } TEST(DrawQuadTest, CopyYUVVideoDrawQuad) { @@ -680,31 +685,34 @@ TEST(DrawQuadTest, CopyPictureDrawQuad) { 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); + bool nearest_neighbor = true; ResourceFormat texture_format = RGBA_8888; gfx::Rect content_rect(30, 40, 20, 30); float contents_scale = 3.141592f; scoped_refptr<RasterSource> raster_source = PicturePileImpl::Create(); CREATE_SHARED_STATE(); - CREATE_QUAD_8_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect, - texture_size, texture_format, content_rect, contents_scale, - raster_source); + CREATE_QUAD_9_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect, + texture_size, nearest_neighbor, texture_format, + content_rect, contents_scale, raster_source); EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material); EXPECT_EQ(opaque_rect, copy_quad->opaque_rect); EXPECT_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(nearest_neighbor, copy_quad->nearest_neighbor); EXPECT_EQ(texture_format, copy_quad->texture_format); EXPECT_EQ(content_rect, copy_quad->content_rect); EXPECT_EQ(contents_scale, copy_quad->contents_scale); EXPECT_EQ(raster_source, copy_quad->raster_source); - CREATE_QUAD_6_ALL(PictureDrawQuad, tex_coord_rect, texture_size, - texture_format, content_rect, contents_scale, - raster_source); + CREATE_QUAD_7_ALL(PictureDrawQuad, tex_coord_rect, texture_size, + nearest_neighbor, texture_format, content_rect, + contents_scale, raster_source); EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material); EXPECT_EQ(tex_coord_rect, copy_quad->tex_coord_rect); EXPECT_EQ(texture_size, copy_quad->texture_size); + EXPECT_EQ(nearest_neighbor, copy_quad->nearest_neighbor); EXPECT_EQ(texture_format, copy_quad->texture_format); EXPECT_EQ(content_rect, copy_quad->content_rect); EXPECT_EQ(contents_scale, copy_quad->contents_scale); @@ -871,15 +879,17 @@ TEST_F(DrawQuadIteratorTest, TileDrawQuad) { gfx::RectF tex_coord_rect(31.f, 12.f, 54.f, 20.f); gfx::Size texture_size(85, 32); bool swizzle_contents = true; + bool nearest_neighbor = true; CREATE_SHARED_STATE(); - CREATE_QUAD_6_NEW(TileDrawQuad, + CREATE_QUAD_7_NEW(TileDrawQuad, opaque_rect, visible_rect, resource_id, tex_coord_rect, texture_size, - swizzle_contents); + swizzle_contents, + nearest_neighbor); EXPECT_EQ(resource_id, quad_new->resource_id); EXPECT_EQ(1, IterateAndCount(quad_new)); EXPECT_EQ(resource_id + 1, quad_new->resource_id); @@ -924,15 +934,16 @@ TEST_F(DrawQuadIteratorTest, DISABLED_PictureDrawQuad) { 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); + bool nearest_neighbor = true; ResourceFormat texture_format = RGBA_8888; gfx::Rect content_rect(30, 40, 20, 30); float contents_scale = 3.141592f; scoped_refptr<PicturePileImpl> raster_source = PicturePileImpl::Create(); CREATE_SHARED_STATE(); - CREATE_QUAD_8_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect, - texture_size, texture_format, content_rect, contents_scale, - raster_source); + CREATE_QUAD_9_NEW(PictureDrawQuad, opaque_rect, visible_rect, tex_coord_rect, + texture_size, nearest_neighbor, texture_format, + content_rect, contents_scale, raster_source); EXPECT_EQ(0, IterateAndCount(quad_new)); } diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc index bf329c2..2171542 100644 --- a/cc/quads/picture_draw_quad.cc +++ b/cc/quads/picture_draw_quad.cc @@ -23,6 +23,7 @@ void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state, const gfx::Rect& visible_rect, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, + bool nearest_neighbor, ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, @@ -35,7 +36,8 @@ void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state, visible_rect, tex_coord_rect, texture_size, - !PlatformColor::SameComponentOrder(texture_format)); + !PlatformColor::SameComponentOrder(texture_format), + nearest_neighbor); this->content_rect = content_rect; this->contents_scale = contents_scale; this->raster_source = raster_source; @@ -49,6 +51,7 @@ void PictureDrawQuad::SetAll(const SharedQuadState* shared_quad_state, bool needs_blending, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, + bool nearest_neighbor, ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, @@ -62,7 +65,8 @@ void PictureDrawQuad::SetAll(const SharedQuadState* shared_quad_state, tex_coord_rect, texture_size, !PlatformColor::SameComponentOrder( - texture_format)); + texture_format), + nearest_neighbor); this->content_rect = content_rect; this->contents_scale = contents_scale; this->raster_source = raster_source; diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h index 62c9f18..624b69c 100644 --- a/cc/quads/picture_draw_quad.h +++ b/cc/quads/picture_draw_quad.h @@ -28,6 +28,7 @@ class CC_EXPORT PictureDrawQuad : public ContentDrawQuadBase { const gfx::Rect& visible_rect, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, + bool nearest_neighbor, ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, @@ -40,6 +41,7 @@ class CC_EXPORT PictureDrawQuad : public ContentDrawQuadBase { bool needs_blending, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, + bool nearest_neighbor, ResourceFormat texture_format, const gfx::Rect& content_rect, float contents_scale, diff --git a/cc/quads/tile_draw_quad.cc b/cc/quads/tile_draw_quad.cc index ea3a14a..88a4b3af 100644 --- a/cc/quads/tile_draw_quad.cc +++ b/cc/quads/tile_draw_quad.cc @@ -25,7 +25,8 @@ void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state, unsigned resource_id, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents) { + bool swizzle_contents, + bool nearest_neighbor) { ContentDrawQuadBase::SetNew(shared_quad_state, DrawQuad::TILED_CONTENT, rect, @@ -33,7 +34,8 @@ void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state, visible_rect, tex_coord_rect, texture_size, - swizzle_contents); + swizzle_contents, + nearest_neighbor); this->resource_id = resource_id; } @@ -45,10 +47,12 @@ void TileDrawQuad::SetAll(const SharedQuadState* shared_quad_state, unsigned resource_id, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents) { + bool swizzle_contents, + bool nearest_neighbor) { ContentDrawQuadBase::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect, opaque_rect, visible_rect, needs_blending, - tex_coord_rect, texture_size, swizzle_contents); + tex_coord_rect, texture_size, swizzle_contents, + nearest_neighbor); this->resource_id = resource_id; } diff --git a/cc/quads/tile_draw_quad.h b/cc/quads/tile_draw_quad.h index d776057..e668ddb 100644 --- a/cc/quads/tile_draw_quad.h +++ b/cc/quads/tile_draw_quad.h @@ -21,7 +21,8 @@ class CC_EXPORT TileDrawQuad : public ContentDrawQuadBase { unsigned resource_id, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents); + bool swizzle_contents, + bool nearest_neighbor); void SetAll(const SharedQuadState* shared_quad_state, const gfx::Rect& rect, @@ -31,7 +32,8 @@ class CC_EXPORT TileDrawQuad : public ContentDrawQuadBase { unsigned resource_id, const gfx::RectF& tex_coord_rect, const gfx::Size& texture_size, - bool swizzle_contents); + bool swizzle_contents, + bool nearest_neighbor); unsigned resource_id; diff --git a/cc/test/render_pass_test_common.cc b/cc/test/render_pass_test_common.cc index b79fc1f..7237ce1 100644 --- a/cc/test/render_pass_test_common.cc +++ b/cc/test/render_pass_test_common.cc @@ -198,6 +198,7 @@ void TestRenderPass::AppendOneOfEveryQuadType( resource2, gfx::RectF(0, 0, 50, 50), gfx::Size(50, 50), + false, false); SharedQuadState* transformed_state = this->CreateAndAppendSharedQuadState(); @@ -215,6 +216,7 @@ void TestRenderPass::AppendOneOfEveryQuadType( resource3, gfx::RectF(0, 0, 100, 100), gfx::Size(100, 100), + false, false); SharedQuadState* shared_state2 = this->CreateAndAppendSharedQuadState(); @@ -235,6 +237,7 @@ void TestRenderPass::AppendOneOfEveryQuadType( resource4, gfx::RectF(0, 0, 100, 100), gfx::Size(100, 100), + false, false); ResourceProvider::ResourceId plane_resources[4]; diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index c8e27a9..fc4780f 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc @@ -4186,6 +4186,7 @@ class BlendStateCheckLayer : public LayerImpl { resource_id_, gfx::RectF(0.f, 0.f, 1.f, 1.f), gfx::Size(1, 1), + false, false); test_blending_draw_quad->visible_rect = quad_visible_rect_; EXPECT_EQ(blend_, test_blending_draw_quad->ShouldDrawWithBlending()); diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h index 21bc4c7..9808438 100644 --- a/content/common/cc_messages.h +++ b/content/common/cc_messages.h @@ -222,6 +222,7 @@ IPC_STRUCT_TRAITS_BEGIN(cc::TileDrawQuad) IPC_STRUCT_TRAITS_MEMBER(tex_coord_rect) IPC_STRUCT_TRAITS_MEMBER(texture_size) IPC_STRUCT_TRAITS_MEMBER(swizzle_contents) + IPC_STRUCT_TRAITS_MEMBER(nearest_neighbor) IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(cc::YUVVideoDrawQuad) diff --git a/content/common/cc_messages_unittest.cc b/content/common/cc_messages_unittest.cc index ef16091..d3ec0df 100644 --- a/content/common/cc_messages_unittest.cc +++ b/content/common/cc_messages_unittest.cc @@ -194,6 +194,7 @@ class CCMessagesTest : public testing::Test { EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect); EXPECT_EQ(a->texture_size, b->texture_size); EXPECT_EQ(a->swizzle_contents, b->swizzle_contents); + EXPECT_EQ(a->nearest_neighbor, b->nearest_neighbor); } void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) { @@ -456,7 +457,8 @@ TEST_F(CCMessagesTest, AllQuads) { arbitrary_resourceid3, arbitrary_rectf1, arbitrary_size1, - arbitrary_bool2); + arbitrary_bool2, + arbitrary_bool3); pass_cmp->CopyFromAndAppendDrawQuad(tile_in, tile_in->shared_quad_state); YUVVideoDrawQuad* yuvvideo_in = diff --git a/mojo/converters/surfaces/surfaces_type_converters.cc b/mojo/converters/surfaces/surfaces_type_converters.cc index 1a6ab99..c064dc8 100644 --- a/mojo/converters/surfaces/surfaces_type_converters.cc +++ b/mojo/converters/surfaces/surfaces_type_converters.cc @@ -158,7 +158,8 @@ bool ConvertDrawQuad(const QuadPtr& input, tile_state->resource_id, tile_state->tex_coord_rect.To<gfx::RectF>(), tile_state->texture_size.To<gfx::Size>(), - tile_state->swizzle_contents); + tile_state->swizzle_contents, + tile_state->nearest_neighbor); break; } case MATERIAL_YUV_VIDEO_CONTENT: { @@ -309,6 +310,7 @@ QuadPtr TypeConverter<QuadPtr, cc::DrawQuad>::Convert( tile_state->tex_coord_rect = RectF::From(tile_quad->tex_coord_rect); tile_state->texture_size = Size::From(tile_quad->texture_size); tile_state->swizzle_contents = tile_quad->swizzle_contents; + tile_state->nearest_neighbor = tile_quad->nearest_neighbor; tile_state->resource_id = tile_quad->resource_id; quad->tile_quad_state = tile_state.Pass(); break; diff --git a/mojo/services/public/interfaces/surfaces/quads.mojom b/mojo/services/public/interfaces/surfaces/quads.mojom index 61115f7..8f5cd1f 100644 --- a/mojo/services/public/interfaces/surfaces/quads.mojom +++ b/mojo/services/public/interfaces/surfaces/quads.mojom @@ -71,6 +71,7 @@ struct TileQuadState { RectF tex_coord_rect; Size texture_size; bool swizzle_contents; + bool nearest_neighbor; uint32 resource_id; }; |