Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: cc/output/renderer_pixeltest.cc

Issue 2121043002: 16 bpp video stream capture, render and WebGL usage - Realsense R200 & SR300 support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/output/gl_renderer_unittest.cc ('k') | cc/output/shader.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/output/gl_renderer_unittest.cc ('k') | cc/output/shader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698