| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "cc/gl_renderer.h" | |
| 6 | |
| 7 #include "cc/draw_quad.h" | |
| 8 #include "cc/test/pixel_test.h" | |
| 9 | |
| 10 namespace cc { | |
| 11 namespace { | |
| 12 | |
| 13 class GLRendererPixelTest : public PixelTest {}; | |
| 14 | |
| 15 scoped_ptr<RenderPass> CreateTestRootRenderPass(RenderPass::Id id, | |
| 16 gfx::Rect rect) { | |
| 17 scoped_ptr<RenderPass> pass = RenderPass::Create(); | |
| 18 const gfx::Rect output_rect = rect; | |
| 19 const gfx::RectF damage_rect = rect; | |
| 20 const gfx::Transform transform_to_root_target; | |
| 21 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); | |
| 22 return pass.Pass(); | |
| 23 } | |
| 24 | |
| 25 scoped_ptr<RenderPass> CreateTestRenderPass( | |
| 26 RenderPass::Id id, | |
| 27 gfx::Rect rect, | |
| 28 const gfx::Transform& transform_to_root_target) { | |
| 29 scoped_ptr<RenderPass> pass = RenderPass::Create(); | |
| 30 const gfx::Rect output_rect = rect; | |
| 31 const gfx::RectF damage_rect = rect; | |
| 32 pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); | |
| 33 return pass.Pass(); | |
| 34 } | |
| 35 | |
| 36 scoped_ptr<SharedQuadState> CreateTestSharedQuadState( | |
| 37 gfx::Transform content_to_target_transform, gfx::Rect rect) { | |
| 38 const gfx::Size content_bounds = rect.size(); | |
| 39 const gfx::Rect visible_content_rect = rect; | |
| 40 const gfx::Rect clip_rect = rect; | |
| 41 const bool is_clipped = false; | |
| 42 const float opacity = 1.0f; | |
| 43 scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create(); | |
| 44 shared_state->SetAll(content_to_target_transform, | |
| 45 content_bounds, | |
| 46 visible_content_rect, | |
| 47 clip_rect, | |
| 48 is_clipped, | |
| 49 opacity); | |
| 50 return shared_state.Pass(); | |
| 51 } | |
| 52 | |
| 53 scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad( | |
| 54 SharedQuadState* shared_state, gfx::Rect rect, RenderPass::Id pass_id) { | |
| 55 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create(); | |
| 56 quad->SetNew(shared_state, | |
| 57 rect, | |
| 58 pass_id, | |
| 59 false, // is_replica | |
| 60 0, // mask_resource_id | |
| 61 rect, // contents_changed_since_last_frame | |
| 62 gfx::RectF(), // mask_uv_rect | |
| 63 WebKit::WebFilterOperations(), // foreground filters | |
| 64 skia::RefPtr<SkImageFilter>(), // foreground filter | |
| 65 WebKit::WebFilterOperations()); // background filters | |
| 66 | |
| 67 return quad.PassAs<DrawQuad>(); | |
| 68 } | |
| 69 | |
| 70 | |
| 71 #if !defined(OS_ANDROID) | |
| 72 TEST_F(GLRendererPixelTest, simpleGreenRect) { | |
| 73 gfx::Rect rect(device_viewport_size_); | |
| 74 | |
| 75 RenderPass::Id id(1, 1); | |
| 76 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | |
| 77 | |
| 78 gfx::Transform content_to_target_transform; | |
| 79 scoped_ptr<SharedQuadState> shared_state = | |
| 80 CreateTestSharedQuadState(content_to_target_transform, rect); | |
| 81 | |
| 82 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | |
| 83 color_quad->SetNew(shared_state.get(), rect, SK_ColorGREEN); | |
| 84 | |
| 85 pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | |
| 86 | |
| 87 RenderPassList pass_list; | |
| 88 pass_list.push_back(pass.Pass()); | |
| 89 | |
| 90 renderer_->DrawFrame(pass_list); | |
| 91 | |
| 92 EXPECT_TRUE(PixelsMatchReference( | |
| 93 base::FilePath(FILE_PATH_LITERAL("green.png")))); | |
| 94 } | |
| 95 | |
| 96 TEST_F(GLRendererPixelTest, RenderPassChangesSize) { | |
| 97 gfx::Rect viewport_rect(device_viewport_size_); | |
| 98 | |
| 99 RenderPass::Id root_pass_id(1, 1); | |
| 100 scoped_ptr<RenderPass> root_pass = | |
| 101 CreateTestRootRenderPass(root_pass_id, viewport_rect); | |
| 102 | |
| 103 RenderPass::Id child_pass_id(2, 2); | |
| 104 gfx::Rect pass_rect(device_viewport_size_); | |
| 105 gfx::Transform transform_to_root; | |
| 106 scoped_ptr<RenderPass> child_pass = | |
| 107 CreateTestRenderPass(child_pass_id, pass_rect, transform_to_root); | |
| 108 | |
| 109 gfx::Transform content_to_target_transform; | |
| 110 scoped_ptr<SharedQuadState> shared_state = | |
| 111 CreateTestSharedQuadState(content_to_target_transform, viewport_rect); | |
| 112 | |
| 113 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | |
| 114 blue->SetNew(shared_state.get(), | |
| 115 gfx::Rect(0, | |
| 116 0, | |
| 117 device_viewport_size_.width() / 2, | |
| 118 device_viewport_size_.height()), | |
| 119 SK_ColorBLUE); | |
| 120 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | |
| 121 yellow->SetNew(shared_state.get(), | |
| 122 gfx::Rect(device_viewport_size_.width() / 2, | |
| 123 0, | |
| 124 device_viewport_size_.width() / 2, | |
| 125 device_viewport_size_.height()), | |
| 126 SK_ColorYELLOW); | |
| 127 | |
| 128 child_pass->quad_list.push_back(blue.PassAs<DrawQuad>()); | |
| 129 child_pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); | |
| 130 | |
| 131 scoped_ptr<SharedQuadState> pass_shared_state = | |
| 132 CreateTestSharedQuadState(gfx::Transform(), pass_rect); | |
| 133 root_pass->quad_list.push_back( | |
| 134 CreateTestRenderPassDrawQuad(pass_shared_state.get(), | |
| 135 pass_rect, | |
| 136 child_pass_id)); | |
| 137 | |
| 138 RenderPassList pass_list; | |
| 139 pass_list.push_back(child_pass.Pass()); | |
| 140 pass_list.push_back(root_pass.Pass()); | |
| 141 | |
| 142 renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); | |
| 143 renderer_->DecideRenderPassAllocationsForFrame(pass_list); | |
| 144 renderer_->DrawFrame(pass_list); | |
| 145 | |
| 146 EXPECT_TRUE(PixelsMatchReference( | |
| 147 base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")))); | |
| 148 } | |
| 149 | |
| 150 class GLRendererPixelTestWithBackgroundFilter : public GLRendererPixelTest { | |
| 151 protected: | |
| 152 void DrawFrame() { | |
| 153 gfx::Rect device_viewport_rect(device_viewport_size_); | |
| 154 | |
| 155 RenderPass::Id root_id(1, 1); | |
| 156 scoped_ptr<RenderPass> root_pass = | |
| 157 CreateTestRootRenderPass(root_id, device_viewport_rect); | |
| 158 root_pass->has_transparent_background = false; | |
| 159 | |
| 160 gfx::Transform identity_content_to_target_transform; | |
| 161 | |
| 162 RenderPass::Id filter_pass_id(2, 1); | |
| 163 gfx::Transform transform_to_root; | |
| 164 scoped_ptr<RenderPass> filter_pass = | |
| 165 CreateTestRenderPass(filter_pass_id, | |
| 166 filter_pass_content_rect_, | |
| 167 transform_to_root); | |
| 168 | |
| 169 // A non-visible quad in the filtering render pass. | |
| 170 { | |
| 171 scoped_ptr<SharedQuadState> shared_state = | |
| 172 CreateTestSharedQuadState(identity_content_to_target_transform, | |
| 173 filter_pass_content_rect_); | |
| 174 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | |
| 175 color_quad->SetNew(shared_state.get(), | |
| 176 filter_pass_content_rect_, | |
| 177 SK_ColorTRANSPARENT); | |
| 178 filter_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | |
| 179 filter_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 180 } | |
| 181 | |
| 182 { | |
| 183 scoped_ptr<SharedQuadState> shared_state = | |
| 184 CreateTestSharedQuadState(filter_pass_to_target_transform_, | |
| 185 filter_pass_content_rect_); | |
| 186 scoped_ptr<RenderPassDrawQuad> filter_pass_quad = | |
| 187 RenderPassDrawQuad::Create(); | |
| 188 filter_pass_quad->SetNew( | |
| 189 shared_state.get(), | |
| 190 filter_pass_content_rect_, | |
| 191 filter_pass_id, | |
| 192 false, // is_replica | |
| 193 0, // mask_resource_id | |
| 194 filter_pass_content_rect_, // contents_changed_since_last_frame | |
| 195 gfx::RectF(), // mask_uv_rect | |
| 196 WebKit::WebFilterOperations(), // filters | |
| 197 skia::RefPtr<SkImageFilter>(), // filter | |
| 198 background_filters_); | |
| 199 root_pass->quad_list.push_back(filter_pass_quad.PassAs<DrawQuad>()); | |
| 200 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 201 } | |
| 202 | |
| 203 const int kColumnWidth = device_viewport_rect.width() / 3; | |
| 204 | |
| 205 gfx::Rect left_rect = gfx::Rect(0, 0, kColumnWidth, 20); | |
| 206 for (int i = 0; left_rect.y() < device_viewport_rect.height(); ++i) { | |
| 207 scoped_ptr<SharedQuadState> shared_state = | |
| 208 CreateTestSharedQuadState(identity_content_to_target_transform, | |
| 209 left_rect); | |
| 210 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | |
| 211 color_quad->SetNew(shared_state.get(), left_rect, SK_ColorGREEN); | |
| 212 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | |
| 213 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 214 left_rect += gfx::Vector2d(0, left_rect.height() + 1); | |
| 215 } | |
| 216 | |
| 217 gfx::Rect middle_rect = gfx::Rect(kColumnWidth+1, 0, kColumnWidth, 20); | |
| 218 for (int i = 0; middle_rect.y() < device_viewport_rect.height(); ++i) { | |
| 219 scoped_ptr<SharedQuadState> shared_state = | |
| 220 CreateTestSharedQuadState(identity_content_to_target_transform, | |
| 221 middle_rect); | |
| 222 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | |
| 223 color_quad->SetNew(shared_state.get(), middle_rect, SK_ColorRED); | |
| 224 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | |
| 225 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 226 middle_rect += gfx::Vector2d(0, middle_rect.height() + 1); | |
| 227 } | |
| 228 | |
| 229 gfx::Rect right_rect = gfx::Rect((kColumnWidth+1)*2, 0, kColumnWidth, 20); | |
| 230 for (int i = 0; right_rect.y() < device_viewport_rect.height(); ++i) { | |
| 231 scoped_ptr<SharedQuadState> shared_state = | |
| 232 CreateTestSharedQuadState(identity_content_to_target_transform, | |
| 233 right_rect); | |
| 234 scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create(); | |
| 235 color_quad->SetNew(shared_state.get(), right_rect, SK_ColorBLUE); | |
| 236 root_pass->quad_list.push_back(color_quad.PassAs<DrawQuad>()); | |
| 237 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 238 right_rect += gfx::Vector2d(0, right_rect.height() + 1); | |
| 239 } | |
| 240 | |
| 241 scoped_ptr<SharedQuadState> shared_state = | |
| 242 CreateTestSharedQuadState(identity_content_to_target_transform, | |
| 243 device_viewport_rect); | |
| 244 scoped_ptr<SolidColorDrawQuad> background_quad = | |
| 245 SolidColorDrawQuad::Create(); | |
| 246 background_quad->SetNew(shared_state.get(), | |
| 247 device_viewport_rect, | |
| 248 SK_ColorWHITE); | |
| 249 root_pass->quad_list.push_back(background_quad.PassAs<DrawQuad>()); | |
| 250 root_pass->shared_quad_state_list.push_back(shared_state.Pass()); | |
| 251 | |
| 252 RenderPassList pass_list; | |
| 253 pass_list.push_back(filter_pass.Pass()); | |
| 254 pass_list.push_back(root_pass.Pass()); | |
| 255 | |
| 256 renderer_->DecideRenderPassAllocationsForFrame(pass_list); | |
| 257 renderer_->DrawFrame(pass_list); | |
| 258 } | |
| 259 | |
| 260 WebKit::WebFilterOperations background_filters_; | |
| 261 gfx::Transform filter_pass_to_target_transform_; | |
| 262 gfx::Rect filter_pass_content_rect_; | |
| 263 }; | |
| 264 | |
| 265 TEST_F(GLRendererPixelTestWithBackgroundFilter, InvertFilter) { | |
| 266 background_filters_.append( | |
| 267 WebKit::WebFilterOperation::createInvertFilter(1.f)); | |
| 268 | |
| 269 filter_pass_content_rect_ = gfx::Rect(device_viewport_size_); | |
| 270 filter_pass_content_rect_.Inset(12, 14, 16, 18); | |
| 271 | |
| 272 DrawFrame(); | |
| 273 EXPECT_TRUE(PixelsMatchReference( | |
| 274 base::FilePath(FILE_PATH_LITERAL("background_filter.png")))); | |
| 275 } | |
| 276 | |
| 277 TEST_F(GLRendererPixelTest, AntiAliasing) { | |
| 278 gfx::Rect rect(0, 0, 200, 200); | |
| 279 | |
| 280 RenderPass::Id id(1, 1); | |
| 281 gfx::Transform transform_to_root; | |
| 282 scoped_ptr<RenderPass> pass = | |
| 283 CreateTestRenderPass(id, rect, transform_to_root); | |
| 284 | |
| 285 gfx::Transform red_content_to_target_transform; | |
| 286 red_content_to_target_transform.Rotate(10); | |
| 287 scoped_ptr<SharedQuadState> red_shared_state = | |
| 288 CreateTestSharedQuadState(red_content_to_target_transform, rect); | |
| 289 | |
| 290 scoped_ptr<SolidColorDrawQuad> red = SolidColorDrawQuad::Create(); | |
| 291 red->SetNew(red_shared_state.get(), rect, SK_ColorRED); | |
| 292 | |
| 293 pass->quad_list.push_back(red.PassAs<DrawQuad>()); | |
| 294 | |
| 295 gfx::Transform yellow_content_to_target_transform; | |
| 296 yellow_content_to_target_transform.Rotate(5); | |
| 297 scoped_ptr<SharedQuadState> yellow_shared_state = | |
| 298 CreateTestSharedQuadState(yellow_content_to_target_transform, rect); | |
| 299 | |
| 300 scoped_ptr<SolidColorDrawQuad> yellow = SolidColorDrawQuad::Create(); | |
| 301 yellow->SetNew(yellow_shared_state.get(), rect, SK_ColorYELLOW); | |
| 302 | |
| 303 pass->quad_list.push_back(yellow.PassAs<DrawQuad>()); | |
| 304 | |
| 305 gfx::Transform blue_content_to_target_transform; | |
| 306 scoped_ptr<SharedQuadState> blue_shared_state = | |
| 307 CreateTestSharedQuadState(blue_content_to_target_transform, rect); | |
| 308 | |
| 309 scoped_ptr<SolidColorDrawQuad> blue = SolidColorDrawQuad::Create(); | |
| 310 blue->SetNew(blue_shared_state.get(), rect, SK_ColorBLUE); | |
| 311 | |
| 312 pass->quad_list.push_back(blue.PassAs<DrawQuad>()); | |
| 313 | |
| 314 RenderPassList pass_list; | |
| 315 pass_list.push_back(pass.Pass()); | |
| 316 | |
| 317 renderer_->DrawFrame(pass_list); | |
| 318 | |
| 319 EXPECT_TRUE(PixelsMatchReference( | |
| 320 base::FilePath(FILE_PATH_LITERAL("anti_aliasing.png")))); | |
| 321 } | |
| 322 #endif | |
| 323 | |
| 324 } // namespace | |
| 325 } // namespace cc | |
| OLD | NEW |