diff options
-rw-r--r-- | cc/cc.gyp | 4 | ||||
-rw-r--r-- | cc/cc_tests.gyp | 1 | ||||
-rw-r--r-- | cc/debug/debug_colors.cc | 4 | ||||
-rw-r--r-- | cc/debug/debug_colors.h | 3 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 34 | ||||
-rw-r--r-- | cc/output/gl_renderer.cc | 53 | ||||
-rw-r--r-- | cc/output/gl_renderer.h | 9 | ||||
-rw-r--r-- | cc/quads/content_draw_quad_base.cc | 50 | ||||
-rw-r--r-- | cc/quads/content_draw_quad_base.h | 48 | ||||
-rw-r--r-- | cc/quads/draw_quad.cc | 4 | ||||
-rw-r--r-- | cc/quads/draw_quad.h | 1 | ||||
-rw-r--r-- | cc/quads/draw_quad_unittest.cc | 68 | ||||
-rw-r--r-- | cc/quads/picture_draw_quad.cc | 67 | ||||
-rw-r--r-- | cc/quads/picture_draw_quad.h | 62 | ||||
-rw-r--r-- | cc/quads/tile_draw_quad.cc | 27 | ||||
-rw-r--r-- | cc/quads/tile_draw_quad.h | 13 | ||||
-rw-r--r-- | cc/resources/managed_tile_state.cc | 4 | ||||
-rw-r--r-- | cc/resources/managed_tile_state.h | 18 | ||||
-rw-r--r-- | cc/resources/tile_manager.cc | 4 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc | 107 | ||||
-rw-r--r-- | content/common/cc_messages.cc | 9 | ||||
-rw-r--r-- | content/common/cc_messages.h | 1 | ||||
-rw-r--r-- | content/common/cc_messages_unittest.cc | 5 |
23 files changed, 556 insertions, 40 deletions
@@ -30,6 +30,8 @@ 'output/compositor_frame_ack.h', 'output/compositor_frame_metadata.cc', 'output/compositor_frame_metadata.h', + 'quads/content_draw_quad_base.cc', + 'quads/content_draw_quad_base.h', 'layers/content_layer.cc', 'layers/content_layer.h', 'layers/content_layer_client.h', @@ -152,6 +154,8 @@ 'debug/paint_time_counter.h', 'resources/picture.cc', 'resources/picture.h', + 'quads/picture_draw_quad.cc', + 'quads/picture_draw_quad.h', 'layers/picture_image_layer.cc', 'layers/picture_image_layer.h', 'layers/picture_image_layer_impl.cc', diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index 35b7095..0098c36 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -29,6 +29,7 @@ 'trees/layer_tree_host_common_unittest.cc', 'trees/layer_tree_host_impl_unittest.cc', 'trees/layer_tree_host_pixeltest_filters.cc', + 'trees/layer_tree_host_pixeltest_on_demand_raster.cc', 'trees/layer_tree_host_unittest.cc', 'trees/layer_tree_host_unittest_animation.cc', 'trees/layer_tree_host_unittest_context.cc', diff --git a/cc/debug/debug_colors.cc b/cc/debug/debug_colors.cc index cc43480..01e72bb 100644 --- a/cc/debug/debug_colors.cc +++ b/cc/debug/debug_colors.cc @@ -128,6 +128,10 @@ int DebugColors::SolidColorTileBorderWidth(const LayerTreeImpl* tree_impl) { return Scale(1, tree_impl); } +// Picture tile borders are dark grey. +SkColor DebugColors::PictureTileBorderColor() { return SkColorSetARGB(64, 64, 64, 0); } +int DebugColors::PictureTileBorderWidth(const LayerTreeImpl* tree_impl) { return Scale(1, tree_impl); } + // ======= Checkerboard colors ======= // Non-debug checkerboards are grey. diff --git a/cc/debug/debug_colors.h b/cc/debug/debug_colors.h index ba5f8b6..be1294d9 100644 --- a/cc/debug/debug_colors.h +++ b/cc/debug/debug_colors.h @@ -56,6 +56,9 @@ class DebugColors { static SkColor SolidColorTileBorderColor(); static int SolidColorTileBorderWidth(const LayerTreeImpl* tree_impl); + static SkColor PictureTileBorderColor(); + static int PictureTileBorderWidth(const LayerTreeImpl* tree_impl); + static SkColor DefaultCheckerboardColor(); static SkColor EvictedTileCheckerboardColor(); static SkColor InvalidatedTileCheckerboardColor(); diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 9d456fc..f39fd41 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -14,6 +14,7 @@ #include "cc/layers/quad_sink.h" #include "cc/quads/checkerboard_draw_quad.h" #include "cc/quads/debug_border_draw_quad.h" +#include "cc/quads/picture_draw_quad.h" #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/tile_draw_quad.h" #include "cc/trees/layer_tree_impl.h" @@ -119,6 +120,9 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, mode == ManagedTileState::DrawingInfo::TRANSPARENT_MODE) { color = DebugColors::SolidColorTileBorderColor(); width = DebugColors::SolidColorTileBorderWidth(layer_tree_impl()); + } else if (mode == ManagedTileState::DrawingInfo::PICTURE_PILE_MODE) { + color = DebugColors::PictureTileBorderColor(); + width = DebugColors::PictureTileBorderWidth(layer_tree_impl()); } else if (iter->priority(ACTIVE_TREE).resolution == HIGH_RESOLUTION) { color = DebugColors::HighResTileBorderColor(); width = DebugColors::HighResTileBorderWidth(layer_tree_impl()); @@ -178,14 +182,14 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, const ManagedTileState::DrawingInfo& drawing_info = iter->drawing_info(); switch (drawing_info.mode()) { - case ManagedTileState::DrawingInfo::TEXTURE_MODE: { - if (iter->contents_scale() != ideal_contents_scale_) - append_quads_data->had_incomplete_tile = true; - + case ManagedTileState::DrawingInfo::RESOURCE_MODE: { gfx::RectF texture_rect = iter.texture_rect(); gfx::Rect opaque_rect = iter->opaque_rect(); opaque_rect.Intersect(content_rect); + if (iter->contents_scale() != ideal_contents_scale_) + append_quads_data->had_incomplete_tile = true; + scoped_ptr<TileDrawQuad> quad = TileDrawQuad::Create(); quad->SetNew(shared_quad_state, geometry_rect, @@ -197,6 +201,24 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data); break; } + case ManagedTileState::DrawingInfo::PICTURE_PILE_MODE: { + gfx::RectF texture_rect = iter.texture_rect(); + gfx::Rect opaque_rect = iter->opaque_rect(); + opaque_rect.Intersect(content_rect); + + scoped_ptr<PictureDrawQuad> quad = PictureDrawQuad::Create(); + quad->SetNew(shared_quad_state, + geometry_rect, + opaque_rect, + texture_rect, + iter.texture_size(), + drawing_info.contents_swizzled(), + iter->content_rect(), + iter->contents_scale(), + pile_); + quad_sink->Append(quad.PassAs<DrawQuad>(), append_quads_data); + break; + } case ManagedTileState::DrawingInfo::SOLID_COLOR_MODE: { scoped_ptr<SolidColorDrawQuad> quad = SolidColorDrawQuad::Create(); quad->SetNew(shared_quad_state, @@ -207,8 +229,6 @@ void PictureLayerImpl::AppendQuads(QuadSink* quad_sink, } case ManagedTileState::DrawingInfo::TRANSPARENT_MODE: break; - case ManagedTileState::DrawingInfo::PICTURE_PILE_MODE: - // TODO(leandrogarcia): crbug.com/173011 would fill this part in. default: NOTREACHED(); } @@ -486,7 +506,7 @@ ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const { // Mask resource not ready yet. if (!*iter || iter->drawing_info().mode() != - ManagedTileState::DrawingInfo::TEXTURE_MODE || + ManagedTileState::DrawingInfo::RESOURCE_MODE || !iter->drawing_info().IsReadyToDraw()) return 0; // Masks only supported if they fit on exactly one tile. diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index c842227..13e6d8a 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc @@ -22,6 +22,7 @@ #include "cc/output/gl_frame_data.h" #include "cc/output/output_surface.h" #include "cc/output/render_surface_filters.h" +#include "cc/quads/picture_draw_quad.h" #include "cc/quads/render_pass.h" #include "cc/quads/stream_video_draw_quad.h" #include "cc/quads/texture_draw_quad.h" @@ -104,7 +105,8 @@ GLRenderer::GLRenderer(RendererClient* client, discard_backbuffer_when_not_visible_(false), is_using_bind_uniform_(false), visible_(true), - is_scissor_enabled_(false) { + is_scissor_enabled_(false), + on_demand_tile_raster_resource_id_(0) { DCHECK(context_); } @@ -303,6 +305,9 @@ void GLRenderer::DoDrawQuad(DrawingFrame* frame, const DrawQuad* quad) { case DrawQuad::IO_SURFACE_CONTENT: DrawIOSurfaceQuad(frame, IOSurfaceDrawQuad::MaterialCast(quad)); break; + case DrawQuad::PICTURE_CONTENT: + DrawPictureQuad(frame, PictureDrawQuad::MaterialCast(quad)); + break; case DrawQuad::RENDER_PASS: DrawRenderPassQuad(frame, RenderPassDrawQuad::MaterialCast(quad)); break; @@ -1038,6 +1043,12 @@ static void TileUniformLocation(T program, TileProgramUniforms* uniforms) { void GLRenderer::DrawTileQuad(const DrawingFrame* frame, const TileDrawQuad* quad) { + DrawContentQuad(frame, quad, quad->resource_id); +} + +void GLRenderer::DrawContentQuad(const DrawingFrame* frame, + const ContentDrawQuadBase* quad, + ResourceProvider::ResourceId resource_id) { gfx::Rect tile_rect = quad->visible_rect; gfx::RectF tex_coord_rect = quad->tex_coord_rect; @@ -1126,7 +1137,7 @@ void GLRenderer::DrawTileQuad(const DrawingFrame* frame, ? GL_LINEAR : GL_NEAREST; ResourceProvider::ScopedSamplerGL quad_resource_lock( - resource_provider_, quad->resource_id, GL_TEXTURE_2D, filter); + resource_provider_, resource_id, GL_TEXTURE_2D, filter); if (use_aa) { GLC(Context(), Context()->uniform3fv(uniforms.edge_location, 8, edge)); @@ -1282,6 +1293,41 @@ void GLRenderer::DrawStreamVideoQuad(const DrawingFrame* frame, program->vertex_shader().matrix_location()); } +void GLRenderer::DrawPictureQuad(const DrawingFrame* frame, + const PictureDrawQuad* quad) { + if (on_demand_tile_raster_bitmap_.width() != quad->texture_size.width() || + on_demand_tile_raster_bitmap_.height() != quad->texture_size.height()) { + on_demand_tile_raster_bitmap_.setConfig( + SkBitmap::kARGB_8888_Config, + quad->texture_size.width(), + quad->texture_size.height()); + on_demand_tile_raster_bitmap_.allocPixels(); + + if (on_demand_tile_raster_resource_id_) + resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); + + on_demand_tile_raster_resource_id_ = resource_provider_->CreateGLTexture( + quad->texture_size, + GL_RGBA, + GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, + ResourceProvider::TextureUsageAny); + } + + SkDevice device(on_demand_tile_raster_bitmap_); + SkCanvas canvas(&device); + + quad->picture_pile->Raster(&canvas, quad->content_rect, quad->contents_scale); + + resource_provider_->SetPixels( + on_demand_tile_raster_resource_id_, + reinterpret_cast<uint8_t*>(on_demand_tile_raster_bitmap_.getPixels()), + gfx::Rect(quad->texture_size), + gfx::Rect(quad->texture_size), + gfx::Vector2d()); + + DrawContentQuad(frame, quad, on_demand_tile_raster_resource_id_); +} + struct TextureProgramBinding { template <class Program> void Set(Program* program, WebKit::WebGraphicsContext3D* context) { @@ -2228,6 +2274,9 @@ void GLRenderer::CleanupSharedObjects() { if (offscreen_framebuffer_id_) GLC(context_, context_->deleteFramebuffer(offscreen_framebuffer_id_)); + if (on_demand_tile_raster_resource_id_) + resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); + ReleaseRenderPassTextures(); } diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h index c30fa06..549f7ae 100644 --- a/cc/output/gl_renderer.h +++ b/cc/output/gl_renderer.h @@ -24,6 +24,7 @@ namespace cc { class GLRendererShaderTest; class OutputSurface; +class PictureDrawQuad; class ScopedResource; class StreamVideoDrawQuad; class TextureDrawQuad; @@ -138,8 +139,13 @@ class CC_EXPORT GLRenderer : void DrawIOSurfaceQuad(const DrawingFrame* frame, const IOSurfaceDrawQuad* quad); void DrawTileQuad(const DrawingFrame* frame, const TileDrawQuad* quad); + void DrawContentQuad(const DrawingFrame* frame, + const ContentDrawQuadBase* quad, + ResourceProvider::ResourceId resource_id); void DrawYUVVideoQuad(const DrawingFrame* frame, const YUVVideoDrawQuad* quad); + void DrawPictureQuad(const DrawingFrame* frame, + const PictureDrawQuad* quad); void SetShaderOpacity(float opacity, int alpha_location); void SetShaderQuadF(const gfx::QuadF& quad, int quad_location); @@ -320,6 +326,9 @@ class CC_EXPORT GLRenderer : scoped_refptr<ResourceProvider::Fence> last_swap_fence_; + SkBitmap on_demand_tile_raster_bitmap_; + ResourceProvider::ResourceId on_demand_tile_raster_resource_id_; + DISALLOW_COPY_AND_ASSIGN(GLRenderer); }; diff --git a/cc/quads/content_draw_quad_base.cc b/cc/quads/content_draw_quad_base.cc new file mode 100644 index 0000000..2c2b4ae --- /dev/null +++ b/cc/quads/content_draw_quad_base.cc @@ -0,0 +1,50 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/quads/content_draw_quad_base.h" + +#include "base/logging.h" + +namespace cc { + +ContentDrawQuadBase::ContentDrawQuadBase() + : swizzle_contents(false) { +} + +ContentDrawQuadBase::~ContentDrawQuadBase() { +} + +void ContentDrawQuadBase::SetNew(const SharedQuadState* shared_quad_state, + DrawQuad::Material material, + gfx::Rect rect, + gfx::Rect opaque_rect, + const gfx::RectF& tex_coord_rect, + 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); + this->tex_coord_rect = tex_coord_rect; + this->texture_size = texture_size; + this->swizzle_contents = swizzle_contents; +} + +void ContentDrawQuadBase::SetAll(const SharedQuadState* shared_quad_state, + DrawQuad::Material material, + gfx::Rect rect, + gfx::Rect opaque_rect, + gfx::Rect visible_rect, + bool needs_blending, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents) { + 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; +} + +} // namespace cc diff --git a/cc/quads/content_draw_quad_base.h b/cc/quads/content_draw_quad_base.h new file mode 100644 index 0000000..f91390b --- /dev/null +++ b/cc/quads/content_draw_quad_base.h @@ -0,0 +1,48 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_QUADS_CONTENT_DRAW_QUAD_BASE_H_ +#define CC_QUADS_CONTENT_DRAW_QUAD_BASE_H_ + +#include "base/memory/scoped_ptr.h" +#include "cc/base/cc_export.h" +#include "cc/quads/draw_quad.h" +#include "third_party/khronos/GLES2/gl2.h" +#include "ui/gfx/point.h" +#include "ui/gfx/size.h" + +namespace cc { + +class CC_EXPORT ContentDrawQuadBase : public DrawQuad { + public: + void SetNew(const SharedQuadState* shared_quad_state, + DrawQuad::Material material, + gfx::Rect rect, + gfx::Rect opaque_rect, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents); + + void SetAll(const SharedQuadState* shared_quad_state, + DrawQuad::Material material, + gfx::Rect rect, + gfx::Rect opaque_rect, + gfx::Rect visible_rect, + bool needs_blending, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents); + + gfx::RectF tex_coord_rect; + gfx::Size texture_size; + bool swizzle_contents; + + protected: + ContentDrawQuadBase(); + virtual ~ContentDrawQuadBase(); +}; + +} + +#endif // CC_QUADS_CONTENT_DRAW_QUAD_BASE_H_ diff --git a/cc/quads/draw_quad.cc b/cc/quads/draw_quad.cc index 0250481..6c8d9b6 100644 --- a/cc/quads/draw_quad.cc +++ b/cc/quads/draw_quad.cc @@ -8,6 +8,7 @@ #include "cc/quads/checkerboard_draw_quad.h" #include "cc/quads/debug_border_draw_quad.h" #include "cc/quads/io_surface_draw_quad.h" +#include "cc/quads/picture_draw_quad.h" #include "cc/quads/render_pass_draw_quad.h" #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/stream_video_draw_quad.h" @@ -62,6 +63,9 @@ scoped_ptr<DrawQuad> DrawQuad::Copy( case IO_SURFACE_CONTENT: copy_quad.reset(TypedCopy<IOSurfaceDrawQuad>(this)); break; + case PICTURE_CONTENT: + copy_quad.reset(TypedCopy<PictureDrawQuad>(this)); + break; case TEXTURE_CONTENT: copy_quad.reset(TypedCopy<TextureDrawQuad>(this)); break; diff --git a/cc/quads/draw_quad.h b/cc/quads/draw_quad.h index 05924f1..3986880 100644 --- a/cc/quads/draw_quad.h +++ b/cc/quads/draw_quad.h @@ -23,6 +23,7 @@ class CC_EXPORT DrawQuad { CHECKERBOARD, DEBUG_BORDER, IO_SURFACE_CONTENT, + PICTURE_CONTENT, RENDER_PASS, TEXTURE_CONTENT, SOLID_COLOR, diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc index 3eefdc9..043a785 100644 --- a/cc/quads/draw_quad_unittest.cc +++ b/cc/quads/draw_quad_unittest.cc @@ -11,12 +11,14 @@ #include "cc/quads/checkerboard_draw_quad.h" #include "cc/quads/debug_border_draw_quad.h" #include "cc/quads/io_surface_draw_quad.h" +#include "cc/quads/picture_draw_quad.h" #include "cc/quads/render_pass_draw_quad.h" #include "cc/quads/solid_color_draw_quad.h" #include "cc/quads/stream_video_draw_quad.h" #include "cc/quads/texture_draw_quad.h" #include "cc/quads/tile_draw_quad.h" #include "cc/quads/yuv_video_draw_quad.h" +#include "cc/resources/picture_pile_impl.h" #include "cc/test/geometry_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperations.h" @@ -657,6 +659,50 @@ TEST(DrawQuadTest, CopyYUVVideoDrawQuad) { EXPECT_EQ(v_plane.format, copy_quad->v_plane.format); } +TEST(DrawQuadTest, CopyPictureDrawQuad) { + gfx::Rect opaque_rect(33, 44, 22, 33); + 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; + gfx::Rect content_rect(30, 40, 20, 30); + float contents_scale = 3.141592f; + scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create(false); + CREATE_SHARED_STATE(); + + CREATE_QUAD_7_NEW(PictureDrawQuad, + opaque_rect, + tex_coord_rect, + texture_size, + swizzle_contents, + content_rect, + contents_scale, + picture_pile); + EXPECT_EQ(DrawQuad::PICTURE_CONTENT, copy_quad->material); + EXPECT_RECT_EQ(opaque_rect, copy_quad->opaque_rect); + 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_RECT_EQ(content_rect, copy_quad->content_rect); + EXPECT_EQ(contents_scale, copy_quad->contents_scale); + EXPECT_EQ(picture_pile, copy_quad->picture_pile); + + CREATE_QUAD_6_ALL(PictureDrawQuad, + tex_coord_rect, + texture_size, + swizzle_contents, + content_rect, + contents_scale, + picture_pile); + 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(swizzle_contents, copy_quad->swizzle_contents); + EXPECT_RECT_EQ(content_rect, copy_quad->content_rect); + EXPECT_EQ(contents_scale, copy_quad->contents_scale); + EXPECT_EQ(picture_pile, copy_quad->picture_pile); +} + class DrawQuadIteratorTest : public testing::Test { protected: ResourceProvider::ResourceId IncrementResourceId( @@ -826,5 +872,27 @@ TEST_F(DrawQuadIteratorTest, YUVVideoDrawQuad) { EXPECT_EQ(v_plane.resource_id + 1, quad_new->v_plane.resource_id); } +TEST_F(DrawQuadIteratorTest, PictureDrawQuad) { + gfx::Rect opaque_rect(33, 44, 22, 33); + 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; + gfx::Rect content_rect(30, 40, 20, 30); + float contents_scale = 3.141592f; + scoped_refptr<PicturePileImpl> picture_pile = PicturePileImpl::Create(false); + + CREATE_SHARED_STATE(); + CREATE_QUAD_7_NEW(PictureDrawQuad, + opaque_rect, + tex_coord_rect, + texture_size, + swizzle_contents, + content_rect, + contents_scale, + picture_pile); + EXPECT_EQ(0, IterateAndCount(quad_new.get())); +} + } // namespace } // namespace cc diff --git a/cc/quads/picture_draw_quad.cc b/cc/quads/picture_draw_quad.cc new file mode 100644 index 0000000..8fda699 --- /dev/null +++ b/cc/quads/picture_draw_quad.cc @@ -0,0 +1,67 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/quads/picture_draw_quad.h" + +namespace cc { + +PictureDrawQuad::PictureDrawQuad() { +} + +PictureDrawQuad::~PictureDrawQuad() { +} + +scoped_ptr<PictureDrawQuad> PictureDrawQuad::Create() { + return make_scoped_ptr(new PictureDrawQuad); +} + +void PictureDrawQuad::SetNew(const SharedQuadState* shared_quad_state, + gfx::Rect rect, + gfx::Rect opaque_rect, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents, + 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, + swizzle_contents); + this->content_rect = content_rect; + this->contents_scale = contents_scale; + this->picture_pile = picture_pile; +} + +void PictureDrawQuad::SetAll(const SharedQuadState* shared_quad_state, + gfx::Rect rect, + gfx::Rect opaque_rect, + gfx::Rect visible_rect, + bool needs_blending, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents, + gfx::Rect content_rect, + float contents_scale, + scoped_refptr<PicturePileImpl> picture_pile) { + ContentDrawQuadBase::SetAll(shared_quad_state, + DrawQuad::PICTURE_CONTENT, rect, opaque_rect, + visible_rect, needs_blending, tex_coord_rect, + texture_size, swizzle_contents); + this->content_rect = content_rect; + this->contents_scale = contents_scale; + this->picture_pile = picture_pile; +} + +void PictureDrawQuad::IterateResources( + const ResourceIteratorCallback& callback) { + // TODO(danakj): Convert to TextureDrawQuad? + NOTIMPLEMENTED(); +} + +const PictureDrawQuad* PictureDrawQuad::MaterialCast(const DrawQuad* quad) { + DCHECK(quad->material == DrawQuad::PICTURE_CONTENT); + return static_cast<const PictureDrawQuad*>(quad); +} + +} // namespace cc diff --git a/cc/quads/picture_draw_quad.h b/cc/quads/picture_draw_quad.h new file mode 100644 index 0000000..847c4f8a --- /dev/null +++ b/cc/quads/picture_draw_quad.h @@ -0,0 +1,62 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_QUADS_PICTURE_DRAW_QUAD_H_ +#define CC_QUADS_PICTURE_DRAW_QUAD_H_ + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "cc/base/cc_export.h" +#include "cc/quads/content_draw_quad_base.h" +#include "cc/resources/picture_pile_impl.h" +#include "ui/gfx/rect.h" +#include "ui/gfx/rect_f.h" +#include "ui/gfx/size.h" + +namespace cc { + +// Used for on-demand tile rasterization. +class CC_EXPORT PictureDrawQuad : public ContentDrawQuadBase { + public: + static scoped_ptr<PictureDrawQuad> Create(); + virtual ~PictureDrawQuad(); + + void SetNew(const SharedQuadState* shared_quad_state, + gfx::Rect rect, + gfx::Rect opaque_rect, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents, + gfx::Rect content_rect, + float contents_scale, + scoped_refptr<PicturePileImpl> picture_pile); + + void SetAll(const SharedQuadState* shared_quad_state, + gfx::Rect rect, + gfx::Rect opaque_rect, + gfx::Rect visible_rect, + bool needs_blending, + const gfx::RectF& tex_coord_rect, + gfx::Size texture_size, + bool swizzle_contents, + gfx::Rect content_rect, + float contents_scale, + scoped_refptr<PicturePileImpl> picture_pile); + + gfx::Rect content_rect; + float contents_scale; + scoped_refptr<PicturePileImpl> picture_pile; + + virtual void IterateResources(const ResourceIteratorCallback& callback) + OVERRIDE; + + static const PictureDrawQuad* MaterialCast(const DrawQuad* quad); + + private: + PictureDrawQuad(); +}; + +} + +#endif // CC_QUADS_PICTURE_DRAW_QUAD_H_ diff --git a/cc/quads/tile_draw_quad.cc b/cc/quads/tile_draw_quad.cc index 80ea6bd..414b320 100644 --- a/cc/quads/tile_draw_quad.cc +++ b/cc/quads/tile_draw_quad.cc @@ -10,8 +10,10 @@ namespace cc { TileDrawQuad::TileDrawQuad() - : resource_id(0), - swizzle_contents(false) { + : resource_id(0) { +} + +TileDrawQuad::~TileDrawQuad() { } scoped_ptr<TileDrawQuad> TileDrawQuad::Create() { @@ -25,14 +27,10 @@ void TileDrawQuad::SetNew(const SharedQuadState* shared_quad_state, const gfx::RectF& tex_coord_rect, gfx::Size texture_size, bool swizzle_contents) { - gfx::Rect visible_rect = rect; - bool needs_blending = false; - DrawQuad::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect, - opaque_rect, visible_rect, needs_blending); + ContentDrawQuadBase::SetNew(shared_quad_state, DrawQuad::TILED_CONTENT, rect, + opaque_rect, tex_coord_rect, texture_size, + swizzle_contents); this->resource_id = resource_id; - this->tex_coord_rect = tex_coord_rect; - this->texture_size = texture_size; - this->swizzle_contents = swizzle_contents; } void TileDrawQuad::SetAll(const SharedQuadState* shared_quad_state, @@ -44,12 +42,10 @@ void TileDrawQuad::SetAll(const SharedQuadState* shared_quad_state, const gfx::RectF& tex_coord_rect, gfx::Size texture_size, bool swizzle_contents) { - DrawQuad::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect, - opaque_rect, visible_rect, needs_blending); + ContentDrawQuadBase::SetAll(shared_quad_state, DrawQuad::TILED_CONTENT, rect, + opaque_rect, visible_rect, needs_blending, + tex_coord_rect, texture_size, swizzle_contents); this->resource_id = resource_id; - this->tex_coord_rect = tex_coord_rect; - this->texture_size = texture_size; - this->swizzle_contents = swizzle_contents; } void TileDrawQuad::IterateResources( @@ -57,8 +53,7 @@ void TileDrawQuad::IterateResources( resource_id = callback.Run(resource_id); } -const TileDrawQuad* TileDrawQuad::MaterialCast( - const DrawQuad* quad) { +const TileDrawQuad* TileDrawQuad::MaterialCast(const DrawQuad* quad) { DCHECK(quad->material == DrawQuad::TILED_CONTENT); return static_cast<const TileDrawQuad*>(quad); } diff --git a/cc/quads/tile_draw_quad.h b/cc/quads/tile_draw_quad.h index e39a281..25957f6 100644 --- a/cc/quads/tile_draw_quad.h +++ b/cc/quads/tile_draw_quad.h @@ -5,18 +5,14 @@ #ifndef CC_QUADS_TILE_DRAW_QUAD_H_ #define CC_QUADS_TILE_DRAW_QUAD_H_ -#include "base/memory/scoped_ptr.h" -#include "cc/base/cc_export.h" -#include "cc/quads/draw_quad.h" -#include "third_party/khronos/GLES2/gl2.h" -#include "ui/gfx/point.h" -#include "ui/gfx/size.h" +#include "cc/quads/content_draw_quad_base.h" namespace cc { -class CC_EXPORT TileDrawQuad : public DrawQuad { +class CC_EXPORT TileDrawQuad : public ContentDrawQuadBase { public: static scoped_ptr<TileDrawQuad> Create(); + virtual ~TileDrawQuad(); void SetNew(const SharedQuadState* shared_quad_state, gfx::Rect rect, @@ -37,9 +33,6 @@ class CC_EXPORT TileDrawQuad : public DrawQuad { bool swizzle_contents); unsigned resource_id; - gfx::RectF tex_coord_rect; - gfx::Size texture_size; - bool swizzle_contents; virtual void IterateResources(const ResourceIteratorCallback& callback) OVERRIDE; diff --git a/cc/resources/managed_tile_state.cc b/cc/resources/managed_tile_state.cc index f428f95..5a4c112 100644 --- a/cc/resources/managed_tile_state.cc +++ b/cc/resources/managed_tile_state.cc @@ -26,7 +26,7 @@ ManagedTileState::ManagedTileState() } ManagedTileState::DrawingInfo::DrawingInfo() - : mode_(TEXTURE_MODE), + : mode_(RESOURCE_MODE), resource_is_being_initialized_(false), can_be_freed_(true), contents_swizzled_(false) { @@ -37,7 +37,7 @@ ManagedTileState::DrawingInfo::~DrawingInfo() { bool ManagedTileState::DrawingInfo::IsReadyToDraw() const { switch (mode_) { - case TEXTURE_MODE: + case RESOURCE_MODE: return resource_ && !resource_is_being_initialized_ && resource_->id(); diff --git a/cc/resources/managed_tile_state.h b/cc/resources/managed_tile_state.h index 3452da7..1b735dd 100644 --- a/cc/resources/managed_tile_state.h +++ b/cc/resources/managed_tile_state.h @@ -21,7 +21,7 @@ class CC_EXPORT ManagedTileState { class CC_EXPORT DrawingInfo { public: enum Mode { - TEXTURE_MODE, + RESOURCE_MODE, SOLID_COLOR_MODE, TRANSPARENT_MODE, PICTURE_PILE_MODE, @@ -38,7 +38,7 @@ class CC_EXPORT ManagedTileState { bool IsReadyToDraw() const; ResourceProvider::ResourceId get_resource_id() const { - DCHECK(mode_ == TEXTURE_MODE); + DCHECK(mode_ == RESOURCE_MODE); DCHECK(resource_); DCHECK(!resource_is_being_initialized_); return resource_->id(); @@ -55,7 +55,7 @@ class CC_EXPORT ManagedTileState { } bool requires_resource() const { - return mode_ == TEXTURE_MODE || + return mode_ == RESOURCE_MODE || mode_ == PICTURE_PILE_MODE; } @@ -67,6 +67,10 @@ class CC_EXPORT ManagedTileState { friend class TileManager; friend class ManagedTileState; + void set_use_resource() { + mode_ = RESOURCE_MODE; + } + void set_transparent() { mode_ = TRANSPARENT_MODE; } @@ -76,6 +80,14 @@ class CC_EXPORT ManagedTileState { solid_color_ = color; } + void set_rasterize_on_demand() { + mode_ = PICTURE_PILE_MODE; + } + + void set_contents_swizzled(bool contents_swizzled) { + contents_swizzled_ = contents_swizzled; + } + Mode mode_; SkColor solid_color_; diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc index 3b569ec..c1e525d 100644 --- a/cc/resources/tile_manager.cc +++ b/cc/resources/tile_manager.cc @@ -593,8 +593,12 @@ void TileManager::AssignGpuMemoryToTiles() { mts.bin[LOW_PRIORITY_BIN] == NOW_BIN) bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; FreeResourcesForTile(tile); + tile->drawing_info().set_rasterize_on_demand(); + tile->drawing_info().set_contents_swizzled( + !PlatformColor::SameComponentOrder(tile->format_)); continue; } + tile->drawing_info().set_use_resource(); bytes_left -= tile_bytes; mts.can_use_gpu_memory = true; if (!tile->drawing_info().resource_ && diff --git a/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc b/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc new file mode 100644 index 0000000..18efae3 --- /dev/null +++ b/cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc @@ -0,0 +1,107 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/layers/append_quads_data.h" +#include "cc/layers/content_layer_client.h" +#include "cc/layers/picture_layer.h" +#include "cc/layers/picture_layer_impl.h" +#include "cc/quads/draw_quad.h" +#include "cc/test/layer_tree_pixel_test.h" +#include "cc/test/mock_quad_culler.h" +#include "cc/trees/layer_tree_impl.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/rect.h" +#include "ui/gfx/rect_f.h" + +#if !defined(OS_ANDROID) + +namespace cc { +namespace { + +class LayerTreeHostOnDemandRasterPixelTest : public LayerTreePixelTest { + public: + virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { + settings->impl_side_painting = true; + } + + virtual void BeginCommitOnThread(LayerTreeHostImpl* impl) OVERRIDE { + // Not enough memory available. Enforce on-demand rasterization. + impl->SetManagedMemoryPolicy( + ManagedMemoryPolicy(1, ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, + 1, ManagedMemoryPolicy::CUTOFF_ALLOW_NOTHING)); + } + + virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool result) OVERRIDE { + // Find the PictureLayerImpl ask it to append quads to check their material. + // The PictureLayerImpl is assumed to be the first child of the root layer + // in the active tree. + PictureLayerImpl* picture_layer = static_cast<PictureLayerImpl*>( + host_impl->active_tree()->root_layer()->child_at(0)); + + QuadList quads; + SharedQuadStateList shared_states; + MockQuadCuller quad_culler(&quads, &shared_states); + + AppendQuadsData data; + picture_layer->AppendQuads(&quad_culler, &data); + + for (size_t i = 0; i < quads.size(); ++i) + EXPECT_EQ(quads[i]->material, DrawQuad::PICTURE_CONTENT); + + // Triggers pixel readback and ends the test. + LayerTreePixelTest::SwapBuffersOnThread(host_impl, result); + } +}; + +class BlueYellowLayerClient : public ContentLayerClient { + public: + BlueYellowLayerClient(gfx::Rect layer_rect) : layer_rect_(layer_rect) { } + + virtual void DidChangeLayerCanUseLCDText() OVERRIDE { } + + virtual void PaintContents(SkCanvas* canvas, + gfx::Rect clip, + gfx::RectF* opaque) OVERRIDE { + *opaque = gfx::RectF(layer_rect_.width(), layer_rect_.height()); + + SkPaint paint; + paint.setColor(SK_ColorBLUE); + canvas->drawRect(SkRect::MakeWH(layer_rect_.width() / 2, + layer_rect_.height()), + paint); + + paint.setColor(SK_ColorYELLOW); + canvas->drawRect( + SkRect::MakeXYWH(layer_rect_.width() / 2, + 0, + layer_rect_.width() / 2, + layer_rect_.height()), + paint); + } + + private: + gfx::Rect layer_rect_; +}; + +TEST_F(LayerTreeHostOnDemandRasterPixelTest, RasterPictureLayer) { + // Use multiple colors in a single layer to prevent bypassing on-demand + // rasterization if a single solid color is detected in picture analysis. + gfx::Rect layer_rect(200, 200); + BlueYellowLayerClient client(layer_rect); + scoped_refptr<PictureLayer> layer = PictureLayer::Create(&client); + + layer->SetIsDrawable(true); + layer->SetAnchorPoint(gfx::PointF()); + layer->SetBounds(layer_rect.size()); + layer->SetPosition(layer_rect.origin()); + + RunPixelTest(layer, base::FilePath(FILE_PATH_LITERAL("blue_yellow.png"))); +} + +} // namespace +} // namespace cc + +#endif // OS_ANDROID diff --git a/content/common/cc_messages.cc b/content/common/cc_messages.cc index 5ec8ae8..fbd9fe0 100644 --- a/content/common/cc_messages.cc +++ b/content/common/cc_messages.cc @@ -320,6 +320,9 @@ void ParamTraits<cc::RenderPass>::Write( case cc::DrawQuad::IO_SURFACE_CONTENT: WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(quad)); break; + case cc::DrawQuad::PICTURE_CONTENT: + NOTREACHED(); + break; case cc::DrawQuad::TEXTURE_CONTENT: WriteParam(m, *cc::TextureDrawQuad::MaterialCast(quad)); break; @@ -434,6 +437,9 @@ bool ParamTraits<cc::RenderPass>::Read( case cc::DrawQuad::IO_SURFACE_CONTENT: draw_quad = ReadDrawQuad<cc::IOSurfaceDrawQuad>(m, iter); break; + case cc::DrawQuad::PICTURE_CONTENT: + NOTREACHED(); + return false; case cc::DrawQuad::TEXTURE_CONTENT: draw_quad = ReadDrawQuad<cc::TextureDrawQuad>(m, iter); break; @@ -513,6 +519,9 @@ void ParamTraits<cc::RenderPass>::Log( case cc::DrawQuad::IO_SURFACE_CONTENT: LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad), l); break; + case cc::DrawQuad::PICTURE_CONTENT: + NOTREACHED(); + break; case cc::DrawQuad::TEXTURE_CONTENT: LogParam(*cc::TextureDrawQuad::MaterialCast(quad), l); break; diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h index ed54bf1..33a5fcb 100644 --- a/content/common/cc_messages.h +++ b/content/common/cc_messages.h @@ -11,6 +11,7 @@ #include "cc/quads/debug_border_draw_quad.h" #include "cc/quads/draw_quad.h" #include "cc/quads/io_surface_draw_quad.h" +#include "cc/quads/picture_draw_quad.h" #include "cc/quads/render_pass.h" #include "cc/quads/render_pass_draw_quad.h" #include "cc/quads/shared_quad_state.h" diff --git a/content/common/cc_messages_unittest.cc b/content/common/cc_messages_unittest.cc index d843e4b..c665467 100644 --- a/content/common/cc_messages_unittest.cc +++ b/content/common/cc_messages_unittest.cc @@ -15,6 +15,7 @@ using cc::DelegatedFrameData; using cc::DebugBorderDrawQuad; using cc::DrawQuad; using cc::IOSurfaceDrawQuad; +using cc::PictureDrawQuad; using cc::RenderPass; using cc::RenderPassDrawQuad; using cc::ResourceProvider; @@ -77,6 +78,10 @@ class CCMessagesTest : public testing::Test { Compare(IOSurfaceDrawQuad::MaterialCast(a), IOSurfaceDrawQuad::MaterialCast(b)); break; + case DrawQuad::PICTURE_CONTENT: + Compare(PictureDrawQuad::MaterialCast(a), + PictureDrawQuad::MaterialCast(b)); + break; case DrawQuad::RENDER_PASS: Compare(RenderPassDrawQuad::MaterialCast(a), RenderPassDrawQuad::MaterialCast(b)); |