summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cc/cc.gyp4
-rw-r--r--cc/cc_tests.gyp1
-rw-r--r--cc/debug/debug_colors.cc4
-rw-r--r--cc/debug/debug_colors.h3
-rw-r--r--cc/layers/picture_layer_impl.cc34
-rw-r--r--cc/output/gl_renderer.cc53
-rw-r--r--cc/output/gl_renderer.h9
-rw-r--r--cc/quads/content_draw_quad_base.cc50
-rw-r--r--cc/quads/content_draw_quad_base.h48
-rw-r--r--cc/quads/draw_quad.cc4
-rw-r--r--cc/quads/draw_quad.h1
-rw-r--r--cc/quads/draw_quad_unittest.cc68
-rw-r--r--cc/quads/picture_draw_quad.cc67
-rw-r--r--cc/quads/picture_draw_quad.h62
-rw-r--r--cc/quads/tile_draw_quad.cc27
-rw-r--r--cc/quads/tile_draw_quad.h13
-rw-r--r--cc/resources/managed_tile_state.cc4
-rw-r--r--cc/resources/managed_tile_state.h18
-rw-r--r--cc/resources/tile_manager.cc4
-rw-r--r--cc/trees/layer_tree_host_pixeltest_on_demand_raster.cc107
-rw-r--r--content/common/cc_messages.cc9
-rw-r--r--content/common/cc_messages.h1
-rw-r--r--content/common/cc_messages_unittest.cc5
23 files changed, 556 insertions, 40 deletions
diff --git a/cc/cc.gyp b/cc/cc.gyp
index e2910c5..296f1bc 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -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));