| 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 |