| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/tiled_layer.h" | 5 #include "cc/tiled_layer.h" |
| 6 | 6 |
| 7 #include "cc/bitmap_content_layer_updater.h" | 7 #include "cc/bitmap_content_layer_updater.h" |
| 8 #include "cc/layer_painter.h" | 8 #include "cc/layer_painter.h" |
| 9 #include "cc/overdraw_metrics.h" | 9 #include "cc/overdraw_metrics.h" |
| 10 #include "cc/rendering_stats.h" | 10 #include "cc/rendering_stats.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 namespace cc { | 24 namespace cc { |
| 25 namespace { | 25 namespace { |
| 26 | 26 |
| 27 class TestOcclusionTracker : public OcclusionTracker { | 27 class TestOcclusionTracker : public OcclusionTracker { |
| 28 public: | 28 public: |
| 29 TestOcclusionTracker() | 29 TestOcclusionTracker() |
| 30 : OcclusionTracker(gfx::Rect(0, 0, 1000, 1000), true) | 30 : OcclusionTracker(gfx::Rect(0, 0, 1000, 1000), true) |
| 31 , m_layerClipRectInTarget(gfx::Rect(0, 0, 1000, 1000)) | 31 , m_layerClipRectInTarget(gfx::Rect(0, 0, 1000, 1000)) |
| 32 { | 32 { |
| 33 // Pretend we have visited a render surface. | |
| 34 m_stack.push_back(StackObject()); | 33 m_stack.push_back(StackObject()); |
| 35 } | 34 } |
| 36 | 35 |
| 37 void setOcclusion(const Region& occlusion) { m_stack.back().occlusionInTarge
t = occlusion; } | 36 void setRenderTarget(Layer* renderTarget) |
| 37 { |
| 38 m_stack.back().target = renderTarget; |
| 39 } |
| 40 |
| 41 void setOcclusion(const Region& occlusion) { m_stack.back().occlusionFromIns
ideTarget = occlusion; } |
| 38 | 42 |
| 39 protected: | 43 protected: |
| 40 virtual gfx::Rect layerClipRectInTarget(const Layer* layer) const OVERRIDE {
return m_layerClipRectInTarget; } | 44 virtual gfx::Rect layerClipRectInTarget(const Layer* layer) const OVERRIDE {
return m_layerClipRectInTarget; } |
| 41 | 45 |
| 42 private: | 46 private: |
| 43 gfx::Rect m_layerClipRectInTarget; | 47 gfx::Rect m_layerClipRectInTarget; |
| 44 }; | 48 }; |
| 45 | 49 |
| 46 class TiledLayerTest : public testing::Test { | 50 class TiledLayerTest : public testing::Test { |
| 47 public: | 51 public: |
| 48 TiledLayerTest() | 52 TiledLayerTest() |
| 49 : m_proxy(NULL) | 53 : m_proxy(NULL) |
| 50 , m_outputSurface(createFakeOutputSurface()) | 54 , m_outputSurface(createFakeOutputSurface()) |
| 51 , m_queue(make_scoped_ptr(new ResourceUpdateQueue)) | 55 , m_queue(make_scoped_ptr(new ResourceUpdateQueue)) |
| 52 , m_occlusion(0) | 56 , m_occlusion(0) |
| 53 { | 57 { |
| 54 } | 58 } |
| 55 | 59 |
| 56 virtual void SetUp() | 60 virtual void SetUp() |
| 57 { | 61 { |
| 58 m_layerTreeHost = LayerTreeHost::create(&m_fakeLayerImplTreeHostClient,
m_settings, scoped_ptr<Thread>(NULL)); | 62 m_layerTreeHost = LayerTreeHost::create(&m_fakeLayerImplTreeHostClient,
m_settings, scoped_ptr<Thread>(NULL)); |
| 59 m_proxy = m_layerTreeHost->proxy(); | 63 m_proxy = m_layerTreeHost->proxy(); |
| 60 m_resourceManager = PrioritizedResourceManager::create(m_proxy); | 64 m_resourceManager = PrioritizedResourceManager::create(m_proxy); |
| 61 m_layerTreeHost->initializeRendererIfNeeded(); | 65 m_layerTreeHost->initializeRendererIfNeeded(); |
| 66 m_layerTreeHost->setRootLayer(Layer::create()); |
| 67 |
| 62 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); | 68 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); |
| 63 m_resourceProvider = ResourceProvider::create(m_outputSurface.get()); | 69 m_resourceProvider = ResourceProvider::create(m_outputSurface.get()); |
| 64 m_hostImpl = make_scoped_ptr(new FakeLayerTreeHostImpl(m_proxy)); | 70 m_hostImpl = make_scoped_ptr(new FakeLayerTreeHostImpl(m_proxy)); |
| 65 } | 71 } |
| 66 | 72 |
| 67 virtual ~TiledLayerTest() | 73 virtual ~TiledLayerTest() |
| 68 { | 74 { |
| 69 resourceManagerClearAllMemory(m_resourceManager.get(), m_resourceProvide
r.get()); | 75 resourceManagerClearAllMemory(m_resourceManager.get(), m_resourceProvide
r.get()); |
| 76 |
| 70 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); | 77 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); |
| 71 m_resourceProvider.reset(); | 78 m_resourceProvider.reset(); |
| 72 m_hostImpl.reset(); | 79 m_hostImpl.reset(); |
| 73 } | 80 } |
| 74 | 81 |
| 75 class ScopedFakeTiledLayerImpl { | |
| 76 public: | |
| 77 ScopedFakeTiledLayerImpl(LayerTreeImpl* treeImpl, int id) | |
| 78 { | |
| 79 m_layerImpl = new FakeTiledLayerImpl(treeImpl, id); | |
| 80 } | |
| 81 ~ScopedFakeTiledLayerImpl() | |
| 82 { | |
| 83 delete m_layerImpl; | |
| 84 } | |
| 85 FakeTiledLayerImpl* get() | |
| 86 { | |
| 87 return m_layerImpl; | |
| 88 } | |
| 89 FakeTiledLayerImpl* operator->() | |
| 90 { | |
| 91 return m_layerImpl; | |
| 92 } | |
| 93 private: | |
| 94 FakeTiledLayerImpl* m_layerImpl; | |
| 95 }; | |
| 96 void resourceManagerClearAllMemory(PrioritizedResourceManager* resourceManag
er, ResourceProvider* resourceProvider) | 82 void resourceManagerClearAllMemory(PrioritizedResourceManager* resourceManag
er, ResourceProvider* resourceProvider) |
| 97 { | 83 { |
| 98 { | 84 { |
| 99 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThread
Blocked(m_proxy); | 85 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThread
Blocked(m_proxy); |
| 100 resourceManager->clearAllMemory(resourceProvider); | 86 resourceManager->clearAllMemory(resourceProvider); |
| 101 resourceManager->reduceMemory(resourceProvider); | 87 resourceManager->reduceMemory(resourceProvider); |
| 102 } | 88 } |
| 103 resourceManager->unlinkAndClearEvictedBackings(); | 89 resourceManager->unlinkAndClearEvictedBackings(); |
| 104 } | 90 } |
| 105 void updateTextures() | 91 void updateTextures() |
| (...skipping 14 matching lines...) Expand all Loading... |
| 120 { | 106 { |
| 121 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); | 107 DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
ked(m_proxy); |
| 122 layer->pushPropertiesTo(layerImpl); | 108 layer->pushPropertiesTo(layerImpl); |
| 123 } | 109 } |
| 124 void layerUpdate(FakeTiledLayer* layer, TestOcclusionTracker* occluded) | 110 void layerUpdate(FakeTiledLayer* layer, TestOcclusionTracker* occluded) |
| 125 { | 111 { |
| 126 DebugScopedSetMainThread mainThread(m_proxy); | 112 DebugScopedSetMainThread mainThread(m_proxy); |
| 127 layer->update(*m_queue.get(), occluded, m_stats); | 113 layer->update(*m_queue.get(), occluded, m_stats); |
| 128 } | 114 } |
| 129 | 115 |
| 130 bool updateAndPush(FakeTiledLayer* layer1, | 116 void calcDrawProps(const scoped_refptr<FakeTiledLayer>& layer1) |
| 131 FakeTiledLayerImpl* layerImpl1, | 117 { |
| 132 FakeTiledLayer* layer2 = 0, | 118 scoped_refptr<FakeTiledLayer> layer2; |
| 133 FakeTiledLayerImpl* layerImpl2 = 0) | 119 calcDrawProps(layer1, layer2); |
| 120 } |
| 121 |
| 122 void calcDrawProps(const scoped_refptr<FakeTiledLayer>& layer1, |
| 123 const scoped_refptr<FakeTiledLayer>& layer2) |
| 124 { |
| 125 if (layer1 && !layer1->parent()) |
| 126 m_layerTreeHost->rootLayer()->addChild(layer1); |
| 127 if (layer2 && !layer1->parent()) |
| 128 m_layerTreeHost->rootLayer()->addChild(layer2); |
| 129 if (m_occlusion) |
| 130 m_occlusion->setRenderTarget(m_layerTreeHost->rootLayer()); |
| 131 |
| 132 std::vector<scoped_refptr<Layer> > renderSurfaceLayerList; |
| 133 LayerTreeHostCommon::calculateDrawProperties( |
| 134 m_layerTreeHost->rootLayer(), |
| 135 m_layerTreeHost->deviceViewportSize(), |
| 136 m_layerTreeHost->deviceScaleFactor(), |
| 137 1, // page_scale_factor |
| 138 m_layerTreeHost->rendererCapabilities().maxTextureSize, |
| 139 false, // can_use_lcd_text |
| 140 renderSurfaceLayerList); |
| 141 } |
| 142 |
| 143 bool updateAndPush(const scoped_refptr<FakeTiledLayer>& layer1, |
| 144 const scoped_ptr<FakeTiledLayerImpl>& layerImpl1) |
| 145 { |
| 146 scoped_refptr<FakeTiledLayer> layer2; |
| 147 scoped_ptr<FakeTiledLayerImpl> layerImpl2; |
| 148 return updateAndPush(layer1, layerImpl1, layer2, layerImpl2); |
| 149 } |
| 150 |
| 151 bool updateAndPush(const scoped_refptr<FakeTiledLayer>& layer1, |
| 152 const scoped_ptr<FakeTiledLayerImpl>& layerImpl1, |
| 153 const scoped_refptr<FakeTiledLayer>& layer2, |
| 154 const scoped_ptr<FakeTiledLayerImpl>& layerImpl2) |
| 134 { | 155 { |
| 135 // Get textures | 156 // Get textures |
| 136 m_resourceManager->clearPriorities(); | 157 m_resourceManager->clearPriorities(); |
| 137 if (layer1) | 158 if (layer1) |
| 138 layer1->setTexturePriorities(m_priorityCalculator); | 159 layer1->setTexturePriorities(m_priorityCalculator); |
| 139 if (layer2) | 160 if (layer2) |
| 140 layer2->setTexturePriorities(m_priorityCalculator); | 161 layer2->setTexturePriorities(m_priorityCalculator); |
| 141 m_resourceManager->prioritizeTextures(); | 162 m_resourceManager->prioritizeTextures(); |
| 142 | 163 |
| 143 // Update content | 164 // Update content |
| 144 if (layer1) | 165 if (layer1) |
| 145 layer1->update(*m_queue.get(), m_occlusion, m_stats); | 166 layer1->update(*m_queue.get(), m_occlusion, m_stats); |
| 146 if (layer2) | 167 if (layer2) |
| 147 layer2->update(*m_queue.get(), m_occlusion, m_stats); | 168 layer2->update(*m_queue.get(), m_occlusion, m_stats); |
| 148 | 169 |
| 149 bool needsUpdate = false; | 170 bool needsUpdate = false; |
| 150 if (layer1) | 171 if (layer1) |
| 151 needsUpdate |= layer1->needsIdlePaint(); | 172 needsUpdate |= layer1->needsIdlePaint(); |
| 152 if (layer2) | 173 if (layer2) |
| 153 needsUpdate |= layer2->needsIdlePaint(); | 174 needsUpdate |= layer2->needsIdlePaint(); |
| 154 | 175 |
| 155 // Update textures and push. | 176 // Update textures and push. |
| 156 updateTextures(); | 177 updateTextures(); |
| 157 if (layer1) | 178 if (layer1) |
| 158 layerPushPropertiesTo(layer1, layerImpl1); | 179 layerPushPropertiesTo(layer1.get(), layerImpl1.get()); |
| 159 if (layer2) | 180 if (layer2) |
| 160 layerPushPropertiesTo(layer2, layerImpl2); | 181 layerPushPropertiesTo(layer2.get(), layerImpl2.get()); |
| 161 | 182 |
| 162 return needsUpdate; | 183 return needsUpdate; |
| 163 } | 184 } |
| 164 | 185 |
| 165 public: | 186 public: |
| 166 Proxy* m_proxy; | 187 Proxy* m_proxy; |
| 167 LayerTreeSettings m_settings; | 188 LayerTreeSettings m_settings; |
| 168 scoped_ptr<OutputSurface> m_outputSurface; | 189 scoped_ptr<OutputSurface> m_outputSurface; |
| 169 scoped_ptr<ResourceProvider> m_resourceProvider; | 190 scoped_ptr<ResourceProvider> m_resourceProvider; |
| 170 scoped_ptr<ResourceUpdateQueue> m_queue; | 191 scoped_ptr<ResourceUpdateQueue> m_queue; |
| 171 RenderingStats m_stats; | 192 RenderingStats m_stats; |
| 172 PriorityCalculator m_priorityCalculator; | 193 PriorityCalculator m_priorityCalculator; |
| 173 FakeLayerImplTreeHostClient m_fakeLayerImplTreeHostClient; | 194 FakeLayerImplTreeHostClient m_fakeLayerImplTreeHostClient; |
| 174 scoped_ptr<LayerTreeHost> m_layerTreeHost; | 195 scoped_ptr<LayerTreeHost> m_layerTreeHost; |
| 175 scoped_ptr<FakeLayerTreeHostImpl> m_hostImpl; | 196 scoped_ptr<FakeLayerTreeHostImpl> m_hostImpl; |
| 176 scoped_ptr<PrioritizedResourceManager> m_resourceManager; | 197 scoped_ptr<PrioritizedResourceManager> m_resourceManager; |
| 177 TestOcclusionTracker* m_occlusion; | 198 TestOcclusionTracker* m_occlusion; |
| 178 }; | 199 }; |
| 179 | 200 |
| 180 TEST_F(TiledLayerTest, pushDirtyTiles) | 201 TEST_F(TiledLayerTest, pushDirtyTiles) |
| 181 { | 202 { |
| 182 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 203 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 183 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 204 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 184 | 205 |
| 185 // The tile size is 100x100, so this invalidates and then paints two tiles. | 206 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 186 layer->setBounds(gfx::Size(100, 200)); | 207 layer->setBounds(gfx::Size(100, 200)); |
| 187 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 208 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 188 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); | 209 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); |
| 189 updateAndPush(layer.get(), layerImpl.get()); | 210 updateAndPush(layer, layerImpl); |
| 190 | 211 |
| 191 // We should have both tiles on the impl side. | 212 // We should have both tiles on the impl side. |
| 192 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 213 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 193 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 214 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 194 | 215 |
| 195 // Invalidates both tiles, but then only update one of them. | 216 // Invalidates both tiles, but then only update one of them. |
| 196 layer->setBounds(gfx::Size(100, 200)); | 217 layer->setBounds(gfx::Size(100, 200)); |
| 197 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 218 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 198 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); | 219 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); |
| 199 updateAndPush(layer.get(), layerImpl.get()); | 220 updateAndPush(layer, layerImpl); |
| 200 | 221 |
| 201 // We should only have the first tile since the other tile was invalidated b
ut not painted. | 222 // We should only have the first tile since the other tile was invalidated b
ut not painted. |
| 202 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 223 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 203 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); | 224 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 204 } | 225 } |
| 205 | 226 |
| 206 TEST_F(TiledLayerTest, pushOccludedDirtyTiles) | 227 TEST_F(TiledLayerTest, pushOccludedDirtyTiles) |
| 207 { | 228 { |
| 208 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 229 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 209 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 230 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 210 TestOcclusionTracker occluded; | 231 TestOcclusionTracker occluded; |
| 211 m_occlusion = &occluded; | 232 m_occlusion = &occluded; |
| 212 | 233 |
| 213 // The tile size is 100x100, so this invalidates and then paints two tiles. | 234 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 214 layer->setBounds(gfx::Size(100, 200)); | 235 layer->setBounds(gfx::Size(100, 200)); |
| 215 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 236 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 216 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 100, 200); | 237 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 100, 200); |
| 217 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); | 238 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); |
| 218 updateAndPush(layer.get(), layerImpl.get()); | 239 updateAndPush(layer, layerImpl); |
| 219 | 240 |
| 220 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 241 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 221 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 20000, 1
); | 242 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 20000, 1
); |
| 222 EXPECT_EQ(0, occluded.overdrawMetrics().tilesCulledForUpload()); | 243 EXPECT_EQ(0, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 223 | 244 |
| 224 // We should have both tiles on the impl side. | 245 // We should have both tiles on the impl side. |
| 225 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 246 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 226 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 247 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 227 | 248 |
| 228 // Invalidates part of the top tile... | 249 // Invalidates part of the top tile... |
| 229 layer->invalidateContentRect(gfx::Rect(0, 0, 50, 50)); | 250 layer->invalidateContentRect(gfx::Rect(0, 0, 50, 50)); |
| 230 // ....but the area is occluded. | 251 // ....but the area is occluded. |
| 231 occluded.setOcclusion(gfx::Rect(0, 0, 50, 50)); | 252 occluded.setOcclusion(gfx::Rect(0, 0, 50, 50)); |
| 232 updateAndPush(layer.get(), layerImpl.get()); | 253 updateAndPush(layer, layerImpl); |
| 233 | 254 |
| 234 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 255 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 235 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 20000 +
2500, 1); | 256 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 20000 +
2500, 1); |
| 236 EXPECT_EQ(0, occluded.overdrawMetrics().tilesCulledForUpload()); | 257 EXPECT_EQ(0, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 237 | 258 |
| 238 // We should still have both tiles, as part of the top tile is still unocclu
ded. | 259 // We should still have both tiles, as part of the top tile is still unocclu
ded. |
| 239 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 260 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 240 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 261 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 241 } | 262 } |
| 242 | 263 |
| 243 TEST_F(TiledLayerTest, pushDeletedTiles) | 264 TEST_F(TiledLayerTest, pushDeletedTiles) |
| 244 { | 265 { |
| 245 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 266 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 246 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 267 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 247 | 268 |
| 248 // The tile size is 100x100, so this invalidates and then paints two tiles. | 269 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 249 layer->setBounds(gfx::Size(100, 200)); | 270 layer->setBounds(gfx::Size(100, 200)); |
| 250 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 271 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 251 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); | 272 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 200)); |
| 252 updateAndPush(layer.get(), layerImpl.get()); | 273 updateAndPush(layer, layerImpl); |
| 253 | 274 |
| 254 // We should have both tiles on the impl side. | 275 // We should have both tiles on the impl side. |
| 255 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 276 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 256 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 277 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 257 | 278 |
| 258 m_resourceManager->clearPriorities(); | 279 m_resourceManager->clearPriorities(); |
| 259 resourceManagerClearAllMemory(m_resourceManager.get(), m_resourceProvider.ge
t()); | 280 resourceManagerClearAllMemory(m_resourceManager.get(), m_resourceProvider.ge
t()); |
| 260 m_resourceManager->setMaxMemoryLimitBytes(4*1024*1024); | 281 m_resourceManager->setMaxMemoryLimitBytes(4*1024*1024); |
| 261 | 282 |
| 262 // This should drop the tiles on the impl thread. | 283 // This should drop the tiles on the impl thread. |
| 263 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 284 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 264 | 285 |
| 265 // We should now have no textures on the impl thread. | 286 // We should now have no textures on the impl thread. |
| 266 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 0)); | 287 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 267 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); | 288 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 268 | 289 |
| 269 // This should recreate and update one of the deleted textures. | 290 // This should recreate and update one of the deleted textures. |
| 270 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 291 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 271 updateAndPush(layer.get(), layerImpl.get()); | 292 updateAndPush(layer, layerImpl); |
| 272 | 293 |
| 273 // We should have one tiles on the impl side. | 294 // We should have one tiles on the impl side. |
| 274 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 295 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 275 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); | 296 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 276 } | 297 } |
| 277 | 298 |
| 278 TEST_F(TiledLayerTest, pushIdlePaintTiles) | 299 TEST_F(TiledLayerTest, pushIdlePaintTiles) |
| 279 { | 300 { |
| 280 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 301 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 281 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 302 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 282 | 303 |
| 283 // The tile size is 100x100. Setup 5x5 tiles with one visible tile in the ce
nter. | 304 // The tile size is 100x100. Setup 5x5 tiles with one visible tile in the ce
nter. |
| 284 // This paints 1 visible of the 25 invalid tiles. | 305 // This paints 1 visible of the 25 invalid tiles. |
| 285 layer->setBounds(gfx::Size(500, 500)); | 306 layer->setBounds(gfx::Size(500, 500)); |
| 286 layer->drawProperties().visible_content_rect = gfx::Rect(200, 200, 100, 100)
; | 307 layer->drawProperties().visible_content_rect = gfx::Rect(200, 200, 100, 100)
; |
| 287 layer->invalidateContentRect(gfx::Rect(0, 0, 500, 500)); | 308 layer->invalidateContentRect(gfx::Rect(0, 0, 500, 500)); |
| 288 bool needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 309 bool needsUpdate = updateAndPush(layer, layerImpl); |
| 289 // We should need idle-painting for surrounding tiles. | 310 // We should need idle-painting for surrounding tiles. |
| 290 EXPECT_TRUE(needsUpdate); | 311 EXPECT_TRUE(needsUpdate); |
| 291 | 312 |
| 292 // We should have one tile on the impl side. | 313 // We should have one tile on the impl side. |
| 293 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(2, 2)); | 314 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(2, 2)); |
| 294 | 315 |
| 295 // For the next four updates, we should detect we still need idle painting. | 316 // For the next four updates, we should detect we still need idle painting. |
| 296 for (int i = 0; i < 4; i++) { | 317 for (int i = 0; i < 4; i++) { |
| 297 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 318 needsUpdate = updateAndPush(layer, layerImpl); |
| 298 EXPECT_TRUE(needsUpdate); | 319 EXPECT_TRUE(needsUpdate); |
| 299 } | 320 } |
| 300 | 321 |
| 301 // We should always finish painting eventually. | 322 // We should always finish painting eventually. |
| 302 for (int i = 0; i < 20; i++) | 323 for (int i = 0; i < 20; i++) |
| 303 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 324 needsUpdate = updateAndPush(layer, layerImpl); |
| 304 | 325 |
| 305 // We should have pre-painted all of the surrounding tiles. | 326 // We should have pre-painted all of the surrounding tiles. |
| 306 for (int i = 0; i < 5; i++) { | 327 for (int i = 0; i < 5; i++) { |
| 307 for (int j = 0; j < 5; j++) | 328 for (int j = 0; j < 5; j++) |
| 308 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(i, j)); | 329 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(i, j)); |
| 309 } | 330 } |
| 310 | 331 |
| 311 EXPECT_FALSE(needsUpdate); | 332 EXPECT_FALSE(needsUpdate); |
| 312 } | 333 } |
| 313 | 334 |
| 314 TEST_F(TiledLayerTest, predictivePainting) | 335 TEST_F(TiledLayerTest, predictivePainting) |
| 315 { | 336 { |
| 316 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 337 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 317 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 338 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 318 | 339 |
| 319 // Prepainting should occur in the scroll direction first, and the | 340 // Prepainting should occur in the scroll direction first, and the |
| 320 // visible rect should be extruded only along the dominant axis. | 341 // visible rect should be extruded only along the dominant axis. |
| 321 gfx::Vector2d directions[6] = { gfx::Vector2d(-10, 0), | 342 gfx::Vector2d directions[6] = { gfx::Vector2d(-10, 0), |
| 322 gfx::Vector2d(10, 0), | 343 gfx::Vector2d(10, 0), |
| 323 gfx::Vector2d(0, -10), | 344 gfx::Vector2d(0, -10), |
| 324 gfx::Vector2d(0, 10), | 345 gfx::Vector2d(0, 10), |
| 325 gfx::Vector2d(10, 20), | 346 gfx::Vector2d(10, 20), |
| 326 gfx::Vector2d(-20, 10) }; | 347 gfx::Vector2d(-20, 10) }; |
| 327 // We should push all tiles that touch the extruded visible rect. | 348 // We should push all tiles that touch the extruded visible rect. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 345 gfx::Size contentBounds = gfx::Size(500, 500); | 366 gfx::Size contentBounds = gfx::Size(500, 500); |
| 346 gfx::Rect contentRect = gfx::Rect(0, 0, 500, 500); | 367 gfx::Rect contentRect = gfx::Rect(0, 0, 500, 500); |
| 347 gfx::Rect visibleRect = gfx::Rect(200, 200, 100, 100); | 368 gfx::Rect visibleRect = gfx::Rect(200, 200, 100, 100); |
| 348 gfx::Rect previousVisibleRect = gfx::Rect(visibleRect.origin() + directi
ons[k], visibleRect.size()); | 369 gfx::Rect previousVisibleRect = gfx::Rect(visibleRect.origin() + directi
ons[k], visibleRect.size()); |
| 349 gfx::Rect nextVisibleRect = gfx::Rect(visibleRect.origin() - directions[
k], visibleRect.size()); | 370 gfx::Rect nextVisibleRect = gfx::Rect(visibleRect.origin() - directions[
k], visibleRect.size()); |
| 350 | 371 |
| 351 // Setup. Use the previousVisibleRect to setup the prediction for next f
rame. | 372 // Setup. Use the previousVisibleRect to setup the prediction for next f
rame. |
| 352 layer->setBounds(contentBounds); | 373 layer->setBounds(contentBounds); |
| 353 layer->drawProperties().visible_content_rect = previousVisibleRect; | 374 layer->drawProperties().visible_content_rect = previousVisibleRect; |
| 354 layer->invalidateContentRect(contentRect); | 375 layer->invalidateContentRect(contentRect); |
| 355 bool needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 376 bool needsUpdate = updateAndPush(layer, layerImpl); |
| 356 | 377 |
| 357 // Invalidate and move the visibleRect in the scroll direction. | 378 // Invalidate and move the visibleRect in the scroll direction. |
| 358 // Check that the correct tiles have been painted in the visible pass. | 379 // Check that the correct tiles have been painted in the visible pass. |
| 359 layer->invalidateContentRect(contentRect); | 380 layer->invalidateContentRect(contentRect); |
| 360 layer->drawProperties().visible_content_rect = visibleRect; | 381 layer->drawProperties().visible_content_rect = visibleRect; |
| 361 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 382 needsUpdate = updateAndPush(layer, layerImpl); |
| 362 for (int i = 0; i < 5; i++) { | 383 for (int i = 0; i < 5; i++) { |
| 363 for (int j = 0; j < 5; j++) | 384 for (int j = 0; j < 5; j++) |
| 364 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), pushedVisible
Tiles[k].Contains(i, j)); | 385 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), pushedVisible
Tiles[k].Contains(i, j)); |
| 365 } | 386 } |
| 366 | 387 |
| 367 // Move the transform in the same direction without invalidating. | 388 // Move the transform in the same direction without invalidating. |
| 368 // Check that non-visible pre-painting occured in the correct direction. | 389 // Check that non-visible pre-painting occured in the correct direction. |
| 369 // Ignore diagonal scrolls here (k > 3) as these have new visible conten
t now. | 390 // Ignore diagonal scrolls here (k > 3) as these have new visible conten
t now. |
| 370 if (k <= 3) { | 391 if (k <= 3) { |
| 371 layer->drawProperties().visible_content_rect = nextVisibleRect; | 392 layer->drawProperties().visible_content_rect = nextVisibleRect; |
| 372 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 393 needsUpdate = updateAndPush(layer, layerImpl); |
| 373 for (int i = 0; i < 5; i++) { | 394 for (int i = 0; i < 5; i++) { |
| 374 for (int j = 0; j < 5; j++) | 395 for (int j = 0; j < 5; j++) |
| 375 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), pushedPre
paintTiles[k].Contains(i, j)); | 396 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), pushedPre
paintTiles[k].Contains(i, j)); |
| 376 } | 397 } |
| 377 } | 398 } |
| 378 | 399 |
| 379 // We should always finish painting eventually. | 400 // We should always finish painting eventually. |
| 380 for (int i = 0; i < 20; i++) | 401 for (int i = 0; i < 20; i++) |
| 381 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 402 needsUpdate = updateAndPush(layer, layerImpl); |
| 382 EXPECT_FALSE(needsUpdate); | 403 EXPECT_FALSE(needsUpdate); |
| 383 } | 404 } |
| 384 } | 405 } |
| 385 | 406 |
| 386 TEST_F(TiledLayerTest, pushTilesAfterIdlePaintFailed) | 407 TEST_F(TiledLayerTest, pushTilesAfterIdlePaintFailed) |
| 387 { | 408 { |
| 388 // Start with 2mb of memory, but the test is going to try to use just more t
han 1mb, so we reduce to 1mb later. | 409 // Start with 2mb of memory, but the test is going to try to use just more t
han 1mb, so we reduce to 1mb later. |
| 389 m_resourceManager->setMaxMemoryLimitBytes(2 * 1024 * 1024); | 410 m_resourceManager->setMaxMemoryLimitBytes(2 * 1024 * 1024); |
| 390 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 411 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 391 ScopedFakeTiledLayerImpl layerImpl1(m_hostImpl->activeTree(), 1); | 412 scoped_ptr<FakeTiledLayerImpl> layerImpl1 = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 1)); |
| 392 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 413 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 393 ScopedFakeTiledLayerImpl layerImpl2(m_hostImpl->activeTree(), 2); | 414 scoped_ptr<FakeTiledLayerImpl> layerImpl2 = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 2)); |
| 394 | 415 |
| 395 // For this test we have two layers. layer1 exhausts most texture memory, le
aving room for 2 more tiles from | 416 // For this test we have two layers. layer1 exhausts most texture memory, le
aving room for 2 more tiles from |
| 396 // layer2, but not all three tiles. First we paint layer1, and one tile from
layer2. Then when we idle paint | 417 // layer2, but not all three tiles. First we paint layer1, and one tile from
layer2. Then when we idle paint |
| 397 // layer2, we will fail on the third tile of layer2, and this should not lea
ve the second tile in a bad state. | 418 // layer2, we will fail on the third tile of layer2, and this should not lea
ve the second tile in a bad state. |
| 398 | 419 |
| 399 // This uses 960000 bytes, leaving 88576 bytes of memory left, which is enou
gh for 2 tiles only in the other layer. | 420 // This uses 960000 bytes, leaving 88576 bytes of memory left, which is enou
gh for 2 tiles only in the other layer. |
| 400 gfx::Rect layer1Rect(0, 0, 100, 2400); | 421 gfx::Rect layer1Rect(0, 0, 100, 2400); |
| 401 | 422 |
| 402 // This requires 4*30000 bytes of memory. | 423 // This requires 4*30000 bytes of memory. |
| 403 gfx::Rect layer2Rect(0, 0, 100, 300); | 424 gfx::Rect layer2Rect(0, 0, 100, 300); |
| 404 | 425 |
| 405 // Paint a single tile in layer2 so that it will idle paint. | 426 // Paint a single tile in layer2 so that it will idle paint. |
| 406 layer1->setBounds(layer1Rect.size()); | 427 layer1->setBounds(layer1Rect.size()); |
| 407 layer1->drawProperties().visible_content_rect = layer1Rect; | 428 layer1->drawProperties().visible_content_rect = layer1Rect; |
| 408 layer2->setBounds(layer2Rect.size()); | 429 layer2->setBounds(layer2Rect.size()); |
| 409 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 430 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 410 bool needsUpdate = updateAndPush(layer1.get(), layerImpl1.get(), | 431 bool needsUpdate = updateAndPush(layer1, layerImpl1, |
| 411 layer2.get(), layerImpl2.get()); | 432 layer2, layerImpl2); |
| 412 // We should need idle-painting for both remaining tiles in layer2. | 433 // We should need idle-painting for both remaining tiles in layer2. |
| 413 EXPECT_TRUE(needsUpdate); | 434 EXPECT_TRUE(needsUpdate); |
| 414 | 435 |
| 415 // Reduce our memory limits to 1mb. | 436 // Reduce our memory limits to 1mb. |
| 416 m_resourceManager->setMaxMemoryLimitBytes(1024 * 1024); | 437 m_resourceManager->setMaxMemoryLimitBytes(1024 * 1024); |
| 417 | 438 |
| 418 // Now idle paint layer2. We are going to run out of memory though! | 439 // Now idle paint layer2. We are going to run out of memory though! |
| 419 // Oh well, commit the frame and push. | 440 // Oh well, commit the frame and push. |
| 420 for (int i = 0; i < 4; i++) { | 441 for (int i = 0; i < 4; i++) { |
| 421 needsUpdate = updateAndPush(layer1.get(), layerImpl1.get(), | 442 needsUpdate = updateAndPush(layer1, layerImpl1, |
| 422 layer2.get(), layerImpl2.get()); | 443 layer2, layerImpl2); |
| 423 } | 444 } |
| 424 | 445 |
| 425 // Sanity check, we should have textures for the big layer. | 446 // Sanity check, we should have textures for the big layer. |
| 426 EXPECT_TRUE(layerImpl1->hasResourceIdForTileAt(0, 0)); | 447 EXPECT_TRUE(layerImpl1->hasResourceIdForTileAt(0, 0)); |
| 427 EXPECT_TRUE(layerImpl1->hasResourceIdForTileAt(0, 23)); | 448 EXPECT_TRUE(layerImpl1->hasResourceIdForTileAt(0, 23)); |
| 428 | 449 |
| 429 // We should only have the first two tiles from layer2 since | 450 // We should only have the first two tiles from layer2 since |
| 430 // it failed to idle update the last tile. | 451 // it failed to idle update the last tile. |
| 431 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 0)); | 452 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 0)); |
| 432 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 0)); | 453 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 0)); |
| 433 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 1)); | 454 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 1)); |
| 434 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 1)); | 455 EXPECT_TRUE(layerImpl2->hasResourceIdForTileAt(0, 1)); |
| 435 | 456 |
| 436 EXPECT_FALSE(needsUpdate); | 457 EXPECT_FALSE(needsUpdate); |
| 437 EXPECT_FALSE(layerImpl2->hasResourceIdForTileAt(0, 2)); | 458 EXPECT_FALSE(layerImpl2->hasResourceIdForTileAt(0, 2)); |
| 438 } | 459 } |
| 439 | 460 |
| 440 TEST_F(TiledLayerTest, pushIdlePaintedOccludedTiles) | 461 TEST_F(TiledLayerTest, pushIdlePaintedOccludedTiles) |
| 441 { | 462 { |
| 442 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 463 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 443 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 464 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 444 TestOcclusionTracker occluded; | 465 TestOcclusionTracker occluded; |
| 445 m_occlusion = &occluded; | 466 m_occlusion = &occluded; |
| 446 | 467 |
| 447 // The tile size is 100x100, so this invalidates one occluded tile, culls it
during paint, but prepaints it. | 468 // The tile size is 100x100, so this invalidates one occluded tile, culls it
during paint, but prepaints it. |
| 448 occluded.setOcclusion(gfx::Rect(0, 0, 100, 100)); | 469 occluded.setOcclusion(gfx::Rect(0, 0, 100, 100)); |
| 449 | 470 |
| 450 layer->setBounds(gfx::Size(100, 100)); | 471 layer->setBounds(gfx::Size(100, 100)); |
| 472 calcDrawProps(layer); |
| 451 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 473 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 452 updateAndPush(layer.get(), layerImpl.get()); | 474 updateAndPush(layer, layerImpl); |
| 453 | 475 |
| 454 // We should have the prepainted tile on the impl side, but culled it during
paint. | 476 // We should have the prepainted tile on the impl side, but culled it during
paint. |
| 455 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 477 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 456 EXPECT_EQ(1, occluded.overdrawMetrics().tilesCulledForUpload()); | 478 EXPECT_EQ(1, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 457 } | 479 } |
| 458 | 480 |
| 459 TEST_F(TiledLayerTest, pushTilesMarkedDirtyDuringPaint) | 481 TEST_F(TiledLayerTest, pushTilesMarkedDirtyDuringPaint) |
| 460 { | 482 { |
| 461 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 483 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 462 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 484 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 463 | 485 |
| 464 // The tile size is 100x100, so this invalidates and then paints two tiles. | 486 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 465 // However, during the paint, we invalidate one of the tiles. This should | 487 // However, during the paint, we invalidate one of the tiles. This should |
| 466 // not prevent the tile from being pushed. | 488 // not prevent the tile from being pushed. |
| 467 layer->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), la
yer.get()); | 489 layer->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), la
yer.get()); |
| 468 layer->setBounds(gfx::Size(100, 200)); | 490 layer->setBounds(gfx::Size(100, 200)); |
| 491 calcDrawProps(layer); |
| 469 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 492 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 470 updateAndPush(layer.get(), layerImpl.get()); | 493 updateAndPush(layer, layerImpl); |
| 471 | 494 |
| 472 // We should have both tiles on the impl side. | 495 // We should have both tiles on the impl side. |
| 473 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 496 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 474 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 497 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 475 } | 498 } |
| 476 | 499 |
| 477 TEST_F(TiledLayerTest, pushTilesLayerMarkedDirtyDuringPaintOnNextLayer) | 500 TEST_F(TiledLayerTest, pushTilesLayerMarkedDirtyDuringPaintOnNextLayer) |
| 478 { | 501 { |
| 479 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 502 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 480 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 503 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 481 ScopedFakeTiledLayerImpl layer1Impl(m_hostImpl->activeTree(), 1); | 504 scoped_ptr<FakeTiledLayerImpl> layer1Impl = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 1)); |
| 482 ScopedFakeTiledLayerImpl layer2Impl(m_hostImpl->activeTree(), 2); | 505 scoped_ptr<FakeTiledLayerImpl> layer2Impl = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 2)); |
| 483 | 506 |
| 484 // Invalidate a tile on layer1, during update of layer 2. | 507 // Invalidate a tile on layer1, during update of layer 2. |
| 485 layer2->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), l
ayer1.get()); | 508 layer2->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), l
ayer1.get()); |
| 486 layer1->setBounds(gfx::Size(100, 200)); | 509 layer1->setBounds(gfx::Size(100, 200)); |
| 510 layer2->setBounds(gfx::Size(100, 200)); |
| 511 calcDrawProps(layer1, layer2); |
| 487 layer1->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 512 layer1->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 488 layer2->setBounds(gfx::Size(100, 200)); | |
| 489 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 513 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 490 updateAndPush(layer1.get(), layer1Impl.get(), | 514 updateAndPush(layer1, layer1Impl, |
| 491 layer2.get(), layer2Impl.get()); | 515 layer2, layer2Impl); |
| 492 | 516 |
| 493 // We should have both tiles on the impl side for all layers. | 517 // We should have both tiles on the impl side for all layers. |
| 494 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 0)); | 518 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 0)); |
| 495 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 1)); | 519 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 1)); |
| 496 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 0)); | 520 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 0)); |
| 497 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 1)); | 521 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 1)); |
| 498 } | 522 } |
| 499 | 523 |
| 500 TEST_F(TiledLayerTest, pushTilesLayerMarkedDirtyDuringPaintOnPreviousLayer) | 524 TEST_F(TiledLayerTest, pushTilesLayerMarkedDirtyDuringPaintOnPreviousLayer) |
| 501 { | 525 { |
| 502 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 526 scoped_refptr<FakeTiledLayer> layer1 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 503 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); | 527 scoped_refptr<FakeTiledLayer> layer2 = make_scoped_refptr(new FakeTiledLayer
(m_resourceManager.get())); |
| 504 ScopedFakeTiledLayerImpl layer1Impl(m_hostImpl->activeTree(), 1); | 528 scoped_ptr<FakeTiledLayerImpl> layer1Impl = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 1)); |
| 505 ScopedFakeTiledLayerImpl layer2Impl(m_hostImpl->activeTree(), 2); | 529 scoped_ptr<FakeTiledLayerImpl> layer2Impl = make_scoped_ptr(new FakeTiledLay
erImpl(m_hostImpl->activeTree(), 2)); |
| 506 | 530 |
| 507 layer1->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), l
ayer2.get()); | 531 layer1->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(0, 50, 100, 50), l
ayer2.get()); |
| 508 layer1->setBounds(gfx::Size(100, 200)); | 532 layer1->setBounds(gfx::Size(100, 200)); |
| 533 layer2->setBounds(gfx::Size(100, 200)); |
| 534 calcDrawProps(layer1, layer2); |
| 509 layer1->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 535 layer1->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 510 layer2->setBounds(gfx::Size(100, 200)); | |
| 511 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 536 layer2->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 512 updateAndPush(layer1.get(), layer1Impl.get(), | 537 updateAndPush(layer1, layer1Impl, |
| 513 layer2.get(), layer2Impl.get()); | 538 layer2, layer2Impl); |
| 514 | 539 |
| 515 // We should have both tiles on the impl side for all layers. | 540 // We should have both tiles on the impl side for all layers. |
| 516 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 0)); | 541 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 0)); |
| 517 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 1)); | 542 EXPECT_TRUE(layer1Impl->hasResourceIdForTileAt(0, 1)); |
| 518 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 0)); | 543 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 0)); |
| 519 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 1)); | 544 EXPECT_TRUE(layer2Impl->hasResourceIdForTileAt(0, 1)); |
| 520 } | 545 } |
| 521 | 546 |
| 522 TEST_F(TiledLayerTest, paintSmallAnimatedLayersImmediately) | 547 TEST_F(TiledLayerTest, paintSmallAnimatedLayersImmediately) |
| 523 { | 548 { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 536 int memoryForLayer = layerWidth * layerHeight * 4; | 561 int memoryForLayer = layerWidth * layerHeight * 4; |
| 537 layerTreeHost->setViewportSize(gfx::Size(layerWidth, layerHeight), gfx::
Size(layerWidth, layerHeight)); | 562 layerTreeHost->setViewportSize(gfx::Size(layerWidth, layerHeight), gfx::
Size(layerWidth, layerHeight)); |
| 538 | 563 |
| 539 // Use 10x5 tiles to run out of memory. | 564 // Use 10x5 tiles to run out of memory. |
| 540 if (runOutOfMemory[i]) | 565 if (runOutOfMemory[i]) |
| 541 layerWidth *= 2; | 566 layerWidth *= 2; |
| 542 | 567 |
| 543 m_resourceManager->setMaxMemoryLimitBytes(memoryForLayer); | 568 m_resourceManager->setMaxMemoryLimitBytes(memoryForLayer); |
| 544 | 569 |
| 545 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLa
yer(m_resourceManager.get())); | 570 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLa
yer(m_resourceManager.get())); |
| 546 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 571 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 547 | 572 |
| 548 // Full size layer with half being visible. | 573 // Full size layer with half being visible. |
| 549 gfx::Size contentBounds(layerWidth, layerHeight); | 574 gfx::Size contentBounds(layerWidth, layerHeight); |
| 550 gfx::Rect contentRect(gfx::Point(), contentBounds); | 575 gfx::Rect contentRect(gfx::Point(), contentBounds); |
| 551 gfx::Rect visibleRect(gfx::Point(), gfx::Size(layerWidth / 2, layerHeigh
t)); | 576 gfx::Rect visibleRect(gfx::Point(), gfx::Size(layerWidth / 2, layerHeigh
t)); |
| 552 | 577 |
| 553 // Pretend the layer is animating. | 578 // Pretend the layer is animating. |
| 554 layer->drawProperties().target_space_transform_is_animating = true; | 579 layer->drawProperties().target_space_transform_is_animating = true; |
| 555 layer->setBounds(contentBounds); | 580 layer->setBounds(contentBounds); |
| 556 layer->drawProperties().visible_content_rect = visibleRect; | 581 layer->drawProperties().visible_content_rect = visibleRect; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 578 for (int j = 0; j < 5; ++j) | 603 for (int j = 0; j < 5; ++j) |
| 579 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), i < 5); | 604 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(i, j), i < 5); |
| 580 } | 605 } |
| 581 } | 606 } |
| 582 } | 607 } |
| 583 } | 608 } |
| 584 | 609 |
| 585 TEST_F(TiledLayerTest, idlePaintOutOfMemory) | 610 TEST_F(TiledLayerTest, idlePaintOutOfMemory) |
| 586 { | 611 { |
| 587 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 612 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 588 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 613 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 589 | 614 |
| 590 // We have enough memory for only the visible rect, so we will run out of me
mory in first idle paint. | 615 // We have enough memory for only the visible rect, so we will run out of me
mory in first idle paint. |
| 591 int memoryLimit = 4 * 100 * 100; // 1 tiles, 4 bytes per pixel. | 616 int memoryLimit = 4 * 100 * 100; // 1 tiles, 4 bytes per pixel. |
| 592 m_resourceManager->setMaxMemoryLimitBytes(memoryLimit); | 617 m_resourceManager->setMaxMemoryLimitBytes(memoryLimit); |
| 593 | 618 |
| 594 // The tile size is 100x100, so this invalidates and then paints two tiles. | 619 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 595 bool needsUpdate = false; | 620 bool needsUpdate = false; |
| 596 layer->setBounds(gfx::Size(300, 300)); | 621 layer->setBounds(gfx::Size(300, 300)); |
| 622 calcDrawProps(layer); |
| 597 layer->drawProperties().visible_content_rect = gfx::Rect(100, 100, 100, 100)
; | 623 layer->drawProperties().visible_content_rect = gfx::Rect(100, 100, 100, 100)
; |
| 598 for (int i = 0; i < 2; i++) | 624 for (int i = 0; i < 2; i++) |
| 599 needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 625 needsUpdate = updateAndPush(layer, layerImpl); |
| 600 | 626 |
| 601 // Idle-painting should see no more priority tiles for painting. | 627 // Idle-painting should see no more priority tiles for painting. |
| 602 EXPECT_FALSE(needsUpdate); | 628 EXPECT_FALSE(needsUpdate); |
| 603 | 629 |
| 604 // We should have one tile on the impl side. | 630 // We should have one tile on the impl side. |
| 605 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(1, 1)); | 631 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(1, 1)); |
| 606 } | 632 } |
| 607 | 633 |
| 608 TEST_F(TiledLayerTest, idlePaintZeroSizedLayer) | 634 TEST_F(TiledLayerTest, idlePaintZeroSizedLayer) |
| 609 { | 635 { |
| 610 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 636 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 611 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 637 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 612 | 638 |
| 613 bool animating[2] = {false, true}; | 639 bool animating[2] = {false, true}; |
| 614 for (int i = 0; i < 2; i++) { | 640 for (int i = 0; i < 2; i++) { |
| 615 // Pretend the layer is animating. | 641 // Pretend the layer is animating. |
| 616 layer->drawProperties().target_space_transform_is_animating = animating[
i]; | 642 layer->drawProperties().target_space_transform_is_animating = animating[
i]; |
| 617 | 643 |
| 618 // The layer's bounds are empty. | 644 // The layer's bounds are empty. |
| 619 // Empty layers don't paint or idle-paint. | 645 // Empty layers don't paint or idle-paint. |
| 620 layer->setBounds(gfx::Size()); | 646 layer->setBounds(gfx::Size()); |
| 647 calcDrawProps(layer); |
| 621 layer->drawProperties().visible_content_rect = gfx::Rect(); | 648 layer->drawProperties().visible_content_rect = gfx::Rect(); |
| 622 bool needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 649 bool needsUpdate = updateAndPush(layer, layerImpl); |
| 623 | 650 |
| 624 // Empty layers don't have tiles. | 651 // Empty layers don't have tiles. |
| 625 EXPECT_EQ(0u, layer->numPaintedTiles()); | 652 EXPECT_EQ(0u, layer->numPaintedTiles()); |
| 626 | 653 |
| 627 // Empty layers don't need prepaint. | 654 // Empty layers don't need prepaint. |
| 628 EXPECT_FALSE(needsUpdate); | 655 EXPECT_FALSE(needsUpdate); |
| 629 | 656 |
| 630 // Empty layers don't have tiles. | 657 // Empty layers don't have tiles. |
| 631 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 0)); | 658 EXPECT_FALSE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 632 } | 659 } |
| 633 } | 660 } |
| 634 | 661 |
| 635 TEST_F(TiledLayerTest, idlePaintNonVisibleLayers) | 662 TEST_F(TiledLayerTest, idlePaintNonVisibleLayers) |
| 636 { | 663 { |
| 637 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 664 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 638 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 665 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 639 | 666 |
| 640 // Alternate between not visible and visible. | 667 // Alternate between not visible and visible. |
| 641 gfx::Rect v(0, 0, 100, 100); | 668 gfx::Rect v(0, 0, 100, 100); |
| 642 gfx::Rect nv(0, 0, 0, 0); | 669 gfx::Rect nv(0, 0, 0, 0); |
| 643 gfx::Rect visibleRect[10] = {nv, nv, v, v, nv, nv, v, v, nv, nv}; | 670 gfx::Rect visibleRect[10] = {nv, nv, v, v, nv, nv, v, v, nv, nv}; |
| 644 bool invalidate[10] = {true, true, true, true, true, true, true, true, fals
e, false }; | 671 bool invalidate[10] = {true, true, true, true, true, true, true, true, fals
e, false }; |
| 645 | 672 |
| 646 // We should not have any tiles except for when the layer was visible | 673 // We should not have any tiles except for when the layer was visible |
| 647 // or after the layer was visible and we didn't invalidate. | 674 // or after the layer was visible and we didn't invalidate. |
| 648 bool haveTile[10] = { false, false, true, true, false, false, true, true, tr
ue, true }; | 675 bool haveTile[10] = { false, false, true, true, false, false, true, true, tr
ue, true }; |
| 649 | 676 |
| 650 for (int i = 0; i < 10; i++) { | 677 for (int i = 0; i < 10; i++) { |
| 651 layer->setBounds(gfx::Size(100, 100)); | 678 layer->setBounds(gfx::Size(100, 100)); |
| 679 calcDrawProps(layer); |
| 652 layer->drawProperties().visible_content_rect = visibleRect[i]; | 680 layer->drawProperties().visible_content_rect = visibleRect[i]; |
| 653 | 681 |
| 654 if (invalidate[i]) | 682 if (invalidate[i]) |
| 655 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 100)); | 683 layer->invalidateContentRect(gfx::Rect(0, 0, 100, 100)); |
| 656 bool needsUpdate = updateAndPush(layer.get(), layerImpl.get()); | 684 bool needsUpdate = updateAndPush(layer, layerImpl); |
| 657 | 685 |
| 658 // We should never signal idle paint, as we painted the entire layer | 686 // We should never signal idle paint, as we painted the entire layer |
| 659 // or the layer was not visible. | 687 // or the layer was not visible. |
| 660 EXPECT_FALSE(needsUpdate); | 688 EXPECT_FALSE(needsUpdate); |
| 661 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(0, 0), haveTile[i]); | 689 EXPECT_EQ(layerImpl->hasResourceIdForTileAt(0, 0), haveTile[i]); |
| 662 } | 690 } |
| 663 } | 691 } |
| 664 | 692 |
| 665 TEST_F(TiledLayerTest, invalidateFromPrepare) | 693 TEST_F(TiledLayerTest, invalidateFromPrepare) |
| 666 { | 694 { |
| 667 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 695 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 668 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 696 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 669 | 697 |
| 670 // The tile size is 100x100, so this invalidates and then paints two tiles. | 698 // The tile size is 100x100, so this invalidates and then paints two tiles. |
| 671 layer->setBounds(gfx::Size(100, 200)); | 699 layer->setBounds(gfx::Size(100, 200)); |
| 700 calcDrawProps(layer); |
| 672 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); | 701 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 200); |
| 673 updateAndPush(layer.get(), layerImpl.get()); | 702 updateAndPush(layer, layerImpl); |
| 674 | 703 |
| 675 // We should have both tiles on the impl side. | 704 // We should have both tiles on the impl side. |
| 676 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); | 705 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 0)); |
| 677 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); | 706 EXPECT_TRUE(layerImpl->hasResourceIdForTileAt(0, 1)); |
| 678 | 707 |
| 679 layer->fakeLayerUpdater()->clearPrepareCount(); | 708 layer->fakeLayerUpdater()->clearPrepareCount(); |
| 680 // Invoke update again. As the layer is valid update shouldn't be invoked on | 709 // Invoke update again. As the layer is valid update shouldn't be invoked on |
| 681 // the LayerUpdater. | 710 // the LayerUpdater. |
| 682 updateAndPush(layer.get(), layerImpl.get()); | 711 updateAndPush(layer, layerImpl); |
| 683 EXPECT_EQ(0, layer->fakeLayerUpdater()->prepareCount()); | 712 EXPECT_EQ(0, layer->fakeLayerUpdater()->prepareCount()); |
| 684 | 713 |
| 685 // setRectToInvalidate triggers invalidateContentRect() being invoked from u
pdate. | 714 // setRectToInvalidate triggers invalidateContentRect() being invoked from u
pdate. |
| 686 layer->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(25, 25, 50, 50), la
yer.get()); | 715 layer->fakeLayerUpdater()->setRectToInvalidate(gfx::Rect(25, 25, 50, 50), la
yer.get()); |
| 687 layer->fakeLayerUpdater()->clearPrepareCount(); | 716 layer->fakeLayerUpdater()->clearPrepareCount(); |
| 688 layer->invalidateContentRect(gfx::Rect(0, 0, 50, 50)); | 717 layer->invalidateContentRect(gfx::Rect(0, 0, 50, 50)); |
| 689 updateAndPush(layer.get(), layerImpl.get()); | 718 updateAndPush(layer, layerImpl); |
| 690 EXPECT_EQ(1, layer->fakeLayerUpdater()->prepareCount()); | 719 EXPECT_EQ(1, layer->fakeLayerUpdater()->prepareCount()); |
| 691 layer->fakeLayerUpdater()->clearPrepareCount(); | 720 layer->fakeLayerUpdater()->clearPrepareCount(); |
| 692 | 721 |
| 693 // The layer should still be invalid as update invoked invalidate. | 722 // The layer should still be invalid as update invoked invalidate. |
| 694 updateAndPush(layer.get(), layerImpl.get()); // visible | 723 updateAndPush(layer, layerImpl); // visible |
| 695 EXPECT_EQ(1, layer->fakeLayerUpdater()->prepareCount()); | 724 EXPECT_EQ(1, layer->fakeLayerUpdater()->prepareCount()); |
| 696 } | 725 } |
| 697 | 726 |
| 698 TEST_F(TiledLayerTest, verifyUpdateRectWhenContentBoundsAreScaled) | 727 TEST_F(TiledLayerTest, verifyUpdateRectWhenContentBoundsAreScaled) |
| 699 { | 728 { |
| 700 // The updateRect (that indicates what was actually painted) should be in | 729 // The updateRect (that indicates what was actually painted) should be in |
| 701 // layer space, not the content space. | 730 // layer space, not the content space. |
| 702 scoped_refptr<FakeTiledLayerWithScaledBounds> layer = make_scoped_refptr(new
FakeTiledLayerWithScaledBounds(m_resourceManager.get())); | 731 scoped_refptr<FakeTiledLayerWithScaledBounds> layer = make_scoped_refptr(new
FakeTiledLayerWithScaledBounds(m_resourceManager.get())); |
| 703 | 732 |
| 704 gfx::Rect layerBounds(0, 0, 300, 200); | 733 gfx::Rect layerBounds(0, 0, 300, 200); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 731 layer->invalidateContentRect(partialDamage); | 760 layer->invalidateContentRect(partialDamage); |
| 732 layer->setTexturePriorities(m_priorityCalculator); | 761 layer->setTexturePriorities(m_priorityCalculator); |
| 733 m_resourceManager->prioritizeTextures(); | 762 m_resourceManager->prioritizeTextures(); |
| 734 layer->update(*m_queue.get(), 0, m_stats); | 763 layer->update(*m_queue.get(), 0, m_stats); |
| 735 EXPECT_FLOAT_RECT_EQ(gfx::RectF(45, 80, 15, 8), layer->updateRect()); | 764 EXPECT_FLOAT_RECT_EQ(gfx::RectF(45, 80, 15, 8), layer->updateRect()); |
| 736 } | 765 } |
| 737 | 766 |
| 738 TEST_F(TiledLayerTest, verifyInvalidationWhenContentsScaleChanges) | 767 TEST_F(TiledLayerTest, verifyInvalidationWhenContentsScaleChanges) |
| 739 { | 768 { |
| 740 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 769 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 741 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 770 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiledLaye
rImpl(m_hostImpl->activeTree(), 1)); |
| 742 | 771 |
| 743 // Create a layer with one tile. | 772 // Create a layer with one tile. |
| 744 layer->setBounds(gfx::Size(100, 100)); | 773 layer->setBounds(gfx::Size(100, 100)); |
| 745 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); | 774 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 100, 100); |
| 746 | 775 |
| 747 // Invalidate the entire layer. | 776 // Invalidate the entire layer. |
| 748 layer->setNeedsDisplay(); | 777 layer->setNeedsDisplay(); |
| 749 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100), layer->lastNeedsDisplayRect
()); | 778 EXPECT_FLOAT_RECT_EQ(gfx::RectF(0, 0, 100, 100), layer->lastNeedsDisplayRect
()); |
| 750 | 779 |
| 751 // Push the tiles to the impl side and check that there is exactly one. | 780 // Push the tiles to the impl side and check that there is exactly one. |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 883 layer->drawProperties().visible_content_rect = contentRect; | 912 layer->drawProperties().visible_content_rect = contentRect; |
| 884 layer->invalidateContentRect(contentRect); | 913 layer->invalidateContentRect(contentRect); |
| 885 | 914 |
| 886 m_layerTreeHost->setRootLayer(layer); | 915 m_layerTreeHost->setRootLayer(layer); |
| 887 m_layerTreeHost->setViewportSize(gfx::Size(300, 200), gfx::Size(300, 200)); | 916 m_layerTreeHost->setViewportSize(gfx::Size(300, 200), gfx::Size(300, 200)); |
| 888 | 917 |
| 889 // Full update of all 6 tiles. | 918 // Full update of all 6 tiles. |
| 890 m_layerTreeHost->updateLayers( | 919 m_layerTreeHost->updateLayers( |
| 891 *m_queue.get(), std::numeric_limits<size_t>::max()); | 920 *m_queue.get(), std::numeric_limits<size_t>::max()); |
| 892 { | 921 { |
| 893 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 922 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 894 EXPECT_EQ(6, m_queue->fullUploadSize()); | 923 EXPECT_EQ(6, m_queue->fullUploadSize()); |
| 895 EXPECT_EQ(0, m_queue->partialUploadSize()); | 924 EXPECT_EQ(0, m_queue->partialUploadSize()); |
| 896 updateTextures(); | 925 updateTextures(); |
| 897 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); | 926 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); |
| 898 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 927 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 899 layer->fakeLayerUpdater()->clearUpdateCount(); | 928 layer->fakeLayerUpdater()->clearUpdateCount(); |
| 900 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 929 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 901 } | 930 } |
| 902 m_layerTreeHost->commitComplete(); | 931 m_layerTreeHost->commitComplete(); |
| 903 | 932 |
| 904 // Full update of 3 tiles and partial update of 3 tiles. | 933 // Full update of 3 tiles and partial update of 3 tiles. |
| 905 layer->invalidateContentRect(gfx::Rect(0, 0, 300, 150)); | 934 layer->invalidateContentRect(gfx::Rect(0, 0, 300, 150)); |
| 906 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t>::m
ax()); | 935 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t>::m
ax()); |
| 907 { | 936 { |
| 908 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 937 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 909 EXPECT_EQ(3, m_queue->fullUploadSize()); | 938 EXPECT_EQ(3, m_queue->fullUploadSize()); |
| 910 EXPECT_EQ(3, m_queue->partialUploadSize()); | 939 EXPECT_EQ(3, m_queue->partialUploadSize()); |
| 911 updateTextures(); | 940 updateTextures(); |
| 912 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); | 941 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); |
| 913 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 942 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 914 layer->fakeLayerUpdater()->clearUpdateCount(); | 943 layer->fakeLayerUpdater()->clearUpdateCount(); |
| 915 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 944 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 916 } | 945 } |
| 917 m_layerTreeHost->commitComplete(); | 946 m_layerTreeHost->commitComplete(); |
| 918 | 947 |
| 919 // Partial update of 6 tiles. | 948 // Partial update of 6 tiles. |
| 920 layer->invalidateContentRect(gfx::Rect(50, 50, 200, 100)); | 949 layer->invalidateContentRect(gfx::Rect(50, 50, 200, 100)); |
| 921 { | 950 { |
| 922 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 951 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 923 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); | 952 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); |
| 924 EXPECT_EQ(2, m_queue->fullUploadSize()); | 953 EXPECT_EQ(2, m_queue->fullUploadSize()); |
| 925 EXPECT_EQ(4, m_queue->partialUploadSize()); | 954 EXPECT_EQ(4, m_queue->partialUploadSize()); |
| 926 updateTextures(); | 955 updateTextures(); |
| 927 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); | 956 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); |
| 928 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 957 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 929 layer->fakeLayerUpdater()->clearUpdateCount(); | 958 layer->fakeLayerUpdater()->clearUpdateCount(); |
| 930 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 959 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 931 } | 960 } |
| 932 m_layerTreeHost->commitComplete(); | 961 m_layerTreeHost->commitComplete(); |
| 933 | 962 |
| 934 // Checkerboard all tiles. | 963 // Checkerboard all tiles. |
| 935 layer->invalidateContentRect(gfx::Rect(0, 0, 300, 200)); | 964 layer->invalidateContentRect(gfx::Rect(0, 0, 300, 200)); |
| 936 { | 965 { |
| 937 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 966 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 938 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 967 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 939 } | 968 } |
| 940 m_layerTreeHost->commitComplete(); | 969 m_layerTreeHost->commitComplete(); |
| 941 | 970 |
| 942 // Partial update of 6 checkerboard tiles. | 971 // Partial update of 6 checkerboard tiles. |
| 943 layer->invalidateContentRect(gfx::Rect(50, 50, 200, 100)); | 972 layer->invalidateContentRect(gfx::Rect(50, 50, 200, 100)); |
| 944 { | 973 { |
| 945 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 974 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 946 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); | 975 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); |
| 947 EXPECT_EQ(6, m_queue->fullUploadSize()); | 976 EXPECT_EQ(6, m_queue->fullUploadSize()); |
| 948 EXPECT_EQ(0, m_queue->partialUploadSize()); | 977 EXPECT_EQ(0, m_queue->partialUploadSize()); |
| 949 updateTextures(); | 978 updateTextures(); |
| 950 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); | 979 EXPECT_EQ(6, layer->fakeLayerUpdater()->updateCount()); |
| 951 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 980 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 952 layer->fakeLayerUpdater()->clearUpdateCount(); | 981 layer->fakeLayerUpdater()->clearUpdateCount(); |
| 953 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 982 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 954 } | 983 } |
| 955 m_layerTreeHost->commitComplete(); | 984 m_layerTreeHost->commitComplete(); |
| 956 | 985 |
| 957 // Partial update of 4 tiles. | 986 // Partial update of 4 tiles. |
| 958 layer->invalidateContentRect(gfx::Rect(50, 50, 100, 100)); | 987 layer->invalidateContentRect(gfx::Rect(50, 50, 100, 100)); |
| 959 { | 988 { |
| 960 ScopedFakeTiledLayerImpl layerImpl(m_hostImpl->activeTree(), 1); | 989 scoped_ptr<FakeTiledLayerImpl> layerImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), 1)); |
| 961 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); | 990 m_layerTreeHost->updateLayers(*m_queue.get(), std::numeric_limits<size_t
>::max()); |
| 962 EXPECT_EQ(0, m_queue->fullUploadSize()); | 991 EXPECT_EQ(0, m_queue->fullUploadSize()); |
| 963 EXPECT_EQ(4, m_queue->partialUploadSize()); | 992 EXPECT_EQ(4, m_queue->partialUploadSize()); |
| 964 updateTextures(); | 993 updateTextures(); |
| 965 EXPECT_EQ(4, layer->fakeLayerUpdater()->updateCount()); | 994 EXPECT_EQ(4, layer->fakeLayerUpdater()->updateCount()); |
| 966 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 995 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 967 layer->fakeLayerUpdater()->clearUpdateCount(); | 996 layer->fakeLayerUpdater()->clearUpdateCount(); |
| 968 layerPushPropertiesTo(layer.get(), layerImpl.get()); | 997 layerPushPropertiesTo(layer.get(), layerImpl.get()); |
| 969 } | 998 } |
| 970 m_layerTreeHost->commitComplete(); | 999 m_layerTreeHost->commitComplete(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 986 layer->setTexturePriorities(m_priorityCalculator); | 1015 layer->setTexturePriorities(m_priorityCalculator); |
| 987 m_resourceManager->prioritizeTextures(); | 1016 m_resourceManager->prioritizeTextures(); |
| 988 layer->update(*m_queue.get(), 0, m_stats); | 1017 layer->update(*m_queue.get(), 0, m_stats); |
| 989 EXPECT_EQ(2, layer->fakeLayerUpdater()->updateCount()); | 1018 EXPECT_EQ(2, layer->fakeLayerUpdater()->updateCount()); |
| 990 } | 1019 } |
| 991 | 1020 |
| 992 TEST_F(TiledLayerTest, tilesPaintedWithOcclusion) | 1021 TEST_F(TiledLayerTest, tilesPaintedWithOcclusion) |
| 993 { | 1022 { |
| 994 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 1023 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 995 TestOcclusionTracker occluded; | 1024 TestOcclusionTracker occluded; |
| 1025 m_occlusion = &occluded; |
| 996 | 1026 |
| 997 // The tile size is 100x100. | 1027 // The tile size is 100x100. |
| 998 | 1028 |
| 999 layer->setBounds(gfx::Size(600, 600)); | 1029 layer->setBounds(gfx::Size(600, 600)); |
| 1030 calcDrawProps(layer); |
| 1000 | 1031 |
| 1001 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); | 1032 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); |
| 1002 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->contentBounds()); | 1033 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->contentBounds()); |
| 1003 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); | 1034 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); |
| 1004 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1035 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1005 | 1036 |
| 1006 layer->setTexturePriorities(m_priorityCalculator); | 1037 layer->setTexturePriorities(m_priorityCalculator); |
| 1007 m_resourceManager->prioritizeTextures(); | 1038 m_resourceManager->prioritizeTextures(); |
| 1008 layer->update(*m_queue.get(), &occluded, m_stats); | 1039 layer->update(*m_queue.get(), &occluded, m_stats); |
| 1009 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); | 1040 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1036 | 1067 |
| 1037 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 1068 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 1038 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000 +
340000 + 360000, 1); | 1069 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000 +
340000 + 360000, 1); |
| 1039 EXPECT_EQ(3 + 2, occluded.overdrawMetrics().tilesCulledForUpload()); | 1070 EXPECT_EQ(3 + 2, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 1040 } | 1071 } |
| 1041 | 1072 |
| 1042 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndVisiblityConstraints) | 1073 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndVisiblityConstraints) |
| 1043 { | 1074 { |
| 1044 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 1075 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 1045 TestOcclusionTracker occluded; | 1076 TestOcclusionTracker occluded; |
| 1077 m_occlusion = &occluded; |
| 1046 | 1078 |
| 1047 // The tile size is 100x100. | 1079 // The tile size is 100x100. |
| 1048 | 1080 |
| 1049 layer->setBounds(gfx::Size(600, 600)); | 1081 layer->setBounds(gfx::Size(600, 600)); |
| 1082 calcDrawProps(layer); |
| 1050 | 1083 |
| 1051 // The partially occluded tiles (by the 150 occlusion height) are visible be
yond the occlusion, so not culled. | 1084 // The partially occluded tiles (by the 150 occlusion height) are visible be
yond the occlusion, so not culled. |
| 1052 occluded.setOcclusion(gfx::Rect(200, 200, 300, 150)); | 1085 occluded.setOcclusion(gfx::Rect(200, 200, 300, 150)); |
| 1053 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 600, 360); | 1086 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 600, 360); |
| 1054 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 600, 360); | 1087 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 600, 360); |
| 1055 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1088 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1056 | 1089 |
| 1057 layer->setTexturePriorities(m_priorityCalculator); | 1090 layer->setTexturePriorities(m_priorityCalculator); |
| 1058 m_resourceManager->prioritizeTextures(); | 1091 m_resourceManager->prioritizeTextures(); |
| 1059 layer->update(*m_queue.get(), &occluded, m_stats); | 1092 layer->update(*m_queue.get(), &occluded, m_stats); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 1127 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 1095 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 210000 +
180000 + 180000, 1); | 1128 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 210000 +
180000 + 180000, 1); |
| 1096 EXPECT_EQ(3 + 6 + 6, occluded.overdrawMetrics().tilesCulledForUpload()); | 1129 EXPECT_EQ(3 + 6 + 6, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 1097 | 1130 |
| 1098 } | 1131 } |
| 1099 | 1132 |
| 1100 TEST_F(TiledLayerTest, tilesNotPaintedWithoutInvalidation) | 1133 TEST_F(TiledLayerTest, tilesNotPaintedWithoutInvalidation) |
| 1101 { | 1134 { |
| 1102 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 1135 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 1103 TestOcclusionTracker occluded; | 1136 TestOcclusionTracker occluded; |
| 1137 m_occlusion = &occluded; |
| 1104 | 1138 |
| 1105 // The tile size is 100x100. | 1139 // The tile size is 100x100. |
| 1106 | 1140 |
| 1107 layer->setBounds(gfx::Size(600, 600)); | 1141 layer->setBounds(gfx::Size(600, 600)); |
| 1142 calcDrawProps(layer); |
| 1108 | 1143 |
| 1109 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); | 1144 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); |
| 1110 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 600, 600); | 1145 layer->drawProperties().drawable_content_rect = gfx::Rect(0, 0, 600, 600); |
| 1111 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 600, 600); | 1146 layer->drawProperties().visible_content_rect = gfx::Rect(0, 0, 600, 600); |
| 1112 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1147 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1113 layer->setTexturePriorities(m_priorityCalculator); | 1148 layer->setTexturePriorities(m_priorityCalculator); |
| 1114 m_resourceManager->prioritizeTextures(); | 1149 m_resourceManager->prioritizeTextures(); |
| 1115 layer->update(*m_queue.get(), &occluded, m_stats); | 1150 layer->update(*m_queue.get(), &occluded, m_stats); |
| 1116 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); | 1151 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); |
| 1117 { | 1152 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1132 | 1167 |
| 1133 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 1168 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 1134 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000,
1); | 1169 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000,
1); |
| 1135 EXPECT_EQ(6, occluded.overdrawMetrics().tilesCulledForUpload()); | 1170 EXPECT_EQ(6, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 1136 } | 1171 } |
| 1137 | 1172 |
| 1138 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndTransforms) | 1173 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndTransforms) |
| 1139 { | 1174 { |
| 1140 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 1175 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 1141 TestOcclusionTracker occluded; | 1176 TestOcclusionTracker occluded; |
| 1177 m_occlusion = &occluded; |
| 1142 | 1178 |
| 1143 // The tile size is 100x100. | 1179 // The tile size is 100x100. |
| 1144 | 1180 |
| 1145 // This makes sure the painting works when the occluded region (in screen sp
ace) | 1181 // This makes sure the painting works when the occluded region (in screen sp
ace) |
| 1146 // is transformed differently than the layer. | 1182 // is transformed differently than the layer. |
| 1147 layer->setBounds(gfx::Size(600, 600)); | 1183 layer->setBounds(gfx::Size(600, 600)); |
| 1184 calcDrawProps(layer); |
| 1148 gfx::Transform screenTransform; | 1185 gfx::Transform screenTransform; |
| 1149 screenTransform.Scale(0.5, 0.5); | 1186 screenTransform.Scale(0.5, 0.5); |
| 1150 layer->drawProperties().screen_space_transform = screenTransform; | 1187 layer->drawProperties().screen_space_transform = screenTransform; |
| 1151 layer->drawProperties().target_space_transform = screenTransform; | 1188 layer->drawProperties().target_space_transform = screenTransform; |
| 1152 | 1189 |
| 1153 occluded.setOcclusion(gfx::Rect(100, 100, 150, 50)); | 1190 occluded.setOcclusion(gfx::Rect(100, 100, 150, 50)); |
| 1154 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->contentBounds()); | 1191 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->contentBounds()); |
| 1155 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); | 1192 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); |
| 1156 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1193 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| 1157 layer->setTexturePriorities(m_priorityCalculator); | 1194 layer->setTexturePriorities(m_priorityCalculator); |
| 1158 m_resourceManager->prioritizeTextures(); | 1195 m_resourceManager->prioritizeTextures(); |
| 1159 layer->update(*m_queue.get(), &occluded, m_stats); | 1196 layer->update(*m_queue.get(), &occluded, m_stats); |
| 1160 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); | 1197 EXPECT_EQ(36-3, layer->fakeLayerUpdater()->updateCount()); |
| 1161 | 1198 |
| 1162 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); | 1199 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedOpaque(), 0, 1); |
| 1163 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000,
1); | 1200 EXPECT_NEAR(occluded.overdrawMetrics().pixelsUploadedTranslucent(), 330000,
1); |
| 1164 EXPECT_EQ(3, occluded.overdrawMetrics().tilesCulledForUpload()); | 1201 EXPECT_EQ(3, occluded.overdrawMetrics().tilesCulledForUpload()); |
| 1165 } | 1202 } |
| 1166 | 1203 |
| 1167 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndScaling) | 1204 TEST_F(TiledLayerTest, tilesPaintedWithOcclusionAndScaling) |
| 1168 { | 1205 { |
| 1169 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); | 1206 scoped_refptr<FakeTiledLayer> layer = make_scoped_refptr(new FakeTiledLayer(
m_resourceManager.get())); |
| 1170 TestOcclusionTracker occluded; | 1207 TestOcclusionTracker occluded; |
| 1208 m_occlusion = &occluded; |
| 1171 | 1209 |
| 1172 // The tile size is 100x100. | 1210 // The tile size is 100x100. |
| 1173 | 1211 |
| 1174 // This makes sure the painting works when the content space is scaled to | 1212 // This makes sure the painting works when the content space is scaled to |
| 1175 // a different layer space. In this case tiles are scaled to be 200x200 | 1213 // a different layer space. In this case tiles are scaled to be 200x200 |
| 1176 // pixels, which means none should be occluded. | 1214 // pixels, which means none should be occluded. |
| 1177 layer->updateContentsScale(0.5); | 1215 layer->setBounds(gfx::Size(600, 600)); |
| 1216 layer->setRasterScale(0.5); |
| 1217 calcDrawProps(layer); |
| 1178 EXPECT_FLOAT_EQ(layer->contentsScaleX(), layer->contentsScaleY()); | 1218 EXPECT_FLOAT_EQ(layer->contentsScaleX(), layer->contentsScaleY()); |
| 1179 layer->setBounds(gfx::Size(600, 600)); | |
| 1180 gfx::Transform drawTransform; | 1219 gfx::Transform drawTransform; |
| 1181 double invScaleFactor = 1 / layer->contentsScaleX(); | 1220 double invScaleFactor = 1 / layer->contentsScaleX(); |
| 1182 drawTransform.Scale(invScaleFactor, invScaleFactor); | 1221 drawTransform.Scale(invScaleFactor, invScaleFactor); |
| 1183 layer->drawProperties().target_space_transform = drawTransform; | 1222 layer->drawProperties().target_space_transform = drawTransform; |
| 1184 layer->drawProperties().screen_space_transform = drawTransform; | 1223 layer->drawProperties().screen_space_transform = drawTransform; |
| 1185 | 1224 |
| 1186 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); | 1225 occluded.setOcclusion(gfx::Rect(200, 200, 300, 100)); |
| 1187 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->bounds()); | 1226 layer->drawProperties().drawable_content_rect = gfx::Rect(gfx::Point(), laye
r->bounds()); |
| 1188 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); | 1227 layer->drawProperties().visible_content_rect = gfx::Rect(gfx::Point(), layer
->contentBounds()); |
| 1189 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); | 1228 layer->invalidateContentRect(gfx::Rect(0, 0, 600, 600)); |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 updateTextures(); | 1469 updateTextures(); |
| 1431 EXPECT_EQ(6, root->fakeLayerUpdater()->updateCount()); | 1470 EXPECT_EQ(6, root->fakeLayerUpdater()->updateCount()); |
| 1432 EXPECT_EQ(3, child->fakeLayerUpdater()->updateCount()); | 1471 EXPECT_EQ(3, child->fakeLayerUpdater()->updateCount()); |
| 1433 EXPECT_EQ(3, child2->fakeLayerUpdater()->updateCount()); | 1472 EXPECT_EQ(3, child2->fakeLayerUpdater()->updateCount()); |
| 1434 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 1473 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 1435 | 1474 |
| 1436 root->fakeLayerUpdater()->clearUpdateCount(); | 1475 root->fakeLayerUpdater()->clearUpdateCount(); |
| 1437 child->fakeLayerUpdater()->clearUpdateCount(); | 1476 child->fakeLayerUpdater()->clearUpdateCount(); |
| 1438 child2->fakeLayerUpdater()->clearUpdateCount(); | 1477 child2->fakeLayerUpdater()->clearUpdateCount(); |
| 1439 | 1478 |
| 1440 ScopedFakeTiledLayerImpl rootImpl(m_hostImpl->activeTree(), root->id()); | 1479 scoped_ptr<FakeTiledLayerImpl> rootImpl = make_scoped_ptr(new FakeTiledL
ayerImpl(m_hostImpl->activeTree(), root->id())); |
| 1441 ScopedFakeTiledLayerImpl childImpl(m_hostImpl->activeTree(), child->id()
); | 1480 scoped_ptr<FakeTiledLayerImpl> childImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), child->id())); |
| 1442 ScopedFakeTiledLayerImpl child2Impl(m_hostImpl->activeTree(), child2->id
()); | 1481 scoped_ptr<FakeTiledLayerImpl> child2Impl = make_scoped_ptr(new FakeTile
dLayerImpl(m_hostImpl->activeTree(), child2->id())); |
| 1443 layerPushPropertiesTo(root.get(), rootImpl.get()); | 1482 layerPushPropertiesTo(root.get(), rootImpl.get()); |
| 1444 layerPushPropertiesTo(child.get(), childImpl.get()); | 1483 layerPushPropertiesTo(child.get(), childImpl.get()); |
| 1445 layerPushPropertiesTo(child2.get(), child2Impl.get()); | 1484 layerPushPropertiesTo(child2.get(), child2Impl.get()); |
| 1446 | 1485 |
| 1447 for (unsigned i = 0; i < 3; ++i) { | 1486 for (unsigned i = 0; i < 3; ++i) { |
| 1448 for (unsigned j = 0; j < 2; ++j) | 1487 for (unsigned j = 0; j < 2; ++j) |
| 1449 EXPECT_TRUE(rootImpl->hasResourceIdForTileAt(i, j)); | 1488 EXPECT_TRUE(rootImpl->hasResourceIdForTileAt(i, j)); |
| 1450 EXPECT_TRUE(childImpl->hasResourceIdForTileAt(i, 0)); | 1489 EXPECT_TRUE(childImpl->hasResourceIdForTileAt(i, 0)); |
| 1451 EXPECT_TRUE(child2Impl->hasResourceIdForTileAt(i, 0)); | 1490 EXPECT_TRUE(child2Impl->hasResourceIdForTileAt(i, 0)); |
| 1452 } | 1491 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1465 updateTextures(); | 1504 updateTextures(); |
| 1466 EXPECT_EQ(6, root->fakeLayerUpdater()->updateCount()); | 1505 EXPECT_EQ(6, root->fakeLayerUpdater()->updateCount()); |
| 1467 EXPECT_EQ(0, child->fakeLayerUpdater()->updateCount()); | 1506 EXPECT_EQ(0, child->fakeLayerUpdater()->updateCount()); |
| 1468 EXPECT_EQ(0, child2->fakeLayerUpdater()->updateCount()); | 1507 EXPECT_EQ(0, child2->fakeLayerUpdater()->updateCount()); |
| 1469 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 1508 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 1470 | 1509 |
| 1471 root->fakeLayerUpdater()->clearUpdateCount(); | 1510 root->fakeLayerUpdater()->clearUpdateCount(); |
| 1472 child->fakeLayerUpdater()->clearUpdateCount(); | 1511 child->fakeLayerUpdater()->clearUpdateCount(); |
| 1473 child2->fakeLayerUpdater()->clearUpdateCount(); | 1512 child2->fakeLayerUpdater()->clearUpdateCount(); |
| 1474 | 1513 |
| 1475 ScopedFakeTiledLayerImpl rootImpl(m_hostImpl->activeTree(), root->id()); | 1514 scoped_ptr<FakeTiledLayerImpl> rootImpl = make_scoped_ptr(new FakeTiledL
ayerImpl(m_hostImpl->activeTree(), root->id())); |
| 1476 ScopedFakeTiledLayerImpl childImpl(m_hostImpl->activeTree(), child->id()
); | 1515 scoped_ptr<FakeTiledLayerImpl> childImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), child->id())); |
| 1477 ScopedFakeTiledLayerImpl child2Impl(m_hostImpl->activeTree(), child2->id
()); | 1516 scoped_ptr<FakeTiledLayerImpl> child2Impl = make_scoped_ptr(new FakeTile
dLayerImpl(m_hostImpl->activeTree(), child2->id())); |
| 1478 layerPushPropertiesTo(root.get(), rootImpl.get()); | 1517 layerPushPropertiesTo(root.get(), rootImpl.get()); |
| 1479 layerPushPropertiesTo(child.get(), childImpl.get()); | 1518 layerPushPropertiesTo(child.get(), childImpl.get()); |
| 1480 layerPushPropertiesTo(child2.get(), child2Impl.get()); | 1519 layerPushPropertiesTo(child2.get(), child2Impl.get()); |
| 1481 | 1520 |
| 1482 for (unsigned i = 0; i < 3; ++i) { | 1521 for (unsigned i = 0; i < 3; ++i) { |
| 1483 for (unsigned j = 0; j < 2; ++j) | 1522 for (unsigned j = 0; j < 2; ++j) |
| 1484 EXPECT_TRUE(rootImpl->hasResourceIdForTileAt(i, j)); | 1523 EXPECT_TRUE(rootImpl->hasResourceIdForTileAt(i, j)); |
| 1485 EXPECT_FALSE(childImpl->hasResourceIdForTileAt(i, 0)); | 1524 EXPECT_FALSE(childImpl->hasResourceIdForTileAt(i, 0)); |
| 1486 EXPECT_FALSE(child2Impl->hasResourceIdForTileAt(i, 0)); | 1525 EXPECT_FALSE(child2Impl->hasResourceIdForTileAt(i, 0)); |
| 1487 } | 1526 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1501 updateTextures(); | 1540 updateTextures(); |
| 1502 EXPECT_EQ(0, root->fakeLayerUpdater()->updateCount()); | 1541 EXPECT_EQ(0, root->fakeLayerUpdater()->updateCount()); |
| 1503 EXPECT_EQ(0, child->fakeLayerUpdater()->updateCount()); | 1542 EXPECT_EQ(0, child->fakeLayerUpdater()->updateCount()); |
| 1504 EXPECT_EQ(0, child2->fakeLayerUpdater()->updateCount()); | 1543 EXPECT_EQ(0, child2->fakeLayerUpdater()->updateCount()); |
| 1505 EXPECT_FALSE(m_queue->hasMoreUpdates()); | 1544 EXPECT_FALSE(m_queue->hasMoreUpdates()); |
| 1506 | 1545 |
| 1507 root->fakeLayerUpdater()->clearUpdateCount(); | 1546 root->fakeLayerUpdater()->clearUpdateCount(); |
| 1508 child->fakeLayerUpdater()->clearUpdateCount(); | 1547 child->fakeLayerUpdater()->clearUpdateCount(); |
| 1509 child2->fakeLayerUpdater()->clearUpdateCount(); | 1548 child2->fakeLayerUpdater()->clearUpdateCount(); |
| 1510 | 1549 |
| 1511 ScopedFakeTiledLayerImpl rootImpl(m_hostImpl->activeTree(), root->id()); | 1550 scoped_ptr<FakeTiledLayerImpl> rootImpl = make_scoped_ptr(new FakeTiledL
ayerImpl(m_hostImpl->activeTree(), root->id())); |
| 1512 ScopedFakeTiledLayerImpl childImpl(m_hostImpl->activeTree(), child->id()
); | 1551 scoped_ptr<FakeTiledLayerImpl> childImpl = make_scoped_ptr(new FakeTiled
LayerImpl(m_hostImpl->activeTree(), child->id())); |
| 1513 ScopedFakeTiledLayerImpl child2Impl(m_hostImpl->activeTree(), child2->id
()); | 1552 scoped_ptr<FakeTiledLayerImpl> child2Impl = make_scoped_ptr(new FakeTile
dLayerImpl(m_hostImpl->activeTree(), child2->id())); |
| 1514 layerPushPropertiesTo(root.get(), rootImpl.get()); | 1553 layerPushPropertiesTo(root.get(), rootImpl.get()); |
| 1515 layerPushPropertiesTo(child.get(), childImpl.get()); | 1554 layerPushPropertiesTo(child.get(), childImpl.get()); |
| 1516 layerPushPropertiesTo(child2.get(), child2Impl.get()); | 1555 layerPushPropertiesTo(child2.get(), child2Impl.get()); |
| 1517 | 1556 |
| 1518 for (unsigned i = 0; i < 3; ++i) { | 1557 for (unsigned i = 0; i < 3; ++i) { |
| 1519 for (unsigned j = 0; j < 2; ++j) | 1558 for (unsigned j = 0; j < 2; ++j) |
| 1520 EXPECT_FALSE(rootImpl->hasResourceIdForTileAt(i, j)); | 1559 EXPECT_FALSE(rootImpl->hasResourceIdForTileAt(i, j)); |
| 1521 EXPECT_FALSE(childImpl->hasResourceIdForTileAt(i, 0)); | 1560 EXPECT_FALSE(childImpl->hasResourceIdForTileAt(i, 0)); |
| 1522 EXPECT_FALSE(child2Impl->hasResourceIdForTileAt(i, 0)); | 1561 EXPECT_FALSE(child2Impl->hasResourceIdForTileAt(i, 0)); |
| 1523 } | 1562 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1624 | 1663 |
| 1625 // Invalidate the entire layer in layer space. When painting, the rect given
to webkit should match the layer's bounds. | 1664 // Invalidate the entire layer in layer space. When painting, the rect given
to webkit should match the layer's bounds. |
| 1626 layer->setNeedsDisplayRect(layerRect); | 1665 layer->setNeedsDisplayRect(layerRect); |
| 1627 layer->update(*m_queue.get(), 0, m_stats); | 1666 layer->update(*m_queue.get(), 0, m_stats); |
| 1628 | 1667 |
| 1629 EXPECT_RECT_EQ(layerRect, layer->trackingLayerPainter()->paintedRect()); | 1668 EXPECT_RECT_EQ(layerRect, layer->trackingLayerPainter()->paintedRect()); |
| 1630 } | 1669 } |
| 1631 | 1670 |
| 1632 } // namespace | 1671 } // namespace |
| 1633 } // namespace cc | 1672 } // namespace cc |
| OLD | NEW |