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( | |
danakj
2016/10/24 21:46:37
s/VideoDrawQuad/TextureDrawQuad/ ?
aleksandar.stojiljkovic
2016/10/25 10:12:28
Done.
| |
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 VideoFrameExternalResources resources = | |
298 video_resource_updater->CreateExternalResourcesFromVideoFrame( | |
299 video_frame); | |
300 | |
301 EXPECT_EQ(VideoFrameExternalResources::RGBA_RESOURCE, resources.type); | |
302 EXPECT_EQ(1u, resources.mailboxes.size()); | |
303 EXPECT_EQ(1u, resources.release_callbacks.size()); | |
304 | |
305 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( | |
306 resources.mailboxes[0], | |
307 SingleReleaseCallbackImpl::Create(resources.release_callbacks[0])); | |
308 | |
309 TextureDrawQuad* quad = | |
aleksandar.stojiljkovic
2016/10/20 21:52:49
To render video frame of format PIXEL_FORMAT_Y16 w
| |
310 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | |
311 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | |
312 quad->SetNew(shared_state, rect, gfx::Rect(), rect, y_resource, false, | |
313 tex_coord_rect.origin(), tex_coord_rect.bottom_right(), | |
314 SK_ColorBLACK, vertex_opacity, false, false, false); | |
315 } | |
316 | |
288 // Upshift video frame to 10 bit. | 317 // Upshift video frame to 10 bit. |
289 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( | 318 scoped_refptr<media::VideoFrame> CreateHighbitVideoFrame( |
290 media::VideoFrame* video_frame) { | 319 media::VideoFrame* video_frame) { |
291 media::VideoPixelFormat format; | 320 media::VideoPixelFormat format; |
292 switch (video_frame->format()) { | 321 switch (video_frame->format()) { |
293 case media::PIXEL_FORMAT_I420: | 322 case media::PIXEL_FORMAT_I420: |
294 case media::PIXEL_FORMAT_YV12: | 323 case media::PIXEL_FORMAT_YV12: |
295 format = media::PIXEL_FORMAT_YUV420P10; | 324 format = media::PIXEL_FORMAT_YUV420P10; |
296 break; | 325 break; |
297 case media::PIXEL_FORMAT_YV16: | 326 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()); | 561 tex_coord_rect.height() * uv_tex_size.height()); |
533 | 562 |
534 YUVVideoDrawQuad* yuv_quad = | 563 YUVVideoDrawQuad* yuv_quad = |
535 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 564 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
536 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | 565 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
537 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, | 566 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, |
538 uv_tex_size, y_resource, u_resource, v_resource, a_resource, | 567 uv_tex_size, y_resource, u_resource, v_resource, a_resource, |
539 color_space, video_color_space, 0.0f, 1.0f, 8); | 568 color_space, video_color_space, 0.0f, 1.0f, 8); |
540 } | 569 } |
541 | 570 |
571 void CreateTestY16VideoDrawQuad_TwoColor( | |
572 const SharedQuadState* shared_state, | |
573 const gfx::RectF& tex_coord_rect, | |
574 uint8_t g_foreground, | |
575 uint8_t g_background, | |
576 RenderPass* render_pass, | |
577 VideoResourceUpdater* video_resource_updater, | |
578 const gfx::Rect& rect, | |
579 const gfx::Rect& visible_rect, | |
580 const gfx::Rect& foreground_rect, | |
581 ResourceProvider* resource_provider) { | |
582 std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory( | |
583 static_cast<unsigned char*>( | |
584 base::AlignedAlloc(rect.size().GetArea() * 2, | |
585 media::VideoFrame::kFrameAddressAlignment))); | |
586 scoped_refptr<media::VideoFrame> video_frame = | |
587 media::VideoFrame::WrapExternalData( | |
588 media::PIXEL_FORMAT_Y16, rect.size(), visible_rect, | |
589 visible_rect.size(), memory.get(), rect.size().GetArea() * 2, | |
590 base::TimeDelta()); | |
591 DCHECK_EQ(video_frame->rows(0) % 2, 0); | |
592 DCHECK_EQ(video_frame->stride(0) % 2, 0); | |
593 | |
594 for (int j = 0; j < video_frame->rows(0); ++j) { | |
595 uint8_t* row = video_frame->data(0) + j * video_frame->stride(0); | |
596 if (j < foreground_rect.y() || j >= foreground_rect.bottom()) { | |
597 for (int i = 0; i < video_frame->stride(0) / 2; ++i) { | |
598 *row++ = i & 0xFF; // Fill R with anything. It is not rendered. | |
599 *row++ = g_background; | |
600 } | |
601 } else { | |
602 for (int i = 0; | |
603 i < std::min(video_frame->stride(0) / 2, foreground_rect.x()); ++i) { | |
604 *row++ = i & 0xFF; | |
605 *row++ = g_background; | |
606 } | |
607 for (int i = foreground_rect.x(); | |
608 i < std::min(video_frame->stride(0) / 2, foreground_rect.right()); | |
609 ++i) { | |
610 *row++ = i & 0xFF; | |
611 *row++ = g_foreground; | |
612 } | |
613 for (int i = foreground_rect.right(); i < video_frame->stride(0) / 2; | |
614 ++i) { | |
615 *row++ = i & 0xFF; | |
616 *row++ = g_background; | |
617 } | |
618 } | |
619 } | |
620 | |
621 CreateTestY16VideoDrawQuad_FromVideoFrame( | |
622 shared_state, video_frame, tex_coord_rect, render_pass, | |
623 video_resource_updater, rect, visible_rect, resource_provider); | |
624 } | |
625 | |
542 typedef ::testing::Types<GLRenderer, | 626 typedef ::testing::Types<GLRenderer, |
543 SoftwareRenderer, | 627 SoftwareRenderer, |
544 GLRendererWithExpandedViewport, | 628 GLRendererWithExpandedViewport, |
545 SoftwareRendererWithExpandedViewport> RendererTypes; | 629 SoftwareRendererWithExpandedViewport> RendererTypes; |
546 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); | 630 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); |
547 | 631 |
548 template <typename RendererType> | 632 template <typename RendererType> |
549 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; | 633 class SoftwareRendererPixelTest : public RendererPixelTest<RendererType> {}; |
550 | 634 |
551 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> | 635 typedef ::testing::Types<SoftwareRenderer, SoftwareRendererWithExpandedViewport> |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
758 trans = gfx::Transform(); | 842 trans = gfx::Transform(); |
759 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0); | 843 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0); |
760 trans.RotateAboutYAxis(-45.0); | 844 trans.RotateAboutYAxis(-45.0); |
761 back_quad_state_ = | 845 back_quad_state_ = |
762 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); | 846 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get()); |
763 back_quad_state_->sorting_context_id = 1; | 847 back_quad_state_->sorting_context_id = 1; |
764 back_quad_state_->clip_rect = quad_rect_; | 848 back_quad_state_->clip_rect = quad_rect_; |
765 } | 849 } |
766 template <typename T> | 850 template <typename T> |
767 void AppendBackgroundAndRunTest(const PixelComparator& comparator) { | 851 void AppendBackgroundAndRunTest(const PixelComparator& comparator) { |
852 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>(); | |
853 AppendBackgroundAndRunTest(comparator, fileName); | |
854 } | |
855 void AppendBackgroundAndRunTest(const PixelComparator& comparator, | |
856 const base::FilePath::CharType* fileName) { | |
768 SharedQuadState* background_quad_state = CreateTestSharedQuadState( | 857 SharedQuadState* background_quad_state = CreateTestSharedQuadState( |
769 gfx::Transform(), viewport_rect_, render_pass_.get()); | 858 gfx::Transform(), viewport_rect_, render_pass_.get()); |
770 SolidColorDrawQuad* background_quad = | 859 SolidColorDrawQuad* background_quad = |
771 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 860 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
772 background_quad->SetNew(background_quad_state, viewport_rect_, | 861 background_quad->SetNew(background_quad_state, viewport_rect_, |
773 viewport_rect_, SK_ColorWHITE, false); | 862 viewport_rect_, SK_ColorWHITE, false); |
774 pass_list_.push_back(std::move(render_pass_)); | 863 pass_list_.push_back(std::move(render_pass_)); |
775 const base::FilePath::CharType* fileName = IntersectingQuadImage<T>(); | |
776 EXPECT_TRUE( | 864 EXPECT_TRUE( |
777 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); | 865 this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); |
778 } | 866 } |
779 template <typename T> | 867 template <typename T> |
780 T* CreateAndAppendDrawQuad() { | 868 T* CreateAndAppendDrawQuad() { |
781 return render_pass_->CreateAndAppendDrawQuad<T>(); | 869 return render_pass_->CreateAndAppendDrawQuad<T>(); |
782 } | 870 } |
783 | 871 |
784 std::unique_ptr<RenderPass> render_pass_; | 872 std::unique_ptr<RenderPass> render_pass_; |
785 gfx::Rect viewport_rect_; | 873 gfx::Rect viewport_rect_; |
(...skipping 191 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(), | 1065 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, | 1066 this->quad_rect_, 149, 43, 21, inner_rect, 0, 128, 128, |
979 this->render_pass_.get(), this->video_resource_updater2_.get(), | 1067 this->render_pass_.get(), this->video_resource_updater2_.get(), |
980 this->resource_provider_.get()); | 1068 this->resource_provider_.get()); |
981 | 1069 |
982 SCOPED_TRACE("IntersectingVideoQuads"); | 1070 SCOPED_TRACE("IntersectingVideoQuads"); |
983 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( | 1071 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>( |
984 FuzzyPixelOffByOneComparator(false)); | 1072 FuzzyPixelOffByOneComparator(false)); |
985 } | 1073 } |
986 | 1074 |
1075 TYPED_TEST(IntersectingQuadGLPixelTest, Y16VideoQuads) { | |
1076 this->SetupQuadStateAndRenderPass(); | |
1077 gfx::Rect inner_rect( | |
1078 ((this->quad_rect_.x() + (this->quad_rect_.width() / 4)) & ~0xF), | |
1079 ((this->quad_rect_.y() + (this->quad_rect_.height() / 4)) & ~0xF), | |
1080 (this->quad_rect_.width() / 2) & ~0xF, | |
1081 (this->quad_rect_.height() / 2) & ~0xF); | |
1082 | |
1083 CreateTestY16VideoDrawQuad_TwoColor( | |
1084 this->front_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 18, 0, | |
1085 this->render_pass_.get(), this->video_resource_updater_.get(), | |
1086 this->quad_rect_, this->quad_rect_, inner_rect, | |
1087 this->resource_provider_.get()); | |
1088 | |
1089 CreateTestY16VideoDrawQuad_TwoColor( | |
1090 this->back_quad_state_, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 0, 182, | |
1091 this->render_pass_.get(), this->video_resource_updater2_.get(), | |
1092 this->quad_rect_, this->quad_rect_, inner_rect, | |
1093 this->resource_provider_.get()); | |
1094 | |
1095 SCOPED_TRACE("IntersectingVideoQuads"); | |
1096 this->AppendBackgroundAndRunTest( | |
1097 FuzzyPixelOffByOneComparator(false), | |
1098 FILE_PATH_LITERAL("intersecting_light_dark_squares_video.png")); | |
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 |