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/gl_renderer.h" | |
6 | |
7 #include "base/message_loop.h" | 5 #include "base/message_loop.h" |
8 #include "cc/layers/append_quads_data.h" | 6 #include "cc/layers/append_quads_data.h" |
| 7 #include "cc/output/gl_renderer.h" |
9 #include "cc/quads/draw_quad.h" | 8 #include "cc/quads/draw_quad.h" |
10 #include "cc/resources/sync_point_helper.h" | 9 #include "cc/resources/sync_point_helper.h" |
11 #include "cc/test/pixel_test.h" | 10 #include "cc/test/pixel_test.h" |
12 #include "gpu/GLES2/gl2extchromium.h" | 11 #include "gpu/GLES2/gl2extchromium.h" |
13 #include "third_party/skia/include/core/SkImageFilter.h" | 12 #include "third_party/skia/include/core/SkImageFilter.h" |
14 #include "third_party/skia/include/core/SkMatrix.h" | 13 #include "third_party/skia/include/core/SkMatrix.h" |
15 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" | 14 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" |
16 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 15 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
17 | 16 |
18 namespace cc { | 17 namespace cc { |
19 namespace { | 18 namespace { |
20 | 19 |
21 class GLRendererPixelTest : public PixelTest {}; | |
22 | |
23 scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, | 20 scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, |
24 gfx::Rect rect) { | 21 gfx::Rect rect) { |
25 scoped_ptr<RenderPass> pass = RenderPass::Create(); | 22 scoped_ptr<RenderPass> pass = RenderPass::Create(); |
26 const gfx::Rect output_rect = rect; | 23 const gfx::Rect output_rect = rect; |
27 const gfx::RectF damage_rect = rect; | 24 const gfx::RectF damage_rect = rect; |
28 const gfx::Transform transform_to_root_target; | 25 const gfx::Transform transform_to_root_target; |
29 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); | 26 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); |
30 return pass.Pass(); | 27 return pass.Pass(); |
31 } | 28 } |
32 | 29 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 0, // mask_resource_id | 65 0, // mask_resource_id |
69 rect, // contents_changed_since_last_frame | 66 rect, // contents_changed_since_last_frame |
70 gfx::RectF(), // mask_uv_rect | 67 gfx::RectF(), // mask_uv_rect |
71 WebKit::WebFilterOperations(), // foreground filters | 68 WebKit::WebFilterOperations(), // foreground filters |
72 skia::RefPtr<SkImageFilter>(), // foreground filter | 69 skia::RefPtr<SkImageFilter>(), // foreground filter |
73 WebKit::WebFilterOperations()); // background filters | 70 WebKit::WebFilterOperations()); // background filters |
74 | 71 |
75 return quad.PassAs<DrawQuad>(); | 72 return quad.PassAs<DrawQuad>(); |
76 } | 73 } |
77 | 74 |
| 75 typedef ::testing::Types<GLRenderer, SoftwareRenderer> RendererTypes; |
| 76 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
| 77 |
| 78 // All pixels can be off by one, but any more than that is an error. |
| 79 class FuzzyPixelOffByOneComparator : public FuzzyPixelComparator { |
| 80 public: |
| 81 explicit FuzzyPixelOffByOneComparator(bool discard_alpha) |
| 82 : FuzzyPixelComparator(discard_alpha, 100.f, 0.f, 1.f, 1, 0) {} |
| 83 }; |
| 84 |
| 85 template <typename RendererType> |
| 86 class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator { |
| 87 public: |
| 88 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha) |
| 89 : fuzzy_(discard_alpha), exact_(discard_alpha) {} |
| 90 |
| 91 virtual bool Compare(const SkBitmap& actual_bmp, |
| 92 const SkBitmap& expected_bmp) const; |
| 93 |
| 94 private: |
| 95 FuzzyPixelOffByOneComparator fuzzy_; |
| 96 ExactPixelComparator exact_; |
| 97 }; |
| 98 |
| 99 template<> |
| 100 bool FuzzyForSoftwareOnlyPixelComparator<GLRenderer>::Compare( |
| 101 const SkBitmap& actual_bmp, |
| 102 const SkBitmap& expected_bmp) const { |
| 103 return exact_.Compare(actual_bmp, expected_bmp); |
| 104 } |
| 105 |
| 106 template<> |
| 107 bool FuzzyForSoftwareOnlyPixelComparator<SoftwareRenderer>::Compare( |
| 108 const SkBitmap& actual_bmp, |
| 109 const SkBitmap& expected_bmp) const { |
| 110 return fuzzy_.Compare(actual_bmp, expected_bmp); |
| 111 } |
78 | 112 |
79 #if !defined(OS_ANDROID) | 113 #if !defined(OS_ANDROID) |
80 TEST_F(GLRendererPixelTest, SimpleGreenRect) { | 114 TYPED_TEST(RendererPixelTest, SimpleGreenRect) { |
81 gfx::Rect rect(device_viewport_size_); | 115 gfx::Rect rect(this->device_viewport_size_); |
82 | 116 |
83 RenderPass::Id id(1, 1); | 117 RenderPass::Id id(1, 1); |
84 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 118 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
85 | 119 |
86 gfx::Transform content_to_target_transform; | 120 gfx::Transform content_to_target_transform; |
87 scoped_ptr<SharedQuadState> shared_state = | 121 scoped_ptr<SharedQuadState> shared_state = |
88 CreateTestSharedQuadState(content_to_target_transform, rect); | 122 CreateTestSharedQuadState(content_to_target_transform, rect); |
89 | 123 |
90 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | 124 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); |
91 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); | 125 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); |
92 | 126 |
93 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | 127 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); |
94 | 128 |
95 RenderPassList pass_list; | 129 RenderPassList pass_list; |
96 pass_list.push_back(pass.Pass()); | 130 pass_list.push_back(pass.Pass()); |
97 | 131 |
98 EXPECT_TRUE(RunPixelTest( | 132 EXPECT_TRUE(this->RunPixelTest( |
99 &pass_list, | 133 &pass_list, |
100 base::FilePath(FILE_PATH_LITERAL("green.png")), | 134 base::FilePath(FILE_PATH_LITERAL("green.png")), |
101 ExactPixelComparator(true))); | 135 ExactPixelComparator(true))); |
102 } | 136 } |
103 | 137 |
104 TEST_F(GLRendererPixelTest, FastPassColorFilterAlpha) { | 138 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { |
105 gfx::Rect viewport_rect(device_viewport_size_); | 139 gfx::Rect viewport_rect(this->device_viewport_size_); |
106 | 140 |
107 RenderPass::Id root_pass_id(1, 1); | 141 RenderPass::Id root_pass_id(1, 1); |
108 scoped_ptr<RenderPass> root_pass = | 142 scoped_ptr<RenderPass> root_pass = |
109 CreateTestRootRenderPass(root_pass_id, viewport_rect); | 143 CreateTestRootRenderPass(root_pass_id, viewport_rect); |
110 | 144 |
111 RenderPass::Id child_pass_id(2, 2); | 145 RenderPass::Id child_pass_id(2, 2); |
112 gfx::Rect pass_rect(device_viewport_size_); | 146 gfx::Rect pass_rect(this->device_viewport_size_); |
113 gfx::Transform transform_to_root; | 147 gfx::Transform transform_to_root; |
114 scoped_ptr<RenderPass> child_pass = | 148 scoped_ptr<RenderPass> child_pass = |
115 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); | 149 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
116 | 150 |
117 gfx::Transform content_to_target_transform; | 151 gfx::Transform content_to_target_transform; |
118 scoped_ptr<SharedQuadState> shared_state = | 152 scoped_ptr<SharedQuadState> shared_state = |
119 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | 153 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); |
120 shared_state->opacity = 0.5f; | 154 shared_state->opacity = 0.5f; |
121 | 155 |
122 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | 156 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); |
123 blue->SetNew(shared_state.get(), | 157 blue->SetNew(shared_state.get(), |
124 gfx::Rect(0, | 158 gfx::Rect(0, |
125 0, | 159 0, |
126 device_viewport_size_.width() / 2, | 160 this->device_viewport_size_.width() / 2, |
127 device_viewport_size_.height()), | 161 this->device_viewport_size_.height()), |
128 SK_ColorBLUE); | 162 SK_ColorBLUE); |
129 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | 163 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
130 yellow->SetNew(shared_state.get(), | 164 yellow->SetNew(shared_state.get(), |
131 gfx::Rect(device_viewport_size_.width() / 2, | 165 gfx::Rect(this->device_viewport_size_.width() / 2, |
132 0, | 166 0, |
133 device_viewport_size_.width() / 2, | 167 this->device_viewport_size_.width() / 2, |
134 device_viewport_size_.height()), | 168 this->device_viewport_size_.height()), |
135 SK_ColorYELLOW); | 169 SK_ColorYELLOW); |
136 | 170 |
137 scoped_ptr<SharedQuadState> blank_state = | 171 scoped_ptr<SharedQuadState> blank_state = |
138 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | 172 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); |
139 | 173 |
140 scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create(); | 174 scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create(); |
141 white->SetNew(blank_state.get(), | 175 white->SetNew(blank_state.get(), |
142 viewport_rect, | 176 viewport_rect, |
143 SK_ColorWHITE); | 177 SK_ColorWHITE); |
144 | 178 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 WebKit::WebFilterOperations(), | 216 WebKit::WebFilterOperations(), |
183 filter, | 217 filter, |
184 WebKit::WebFilterOperations()); | 218 WebKit::WebFilterOperations()); |
185 | 219 |
186 root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>()); | 220 root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>()); |
187 | 221 |
188 RenderPassList pass_list; | 222 RenderPassList pass_list; |
189 pass_list.push_back(child_pass.Pass()); | 223 pass_list.push_back(child_pass.Pass()); |
190 pass_list.push_back(root_pass.Pass()); | 224 pass_list.push_back(root_pass.Pass()); |
191 | 225 |
192 EXPECT_TRUE(RunPixelTest( | 226 // This test has alpha=254 for the software renderer vs. alpha=255 for the gl |
| 227 // renderer so use a fuzzy comparator. |
| 228 EXPECT_TRUE(this->RunPixelTest( |
193 &pass_list, | 229 &pass_list, |
194 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")), | 230 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha.png")), |
195 ExactPixelComparator(false))); | 231 FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false))); |
196 } | 232 } |
197 | 233 |
198 TEST_F(GLRendererPixelTest, FastPassColorFilterAlphaTranslation) { | 234 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlphaTranslation) { |
199 gfx::Rect viewport_rect(device_viewport_size_); | 235 gfx::Rect viewport_rect(this->device_viewport_size_); |
200 | 236 |
201 RenderPass::Id root_pass_id(1, 1); | 237 RenderPass::Id root_pass_id(1, 1); |
202 scoped_ptr<RenderPass> root_pass = | 238 scoped_ptr<RenderPass> root_pass = |
203 CreateTestRootRenderPass(root_pass_id, viewport_rect); | 239 CreateTestRootRenderPass(root_pass_id, viewport_rect); |
204 | 240 |
205 RenderPass::Id child_pass_id(2, 2); | 241 RenderPass::Id child_pass_id(2, 2); |
206 gfx::Rect pass_rect(device_viewport_size_); | 242 gfx::Rect pass_rect(this->device_viewport_size_); |
207 gfx::Transform transform_to_root; | 243 gfx::Transform transform_to_root; |
208 scoped_ptr<RenderPass> child_pass = | 244 scoped_ptr<RenderPass> child_pass = |
209 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); | 245 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
210 | 246 |
211 gfx::Transform content_to_target_transform; | 247 gfx::Transform content_to_target_transform; |
212 scoped_ptr<SharedQuadState> shared_state = | 248 scoped_ptr<SharedQuadState> shared_state = |
213 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | 249 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); |
214 shared_state->opacity = 0.5f; | 250 shared_state->opacity = 0.5f; |
215 | 251 |
216 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | 252 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); |
217 blue->SetNew(shared_state.get(), | 253 blue->SetNew(shared_state.get(), |
218 gfx::Rect(0, | 254 gfx::Rect(0, |
219 0, | 255 0, |
220 device_viewport_size_.width() / 2, | 256 this->device_viewport_size_.width() / 2, |
221 device_viewport_size_.height()), | 257 this->device_viewport_size_.height()), |
222 SK_ColorBLUE); | 258 SK_ColorBLUE); |
223 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | 259 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
224 yellow->SetNew(shared_state.get(), | 260 yellow->SetNew(shared_state.get(), |
225 gfx::Rect(device_viewport_size_.width() / 2, | 261 gfx::Rect(this->device_viewport_size_.width() / 2, |
226 0, | 262 0, |
227 device_viewport_size_.width() / 2, | 263 this->device_viewport_size_.width() / 2, |
228 device_viewport_size_.height()), | 264 this->device_viewport_size_.height()), |
229 SK_ColorYELLOW); | 265 SK_ColorYELLOW); |
230 | 266 |
231 scoped_ptr<SharedQuadState> blank_state = | 267 scoped_ptr<SharedQuadState> blank_state = |
232 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | 268 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); |
233 | 269 |
234 scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create(); | 270 scoped_ptr<SolidColorDrawQuad> white = SolidColorDrawQuad::Create(); |
235 white->SetNew(blank_state.get(), | 271 white->SetNew(blank_state.get(), |
236 viewport_rect, | 272 viewport_rect, |
237 SK_ColorWHITE); | 273 SK_ColorWHITE); |
238 | 274 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 WebKit::WebFilterOperations(), | 315 WebKit::WebFilterOperations(), |
280 filter, | 316 filter, |
281 WebKit::WebFilterOperations()); | 317 WebKit::WebFilterOperations()); |
282 | 318 |
283 root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>()); | 319 root_pass->quad_list.push_back(render_pass_quad.PassAs<DrawQuad>()); |
284 RenderPassList pass_list; | 320 RenderPassList pass_list; |
285 | 321 |
286 pass_list.push_back(child_pass.Pass()); | 322 pass_list.push_back(child_pass.Pass()); |
287 pass_list.push_back(root_pass.Pass()); | 323 pass_list.push_back(root_pass.Pass()); |
288 | 324 |
289 EXPECT_TRUE(RunPixelTest( | 325 // This test has alpha=254 for the software renderer vs. alpha=255 for the gl |
| 326 // renderer so use a fuzzy comparator. |
| 327 EXPECT_TRUE(this->RunPixelTest( |
290 &pass_list, | 328 &pass_list, |
291 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")), | 329 base::FilePath(FILE_PATH_LITERAL("blue_yellow_alpha_translate.png")), |
292 ExactPixelComparator(false))); | 330 FuzzyForSoftwareOnlyPixelComparator<TypeParam>(false))); |
293 } | 331 } |
294 | 332 |
295 TEST_F(GLRendererPixelTest, RenderPassChangesSize) { | 333 TYPED_TEST(RendererPixelTest, RenderPassChangesSize) { |
296 gfx::Rect viewport_rect(device_viewport_size_); | 334 gfx::Rect viewport_rect(this->device_viewport_size_); |
297 | 335 |
298 RenderPass::Id root_pass_id(1, 1); | 336 RenderPass::Id root_pass_id(1, 1); |
299 scoped_ptr<RenderPass> root_pass = | 337 scoped_ptr<RenderPass> root_pass = |
300 CreateTestRootRenderPass(root_pass_id, viewport_rect); | 338 CreateTestRootRenderPass(root_pass_id, viewport_rect); |
301 | 339 |
302 RenderPass::Id child_pass_id(2, 2); | 340 RenderPass::Id child_pass_id(2, 2); |
303 gfx::Rect pass_rect(device_viewport_size_); | 341 gfx::Rect pass_rect(this->device_viewport_size_); |
304 gfx::Transform transform_to_root; | 342 gfx::Transform transform_to_root; |
305 scoped_ptr<RenderPass> child_pass = | 343 scoped_ptr<RenderPass> child_pass = |
306 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); | 344 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); |
307 | 345 |
308 gfx::Transform content_to_target_transform; | 346 gfx::Transform content_to_target_transform; |
309 scoped_ptr<SharedQuadState> shared_state = | 347 scoped_ptr<SharedQuadState> shared_state = |
310 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | 348 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); |
311 | 349 |
312 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | 350 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); |
313 blue->SetNew(shared_state.get(), | 351 blue->SetNew(shared_state.get(), |
314 gfx::Rect(0, | 352 gfx::Rect(0, |
315 0, | 353 0, |
316 device_viewport_size_.width() / 2, | 354 this->device_viewport_size_.width() / 2, |
317 device_viewport_size_.height()), | 355 this->device_viewport_size_.height()), |
318 SK_ColorBLUE); | 356 SK_ColorBLUE); |
319 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | 357 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); |
320 yellow->SetNew(shared_state.get(), | 358 yellow->SetNew(shared_state.get(), |
321 gfx::Rect(device_viewport_size_.width() / 2, | 359 gfx::Rect(this->device_viewport_size_.width() / 2, |
322 0, | 360 0, |
323 device_viewport_size_.width() / 2, | 361 this->device_viewport_size_.width() / 2, |
324 device_viewport_size_.height()), | 362 this->device_viewport_size_.height()), |
325 SK_ColorYELLOW); | 363 SK_ColorYELLOW); |
326 | 364 |
327 child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); | 365 child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); |
328 child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); | 366 child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); |
329 | 367 |
330 scoped_ptr<SharedQuadState> pass_shared_state = | 368 scoped_ptr<SharedQuadState> pass_shared_state = |
331 CreateTestSharedQuadState(gfx::Transform(), pass_rect); | 369 CreateTestSharedQuadState(gfx::Transform(), pass_rect); |
332 root_pass->quad_list.push_back( | 370 root_pass->quad_list.push_back( |
333 CreateTestRenderPassDrawQuad(pass_shared_state.get(), | 371 CreateTestRenderPassDrawQuad(pass_shared_state.get(), |
334 pass_rect, | 372 pass_rect, |
335 child_pass_id)); | 373 child_pass_id)); |
336 | 374 |
337 RenderPassList pass_list; | 375 RenderPassList pass_list; |
338 pass_list.push_back(child_pass.Pass()); | 376 pass_list.push_back(child_pass.Pass()); |
339 pass_list.push_back(root_pass.Pass()); | 377 pass_list.push_back(root_pass.Pass()); |
340 | 378 |
341 renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); | 379 this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); |
342 | 380 |
343 EXPECT_TRUE(RunPixelTest( | 381 EXPECT_TRUE(this->RunPixelTest( |
344 &pass_list, | 382 &pass_list, |
345 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), | 383 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")), |
346 ExactPixelComparator(true))); | 384 ExactPixelComparator(true))); |
347 } | 385 } |
348 | 386 |
349 class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { | 387 template <typename RendererType> |
| 388 class RendererPixelTestWithBackgroundFilter |
| 389 : public RendererPixelTest<RendererType> { |
350 protected: | 390 protected: |
351 void SetUpRenderPassList() { | 391 void SetUpRenderPassList() { |
352 gfx::Rect device_viewport_rect(device_viewport_size_); | 392 gfx::Rect device_viewport_rect(this->device_viewport_size_); |
353 | 393 |
354 RenderPass::Id root_id(1, 1); | 394 RenderPass::Id root_id(1, 1); |
355 scoped_ptr<RenderPass> root_pass = | 395 scoped_ptr<RenderPass> root_pass = |
356 CreateTestRootRenderPass(root_id, device_viewport_rect); | 396 CreateTestRootRenderPass(root_id, device_viewport_rect); |
357 root_pass->has_transparent_background = false; | 397 root_pass->has_transparent_background = false; |
358 | 398 |
359 gfx::Transform identity_content_to_target_transform; | 399 gfx::Transform identity_content_to_target_transform; |
360 | 400 |
361 RenderPass::Id filter_pass_id(2, 1); | 401 RenderPass::Id filter_pass_id(2, 1); |
362 gfx::Transform transform_to_root; | 402 gfx::Transform transform_to_root; |
(...skipping 24 matching lines...) Expand all Loading... |
387 filter_pass_quad->SetNew( | 427 filter_pass_quad->SetNew( |
388 shared_state.get(), | 428 shared_state.get(), |
389 filter_pass_content_rect_, | 429 filter_pass_content_rect_, |
390 filter_pass_id, | 430 filter_pass_id, |
391 false, // is_replica | 431 false, // is_replica |
392 0, // mask_resource_id | 432 0, // mask_resource_id |
393 filter_pass_content_rect_, // contents_changed_since_last_frame | 433 filter_pass_content_rect_, // contents_changed_since_last_frame |
394 gfx::RectF(), // mask_uv_rect | 434 gfx::RectF(), // mask_uv_rect |
395 WebKit::WebFilterOperations(), // filters | 435 WebKit::WebFilterOperations(), // filters |
396 skia::RefPtr<SkImageFilter>(), // filter | 436 skia::RefPtr<SkImageFilter>(), // filter |
397 background_filters_); | 437 this->background_filters_); |
398 root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>()); | 438 root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>()); |
399 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | 439 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); |
400 } | 440 } |
401 | 441 |
402 const int kColumnWidth = device_viewport_rect.width() / 3; | 442 const int kColumnWidth = device_viewport_rect.width() / 3; |
403 | 443 |
404 gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20); | 444 gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20); |
405 for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) { | 445 for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) { |
406 scoped_ptr<SharedQuadState> shared_state = | 446 scoped_ptr<SharedQuadState> shared_state = |
407 CreateTestSharedQuadState(identity_content_to_target_transform, | 447 CreateTestSharedQuadState(identity_content_to_target_transform, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 pass_list_.push_back(filter_pass.Pass()); | 491 pass_list_.push_back(filter_pass.Pass()); |
452 pass_list_.push_back(root_pass.Pass()); | 492 pass_list_.push_back(root_pass.Pass()); |
453 } | 493 } |
454 | 494 |
455 RenderPassList pass_list_; | 495 RenderPassList pass_list_; |
456 WebKit::WebFilterOperations background_filters_; | 496 WebKit::WebFilterOperations background_filters_; |
457 gfx::Transform filter_pass_to_target_transform_; | 497 gfx::Transform filter_pass_to_target_transform_; |
458 gfx::Rect filter_pass_content_rect_; | 498 gfx::Rect filter_pass_content_rect_; |
459 }; | 499 }; |
460 | 500 |
| 501 typedef ::testing::Types<GLRenderer, SoftwareRenderer> RendererTypes; |
| 502 TYPED_TEST_CASE(RendererPixelTestWithBackgroundFilter, RendererTypes); |
| 503 |
| 504 typedef RendererPixelTestWithBackgroundFilter<GLRenderer> |
| 505 GLRendererPixelTestWithBackgroundFilter; |
| 506 |
| 507 // TODO(skaslev): The software renderer does not support filters yet. |
461 TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { | 508 TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { |
462 background_filters_.append( | 509 this->background_filters_.append( |
463 WebKit::WebFilterOperation::createInvertFilter(1.f)); | 510 WebKit::WebFilterOperation::createInvertFilter(1.f)); |
464 | 511 |
465 filter_pass_content_rect_ = gfx::Rect(device_viewport_size_); | 512 this->filter_pass_content_rect_ = gfx::Rect(this->device_viewport_size_); |
466 filter_pass_content_rect_.Inset(12, 14, 16, 18); | 513 this->filter_pass_content_rect_.Inset(12, 14, 16, 18); |
467 | 514 |
468 SetUpRenderPassList(); | 515 this->SetUpRenderPassList(); |
469 EXPECT_TRUE(RunPixelTest( | 516 EXPECT_TRUE(this->RunPixelTest( |
470 &pass_list_, | 517 &this->pass_list_, |
471 base::FilePath(FILE_PATH_LITERAL("background_filter.png")), | 518 base::FilePath(FILE_PATH_LITERAL("background_filter.png")), |
472 ExactPixelComparator(true))); | 519 ExactPixelComparator(true))); |
473 } | 520 } |
474 | 521 |
| 522 // Software renderer does not support anti-aliased edges. |
475 TEST_F(GLRendererPixelTest, AntiAliasing) { | 523 TEST_F(GLRendererPixelTest, AntiAliasing) { |
476 gfx::Rect rect(0, 0, 200, 200); | 524 gfx::Rect rect(0, 0, 200, 200); |
477 | 525 |
478 RenderPass::Id id(1, 1); | 526 RenderPass::Id id(1, 1); |
479 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 527 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
480 | 528 |
481 gfx::Transform red_content_to_target_transform; | 529 gfx::Transform red_content_to_target_transform; |
482 red_content_to_target_transform.Rotate(10); | 530 red_content_to_target_transform.Rotate(10); |
483 scoped_ptr<SharedQuadState> red_shared_state = | 531 scoped_ptr<SharedQuadState> red_shared_state = |
484 CreateTestSharedQuadState(red_content_to_target_transform, rect); | 532 CreateTestSharedQuadState(red_content_to_target_transform, rect); |
(...skipping 18 matching lines...) Expand all Loading... |
503 CreateTestSharedQuadState(blue_content_to_target_transform, rect); | 551 CreateTestSharedQuadState(blue_content_to_target_transform, rect); |
504 | 552 |
505 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | 553 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); |
506 blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); | 554 blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); |
507 | 555 |
508 pass->quad_list.push_back(blue.PassAs<DrawQuad>()); | 556 pass->quad_list.push_back(blue.PassAs<DrawQuad>()); |
509 | 557 |
510 RenderPassList pass_list; | 558 RenderPassList pass_list; |
511 pass_list.push_back(pass.Pass()); | 559 pass_list.push_back(pass.Pass()); |
512 | 560 |
513 EXPECT_TRUE(RunPixelTest( | 561 EXPECT_TRUE(this->RunPixelTest( |
514 &pass_list, | 562 &pass_list, |
515 base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")), | 563 base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")), |
516 ExactPixelComparator(true))); | 564 ExactPixelComparator(true))); |
517 } | 565 } |
518 | 566 |
| 567 // This test tests that anti-aliasing works for axis aligned quads. |
| 568 // Anti-aliasing is only supported in the gl renderer. |
519 TEST_F(GLRendererPixelTest, AxisAligned) { | 569 TEST_F(GLRendererPixelTest, AxisAligned) { |
520 gfx::Rect rect(0, 0, 200, 200); | 570 gfx::Rect rect(0, 0, 200, 200); |
521 | 571 |
522 RenderPass::Id id(1, 1); | 572 RenderPass::Id id(1, 1); |
523 gfx::Transform transform_to_root; | 573 gfx::Transform transform_to_root; |
524 scoped_ptr<RenderPass> pass = | 574 scoped_ptr<RenderPass> pass = |
525 CreateTestRenderPass(id, rect, transform_to_root); | 575 CreateTestRenderPass(id, rect, transform_to_root); |
526 | 576 |
527 gfx::Transform red_content_to_target_transform; | 577 gfx::Transform red_content_to_target_transform; |
528 red_content_to_target_transform.Translate(50, 50); | 578 red_content_to_target_transform.Translate(50, 50); |
(...skipping 24 matching lines...) Expand all Loading... |
553 CreateTestSharedQuadState(blue_content_to_target_transform, rect); | 603 CreateTestSharedQuadState(blue_content_to_target_transform, rect); |
554 | 604 |
555 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | 605 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); |
556 blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); | 606 blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); |
557 | 607 |
558 pass->quad_list.push_back(blue.PassAs<DrawQuad>()); | 608 pass->quad_list.push_back(blue.PassAs<DrawQuad>()); |
559 | 609 |
560 RenderPassList pass_list; | 610 RenderPassList pass_list; |
561 pass_list.push_back(pass.Pass()); | 611 pass_list.push_back(pass.Pass()); |
562 | 612 |
563 EXPECT_TRUE(RunPixelTest( | 613 EXPECT_TRUE(this->RunPixelTest( |
564 &pass_list, | 614 &pass_list, |
565 base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")), | 615 base::FilePath(FILE_PATH_LITERAL("axis_aligned.png")), |
566 ExactPixelComparator(true))); | 616 ExactPixelComparator(true))); |
567 } | 617 } |
568 | 618 |
569 static void SyncPointCallback(int* callback_count) { | 619 static void SyncPointCallback(int* callback_count) { |
570 ++(*callback_count); | 620 ++(*callback_count); |
571 base::MessageLoop::current()->QuitWhenIdle(); | 621 base::MessageLoop::current()->QuitWhenIdle(); |
572 } | 622 } |
573 | 623 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 base::MessageLoop::current()->Run(); | 677 base::MessageLoop::current()->Run(); |
628 | 678 |
629 // The sync point should have happened. | 679 // The sync point should have happened. |
630 EXPECT_EQ(1, sync_point_callback_count); | 680 EXPECT_EQ(1, sync_point_callback_count); |
631 EXPECT_EQ(1, other_callback_count); | 681 EXPECT_EQ(1, other_callback_count); |
632 } | 682 } |
633 #endif | 683 #endif |
634 | 684 |
635 } // namespace | 685 } // namespace |
636 } // namespace cc | 686 } // namespace cc |
OLD | NEW |