summaryrefslogtreecommitdiffstats
path: root/cc/layers
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-27 02:36:46 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-27 02:36:46 +0000
commit1898d322d53f765e2efe7311c8764dea40dacf46 (patch)
treed2963619bdf5a95fd61eda0abe020af046127e32 /cc/layers
parentd57b95ad98f4e88abae8621cc0a83735101e77e0 (diff)
downloadchromium_src-1898d322d53f765e2efe7311c8764dea40dacf46.zip
chromium_src-1898d322d53f765e2efe7311c8764dea40dacf46.tar.gz
chromium_src-1898d322d53f765e2efe7311c8764dea40dacf46.tar.bz2
cc: Modify RenderPass::transform_to_root_target in DRLayerImpl.
DelegatedRendererLayerImpl needs to transform everything in its output by the transforms with which the layer itself will be drawn. It was transforming the contents of all its quads, but missed transforming its render passes. Each RenderPass::transform_to_root_target needs to have the DelegatedRendererLayerImpl's screen space transform included in it. Tests: DelegatedRendererLayerImplTestSimple.RenderPassTransformIsModified R=enne BUG=311315 Review URL: https://codereview.chromium.org/45543002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@231236 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layers')
-rw-r--r--cc/layers/delegated_renderer_layer_impl.cc14
-rw-r--r--cc/layers/delegated_renderer_layer_impl_unittest.cc63
2 files changed, 60 insertions, 17 deletions
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
index 35bd0b7..25a27af 100644
--- a/cc/layers/delegated_renderer_layer_impl.cc
+++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -237,6 +237,13 @@ void DelegatedRendererLayerImpl::AppendContributingRenderPasses(
RenderPassSink* render_pass_sink) {
DCHECK(HasContributingDelegatedRenderPasses());
+ const RenderPass* root_delegated_render_pass =
+ render_passes_in_draw_order_.back();
+ gfx::Size frame_size = root_delegated_render_pass->output_rect.size();
+ gfx::Transform delegated_frame_to_root_transform =
+ screen_space_transform() *
+ DelegatedFrameToLayerSpaceTransform(frame_size);
+
for (size_t i = 0; i < render_passes_in_draw_order_.size() - 1; ++i) {
RenderPass::Id output_render_pass_id(-1, -1);
bool present =
@@ -248,8 +255,11 @@ void DelegatedRendererLayerImpl::AppendContributingRenderPasses(
<< render_passes_in_draw_order_[i]->id.index;
DCHECK_GT(output_render_pass_id.index, 0);
- render_pass_sink->AppendRenderPass(
- render_passes_in_draw_order_[i]->Copy(output_render_pass_id));
+ scoped_ptr<RenderPass> copy_pass =
+ render_passes_in_draw_order_[i]->Copy(output_render_pass_id);
+ copy_pass->transform_to_root_target.ConcatTransform(
+ delegated_frame_to_root_transform);
+ render_pass_sink->AppendRenderPass(copy_pass.Pass());
}
}
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc
index a6bb327..05e8513 100644
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -89,24 +89,21 @@ class DelegatedRendererLayerImplTestSimple
delegated_renderer_layer->SetTransform(transform);
ScopedPtrVector<RenderPass> delegated_render_passes;
- TestRenderPass* pass1 = AddRenderPass(
- &delegated_render_passes,
- RenderPass::Id(9, 6),
- gfx::Rect(6, 6, 6, 6),
- gfx::Transform());
+ TestRenderPass* pass1 = AddRenderPass(&delegated_render_passes,
+ RenderPass::Id(9, 6),
+ gfx::Rect(6, 6, 6, 6),
+ gfx::Transform(1, 0, 0, 1, 5, 6));
AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
- TestRenderPass* pass2 = AddRenderPass(
- &delegated_render_passes,
- RenderPass::Id(9, 7),
- gfx::Rect(7, 7, 7, 7),
- gfx::Transform());
+ TestRenderPass* pass2 = AddRenderPass(&delegated_render_passes,
+ RenderPass::Id(9, 7),
+ gfx::Rect(7, 7, 7, 7),
+ gfx::Transform(1, 0, 0, 1, 7, 8));
AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u);
AddRenderPassQuad(pass2, pass1);
- TestRenderPass* pass3 = AddRenderPass(
- &delegated_render_passes,
- RenderPass::Id(9, 8),
- gfx::Rect(0, 0, 8, 8),
- gfx::Transform());
+ TestRenderPass* pass3 = AddRenderPass(&delegated_render_passes,
+ RenderPass::Id(9, 8),
+ gfx::Rect(0, 0, 8, 8),
+ gfx::Transform(1, 0, 0, 1, 9, 10));
AddRenderPassQuad(pass3, pass2);
delegated_renderer_layer->SetFrameDataForRenderPasses(
&delegated_render_passes);
@@ -267,6 +264,42 @@ TEST_F(DelegatedRendererLayerImplTestSimple,
host_impl_->DidDrawAllLayers(frame);
}
+TEST_F(DelegatedRendererLayerImplTestSimple, RenderPassTransformIsModified) {
+ LayerTreeHostImpl::FrameData frame;
+ EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
+
+ // The delegated layer has a surface between it and the root.
+ EXPECT_TRUE(delegated_renderer_layer_->render_target()->parent());
+
+ // Each non-DelegatedRendererLayer added one RenderPass. The
+ // DelegatedRendererLayer added two contributing passes.
+ ASSERT_EQ(5u, frame.render_passes.size());
+
+ // The DelegatedRendererLayer is at position 9,9 compared to the root, so all
+ // render pass' transforms to the root should be shifted by this amount.
+ // The DelegatedRendererLayer has a size of 10x10, but the root delegated
+ // RenderPass has a size of 8x8, so any render passes should be scaled by
+ // 10/8.
+ gfx::Transform transform;
+ transform.Translate(9.0, 9.0);
+ transform.Scale(10.0 / 8.0, 10.0 / 8.0);
+
+ // The first contributing surface has a translation of 5, 6.
+ gfx::Transform five_six(1, 0, 0, 1, 5, 6);
+
+ // The second contributing surface has a translation of 7, 8.
+ gfx::Transform seven_eight(1, 0, 0, 1, 7, 8);
+
+ EXPECT_TRANSFORMATION_MATRIX_EQ(
+ transform * five_six, frame.render_passes[1]->transform_to_root_target);
+ EXPECT_TRANSFORMATION_MATRIX_EQ(
+ transform * seven_eight,
+ frame.render_passes[2]->transform_to_root_target);
+
+ host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
+ host_impl_->DidDrawAllLayers(frame);
+}
+
TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) {
LayerTreeHostImpl::FrameData frame;
EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));