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 |