summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
Diffstat (limited to 'cc')
-rw-r--r--cc/delegated_renderer_layer.cc21
-rw-r--r--cc/delegated_renderer_layer.h2
-rw-r--r--cc/delegated_renderer_layer_impl.cc19
-rw-r--r--cc/layer_tree_host_unittest_delegated.cc109
4 files changed, 75 insertions, 76 deletions
diff --git a/cc/delegated_renderer_layer.cc b/cc/delegated_renderer_layer.cc
index f1e10a5..30b9f9b 100644
--- a/cc/delegated_renderer_layer.cc
+++ b/cc/delegated_renderer_layer.cc
@@ -25,6 +25,10 @@ scoped_ptr<LayerImpl> DelegatedRendererLayer::createLayerImpl(
tree_impl, m_layerId).PassAs<LayerImpl>();
}
+bool DelegatedRendererLayer::drawsContent() const {
+ return !frame_size_.IsEmpty();
+}
+
void DelegatedRendererLayer::pushPropertiesTo(LayerImpl* impl) {
Layer::pushPropertiesTo(impl);
@@ -33,10 +37,16 @@ void DelegatedRendererLayer::pushPropertiesTo(LayerImpl* impl) {
delegated_impl->SetDisplaySize(display_size_);
- if (frame_data_)
- delegated_impl->SetFrameData(frame_data_.Pass(), damage_in_frame_);
-
- damage_in_frame_ = gfx::RectF();
+ if (frame_data_) {
+ if (frame_size_.IsEmpty()) {
+ scoped_ptr<DelegatedFrameData> empty_frame(new DelegatedFrameData);
+ delegated_impl->SetFrameData(empty_frame.Pass(), gfx::Rect());
+ } else {
+ delegated_impl->SetFrameData(frame_data_.Pass(), damage_in_frame_);
+ }
+ frame_data_.reset();
+ damage_in_frame_ = gfx::RectF();
+ }
}
void DelegatedRendererLayer::SetDisplaySize(gfx::Size size) {
@@ -52,6 +62,9 @@ void DelegatedRendererLayer::SetFrameData(
if (!frame_data_->render_pass_list.empty()) {
RenderPass* root_pass = frame_data_->render_pass_list.back();
damage_in_frame_.Union(root_pass->damage_rect);
+ frame_size_ = root_pass->output_rect.size();
+ } else {
+ frame_size_ = gfx::Size();
}
setNeedsCommit();
}
diff --git a/cc/delegated_renderer_layer.h b/cc/delegated_renderer_layer.h
index f8c847d..8266b63 100644
--- a/cc/delegated_renderer_layer.h
+++ b/cc/delegated_renderer_layer.h
@@ -18,6 +18,7 @@ class CC_EXPORT DelegatedRendererLayer : public Layer {
virtual scoped_ptr<LayerImpl> createLayerImpl(LayerTreeImpl* tree_impl)
OVERRIDE;
virtual void pushPropertiesTo(LayerImpl* impl) OVERRIDE;
+ virtual bool drawsContent() const OVERRIDE;
// Set the size at which the frame should be displayed, with the origin at the
// layer's origin. This must always contain at least the layer's bounds. A
@@ -34,6 +35,7 @@ class CC_EXPORT DelegatedRendererLayer : public Layer {
private:
scoped_ptr<DelegatedFrameData> frame_data_;
gfx::RectF damage_in_frame_;
+ gfx::Size frame_size_;
gfx::Size display_size_;
};
diff --git a/cc/delegated_renderer_layer_impl.cc b/cc/delegated_renderer_layer_impl.cc
index a8cdd54..db32adb 100644
--- a/cc/delegated_renderer_layer_impl.cc
+++ b/cc/delegated_renderer_layer_impl.cc
@@ -44,25 +44,14 @@ void DelegatedRendererLayerImpl::SetFrameData(
// Display size is already set so we can compute what the damage rect
// will be in layer space.
- RenderPass* new_root_pass = frame_data->render_pass_list.empty() ?
- NULL : frame_data->render_pass_list.back();
- bool new_frame_is_empty = !new_root_pass;
-
- RenderPass* old_root_pass = render_passes_in_draw_order_.empty() ?
- NULL : render_passes_in_draw_order_.back();
- bool old_frame_is_empty = !old_root_pass;
-
- gfx::RectF damage_in_layer;
- if (new_frame_is_empty) {
- if (!old_frame_is_empty)
- damage_in_layer = gfx::Rect(bounds());
- } else {
+ if (!frame_data->render_pass_list.empty()) {
+ RenderPass* new_root_pass = frame_data->render_pass_list.back();
DCHECK(!new_root_pass->output_rect.IsEmpty());
- damage_in_layer = MathUtil::mapClippedRect(
+ gfx::RectF damage_in_layer = MathUtil::mapClippedRect(
DelegatedFrameToLayerSpaceTransform(new_root_pass->output_rect.size()),
damage_in_frame);
+ setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
}
- setUpdateRect(gfx::UnionRects(updateRect(), damage_in_layer));
// TODO(danakj): Convert the resource ids the render passes and return data
// for a frame ack.
diff --git a/cc/layer_tree_host_unittest_delegated.cc b/cc/layer_tree_host_unittest_delegated.cc
index 6fe3f8f..649a0d6 100644
--- a/cc/layer_tree_host_unittest_delegated.cc
+++ b/cc/layer_tree_host_unittest_delegated.cc
@@ -17,31 +17,6 @@ namespace {
// These tests deal with delegated renderer layers.
class LayerTreeHostDelegatedTest : public ThreadedTest {
protected:
- class TestDelegatedRendererLayer : public DelegatedRendererLayer {
- public:
- static scoped_refptr<DelegatedRendererLayer> Create(
- LayerTreeHostDelegatedTest* test) {
- return new TestDelegatedRendererLayer(test);
- }
-
- virtual void update(ResourceUpdateQueue& queue,
- const OcclusionTracker* occlusion,
- RenderingStats* stats) OVERRIDE {
- DelegatedRendererLayer::update(queue, occlusion, stats);
- test_->UpdateDelegatedLayer(this);
-
- }
- protected:
- explicit TestDelegatedRendererLayer(LayerTreeHostDelegatedTest* test)
- : DelegatedRendererLayer(),
- test_(test) {}
- virtual ~TestDelegatedRendererLayer() {}
- LayerTreeHostDelegatedTest* test_;
- };
-
- // Called by each delegated renderer layer when update is called on it.
- virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer) {}
-
scoped_ptr<DelegatedFrameData> CreateFrameData(gfx::Rect root_output_rect,
gfx::Rect root_damage_rect) {
scoped_ptr<DelegatedFrameData> frame(new DelegatedFrameData);
@@ -69,7 +44,7 @@ class LayerTreeHostDelegatedTestCaseSingleDelegatedLayer
root_->setAnchorPoint(gfx::PointF());
root_->setBounds(gfx::Size(10, 10));
- delegated_ = TestDelegatedRendererLayer::Create(this);
+ delegated_ = DelegatedRendererLayer::Create();
delegated_->setAnchorPoint(gfx::PointF());
delegated_->setBounds(gfx::Size(10, 10));
delegated_->setIsDrawable(true);
@@ -98,12 +73,11 @@ class LayerTreeHostDelegatedTestCreateChildId
num_activates_(0),
did_reset_child_id_(false) {}
- virtual void UpdateDelegatedLayer(TestDelegatedRendererLayer* layer)
- OVERRIDE {
+ virtual void didCommit() OVERRIDE {
if (testEnded())
return;
- layer->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
- gfx::Rect(0, 0, 1, 1)));
+ delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
+ gfx::Rect(0, 0, 1, 1)));
}
virtual void treeActivatedOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
@@ -113,14 +87,14 @@ class LayerTreeHostDelegatedTestCreateChildId
++num_activates_;
switch(num_activates_) {
- case 1:
+ case 2:
EXPECT_TRUE(delegated_impl->child_id());
EXPECT_FALSE(did_reset_child_id_);
host_impl->resourceProvider()->graphicsContext3D()->loseContextCHROMIUM(
GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
break;
- case 2:
+ case 3:
EXPECT_TRUE(delegated_impl->child_id());
EXPECT_TRUE(did_reset_child_id_);
endTest();
@@ -132,14 +106,14 @@ class LayerTreeHostDelegatedTestCreateChildId
bool success) OVERRIDE {
EXPECT_TRUE(success);
- if (!num_activates_)
+ if (num_activates_ < 2)
return;
LayerImpl* root_impl = host_impl->activeTree()->RootLayer();
DelegatedRendererLayerImpl* delegated_impl =
static_cast<DelegatedRendererLayerImpl*>(root_impl->children()[0]);
- EXPECT_EQ(1, num_activates_);
+ EXPECT_EQ(2, num_activates_);
EXPECT_FALSE(delegated_impl->child_id());
did_reset_child_id_ = true;
}
@@ -164,6 +138,12 @@ class LayerTreeHostDelegatedTestLayerUsesFrameDamage
int next_source_frame_number = m_layerTreeHost->commitNumber();
switch (next_source_frame_number) {
case 1:
+ // The first time the layer gets a frame the whole layer should be
+ // damaged.
+ delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 1, 1),
+ gfx::Rect(0, 0, 1, 1)));
+ break;
+ case 2:
// Should create a total amount of gfx::Rect(2, 2, 10, 6) damage.
// The frame size is 20x20 while the layer is 10x10, so this should
// produce a gfx::Rect(1, 1, 5, 3) damage rect.
@@ -172,54 +152,59 @@ class LayerTreeHostDelegatedTestLayerUsesFrameDamage
delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 20, 20),
gfx::Rect(7, 2, 5, 6)));
break;
- case 2:
+ case 3:
// Should create zero damage.
m_layerTreeHost->setNeedsCommit();
break;
- case 3:
+ case 4:
// Should damage the full viewport.
delegated_->setBounds(gfx::Size(2, 2));
break;
- case 4:
+ case 5:
// Should create zero damage.
m_layerTreeHost->setNeedsCommit();
break;
- case 5:
+ case 6:
// Should damage the full layer.
delegated_->setBounds(gfx::Size(6, 6));
delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
gfx::Rect(1, 1, 2, 2)));
break;
- case 6:
+ case 7:
// Should create zero damage.
m_layerTreeHost->setNeedsCommit();
break;
- case 7:
+ case 8:
// Should damage the full layer.
delegated_->SetDisplaySize(gfx::Size(10, 10));
break;
- case 8:
+ case 9:
// Should create zero damage.
m_layerTreeHost->setNeedsCommit();
break;
- case 9:
+ case 10:
// Setting an empty frame should damage the whole layer the
// first time.
delegated_->SetFrameData(CreateEmptyFrameData());
break;
- case 10:
+ case 11:
// Setting an empty frame shouldn't damage anything after the
// first time.
delegated_->SetFrameData(CreateEmptyFrameData());
break;
- case 11:
+ case 12:
+ // Having valid content to display agains should damage the whole layer.
+ delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 10, 10),
+ gfx::Rect(5, 5, 1, 1)));
+ break;
+ case 13:
// Should create gfx::Rect(1, 1, 2, 2) of damage. The frame size is
// 5x5 and the display size is now set to 10x10, so this should result
// in a gfx::Rect(2, 2, 4, 4) damage rect.
delegated_->SetFrameData(CreateFrameData(gfx::Rect(0, 0, 5, 5),
gfx::Rect(1, 1, 2, 2)));
break;
- case 12:
+ case 14:
// Should create zero damage.
m_layerTreeHost->setNeedsCommit();
break;
@@ -239,54 +224,64 @@ class LayerTreeHostDelegatedTestLayerUsesFrameDamage
switch (host_impl->activeTree()->source_frame_number()) {
case 0:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
+ // Before the layer has a frame to display it should not
+ // be visible at all, and not damage anything.
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 1:
- EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 2:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(1.f, 1.f, 5.f, 3.f).ToString(),
damage_rect.ToString());
break;
case 3:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 4:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 10.f, 10.f).ToString(),
damage_rect.ToString());
break;
case 5:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 6:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
damage_rect.ToString());
break;
case 7:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 8:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
damage_rect.ToString());
break;
case 9:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 10:
- EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
damage_rect.ToString());
break;
case 11:
- EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
break;
case 12:
+ EXPECT_EQ(gfx::RectF(0.f, 0.f, 6.f, 6.f).ToString(),
+ damage_rect.ToString());
+ break;
+ case 13:
+ EXPECT_EQ(gfx::RectF(2.f, 2.f, 4.f, 4.f).ToString(),
+ damage_rect.ToString());
+ break;
+ case 14:
EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.f, 0.f).ToString(),
damage_rect.ToString());
endTest();