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 "base/message_loop/message_loop.h" | 5 #include "base/message_loop/message_loop.h" |
6 #include "cc/layers/append_quads_data.h" | 6 #include "cc/layers/append_quads_data.h" |
7 #include "cc/output/gl_renderer.h" | 7 #include "cc/output/gl_renderer.h" |
8 #include "cc/quads/draw_quad.h" | 8 #include "cc/quads/draw_quad.h" |
9 #include "cc/quads/picture_draw_quad.h" | 9 #include "cc/quads/picture_draw_quad.h" |
10 #include "cc/quads/texture_draw_quad.h" | 10 #include "cc/quads/texture_draw_quad.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 rect, | 103 rect, |
104 pass_id, | 104 pass_id, |
105 0, // mask_resource_id | 105 0, // mask_resource_id |
106 gfx::Vector2dF(), // mask_uv_scale | 106 gfx::Vector2dF(), // mask_uv_scale |
107 gfx::Size(), // mask_texture_size | 107 gfx::Size(), // mask_texture_size |
108 FilterOperations(), // foreground filters | 108 FilterOperations(), // foreground filters |
109 gfx::Vector2dF(), // filters scale | 109 gfx::Vector2dF(), // filters scale |
110 FilterOperations()); // background filters | 110 FilterOperations()); // background filters |
111 } | 111 } |
112 | 112 |
| 113 void CreateTestTwoColoredTextureDrawQuad(const gfx::Rect& rect, |
| 114 SkColor texel_color, |
| 115 SkColor texel_stripe_color, |
| 116 SkColor background_color, |
| 117 bool premultiplied_alpha, |
| 118 const SharedQuadState* shared_state, |
| 119 ResourceProvider* resource_provider, |
| 120 RenderPass* render_pass) { |
| 121 SkPMColor pixel_color = premultiplied_alpha |
| 122 ? SkPreMultiplyColor(texel_color) |
| 123 : SkPackARGB32NoCheck(SkColorGetA(texel_color), |
| 124 SkColorGetR(texel_color), |
| 125 SkColorGetG(texel_color), |
| 126 SkColorGetB(texel_color)); |
| 127 SkPMColor pixel_stripe_color = |
| 128 premultiplied_alpha |
| 129 ? SkPreMultiplyColor(texel_stripe_color) |
| 130 : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color), |
| 131 SkColorGetR(texel_stripe_color), |
| 132 SkColorGetG(texel_stripe_color), |
| 133 SkColorGetB(texel_stripe_color)); |
| 134 std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color); |
| 135 for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) { |
| 136 for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) { |
| 137 pixels[i * rect.width() + k] = pixel_stripe_color; |
| 138 } |
| 139 } |
| 140 ResourceProvider::ResourceId resource = resource_provider->CreateResource( |
| 141 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 142 RGBA_8888); |
| 143 resource_provider->SetPixels(resource, |
| 144 reinterpret_cast<uint8_t*>(&pixels.front()), |
| 145 rect, rect, gfx::Vector2d()); |
| 146 |
| 147 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 148 const gfx::PointF uv_top_left(0.0f, 0.0f); |
| 149 const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
| 150 const bool flipped = false; |
| 151 const bool nearest_neighbor = false; |
| 152 TextureDrawQuad* quad = |
| 153 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 154 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, |
| 155 premultiplied_alpha, uv_top_left, uv_bottom_right, |
| 156 background_color, vertex_opacity, flipped, nearest_neighbor); |
| 157 } |
| 158 |
113 void CreateTestTextureDrawQuad(const gfx::Rect& rect, | 159 void CreateTestTextureDrawQuad(const gfx::Rect& rect, |
114 SkColor texel_color, | 160 SkColor texel_color, |
115 SkColor background_color, | 161 SkColor background_color, |
116 bool premultiplied_alpha, | 162 bool premultiplied_alpha, |
117 const SharedQuadState* shared_state, | 163 const SharedQuadState* shared_state, |
118 ResourceProvider* resource_provider, | 164 ResourceProvider* resource_provider, |
119 RenderPass* render_pass) { | 165 RenderPass* render_pass) { |
120 SkPMColor pixel_color = premultiplied_alpha ? | 166 SkPMColor pixel_color = premultiplied_alpha ? |
121 SkPreMultiplyColor(texel_color) : | 167 SkPreMultiplyColor(texel_color) : |
122 SkPackARGB32NoCheck(SkColorGetA(texel_color), | 168 SkPackARGB32NoCheck(SkColorGetA(texel_color), |
123 SkColorGetR(texel_color), | 169 SkColorGetR(texel_color), |
124 SkColorGetG(texel_color), | 170 SkColorGetG(texel_color), |
125 SkColorGetB(texel_color)); | 171 SkColorGetB(texel_color)); |
126 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height(); | 172 size_t num_pixels = static_cast<size_t>(rect.width()) * rect.height(); |
127 std::vector<uint32_t> pixels(num_pixels, pixel_color); | 173 std::vector<uint32_t> pixels(num_pixels, pixel_color); |
128 | 174 |
129 ResourceProvider::ResourceId resource = resource_provider->CreateResource( | 175 ResourceProvider::ResourceId resource = resource_provider->CreateResource( |
130 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 176 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
131 RGBA_8888); | 177 RGBA_8888); |
132 resource_provider->CopyToResource( | 178 resource_provider->CopyToResource( |
133 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); | 179 resource, reinterpret_cast<uint8_t*>(&pixels.front()), rect.size()); |
134 | 180 |
135 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 181 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
136 | 182 |
| 183 const gfx::PointF uv_top_left(0.0f, 0.0f); |
| 184 const gfx::PointF uv_bottom_right(1.0f, 1.0f); |
| 185 const bool flipped = false; |
| 186 const bool nearest_neighbor = false; |
137 TextureDrawQuad* quad = | 187 TextureDrawQuad* quad = |
138 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 188 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
139 quad->SetNew(shared_state, | 189 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource, |
140 rect, | 190 premultiplied_alpha, uv_top_left, uv_bottom_right, |
141 gfx::Rect(), | 191 background_color, vertex_opacity, flipped, nearest_neighbor); |
142 rect, | 192 } |
143 resource, | 193 |
144 premultiplied_alpha, | 194 void CreateTestYUVVideoDrawQuad_FromVideoFrame( |
145 gfx::PointF(0.0f, 0.0f), // uv_top_left | 195 const SharedQuadState* shared_state, |
146 gfx::PointF(1.0f, 1.0f), // uv_bottom_right | 196 scoped_refptr<media::VideoFrame> video_frame, |
147 background_color, | 197 uint8 alpha_value, |
148 vertex_opacity, | 198 const gfx::RectF& tex_coord_rect, |
149 false, // flipped | 199 RenderPass* render_pass, |
150 false); // nearest_neighbor | 200 VideoResourceUpdater* video_resource_updater, |
| 201 const gfx::Rect& rect, |
| 202 ResourceProvider* resource_provider) { |
| 203 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A); |
| 204 const YUVVideoDrawQuad::ColorSpace color_space = |
| 205 (video_frame->format() == media::VideoFrame::YV12J |
| 206 ? YUVVideoDrawQuad::JPEG |
| 207 : YUVVideoDrawQuad::REC_601); |
| 208 const gfx::Rect opaque_rect(0, 0, 0, 0); |
| 209 |
| 210 if (with_alpha) { |
| 211 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value, |
| 212 video_frame->stride(media::VideoFrame::kAPlane) * |
| 213 video_frame->rows(media::VideoFrame::kAPlane)); |
| 214 } |
| 215 |
| 216 VideoFrameExternalResources resources = |
| 217 video_resource_updater->CreateExternalResourcesFromVideoFrame( |
| 218 video_frame); |
| 219 |
| 220 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type); |
| 221 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 222 resources.mailboxes.size()); |
| 223 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()), |
| 224 resources.release_callbacks.size()); |
| 225 |
| 226 ResourceProvider::ResourceId y_resource = |
| 227 resource_provider->CreateResourceFromTextureMailbox( |
| 228 resources.mailboxes[media::VideoFrame::kYPlane], |
| 229 SingleReleaseCallbackImpl::Create( |
| 230 resources.release_callbacks[media::VideoFrame::kYPlane])); |
| 231 ResourceProvider::ResourceId u_resource = |
| 232 resource_provider->CreateResourceFromTextureMailbox( |
| 233 resources.mailboxes[media::VideoFrame::kUPlane], |
| 234 SingleReleaseCallbackImpl::Create( |
| 235 resources.release_callbacks[media::VideoFrame::kUPlane])); |
| 236 ResourceProvider::ResourceId v_resource = |
| 237 resource_provider->CreateResourceFromTextureMailbox( |
| 238 resources.mailboxes[media::VideoFrame::kVPlane], |
| 239 SingleReleaseCallbackImpl::Create( |
| 240 resources.release_callbacks[media::VideoFrame::kVPlane])); |
| 241 ResourceProvider::ResourceId a_resource = 0; |
| 242 if (with_alpha) { |
| 243 a_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 244 resources.mailboxes[media::VideoFrame::kAPlane], |
| 245 SingleReleaseCallbackImpl::Create( |
| 246 resources.release_callbacks[media::VideoFrame::kAPlane])); |
| 247 } |
| 248 |
| 249 YUVVideoDrawQuad* yuv_quad = |
| 250 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
| 251 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect, |
| 252 video_frame->coded_size(), y_resource, u_resource, |
| 253 v_resource, a_resource, color_space); |
| 254 } |
| 255 |
| 256 void CreateTestYUVVideoDrawQuad_Striped( |
| 257 const SharedQuadState* shared_state, |
| 258 media::VideoFrame::Format format, |
| 259 bool is_transparent, |
| 260 const gfx::RectF& tex_coord_rect, |
| 261 RenderPass* render_pass, |
| 262 VideoResourceUpdater* video_resource_updater, |
| 263 const gfx::Rect& rect, |
| 264 ResourceProvider* resource_provider) { |
| 265 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
| 266 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
| 267 |
| 268 // YUV values representing a striped pattern, for validating texture |
| 269 // coordinates for sampling. |
| 270 uint8_t y_value = 0; |
| 271 uint8_t u_value = 0; |
| 272 uint8_t v_value = 0; |
| 273 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) { |
| 274 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) + |
| 275 video_frame->stride(media::VideoFrame::kYPlane) * i; |
| 276 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane); |
| 277 ++j) { |
| 278 y_row[j] = (y_value += 1); |
| 279 } |
| 280 } |
| 281 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) { |
| 282 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) + |
| 283 video_frame->stride(media::VideoFrame::kUPlane) * i; |
| 284 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) + |
| 285 video_frame->stride(media::VideoFrame::kVPlane) * i; |
| 286 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane); |
| 287 ++j) { |
| 288 u_row[j] = (u_value += 3); |
| 289 v_row[j] = (v_value += 5); |
| 290 } |
| 291 } |
| 292 uint8 alpha_value = is_transparent ? 0 : 128; |
| 293 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
| 294 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
| 295 video_resource_updater, rect, resource_provider); |
| 296 } |
| 297 |
| 298 // Creates a video frame of size background_size filled with yuv_background, |
| 299 // and then draws a foreground rectangle in a different color on top of |
| 300 // that. The foreground rectangle must have coordinates that are divisible |
| 301 // by 2 because YUV is a block format. |
| 302 void CreateTestYUVVideoDrawQuad_TwoColor( |
| 303 const SharedQuadState* shared_state, |
| 304 media::VideoFrame::Format format, |
| 305 bool is_transparent, |
| 306 const gfx::RectF& tex_coord_rect, |
| 307 const gfx::Size& background_size, |
| 308 uint8 y_background, |
| 309 uint8 u_background, |
| 310 uint8 v_background, |
| 311 const gfx::Rect& foreground_rect, |
| 312 uint8 y_foreground, |
| 313 uint8 u_foreground, |
| 314 uint8 v_foreground, |
| 315 RenderPass* render_pass, |
| 316 VideoResourceUpdater* video_resource_updater, |
| 317 ResourceProvider* resource_provider) { |
| 318 const gfx::Rect rect(background_size); |
| 319 |
| 320 scoped_refptr<media::VideoFrame> video_frame = |
| 321 media::VideoFrame::CreateFrame(format, background_size, foreground_rect, |
| 322 foreground_rect.size(), base::TimeDelta()); |
| 323 |
| 324 int planes[] = {media::VideoFrame::kYPlane, |
| 325 media::VideoFrame::kUPlane, |
| 326 media::VideoFrame::kVPlane}; |
| 327 uint8 yuv_background[] = {y_background, u_background, v_background}; |
| 328 uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground}; |
| 329 int sample_size[] = {1, 2, 2}; |
| 330 |
| 331 for (int i = 0; i < 3; ++i) { |
| 332 memset(video_frame->data(planes[i]), yuv_background[i], |
| 333 video_frame->stride(planes[i]) * video_frame->rows(planes[i])); |
| 334 } |
| 335 |
| 336 for (int i = 0; i < 3; ++i) { |
| 337 // Since yuv encoding uses block encoding, widths have to be divisible |
| 338 // by the sample size in order for this function to behave properly. |
| 339 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0); |
| 340 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0); |
| 341 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0); |
| 342 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0); |
| 343 |
| 344 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i], |
| 345 foreground_rect.y() / sample_size[i], |
| 346 foreground_rect.width() / sample_size[i], |
| 347 foreground_rect.height() / sample_size[i]); |
| 348 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) { |
| 349 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) { |
| 350 size_t offset = y * video_frame->stride(planes[i]) + x; |
| 351 video_frame->data(planes[i])[offset] = yuv_foreground[i]; |
| 352 } |
| 353 } |
| 354 } |
| 355 |
| 356 uint8 alpha_value = 255; |
| 357 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
| 358 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
| 359 video_resource_updater, rect, resource_provider); |
| 360 } |
| 361 |
| 362 void CreateTestYUVVideoDrawQuad_Solid( |
| 363 const SharedQuadState* shared_state, |
| 364 media::VideoFrame::Format format, |
| 365 bool is_transparent, |
| 366 const gfx::RectF& tex_coord_rect, |
| 367 uint8 y, |
| 368 uint8 u, |
| 369 uint8 v, |
| 370 RenderPass* render_pass, |
| 371 VideoResourceUpdater* video_resource_updater, |
| 372 const gfx::Rect& rect, |
| 373 ResourceProvider* resource_provider) { |
| 374 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( |
| 375 format, rect.size(), rect, rect.size(), base::TimeDelta()); |
| 376 |
| 377 // YUV values of a solid, constant, color. Useful for testing that color |
| 378 // space/color range are being handled properly. |
| 379 memset(video_frame->data(media::VideoFrame::kYPlane), y, |
| 380 video_frame->stride(media::VideoFrame::kYPlane) * |
| 381 video_frame->rows(media::VideoFrame::kYPlane)); |
| 382 memset(video_frame->data(media::VideoFrame::kUPlane), u, |
| 383 video_frame->stride(media::VideoFrame::kUPlane) * |
| 384 video_frame->rows(media::VideoFrame::kUPlane)); |
| 385 memset(video_frame->data(media::VideoFrame::kVPlane), v, |
| 386 video_frame->stride(media::VideoFrame::kVPlane) * |
| 387 video_frame->rows(media::VideoFrame::kVPlane)); |
| 388 |
| 389 uint8 alpha_value = is_transparent ? 0 : 128; |
| 390 CreateTestYUVVideoDrawQuad_FromVideoFrame( |
| 391 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, |
| 392 video_resource_updater, rect, resource_provider); |
151 } | 393 } |
152 | 394 |
153 typedef ::testing::Types<GLRenderer, | 395 typedef ::testing::Types<GLRenderer, |
154 SoftwareRenderer, | 396 SoftwareRenderer, |
155 GLRendererWithExpandedViewport, | 397 GLRendererWithExpandedViewport, |
156 SoftwareRendererWithExpandedViewport> RendererTypes; | 398 SoftwareRendererWithExpandedViewport> RendererTypes; |
157 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); | 399 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
158 | 400 |
159 template <typename RendererType> | 401 template <typename RendererType> |
160 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; | 402 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 | 557 |
316 RenderPassList pass_list; | 558 RenderPassList pass_list; |
317 pass_list.push_back(pass.Pass()); | 559 pass_list.push_back(pass.Pass()); |
318 | 560 |
319 EXPECT_TRUE(this->RunPixelTest( | 561 EXPECT_TRUE(this->RunPixelTest( |
320 &pass_list, | 562 &pass_list, |
321 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), | 563 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), |
322 FuzzyPixelOffByOneComparator(true))); | 564 FuzzyPixelOffByOneComparator(true))); |
323 } | 565 } |
324 | 566 |
| 567 template <typename QuadType> |
| 568 static const base::FilePath::CharType* IntersectingQuadImage() { |
| 569 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png"); |
| 570 } |
| 571 template <> |
| 572 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() { |
| 573 return FILE_PATH_LITERAL("intersecting_blue_green.png"); |
| 574 } |
| 575 template <> |
| 576 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() { |
| 577 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"); |
| 578 } |
| 579 |
| 580 template <typename TypeParam> |
| 581 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> { |
| 582 protected: |
| 583 void SetupQuadStateAndRenderPass() { |
| 584 // This sets up a pair of draw quads. They are both rotated |
| 585 // relative to the root plane, they are also rotated relative to each other. |
| 586 // The intersect in the middle at a non-perpendicular angle so that any |
| 587 // errors are hopefully magnified. |
| 588 // The quads should intersect correctly, as in the front quad should only |
| 589 // be partially in front of the back quad, and partially behind. |
| 590 |
| 591 viewport_rect_ = gfx::Rect(this->device_viewport_size_); |
| 592 quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(), |
| 593 this->device_viewport_size_.height() / 2.0); |
| 594 |
| 595 RenderPassId id(1, 1); |
| 596 render_pass_ = CreateTestRootRenderPass(id, viewport_rect_); |
| 597 |
| 598 // Create the front quad rotated on the Z and Y axis. |
| 599 gfx::Transform trans; |
| 600 trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0); |
| 601 trans.RotateAboutZAxis(45.0); |
| 602 trans.RotateAboutYAxis(45.0); |
| 603 front_quad_state_ = |
| 604 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); |
| 605 front_quad_state_->clip_rect = quad_rect_; |
| 606 // Make sure they end up in a 3d sorting context. |
| 607 front_quad_state_->sorting_context_id = 1; |
| 608 |
| 609 // Create the back quad, and rotate on just the y axis. This will intersect |
| 610 // the first quad partially. |
| 611 trans = gfx::Transform(); |
| 612 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0); |
| 613 trans.RotateAboutYAxis(-45.0); |
| 614 back_quad_state_ = |
| 615 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); |
| 616 back_quad_state_->sorting_context_id = 1; |
| 617 back_quad_state_->clip_rect = quad_rect_; |
| 618 } |
| 619 template <typename T> |
| 620 void AppendBackgroundAndRunTest(const PixelComparator& comparator) { |
| 621 SharedQuadState* background_quad_state = CreateTestSharedQuadState( |
| 622 gfx::Transform(), viewport_rect_, render_pass_.get()); |
| 623 SolidColorDrawQuad* background_quad = |
| 624 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 625 background_quad->SetNew(background_quad_state, viewport_rect_, |
| 626 viewport_rect_, SK_ColorWHITE, false); |
| 627 pass_list_.push_back(render_pass_.Pass()); |
| 628 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>(); |
| 629 EXPECT_TRUE( |
| 630 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); |
| 631 } |
| 632 template <typename T> |
| 633 T* CreateAndAppendDrawQuad() { |
| 634 return render_pass_->CreateAndAppendDrawQuad<T>(); |
| 635 } |
| 636 |
| 637 scoped_ptr<RenderPass> render_pass_; |
| 638 gfx::Rect viewport_rect_; |
| 639 SharedQuadState* front_quad_state_; |
| 640 SharedQuadState* back_quad_state_; |
| 641 gfx::Rect quad_rect_; |
| 642 RenderPassList pass_list_; |
| 643 }; |
| 644 |
| 645 template <typename TypeParam> |
| 646 class IntersectingQuadGLPixelTest |
| 647 : public IntersectingQuadPixelTest<TypeParam> { |
| 648 public: |
| 649 void SetUp() override { |
| 650 IntersectingQuadPixelTest<TypeParam>::SetUp(); |
| 651 video_resource_updater_.reset( |
| 652 new VideoResourceUpdater(this->output_surface_->context_provider(), |
| 653 this->resource_provider_.get())); |
| 654 video_resource_updater2_.reset( |
| 655 new VideoResourceUpdater(this->output_surface_->context_provider(), |
| 656 this->resource_provider_.get())); |
| 657 } |
| 658 |
| 659 protected: |
| 660 scoped_ptr<VideoResourceUpdater> video_resource_updater_; |
| 661 scoped_ptr<VideoResourceUpdater> video_resource_updater2_; |
| 662 }; |
| 663 |
| 664 template <typename TypeParam> |
| 665 class IntersectingQuadSoftwareTest |
| 666 : public IntersectingQuadPixelTest<TypeParam> {}; |
| 667 |
| 668 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> |
| 669 SoftwareRendererTypes; |
| 670 typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport> |
| 671 GLRendererTypes; |
| 672 |
| 673 TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes); |
| 674 TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes); |
| 675 TYPED_TEST_CASE(IntersectingQuadSoftwareTest, SoftwareRendererTypes); |
| 676 |
| 677 TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) { |
| 678 this->SetupQuadStateAndRenderPass(); |
| 679 |
| 680 SolidColorDrawQuad* quad = |
| 681 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 682 SolidColorDrawQuad* quad2 = |
| 683 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 684 |
| 685 quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_, |
| 686 SK_ColorBLUE, false); |
| 687 quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_, |
| 688 SK_ColorGREEN, false); |
| 689 SCOPED_TRACE("IntersectingSolidColorQuads"); |
| 690 this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>( |
| 691 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
| 692 } |
| 693 |
| 694 template <typename TypeParam> |
| 695 SkColor GetColor(const SkColor& color) { |
| 696 return color; |
| 697 } |
| 698 |
| 699 template <> |
| 700 SkColor GetColor<GLRenderer>(const SkColor& color) { |
| 701 return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color), |
| 702 SkColorGetG(color), SkColorGetR(color)); |
| 703 } |
| 704 template <> |
| 705 SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) { |
| 706 return GetColor<GLRenderer>(color); |
| 707 } |
| 708 |
| 709 TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) { |
| 710 this->SetupQuadStateAndRenderPass(); |
| 711 CreateTestTwoColoredTextureDrawQuad( |
| 712 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), |
| 713 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT, |
| 714 true, this->front_quad_state_, this->resource_provider_.get(), |
| 715 this->render_pass_.get()); |
| 716 CreateTestTwoColoredTextureDrawQuad( |
| 717 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)), |
| 718 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT, |
| 719 true, this->back_quad_state_, this->resource_provider_.get(), |
| 720 this->render_pass_.get()); |
| 721 |
| 722 SCOPED_TRACE("IntersectingTexturedQuads"); |
| 723 this->template AppendBackgroundAndRunTest<TextureDrawQuad>( |
| 724 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
| 725 } |
| 726 |
| 727 TYPED_TEST(IntersectingQuadSoftwareTest, PictureQuads) { |
| 728 this->SetupQuadStateAndRenderPass(); |
| 729 gfx::RectF outer_rect(this->quad_rect_); |
| 730 gfx::RectF inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4), |
| 731 this->quad_rect_.y() + (this->quad_rect_.height() / 4), |
| 732 this->quad_rect_.width() / 2, |
| 733 this->quad_rect_.height() / 2); |
| 734 |
| 735 SkPaint black_paint; |
| 736 black_paint.setColor(SK_ColorBLACK); |
| 737 SkPaint blue_paint; |
| 738 blue_paint.setColor(SK_ColorBLUE); |
| 739 SkPaint green_paint; |
| 740 green_paint.setColor(SK_ColorGREEN); |
| 741 |
| 742 scoped_ptr<FakePicturePile> blue_recording = |
| 743 FakePicturePile::CreateFilledPile(gfx::Size(1000, 1000), |
| 744 this->quad_rect_.size()); |
| 745 blue_recording->add_draw_rect_with_paint(outer_rect, black_paint); |
| 746 blue_recording->add_draw_rect_with_paint(inner_rect, blue_paint); |
| 747 blue_recording->RerecordPile(); |
| 748 scoped_refptr<FakePicturePileImpl> blue_pile = |
| 749 FakePicturePileImpl::CreateFromPile(blue_recording.get(), nullptr); |
| 750 |
| 751 PictureDrawQuad* blue_quad = |
| 752 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>(); |
| 753 |
| 754 blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(), |
| 755 this->quad_rect_, this->quad_rect_, this->quad_rect_.size(), |
| 756 false, RGBA_8888, this->quad_rect_, 1.f, blue_pile); |
| 757 |
| 758 scoped_ptr<FakePicturePile> green_recording = |
| 759 FakePicturePile::CreateFilledPile(this->quad_rect_.size(), |
| 760 this->quad_rect_.size()); |
| 761 green_recording->add_draw_rect_with_paint(outer_rect, green_paint); |
| 762 green_recording->add_draw_rect_with_paint(inner_rect, black_paint); |
| 763 green_recording->RerecordPile(); |
| 764 scoped_refptr<FakePicturePileImpl> green_pile = |
| 765 FakePicturePileImpl::CreateFromPile(green_recording.get(), nullptr); |
| 766 |
| 767 PictureDrawQuad* green_quad = |
| 768 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>(); |
| 769 green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(), |
| 770 this->quad_rect_, this->quad_rect_, |
| 771 this->quad_rect_.size(), false, RGBA_8888, |
| 772 this->quad_rect_, 1.f, green_pile); |
| 773 SCOPED_TRACE("IntersectingPictureQuadsPass"); |
| 774 this->template AppendBackgroundAndRunTest<PictureDrawQuad>( |
| 775 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
| 776 } |
| 777 |
| 778 TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) { |
| 779 this->SetupQuadStateAndRenderPass(); |
| 780 RenderPassId child_pass_id1(2, 2); |
| 781 RenderPassId child_pass_id2(2, 3); |
| 782 scoped_ptr<RenderPass> child_pass1 = |
| 783 CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform()); |
| 784 SharedQuadState* child1_quad_state = CreateTestSharedQuadState( |
| 785 gfx::Transform(), this->quad_rect_, child_pass1.get()); |
| 786 scoped_ptr<RenderPass> child_pass2 = |
| 787 CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform()); |
| 788 SharedQuadState* child2_quad_state = CreateTestSharedQuadState( |
| 789 gfx::Transform(), this->quad_rect_, child_pass2.get()); |
| 790 |
| 791 CreateTestTwoColoredTextureDrawQuad( |
| 792 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), |
| 793 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT, |
| 794 true, child1_quad_state, this->resource_provider_.get(), |
| 795 child_pass1.get()); |
| 796 CreateTestTwoColoredTextureDrawQuad( |
| 797 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)), |
| 798 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT, |
| 799 true, child2_quad_state, this->resource_provider_.get(), |
| 800 child_pass2.get()); |
| 801 |
| 802 CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_, |
| 803 child_pass_id1, this->render_pass_.get()); |
| 804 CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_, |
| 805 child_pass_id2, this->render_pass_.get()); |
| 806 |
| 807 this->pass_list_.push_back(child_pass1.Pass()); |
| 808 this->pass_list_.push_back(child_pass2.Pass()); |
| 809 SCOPED_TRACE("IntersectingRenderQuadsPass"); |
| 810 this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>( |
| 811 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); |
| 812 } |
| 813 |
| 814 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) { |
| 815 this->SetupQuadStateAndRenderPass(); |
| 816 gfx::Rect inner_rect( |
| 817 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), |
| 818 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), |
| 819 (this->quad_rect_.width() / 2) & ~0xF, |
| 820 (this->quad_rect_.height() / 2) & ~0xF); |
| 821 |
| 822 CreateTestYUVVideoDrawQuad_TwoColor( |
| 823 this->front_quad_state_, media::VideoFrame::YV12J, false, |
| 824 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128, |
| 825 inner_rect, 29, 255, 107, this->render_pass_.get(), |
| 826 this->video_resource_updater_.get(), this->resource_provider_.get()); |
| 827 |
| 828 CreateTestYUVVideoDrawQuad_TwoColor( |
| 829 this->back_quad_state_, media::VideoFrame::YV12J, false, |
| 830 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21, |
| 831 inner_rect, 0, 128, 128, this->render_pass_.get(), |
| 832 this->video_resource_updater2_.get(), this->resource_provider_.get()); |
| 833 |
| 834 SCOPED_TRACE("IntersectingVideoQuads"); |
| 835 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( |
| 836 FuzzyPixelOffByOneComparator(false)); |
| 837 } |
| 838 |
325 // TODO(skaslev): The software renderer does not support non-premultplied alpha. | 839 // TODO(skaslev): The software renderer does not support non-premultplied alpha. |
326 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { | 840 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { |
327 gfx::Rect rect(this->device_viewport_size_); | 841 gfx::Rect rect(this->device_viewport_size_); |
328 | 842 |
329 RenderPassId id(1, 1); | 843 RenderPassId id(1, 1); |
330 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 844 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
331 | 845 |
332 SharedQuadState* shared_state = | 846 SharedQuadState* shared_state = |
333 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 847 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
334 | 848 |
(...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2145 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") | 2659 ? FILE_PATH_LITERAL("four_blue_green_checkers.png") |
2146 : FILE_PATH_LITERAL("checkers_big.png"); | 2660 : FILE_PATH_LITERAL("checkers_big.png"); |
2147 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), | 2661 EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path), |
2148 ExactPixelComparator(true))); | 2662 ExactPixelComparator(true))); |
2149 } | 2663 } |
2150 | 2664 |
2151 #endif // !defined(OS_ANDROID) | 2665 #endif // !defined(OS_ANDROID) |
2152 | 2666 |
2153 } // namespace | 2667 } // namespace |
2154 } // namespace cc | 2668 } // namespace cc |
OLD | NEW |