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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 bits_per_channel = 10; | 278 bits_per_channel = 10; |
279 } | 279 } |
280 | 280 |
281 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | 281 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
282 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, | 282 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, |
283 uv_tex_size, y_resource, u_resource, v_resource, a_resource, | 283 uv_tex_size, y_resource, u_resource, v_resource, a_resource, |
284 color_space, video_color_space, 0.0f, 1.0f, | 284 color_space, video_color_space, 0.0f, 1.0f, |
285 bits_per_channel); | 285 bits_per_channel); |
286 } | 286 } |
287 | 287 |
| 288 void CreateTestY16VideoDrawQuad_FromVideoFrame( |
| 289 const SharedQuadState* shared_state, |
| 290 scoped_refptr<media::VideoFrame> video_frame, |
| 291 const gfx::RectF& tex_coord_rect, |
| 292 RenderPass* render_pass, |
| 293 VideoResourceUpdater* video_resource_updater, |
| 294 const gfx::Rect& rect, |
| 295 const gfx::Rect& visible_rect, |
| 296 ResourceProvider* resource_provider) { |
| 297 const gfx::Rect opaque_rect(0, 0, 0, 0); |
| 298 |
| 299 VideoFrameExternalResources resources = |
| 300 video_resource_updater->CreateExternalResourcesFromVideoFrame( |
| 301 video_frame); |
| 302 |
| 303 EXPECT_EQ(VideoFrameExternalResources::Y_RESOURCE, resources.type); |
| 304 EXPECT_EQ(1u, resources.mailboxes.size()); |
| 305 EXPECT_EQ(1u, resources.release_callbacks.size()); |
| 306 |
| 307 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( |
| 308 resources.mailboxes[0], |
| 309 SingleReleaseCallbackImpl::Create(resources.release_callbacks[0])); |
| 310 |
| 311 YVideoDrawQuad* y_video_quad = |
| 312 render_pass->CreateAndAppendDrawQuad<YVideoDrawQuad>(); |
| 313 y_video_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
| 314 y_resource, tex_coord_rect.origin(), |
| 315 tex_coord_rect.bottom_right()); |
| 316 } |
| 317 |
288 // Upshift video frame to 10 bit. | 318 // Upshift video frame to 10 bit. |
289 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( | 319 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( |
290 media::VideoFrame* video_frame) { | 320 media::VideoFrame* video_frame) { |
291 media::VideoPixelFormat format; | 321 media::VideoPixelFormat format; |
292 switch (video_frame->format()) { | 322 switch (video_frame->format()) { |
293 case media::PIXEL_FORMAT_I420: | 323 case media::PIXEL_FORMAT_I420: |
294 case media::PIXEL_FORMAT_YV12: | 324 case media::PIXEL_FORMAT_YV12: |
295 format = media::PIXEL_FORMAT_YUV420P10; | 325 format = media::PIXEL_FORMAT_YUV420P10; |
296 break; | 326 break; |
297 case media::PIXEL_FORMAT_YV16: | 327 case media::PIXEL_FORMAT_YV16: |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 tex_coord_rect.height() * uv_tex_size.height()); | 562 tex_coord_rect.height() * uv_tex_size.height()); |
533 | 563 |
534 YUVVideoDrawQuad* yuv_quad = | 564 YUVVideoDrawQuad* yuv_quad = |
535 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 565 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
536 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | 566 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
537 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, | 567 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, |
538 uv_tex_size, y_resource, u_resource, v_resource, a_resource, | 568 uv_tex_size, y_resource, u_resource, v_resource, a_resource, |
539 color_space, video_color_space, 0.0f, 1.0f, 8); | 569 color_space, video_color_space, 0.0f, 1.0f, 8); |
540 } | 570 } |
541 | 571 |
| 572 void CreateTestY16VideoDrawQuad_TwoColor( |
| 573 const SharedQuadState* shared_state, |
| 574 const gfx::RectF& tex_coord_rect, |
| 575 uint8_t g_foreground, |
| 576 uint8_t g_background, |
| 577 RenderPass* render_pass, |
| 578 VideoResourceUpdater* video_resource_updater, |
| 579 const gfx::Rect& rect, |
| 580 const gfx::Rect& visible_rect, |
| 581 const gfx::Rect& foreground_rect, |
| 582 ResourceProvider* resource_provider) { |
| 583 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory( |
| 584 static_cast<unsigned char*>( |
| 585 base::AlignedAlloc(rect.size().GetArea() * 2, |
| 586 media::VideoFrame::kFrameAddressAlignment))); |
| 587 scoped_refptr<media::VideoFrame> video_frame = |
| 588 media::VideoFrame::WrapExternalData( |
| 589 media::PIXEL_FORMAT_Y16, rect.size(), foreground_rect, |
| 590 foreground_rect.size(), memory.get(), rect.size().GetArea() * 2, |
| 591 base::TimeDelta()); |
| 592 DCHECK_EQ(video_frame->rows(0) % 2, 0); |
| 593 DCHECK_EQ(video_frame->stride(0) % 2, 0); |
| 594 |
| 595 for (int j = 0; j < video_frame->rows(0); ++j) { |
| 596 uint8_t* row = video_frame->data(0) + j * video_frame->stride(0); |
| 597 if (j < foreground_rect.y() || j >= foreground_rect.bottom()) { |
| 598 for (int i = 0; i < video_frame->stride(0) / 2; ++i) { |
| 599 *row++ = i & 0xFF; // Fill R with anything. It is not rendered. |
| 600 *row++ = g_background; |
| 601 } |
| 602 } else { |
| 603 for (int i = 0; |
| 604 i < std::min(video_frame->stride(0) / 2, foreground_rect.x()); ++i) { |
| 605 *row++ = i & 0xFF; |
| 606 *row++ = g_background; |
| 607 } |
| 608 for (int i = foreground_rect.x(); |
| 609 i < std::min(video_frame->stride(0) / 2, foreground_rect.right()); |
| 610 ++i) { |
| 611 *row++ = i & 0xFF; |
| 612 *row++ = g_foreground; |
| 613 } |
| 614 for (int i = foreground_rect.right(); i < video_frame->stride(0) / 2; |
| 615 ++i) { |
| 616 *row++ = i & 0xFF; |
| 617 *row++ = g_background; |
| 618 } |
| 619 } |
| 620 } |
| 621 |
| 622 CreateTestY16VideoDrawQuad_FromVideoFrame( |
| 623 shared_state, video_frame, tex_coord_rect, render_pass, |
| 624 video_resource_updater, rect, visible_rect, resource_provider); |
| 625 } |
| 626 |
542 typedef ::testing::Types<GLRenderer, | 627 typedef ::testing::Types<GLRenderer, |
543 SoftwareRenderer, | 628 SoftwareRenderer, |
544 GLRendererWithExpandedViewport, | 629 GLRendererWithExpandedViewport, |
545 SoftwareRendererWithExpandedViewport> RendererTypes; | 630 SoftwareRendererWithExpandedViewport> RendererTypes; |
546 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); | 631 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
547 | 632 |
548 template <typename RendererType> | 633 template <typename RendererType> |
549 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; | 634 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; |
550 | 635 |
551 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> | 636 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png"); | 801 return FILE_PATH_LITERAL("intersecting_blue_green_squares.png"); |
717 } | 802 } |
718 template <> | 803 template <> |
719 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() { | 804 const base::FilePath::CharType* IntersectingQuadImage<SolidColorDrawQuad>() { |
720 return FILE_PATH_LITERAL("intersecting_blue_green.png"); | 805 return FILE_PATH_LITERAL("intersecting_blue_green.png"); |
721 } | 806 } |
722 template <> | 807 template <> |
723 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() { | 808 const base::FilePath::CharType* IntersectingQuadImage<YUVVideoDrawQuad>() { |
724 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"); | 809 return FILE_PATH_LITERAL("intersecting_blue_green_squares_video.png"); |
725 } | 810 } |
| 811 template <> |
| 812 const base::FilePath::CharType* IntersectingQuadImage<YVideoDrawQuad>() { |
| 813 return FILE_PATH_LITERAL("intersecting_light_dark_squares_video.png"); |
| 814 } |
726 | 815 |
727 template <typename TypeParam> | 816 template <typename TypeParam> |
728 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> { | 817 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> { |
729 protected: | 818 protected: |
730 void SetupQuadStateAndRenderPass() { | 819 void SetupQuadStateAndRenderPass() { |
731 // This sets up a pair of draw quads. They are both rotated | 820 // This sets up a pair of draw quads. They are both rotated |
732 // relative to the root plane, they are also rotated relative to each other. | 821 // relative to the root plane, they are also rotated relative to each other. |
733 // The intersect in the middle at a non-perpendicular angle so that any | 822 // The intersect in the middle at a non-perpendicular angle so that any |
734 // errors are hopefully magnified. | 823 // errors are hopefully magnified. |
735 // The quads should intersect correctly, as in the front quad should only | 824 // The quads should intersect correctly, as in the front quad should only |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
977 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), | 1066 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), |
978 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, | 1067 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, |
979 this->render_pass_.get(), this->video_resource_updater2_.get(), | 1068 this->render_pass_.get(), this->video_resource_updater2_.get(), |
980 this->resource_provider_.get()); | 1069 this->resource_provider_.get()); |
981 | 1070 |
982 SCOPED_TRACE("IntersectingVideoQuads"); | 1071 SCOPED_TRACE("IntersectingVideoQuads"); |
983 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( | 1072 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( |
984 FuzzyPixelOffByOneComparator(false)); | 1073 FuzzyPixelOffByOneComparator(false)); |
985 } | 1074 } |
986 | 1075 |
| 1076 TYPED_TEST(IntersectingQuadGLPixelTest, YVideoQuads) { |
| 1077 this->SetupQuadStateAndRenderPass(); |
| 1078 gfx::Rect inner_rect( |
| 1079 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), |
| 1080 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), |
| 1081 (this->quad_rect_.width() / 2) & ~0xF, |
| 1082 (this->quad_rect_.height() / 2) & ~0xF); |
| 1083 |
| 1084 CreateTestY16VideoDrawQuad_TwoColor( |
| 1085 this->front_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 18, 0, |
| 1086 this->render_pass_.get(), this->video_resource_updater_.get(), |
| 1087 this->quad_rect_, this->quad_rect_, inner_rect, |
| 1088 this->resource_provider_.get()); |
| 1089 |
| 1090 CreateTestY16VideoDrawQuad_TwoColor( |
| 1091 this->back_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 0, 182, |
| 1092 this->render_pass_.get(), this->video_resource_updater2_.get(), |
| 1093 this->quad_rect_, this->quad_rect_, inner_rect, |
| 1094 this->resource_provider_.get()); |
| 1095 |
| 1096 SCOPED_TRACE("IntersectingVideoQuads"); |
| 1097 this->template AppendBackgroundAndRunTest<YVideoDrawQuad>( |
| 1098 FuzzyPixelOffByOneComparator(false)); |
| 1099 } |
| 1100 |
987 // TODO(skaslev): The software renderer does not support non-premultplied alpha. | 1101 // TODO(skaslev): The software renderer does not support non-premultplied alpha. |
988 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { | 1102 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { |
989 gfx::Rect rect(this->device_viewport_size_); | 1103 gfx::Rect rect(this->device_viewport_size_); |
990 | 1104 |
991 RenderPassId id(1, 1); | 1105 RenderPassId id(1, 1); |
992 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1106 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
993 | 1107 |
994 SharedQuadState* shared_state = | 1108 SharedQuadState* shared_state = |
995 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1109 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
996 | 1110 |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 | 1452 |
1339 RenderPassList pass_list; | 1453 RenderPassList pass_list; |
1340 pass_list.push_back(std::move(pass)); | 1454 pass_list.push_back(std::move(pass)); |
1341 | 1455 |
1342 EXPECT_TRUE(this->RunPixelTest( | 1456 EXPECT_TRUE(this->RunPixelTest( |
1343 &pass_list, | 1457 &pass_list, |
1344 base::FilePath(FILE_PATH_LITERAL("black.png")), | 1458 base::FilePath(FILE_PATH_LITERAL("black.png")), |
1345 ExactPixelComparator(true))); | 1459 ExactPixelComparator(true))); |
1346 } | 1460 } |
1347 | 1461 |
| 1462 TEST_F(VideoGLRendererPixelTest, TwoColorY16Rect) { |
| 1463 gfx::Rect rect(this->device_viewport_size_); |
| 1464 |
| 1465 RenderPassId id(1, 1); |
| 1466 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
| 1467 |
| 1468 SharedQuadState* shared_state = |
| 1469 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
| 1470 |
| 1471 gfx::Rect upper_rect(rect.x(), rect.y(), rect.width(), rect.height() / 2); |
| 1472 CreateTestY16VideoDrawQuad_TwoColor( |
| 1473 shared_state, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 68, 123, pass.get(), |
| 1474 video_resource_updater_.get(), rect, rect, upper_rect, |
| 1475 resource_provider_.get()); |
| 1476 |
| 1477 RenderPassList pass_list; |
| 1478 pass_list.push_back(std::move(pass)); |
| 1479 |
| 1480 EXPECT_TRUE(this->RunPixelTest( |
| 1481 &pass_list, |
| 1482 base::FilePath(FILE_PATH_LITERAL("blue_yellow_filter_chain.png")), |
| 1483 FuzzyPixelOffByOneComparator(true))); |
| 1484 } |
| 1485 |
1348 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { | 1486 TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) { |
1349 gfx::Rect viewport_rect(this->device_viewport_size_); | 1487 gfx::Rect viewport_rect(this->device_viewport_size_); |
1350 | 1488 |
1351 RenderPassId root_pass_id(1, 1); | 1489 RenderPassId root_pass_id(1, 1); |
1352 std::unique_ptr<RenderPass> root_pass = | 1490 std::unique_ptr<RenderPass> root_pass = |
1353 CreateTestRootRenderPass(root_pass_id, viewport_rect); | 1491 CreateTestRootRenderPass(root_pass_id, viewport_rect); |
1354 | 1492 |
1355 RenderPassId child_pass_id(2, 2); | 1493 RenderPassId child_pass_id(2, 2); |
1356 gfx::Rect pass_rect(this->device_viewport_size_); | 1494 gfx::Rect pass_rect(this->device_viewport_size_); |
1357 gfx::Transform transform_to_root; | 1495 gfx::Transform transform_to_root; |
(...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3147 | 3285 |
3148 EXPECT_TRUE(this->RunPixelTest( | 3286 EXPECT_TRUE(this->RunPixelTest( |
3149 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), | 3287 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), |
3150 FuzzyPixelOffByOneComparator(true))); | 3288 FuzzyPixelOffByOneComparator(true))); |
3151 } | 3289 } |
3152 | 3290 |
3153 #endif // !defined(OS_ANDROID) | 3291 #endif // !defined(OS_ANDROID) |
3154 | 3292 |
3155 } // namespace | 3293 } // namespace |
3156 } // namespace cc | 3294 } // namespace cc |
OLD | NEW |