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