Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1727)

Unified Diff: cc/layer_tree_host_unittest.cc

Issue 11464041: cc: Don't use partial updates for scrollbars when they are not allowed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | cc/scrollbar_layer.h » ('j') | cc/scrollbar_layer.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/layer_tree_host_unittest.cc
diff --git a/cc/layer_tree_host_unittest.cc b/cc/layer_tree_host_unittest.cc
index b8d79d9cf42289d77aa64fdbe7401c96fc173fa7..9e9d8588f5d239561b2e660d4099b4829016e82b 100644
--- a/cc/layer_tree_host_unittest.cc
+++ b/cc/layer_tree_host_unittest.cc
@@ -11,11 +11,15 @@
#include "cc/layer_tree_host_impl.h"
#include "cc/layer_tree_impl.h"
#include "cc/output_surface.h"
+#include "cc/scrollbar_layer.h"
#include "cc/single_thread_proxy.h"
#include "cc/test/fake_content_layer_client.h"
#include "cc/test/fake_layer_tree_host_client.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_proxy.h"
+#include "cc/test/fake_scrollbar_theme_painter.h"
+#include "cc/test/fake_web_scrollbar.h"
+#include "cc/test/fake_web_scrollbar_theme_geometry.h"
#include "cc/test/geometry_test_utils.h"
#include "cc/test/layer_tree_test_common.h"
#include "cc/test/occlusion_tracker_test_common.h"
@@ -1172,6 +1176,42 @@ private:
int m_paintContentsCount;
};
+class ScrollbarLayerWithUpdateTracking : public ScrollbarLayer {
+public:
+ static scoped_refptr<ScrollbarLayerWithUpdateTracking> create(int scrollLayerId, bool paintContentsDuringUpdate)
+ {
+ return make_scoped_refptr(new ScrollbarLayerWithUpdateTracking(scrollLayerId, paintContentsDuringUpdate));
+ }
+
+ int updateCount() { return m_updateCount; }
+ void resetUpdateCount() { m_updateCount = 0; }
+
+ virtual void update(ResourceUpdateQueue& queue, const OcclusionTracker* occlusion, RenderingStats& stats) OVERRIDE
+ {
+ ScrollbarLayer::update(queue, occlusion, stats);
+ m_updateCount++;
+ }
+
+private:
+ explicit ScrollbarLayerWithUpdateTracking(int scrollLayerId, bool paintContentsDuringUpdate)
+ : ScrollbarLayer(
+ FakeWebScrollbar::create().PassAs<WebKit::WebScrollbar>(),
+ FakeScrollbarThemePainter::Create(paintContentsDuringUpdate).PassAs<ScrollbarThemePainter>(),
+ FakeWebScrollbarThemeGeometry::create().PassAs<WebKit::WebScrollbarThemeGeometry>(),
+ scrollLayerId)
+ , m_updateCount(0)
+ {
+ setAnchorPoint(gfx::PointF(0, 0));
+ setBounds(gfx::Size(10, 10));
+ setIsDrawable(true);
+ }
+ virtual ~ScrollbarLayerWithUpdateTracking()
+ {
+ }
+
+ int m_updateCount;
+};
+
// Layer opacity change during paint should not prevent compositor resources from being updated during commit.
class LayerTreeHostTestOpacityChange : public LayerTreeHostTest {
public:
@@ -1398,6 +1438,7 @@ class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest {
public:
LayerTreeHostTestAtomicCommit()
: m_layer(ContentLayerWithUpdateTracking::create(&m_client))
+ , m_scrollbar(ScrollbarLayerWithUpdateTracking::create(m_layer->id(), true))
{
// Make sure partial texture updates are turned off.
m_settings.maxPartialTextureUpdates = 0;
@@ -1405,6 +1446,7 @@ public:
virtual void beginTest() OVERRIDE
{
+ m_layer->addChild(m_scrollbar);
m_layerTreeHost->setRootLayer(m_layer);
m_layerTreeHost->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
@@ -1421,25 +1463,28 @@ public:
switch (impl->activeTree()->source_frame_number()) {
case 0:
- // Number of textures should be one.
- ASSERT_EQ(1, context->numTextures());
- // Number of textures used for commit should be one.
- EXPECT_EQ(1, context->numUsedTextures());
+ // Number of textures should be one for each layer
+ ASSERT_EQ(2, context->numTextures());
+ // Number of textures used for commit should be one for each layer.
+ EXPECT_EQ(2, context->numUsedTextures());
// Verify that used texture is correct.
EXPECT_TRUE(context->usedTexture(context->texture(0)));
+ EXPECT_TRUE(context->usedTexture(context->texture(1)));
context->resetUsedTextures();
break;
case 1:
- // Number of textures should be two as the first texture
- // is used by impl thread and cannot by used for update.
- ASSERT_EQ(2, context->numTextures());
- // Number of textures used for commit should still be one.
- EXPECT_EQ(1, context->numUsedTextures());
- // First texture should not have been used.
+ // Number of textures should be doubled as the first textures
+ // are used by impl thread and cannot by used for update.
+ ASSERT_EQ(4, context->numTextures());
+ // Number of textures used for commit should still be one for each layer.
+ EXPECT_EQ(2, context->numUsedTextures());
+ // First textures should not have been used.
EXPECT_FALSE(context->usedTexture(context->texture(0)));
- // New texture should have been used.
- EXPECT_TRUE(context->usedTexture(context->texture(1)));
+ EXPECT_FALSE(context->usedTexture(context->texture(1)));
+ // New textures should have been used.
+ EXPECT_TRUE(context->usedTexture(context->texture(2)));
+ EXPECT_TRUE(context->usedTexture(context->texture(3)));
context->resetUsedTextures();
break;
@@ -1453,8 +1498,8 @@ public:
{
CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->outputSurface()->Context3D());
- // Number of textures used for draw should always be one.
- EXPECT_EQ(1, context->numUsedTextures());
+ // Number of textures used for draw should always be one for each layer.
+ EXPECT_EQ(2, context->numUsedTextures());
if (impl->activeTree()->source_frame_number() < 1) {
context->resetUsedTextures();
@@ -1467,6 +1512,7 @@ public:
virtual void layout() OVERRIDE
{
m_layer->setNeedsDisplay();
+ m_scrollbar->setNeedsDisplay();
}
virtual void afterTest() OVERRIDE
@@ -1476,6 +1522,7 @@ public:
private:
FakeContentLayerClient m_client;
scoped_refptr<ContentLayerWithUpdateTracking> m_layer;
+ scoped_refptr<ScrollbarLayerWithUpdateTracking> m_scrollbar;
};
TEST_F(LayerTreeHostTestAtomicCommit, runMultiThread)
@@ -1500,6 +1547,8 @@ public:
LayerTreeHostTestAtomicCommitWithPartialUpdate()
: m_parent(ContentLayerWithUpdateTracking::create(&m_client))
, m_child(ContentLayerWithUpdateTracking::create(&m_client))
+ , m_scrollbarWithPaints(ScrollbarLayerWithUpdateTracking::create(m_parent->id(), true))
+ , m_scrollbarWithoutPaints(ScrollbarLayerWithUpdateTracking::create(m_parent->id(), false))
, m_numCommits(0)
{
// Allow one partial texture update.
@@ -1514,6 +1563,8 @@ public:
gfx::Transform identityMatrix;
setLayerPropertiesForTesting(m_parent.get(), 0, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 20), true);
setLayerPropertiesForTesting(m_child.get(), m_parent.get(), identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 10), gfx::Size(10, 10), false);
+ setLayerPropertiesForTesting(m_scrollbarWithPaints.get(), m_parent.get(), identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 10), gfx::Size(10, 10), false);
+ setLayerPropertiesForTesting(m_scrollbarWithoutPaints.get(), m_parent.get(), identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 10), gfx::Size(10, 10), false);
ASSERT_TRUE(m_layerTreeHost->initializeRendererIfNeeded());
ResourceUpdateQueue queue;
@@ -1528,31 +1579,54 @@ public:
switch (impl->activeTree()->source_frame_number()) {
case 0:
- // Number of textures should be two.
- ASSERT_EQ(2, context->numTextures());
- // Number of textures used for commit should be two.
- EXPECT_EQ(2, context->numUsedTextures());
+ // Number of textures should be one for each layer.
+ ASSERT_EQ(4, context->numTextures());
+ // Number of textures used for commit should be one for each layer.
+ EXPECT_EQ(4, context->numUsedTextures());
// Verify that used textures are correct.
EXPECT_TRUE(context->usedTexture(context->texture(0)));
EXPECT_TRUE(context->usedTexture(context->texture(1)));
+ EXPECT_TRUE(context->usedTexture(context->texture(2)));
+ EXPECT_TRUE(context->usedTexture(context->texture(3)));
context->resetUsedTextures();
break;
case 1:
- // Number of textures used for commit should still be two.
- EXPECT_EQ(2, context->numUsedTextures());
- // First two textures should not have been used.
+ // Number of textures should be two for each content layer and one
+ // for each scrollbar, since they always do a partial update.
+ ASSERT_EQ(6, context->numTextures());
+ // Number of textures used for commit should be one for each content
+ // layer, and one for the scrollbar layer that paints.
+ EXPECT_EQ(3, context->numUsedTextures());
+
+ // First content textures should not have been used.
EXPECT_FALSE(context->usedTexture(context->texture(0)));
EXPECT_FALSE(context->usedTexture(context->texture(1)));
- // New textures should have been used.
- EXPECT_TRUE(context->usedTexture(context->texture(2)));
+ // The non-painting scrollbar's texture wasn't updated.
+ EXPECT_FALSE(context->usedTexture(context->texture(2)));
+ // The painting scrollbar's partial update texture was used.
EXPECT_TRUE(context->usedTexture(context->texture(3)));
+ // New textures should have been used.
+ EXPECT_TRUE(context->usedTexture(context->texture(4)));
+ EXPECT_TRUE(context->usedTexture(context->texture(5)));
context->resetUsedTextures();
break;
case 2:
- // Number of textures used for commit should still be two.
- EXPECT_EQ(2, context->numUsedTextures());
+ // Number of textures should be two for each content layer and one
+ // for each scrollbar, since they always do a partial update.
+ ASSERT_EQ(6, context->numTextures());
+ // Number of textures used for commit should be one for each content
+ // layer, and one for the scrollbar layer that paints.
+ EXPECT_EQ(3, context->numUsedTextures());
+
+ // The non-painting scrollbar's texture wasn't updated.
+ EXPECT_FALSE(context->usedTexture(context->texture(2)));
+ // The painting scrollbar does a partial update.
+ EXPECT_TRUE(context->usedTexture(context->texture(3)));
+ // One content layer does a partial update also.
+ EXPECT_TRUE(context->usedTexture(context->texture(4)));
+ EXPECT_FALSE(context->usedTexture(context->texture(5)));
context->resetUsedTextures();
break;
@@ -1563,8 +1637,10 @@ public:
context->resetUsedTextures();
break;
case 4:
- // Number of textures used for commit should be one.
- EXPECT_EQ(1, context->numUsedTextures());
+ // Number of textures used for commit should be two. One for the
+ // content layer, and one for the painting scrollbar. The
+ // non-painting scrollbar doesn't update its texture.
+ EXPECT_EQ(2, context->numUsedTextures());
context->resetUsedTextures();
break;
@@ -1578,12 +1654,12 @@ public:
{
CompositorFakeWebGraphicsContext3DWithTextureTracking* context = static_cast<CompositorFakeWebGraphicsContext3DWithTextureTracking*>(impl->outputSurface()->Context3D());
- // Number of textures used for drawing should two except for frame 4
- // where the viewport only contains one layer.
+ // Number of textures used for drawing should one per layer except for
+ // frame 3 where the viewport only contains one layer.
if (impl->activeTree()->source_frame_number() == 3)
EXPECT_EQ(1, context->numUsedTextures());
else
- EXPECT_EQ(2, context->numUsedTextures());
+ EXPECT_EQ(4, context->numUsedTextures());
if (impl->activeTree()->source_frame_number() < 4) {
context->resetUsedTextures();
@@ -1600,14 +1676,20 @@ public:
case 1:
m_parent->setNeedsDisplay();
m_child->setNeedsDisplay();
+ m_scrollbarWithPaints->setNeedsDisplay();
+ m_scrollbarWithoutPaints->setNeedsDisplay();
break;
case 2:
// Damage part of layers.
m_parent->setNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
m_child->setNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
+ m_scrollbarWithPaints->setNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
+ m_scrollbarWithoutPaints->setNeedsDisplayRect(gfx::RectF(0, 0, 5, 5));
break;
case 3:
m_child->setNeedsDisplay();
+ m_scrollbarWithPaints->setNeedsDisplay();
+ m_scrollbarWithoutPaints->setNeedsDisplay();
m_layerTreeHost->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
break;
case 4:
@@ -1627,6 +1709,8 @@ private:
FakeContentLayerClient m_client;
scoped_refptr<ContentLayerWithUpdateTracking> m_parent;
scoped_refptr<ContentLayerWithUpdateTracking> m_child;
+ scoped_refptr<ScrollbarLayerWithUpdateTracking> m_scrollbarWithPaints;
+ scoped_refptr<ScrollbarLayerWithUpdateTracking> m_scrollbarWithoutPaints;
int m_numCommits;
};
« no previous file with comments | « no previous file | cc/scrollbar_layer.h » ('j') | cc/scrollbar_layer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698