OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/output/software_renderer.h" | 5 #include "cc/output/software_renderer.h" |
6 | 6 |
7 #include "cc/layers/quad_sink.h" | 7 #include "cc/layers/quad_sink.h" |
8 #include "cc/output/compositor_frame_metadata.h" | 8 #include "cc/output/compositor_frame_metadata.h" |
9 #include "cc/output/software_output_device.h" | 9 #include "cc/output/software_output_device.h" |
10 #include "cc/quads/render_pass.h" | 10 #include "cc/quads/render_pass.h" |
11 #include "cc/quads/render_pass_draw_quad.h" | 11 #include "cc/quads/render_pass_draw_quad.h" |
12 #include "cc/quads/solid_color_draw_quad.h" | 12 #include "cc/quads/solid_color_draw_quad.h" |
13 #include "cc/quads/tile_draw_quad.h" | 13 #include "cc/quads/tile_draw_quad.h" |
14 #include "cc/test/animation_test_common.h" | 14 #include "cc/test/animation_test_common.h" |
15 #include "cc/test/fake_output_surface.h" | 15 #include "cc/test/fake_output_surface.h" |
16 #include "cc/test/geometry_test_utils.h" | 16 #include "cc/test/geometry_test_utils.h" |
17 #include "cc/test/render_pass_test_common.h" | 17 #include "cc/test/render_pass_test_common.h" |
18 #include "cc/test/render_pass_test_utils.h" | 18 #include "cc/test/render_pass_test_utils.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "third_party/skia/include/core/SkCanvas.h" |
| 22 #include "third_party/skia/include/core/SkDevice.h" |
21 | 23 |
22 namespace cc { | 24 namespace cc { |
23 namespace { | 25 namespace { |
24 | 26 |
25 class SoftwareRendererTest : public testing::Test, public RendererClient { | 27 class SoftwareRendererTest : public testing::Test, public RendererClient { |
26 public: | 28 public: |
27 SoftwareRendererTest() : should_clear_root_render_pass_(true) {} | 29 SoftwareRendererTest() : should_clear_root_render_pass_(true) {} |
28 | 30 |
29 void InitializeRenderer() { | 31 void InitializeRenderer( |
| 32 scoped_ptr<SoftwareOutputDevice> software_output_device) { |
30 output_surface_ = FakeOutputSurface::CreateSoftware( | 33 output_surface_ = FakeOutputSurface::CreateSoftware( |
31 make_scoped_ptr(new SoftwareOutputDevice)); | 34 software_output_device.Pass()); |
32 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); | 35 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); |
33 renderer_ = SoftwareRenderer::Create( | 36 renderer_ = SoftwareRenderer::Create( |
34 this, output_surface_.get(), resource_provider()); | 37 this, output_surface_.get(), resource_provider()); |
35 } | 38 } |
36 | 39 |
37 ResourceProvider* resource_provider() const { | 40 ResourceProvider* resource_provider() const { |
38 return resource_provider_.get(); | 41 return resource_provider_.get(); |
39 } | 42 } |
40 | 43 |
41 SoftwareRenderer* renderer() const { return renderer_.get(); } | 44 SoftwareRenderer* renderer() const { return renderer_.get(); } |
42 | 45 |
43 void set_viewport_size(gfx::Size viewport_size) { | 46 void set_viewport(gfx::Rect viewport) { |
44 viewport_size_ = viewport_size; | 47 viewport_ = viewport; |
45 } | 48 } |
46 | 49 |
47 void set_should_clear_root_render_pass(bool clear_root_render_pass) { | 50 void set_should_clear_root_render_pass(bool clear_root_render_pass) { |
48 should_clear_root_render_pass_ = clear_root_render_pass; | 51 should_clear_root_render_pass_ = clear_root_render_pass; |
49 } | 52 } |
50 | 53 |
51 // RendererClient implementation. | 54 // RendererClient implementation. |
52 virtual gfx::Size DeviceViewportSize() const OVERRIDE { | 55 virtual gfx::Rect DeviceViewport() const OVERRIDE { |
53 return viewport_size_; | 56 return viewport_; |
54 } | 57 } |
55 virtual float DeviceScaleFactor() const OVERRIDE { | 58 virtual float DeviceScaleFactor() const OVERRIDE { |
56 return 1.f; | 59 return 1.f; |
57 } | 60 } |
58 virtual const LayerTreeSettings& Settings() const OVERRIDE { | 61 virtual const LayerTreeSettings& Settings() const OVERRIDE { |
59 return settings_; | 62 return settings_; |
60 } | 63 } |
61 virtual void SetFullRootLayerDamage() OVERRIDE {} | 64 virtual void SetFullRootLayerDamage() OVERRIDE {} |
62 virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy& policy) | 65 virtual void SetManagedMemoryPolicy(const ManagedMemoryPolicy& policy) |
63 OVERRIDE {} | 66 OVERRIDE {} |
64 virtual void EnforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) | 67 virtual void EnforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) |
65 OVERRIDE {} | 68 OVERRIDE {} |
66 virtual bool HasImplThread() const OVERRIDE { return false; } | 69 virtual bool HasImplThread() const OVERRIDE { return false; } |
67 virtual bool ShouldClearRootRenderPass() const OVERRIDE { | 70 virtual bool ShouldClearRootRenderPass() const OVERRIDE { |
68 return should_clear_root_render_pass_; | 71 return should_clear_root_render_pass_; |
69 } | 72 } |
70 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { | 73 virtual CompositorFrameMetadata MakeCompositorFrameMetadata() const OVERRIDE { |
71 return CompositorFrameMetadata(); | 74 return CompositorFrameMetadata(); |
72 } | 75 } |
73 virtual bool AllowPartialSwap() const OVERRIDE { | 76 virtual bool AllowPartialSwap() const OVERRIDE { |
74 return true; | 77 return true; |
75 } | 78 } |
76 | 79 |
77 protected: | 80 protected: |
78 scoped_ptr<FakeOutputSurface> output_surface_; | 81 scoped_ptr<FakeOutputSurface> output_surface_; |
79 scoped_ptr<ResourceProvider> resource_provider_; | 82 scoped_ptr<ResourceProvider> resource_provider_; |
80 scoped_ptr<SoftwareRenderer> renderer_; | 83 scoped_ptr<SoftwareRenderer> renderer_; |
81 gfx::Size viewport_size_; | 84 gfx::Rect viewport_; |
82 LayerTreeSettings settings_; | 85 LayerTreeSettings settings_; |
83 bool should_clear_root_render_pass_; | 86 bool should_clear_root_render_pass_; |
84 }; | 87 }; |
85 | 88 |
86 TEST_F(SoftwareRendererTest, SolidColorQuad) { | 89 TEST_F(SoftwareRendererTest, SolidColorQuad) { |
87 gfx::Size outer_size(100, 100); | 90 gfx::Size outer_size(100, 100); |
88 gfx::Size inner_size(98, 98); | 91 gfx::Size inner_size(98, 98); |
89 gfx::Rect outer_rect(outer_size); | 92 gfx::Rect outer_rect(outer_size); |
90 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 93 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
91 set_viewport_size(outer_size); | 94 set_viewport(gfx::Rect(outer_size)); |
92 | 95 |
93 InitializeRenderer(); | 96 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
94 | 97 |
95 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); | 98 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); |
96 shared_quad_state->SetAll( | 99 shared_quad_state->SetAll( |
97 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); | 100 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); |
98 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); | 101 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); |
99 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); | 102 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); |
100 root_render_pass->SetNew( | 103 root_render_pass->SetNew( |
101 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); | 104 root_render_pass_id, outer_rect, outer_rect, gfx::Transform()); |
102 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); | 105 scoped_ptr<SolidColorDrawQuad> outer_quad = SolidColorDrawQuad::Create(); |
103 outer_quad->SetNew( | 106 outer_quad->SetNew( |
104 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); | 107 shared_quad_state.get(), outer_rect, SK_ColorYELLOW, false); |
105 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); | 108 scoped_ptr<SolidColorDrawQuad> inner_quad = SolidColorDrawQuad::Create(); |
106 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); | 109 inner_quad->SetNew(shared_quad_state.get(), inner_rect, SK_ColorCYAN, false); |
107 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 110 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
108 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 111 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
109 | 112 |
110 RenderPassList list; | 113 RenderPassList list; |
111 list.push_back(root_render_pass.PassAs<RenderPass>()); | 114 list.push_back(root_render_pass.PassAs<RenderPass>()); |
112 renderer()->DrawFrame(&list); | 115 renderer()->DrawFrame(&list); |
113 | 116 |
114 SkBitmap output; | 117 SkBitmap output; |
115 output.setConfig(SkBitmap::kARGB_8888_Config, | 118 output.setConfig(SkBitmap::kARGB_8888_Config, |
116 DeviceViewportSize().width(), | 119 DeviceViewport().width(), |
117 DeviceViewportSize().height()); | 120 DeviceViewport().height()); |
118 output.allocPixels(); | 121 output.allocPixels(); |
119 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | 122 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
120 | 123 |
121 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | 124 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
122 EXPECT_EQ(SK_ColorYELLOW, | 125 EXPECT_EQ(SK_ColorYELLOW, |
123 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); | 126 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); |
124 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); | 127 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); |
125 EXPECT_EQ(SK_ColorCYAN, | 128 EXPECT_EQ(SK_ColorCYAN, |
126 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); | 129 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); |
127 } | 130 } |
128 | 131 |
129 TEST_F(SoftwareRendererTest, TileQuad) { | 132 TEST_F(SoftwareRendererTest, TileQuad) { |
130 gfx::Size outer_size(100, 100); | 133 gfx::Size outer_size(100, 100); |
131 gfx::Size inner_size(98, 98); | 134 gfx::Size inner_size(98, 98); |
132 gfx::Rect outer_rect(outer_size); | 135 gfx::Rect outer_rect(outer_size); |
133 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); | 136 gfx::Rect inner_rect(gfx::Point(1, 1), inner_size); |
134 set_viewport_size(outer_size); | 137 set_viewport(gfx::Rect(outer_size)); |
135 InitializeRenderer(); | 138 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
136 | 139 |
137 ResourceProvider::ResourceId resource_yellow = | 140 ResourceProvider::ResourceId resource_yellow = |
138 resource_provider()->CreateResource( | 141 resource_provider()->CreateResource( |
139 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny); | 142 outer_size, GL_RGBA, ResourceProvider::TextureUsageAny); |
140 ResourceProvider::ResourceId resource_cyan = | 143 ResourceProvider::ResourceId resource_cyan = |
141 resource_provider()->CreateResource( | 144 resource_provider()->CreateResource( |
142 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny); | 145 inner_size, GL_RGBA, ResourceProvider::TextureUsageAny); |
143 | 146 |
144 SkBitmap yellow_tile; | 147 SkBitmap yellow_tile; |
145 yellow_tile.setConfig( | 148 yellow_tile.setConfig( |
(...skipping 12 matching lines...) Expand all Loading... |
158 static_cast<uint8_t*>(yellow_tile.getPixels()), | 161 static_cast<uint8_t*>(yellow_tile.getPixels()), |
159 gfx::Rect(outer_size), | 162 gfx::Rect(outer_size), |
160 gfx::Rect(outer_size), | 163 gfx::Rect(outer_size), |
161 gfx::Vector2d()); | 164 gfx::Vector2d()); |
162 resource_provider()->SetPixels(resource_cyan, | 165 resource_provider()->SetPixels(resource_cyan, |
163 static_cast<uint8_t*>(cyan_tile.getPixels()), | 166 static_cast<uint8_t*>(cyan_tile.getPixels()), |
164 gfx::Rect(inner_size), | 167 gfx::Rect(inner_size), |
165 gfx::Rect(inner_size), | 168 gfx::Rect(inner_size), |
166 gfx::Vector2d()); | 169 gfx::Vector2d()); |
167 | 170 |
168 gfx::Rect root_rect = gfx::Rect(DeviceViewportSize()); | 171 gfx::Rect root_rect = DeviceViewport(); |
169 | 172 |
170 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); | 173 scoped_ptr<SharedQuadState> shared_quad_state = SharedQuadState::Create(); |
171 shared_quad_state->SetAll( | 174 shared_quad_state->SetAll( |
172 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); | 175 gfx::Transform(), outer_size, outer_rect, outer_rect, false, 1.0); |
173 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); | 176 RenderPass::Id root_render_pass_id = RenderPass::Id(1, 1); |
174 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); | 177 scoped_ptr<TestRenderPass> root_render_pass = TestRenderPass::Create(); |
175 root_render_pass->SetNew( | 178 root_render_pass->SetNew( |
176 root_render_pass_id, root_rect, root_rect, gfx::Transform()); | 179 root_render_pass_id, root_rect, root_rect, gfx::Transform()); |
177 scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create(); | 180 scoped_ptr<TileDrawQuad> outer_quad = TileDrawQuad::Create(); |
178 outer_quad->SetNew(shared_quad_state.get(), | 181 outer_quad->SetNew(shared_quad_state.get(), |
(...skipping 13 matching lines...) Expand all Loading... |
192 false); | 195 false); |
193 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); | 196 root_render_pass->AppendQuad(inner_quad.PassAs<DrawQuad>()); |
194 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); | 197 root_render_pass->AppendQuad(outer_quad.PassAs<DrawQuad>()); |
195 | 198 |
196 RenderPassList list; | 199 RenderPassList list; |
197 list.push_back(root_render_pass.PassAs<RenderPass>()); | 200 list.push_back(root_render_pass.PassAs<RenderPass>()); |
198 renderer()->DrawFrame(&list); | 201 renderer()->DrawFrame(&list); |
199 | 202 |
200 SkBitmap output; | 203 SkBitmap output; |
201 output.setConfig(SkBitmap::kARGB_8888_Config, | 204 output.setConfig(SkBitmap::kARGB_8888_Config, |
202 DeviceViewportSize().width(), | 205 DeviceViewport().width(), |
203 DeviceViewportSize().height()); | 206 DeviceViewport().height()); |
204 output.allocPixels(); | 207 output.allocPixels(); |
205 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); | 208 renderer()->GetFramebufferPixels(output.getPixels(), outer_rect); |
206 | 209 |
207 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); | 210 EXPECT_EQ(SK_ColorYELLOW, output.getColor(0, 0)); |
208 EXPECT_EQ(SK_ColorYELLOW, | 211 EXPECT_EQ(SK_ColorYELLOW, |
209 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); | 212 output.getColor(outer_size.width() - 1, outer_size.height() - 1)); |
210 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); | 213 EXPECT_EQ(SK_ColorCYAN, output.getColor(1, 1)); |
211 EXPECT_EQ(SK_ColorCYAN, | 214 EXPECT_EQ(SK_ColorCYAN, |
212 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); | 215 output.getColor(inner_size.width() - 1, inner_size.height() - 1)); |
213 } | 216 } |
214 | 217 |
215 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { | 218 TEST_F(SoftwareRendererTest, ShouldClearRootRenderPass) { |
216 gfx::Rect viewport_rect(0, 0, 100, 100); | 219 gfx::Rect viewport_rect(0, 0, 100, 100); |
217 set_viewport_size(viewport_rect.size()); | 220 set_viewport(viewport_rect); |
218 set_should_clear_root_render_pass(false); | 221 set_should_clear_root_render_pass(false); |
219 InitializeRenderer(); | 222 InitializeRenderer(make_scoped_ptr(new SoftwareOutputDevice)); |
220 | 223 |
221 RenderPassList list; | 224 RenderPassList list; |
222 | 225 |
223 SkBitmap output; | 226 SkBitmap output; |
224 output.setConfig(SkBitmap::kARGB_8888_Config, | 227 output.setConfig(SkBitmap::kARGB_8888_Config, |
225 viewport_rect.width(), | 228 viewport_rect.width(), |
226 viewport_rect.height()); | 229 viewport_rect.height()); |
227 output.allocPixels(); | 230 output.allocPixels(); |
228 | 231 |
229 // Draw a fullscreen green quad in a first frame. | 232 // Draw a fullscreen green quad in a first frame. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); | 264 output.getColor(viewport_rect.width() - 1, viewport_rect.height() - 1)); |
262 | 265 |
263 EXPECT_EQ(SK_ColorMAGENTA, | 266 EXPECT_EQ(SK_ColorMAGENTA, |
264 output.getColor(smaller_rect.x(), smaller_rect.y())); | 267 output.getColor(smaller_rect.x(), smaller_rect.y())); |
265 EXPECT_EQ(SK_ColorMAGENTA, | 268 EXPECT_EQ(SK_ColorMAGENTA, |
266 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); | 269 output.getColor(smaller_rect.right() - 1, smaller_rect.bottom() - 1)); |
267 } | 270 } |
268 | 271 |
269 } // namespace | 272 } // namespace |
270 } // namespace cc | 273 } // namespace cc |
OLD | NEW |