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

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

Issue 595593002: Splitting of layers for correct intersections (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes from issues introduced by the rebase, added tests for video_quads. Created 5 years, 11 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
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 "base/message_loop/message_loop.h" 5 #include "base/message_loop/message_loop.h"
6 #include "cc/layers/append_quads_data.h" 6 #include "cc/layers/append_quads_data.h"
7 #include "cc/output/gl_renderer.h" 7 #include "cc/output/gl_renderer.h"
8 #include "cc/quads/draw_quad.h" 8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/picture_draw_quad.h" 9 #include "cc/quads/picture_draw_quad.h"
10 #include "cc/quads/texture_draw_quad.h" 10 #include "cc/quads/texture_draw_quad.h"
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 resource, 149 resource,
150 premultiplied_alpha, 150 premultiplied_alpha,
151 gfx::PointF(0.0f, 0.0f), // uv_top_left 151 gfx::PointF(0.0f, 0.0f), // uv_top_left
152 gfx::PointF(1.0f, 1.0f), // uv_bottom_right 152 gfx::PointF(1.0f, 1.0f), // uv_bottom_right
153 background_color, 153 background_color,
154 vertex_opacity, 154 vertex_opacity,
155 false, // flipped 155 false, // flipped
156 false); // nearest_neighbor 156 false); // nearest_neighbor
157 } 157 }
158 158
159 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
enne (OOO) 2015/02/04 21:24:00 Ack, I touched some of these functions in a recent
awoloszyn 2015/02/12 16:48:51 Turns out it wasn't too bad!
160 const SharedQuadState* shared_state,
161 scoped_refptr<media::VideoFrame> video_frame,
162 bool is_transparent,
163 const gfx::RectF& tex_coord_rect,
164 RenderPass* render_pass,
165 VideoResourceUpdater* video_resource_updater,
166 const gfx::Rect& rect,
167 ResourceProvider* resource_provider) {
168 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
169 const YUVVideoDrawQuad::ColorSpace color_space =
170 (video_frame->format() == media::VideoFrame::YV12J
171 ? YUVVideoDrawQuad::REC_601_JPEG
172 : YUVVideoDrawQuad::REC_601);
173 const gfx::Rect opaque_rect(0, 0, 0, 0);
174
175 if (with_alpha)
176 memset(video_frame->data(media::VideoFrame::kAPlane),
177 is_transparent ? 0 : 128,
178 video_frame->stride(media::VideoFrame::kAPlane) *
179 video_frame->rows(media::VideoFrame::kAPlane));
180
181 VideoFrameExternalResources resources =
182 video_resource_updater->CreateExternalResourcesFromVideoFrame(
183 video_frame);
184
185 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
186 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
187 resources.mailboxes.size());
188 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
189 resources.release_callbacks.size());
190
191 ResourceProvider::ResourceId y_resource =
192 resource_provider->CreateResourceFromTextureMailbox(
193 resources.mailboxes[media::VideoFrame::kYPlane],
194 SingleReleaseCallbackImpl::Create(
195 resources.release_callbacks[media::VideoFrame::kYPlane]));
196 ResourceProvider::ResourceId u_resource =
197 resource_provider->CreateResourceFromTextureMailbox(
198 resources.mailboxes[media::VideoFrame::kUPlane],
199 SingleReleaseCallbackImpl::Create(
200 resources.release_callbacks[media::VideoFrame::kUPlane]));
201 ResourceProvider::ResourceId v_resource =
202 resource_provider->CreateResourceFromTextureMailbox(
203 resources.mailboxes[media::VideoFrame::kVPlane],
204 SingleReleaseCallbackImpl::Create(
205 resources.release_callbacks[media::VideoFrame::kVPlane]));
206 ResourceProvider::ResourceId a_resource = 0;
207 if (with_alpha) {
208 a_resource = resource_provider->CreateResourceFromTextureMailbox(
209 resources.mailboxes[media::VideoFrame::kAPlane],
210 SingleReleaseCallbackImpl::Create(
211 resources.release_callbacks[media::VideoFrame::kAPlane]));
212 }
213
214 YUVVideoDrawQuad* yuv_quad =
215 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
216 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
217 y_resource, u_resource, v_resource, a_resource, color_space);
218 }
219
220 void CreateTestYUVVideoDrawQuad_Striped(
221 const SharedQuadState* shared_state,
222 media::VideoFrame::Format format,
223 bool is_transparent,
224 const gfx::RectF& tex_coord_rect,
225 RenderPass* render_pass,
226 VideoResourceUpdater* video_resource_updater,
227 const gfx::Rect& rect,
228 ResourceProvider* resource_provider) {
229 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
230 format, rect.size(), rect, rect.size(), base::TimeDelta());
231
232 // YUV values representing a striped pattern, for validating texture
233 // coordinates for sampling.
234 uint8_t y_value = 0;
235 uint8_t u_value = 0;
236 uint8_t v_value = 0;
237 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
238 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
239 video_frame->stride(media::VideoFrame::kYPlane) * i;
240 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
241 ++j) {
242 y_row[j] = (y_value += 1);
243 }
244 }
245 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
246 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
247 video_frame->stride(media::VideoFrame::kUPlane) * i;
248 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
249 video_frame->stride(media::VideoFrame::kVPlane) * i;
250 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
251 ++j) {
252 u_row[j] = (u_value += 3);
253 v_row[j] = (v_value += 5);
254 }
255 }
256 CreateTestYUVVideoDrawQuad_FromVideoFrame(
257 shared_state, video_frame, is_transparent, tex_coord_rect, render_pass,
258 video_resource_updater, rect, resource_provider);
259 }
260
261 void CreateTestYUVVideoDrawQuad_Solid(
262 const SharedQuadState* shared_state,
263 media::VideoFrame::Format format,
264 bool is_transparent,
265 const gfx::RectF& tex_coord_rect,
266 uint8 y,
267 uint8 u,
268 uint8 v,
269 RenderPass* render_pass,
270 VideoResourceUpdater* video_resource_updater,
271 const gfx::Rect& rect,
272 ResourceProvider* resource_provider) {
273 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
274 format, rect.size(), rect, rect.size(), base::TimeDelta());
275
276 // YUV values of a solid, constant, color. Useful for testing that color
277 // space/color range are being handled properly.
278 memset(video_frame->data(media::VideoFrame::kYPlane), y,
279 video_frame->stride(media::VideoFrame::kYPlane) *
280 video_frame->rows(media::VideoFrame::kYPlane));
281 memset(video_frame->data(media::VideoFrame::kUPlane), u,
282 video_frame->stride(media::VideoFrame::kUPlane) *
283 video_frame->rows(media::VideoFrame::kUPlane));
284 memset(video_frame->data(media::VideoFrame::kVPlane), v,
285 video_frame->stride(media::VideoFrame::kVPlane) *
286 video_frame->rows(media::VideoFrame::kVPlane));
287
288 CreateTestYUVVideoDrawQuad_FromVideoFrame(
289 shared_state, video_frame, is_transparent, tex_coord_rect, render_pass,
290 video_resource_updater, rect, resource_provider);
291 }
292
159 typedef ::testing::Types<GLRenderer, 293 typedef ::testing::Types<GLRenderer,
160 SoftwareRenderer, 294 SoftwareRenderer,
161 GLRendererWithExpandedViewport, 295 GLRendererWithExpandedViewport,
162 SoftwareRendererWithExpandedViewport> RendererTypes; 296 SoftwareRendererWithExpandedViewport> RendererTypes;
163 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 297 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
164 298
165 template <typename RendererType> 299 template <typename RendererType>
166 class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator { 300 class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator {
167 public: 301 public:
168 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha) 302 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 448
315 RenderPassList pass_list; 449 RenderPassList pass_list;
316 pass_list.push_back(pass.Pass()); 450 pass_list.push_back(pass.Pass());
317 451
318 EXPECT_TRUE(this->RunPixelTest( 452 EXPECT_TRUE(this->RunPixelTest(
319 &pass_list, 453 &pass_list,
320 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 454 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
321 FuzzyPixelOffByOneComparator(true))); 455 FuzzyPixelOffByOneComparator(true)));
322 } 456 }
323 457
458 static const char* types[] = {
459 "intersecting_blue_green.png",
460 "intersecting_blue_green_texture.png",
enne (OOO) 2015/02/04 21:24:00 What's with the weird aliasing in this image and t
awoloszyn 2015/02/12 16:48:52 I replaced these images with more sensible ones. W
461 "intersecting_blue_green_render_pass.png",
enne (OOO) 2015/02/04 21:24:00 The intersecting_blue_green_render_pass.png looks
awoloszyn 2015/02/12 16:48:51 I replaced most of the pictures with fuzz.
462 };
463
464 #define GLImageIndex(Type, number) \
465 template <> \
466 struct GLImage<Type> { \
467 static const int val = number; \
468 };
469
470 template <typename QuadType>
471 struct GLImage {
472 static const int val = 0;
473 };
474 GLImageIndex(TextureDrawQuad, 1);
enne (OOO) 2015/02/04 21:24:00 Whoa, this is a bit obtuse to get a string into a
awoloszyn 2015/02/12 16:48:52 Fixed.
475 GLImageIndex(YUVVideoDrawQuad, 1);
476 GLImageIndex(RenderPassDrawQuad, 2);
477
478 template <typename RendererType, typename QuadType>
479 struct TypeStruct {
480 static const char* IntersectingQuadImage() {
481 return types[GLImage<QuadType>::val];
482 }
483 };
484
485 template <typename QuadType>
486 struct TypeStruct<SoftwareRenderer, QuadType> {
487 static const char* IntersectingQuadImage() {
488 return "intersecting_blue_green_software.png";
489 }
490 };
491
492 template <typename QuadType>
493 struct TypeStruct<SoftwareRendererWithExpandedViewport, QuadType> {
494 static const char* IntersectingQuadImage() {
495 return "intersecting_blue_green_software.png";
496 }
497 };
498
499 template <typename TypeParam>
500 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
501 protected:
502 void SetupQuadStateAndRenderPass() {
503 viewport_rect_ = gfx::Rect(this->device_viewport_size_);
504 quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(),
505 this->device_viewport_size_.height() / 2.0);
506
507 RenderPassId id(1, 1);
508 render_pass_ = CreateTestRootRenderPass(id, viewport_rect_);
509 gfx::Transform trans;
enne (OOO) 2015/02/04 21:24:00 Can you leave a large comment about what this is s
awoloszyn 2015/02/12 16:48:51 Done.
510 trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0);
511 trans.RotateAboutZAxis(46.0);
enne (OOO) 2015/02/04 21:24:00 Why 46 degrees? Is that why there's the weird alia
awoloszyn 2015/02/12 16:48:51 I wanted to avoid picking a very common rotation,
512 trans.RotateAboutYAxis(46.0);
513
514 front_quad_state_ =
515 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
516 front_quad_state_->clip_rect = quad_rect_;
517 front_quad_state_->sorting_context_id = 1;
518
519 trans = gfx::Transform();
520 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0);
521 trans.RotateAboutYAxis(-45.0);
522 back_quad_state_ =
523 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
524 back_quad_state_->sorting_context_id = 1;
525 back_quad_state_->clip_rect = quad_rect_;
526 }
527 template <typename T>
528 void AppendBackgroundAndRunTest() {
529 SharedQuadState* background_quad_state = CreateTestSharedQuadState(
530 gfx::Transform(), viewport_rect_, render_pass_.get());
531 SolidColorDrawQuad* background_quad =
532 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
533 background_quad->SetNew(background_quad_state, viewport_rect_,
534 viewport_rect_, SK_ColorWHITE, false);
535 pass_list_.push_back(render_pass_.Pass());
536 const char* fileName = TypeStruct<TypeParam, T>::IntersectingQuadImage();
537 EXPECT_TRUE(this->RunPixelTest(&pass_list_,
538 base::FilePath(FILE_PATH_LITERAL(fileName)),
539 FuzzyPixelOffByOneComparator(true)));
540 }
541 template <typename T>
542 T* CreateAndAppendDrawQuad() {
543 return render_pass_->CreateAndAppendDrawQuad<T>();
544 }
545
546 scoped_ptr<RenderPass> render_pass_;
547 gfx::Rect viewport_rect_;
548 SharedQuadState* front_quad_state_;
549 SharedQuadState* back_quad_state_;
550 gfx::Rect quad_rect_;
551 RenderPassList pass_list_;
552 };
553
554 TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes);
555
556 TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) {
557 this->SetupQuadStateAndRenderPass();
558
559 SolidColorDrawQuad* quad =
560 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
561 SolidColorDrawQuad* quad2 =
562 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
563
564 quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_,
565 SK_ColorBLUE, false);
566 quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_,
567 SK_ColorGREEN, false);
568 SCOPED_TRACE("IntersectingSolidColorQuads");
569 this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>();
570 }
571
572 template <typename TypeParam>
573 SkColor GetColor(const SkColor& color) {
574 return color;
575 }
576
577 template <>
578 SkColor GetColor<GLRenderer>(const SkColor& color) {
579 return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color),
580 SkColorGetG(color), SkColorGetR(color));
581 }
582 template <>
583 SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) {
584 return GetColor<GLRenderer>(color);
585 }
586
587 TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) {
588 this->SetupQuadStateAndRenderPass();
589 CreateTestTextureDrawQuad(
590 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)),
enne (OOO) 2015/02/04 21:24:00 Do you think the texture/video/picture/content qua
awoloszyn 2015/02/12 16:48:51 Fixed, now have a small square inside a large squa
591 SK_ColorTRANSPARENT, true, this->front_quad_state_,
592 this->resource_provider_.get(), this->render_pass_.get());
593 CreateTestTextureDrawQuad(
594 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
595 SK_ColorTRANSPARENT, true, this->back_quad_state_,
596 this->resource_provider_.get(), this->render_pass_.get());
597
598 SCOPED_TRACE("IntersectingTexturedQuads");
599 this->template AppendBackgroundAndRunTest<TextureDrawQuad>();
600 }
601
602 TYPED_TEST(IntersectingQuadPixelTest, PictureQuads) {
603 this->SetupQuadStateAndRenderPass();
604
605 scoped_refptr<FakePicturePileImpl> blue_pile =
606 FakePicturePileImpl::CreateFilledPile(gfx::Size(1000, 1000),
607 this->quad_rect_.size());
608 SkPaint blue_paint;
609 blue_paint.setColor(SK_ColorBLUE);
610 blue_pile->add_draw_rect_with_paint(this->quad_rect_, blue_paint);
611 blue_pile->RerecordPile();
612
613 PictureDrawQuad* blue_quad =
614 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
615 blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(),
616 this->quad_rect_, this->quad_rect_, this->quad_rect_.size(),
617 false, RGBA_8888, this->quad_rect_, 1.f, blue_pile);
618
619 scoped_refptr<FakePicturePileImpl> green_pile =
620 FakePicturePileImpl::CreateFilledPile(this->quad_rect_.size(),
621 this->quad_rect_.size());
622 SkPaint green_paint;
623 green_paint.setColor(SK_ColorGREEN);
624 green_pile->add_draw_rect_with_paint(this->quad_rect_, green_paint);
625 green_pile->RerecordPile();
626
627 PictureDrawQuad* green_quad =
628 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
629 green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(),
630 this->quad_rect_, this->quad_rect_,
631 this->quad_rect_.size(), false, RGBA_8888,
632 this->quad_rect_, 1.f, green_pile);
633 SCOPED_TRACE("IntersectingPictureQuadsPass");
634 this->template AppendBackgroundAndRunTest<PictureDrawQuad>();
635 }
636
637 TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
638 this->SetupQuadStateAndRenderPass();
639 RenderPassId child_pass_id1(2, 2);
640 RenderPassId child_pass_id2(2, 3);
641 scoped_ptr<RenderPass> child_pass1 =
642 CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform());
643 SharedQuadState* child1_quad_state = CreateTestSharedQuadState(
644 gfx::Transform(), this->quad_rect_, child_pass1.get());
645 scoped_ptr<RenderPass> child_pass2 =
646 CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform());
647 SharedQuadState* child2_quad_state = CreateTestSharedQuadState(
648 gfx::Transform(), this->quad_rect_, child_pass2.get());
649 SolidColorDrawQuad* quad =
650 child_pass1->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
651 SolidColorDrawQuad* quad2 =
652 child_pass2->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
653 quad->SetNew(child1_quad_state, this->quad_rect_, this->quad_rect_,
654 SK_ColorBLUE, false);
655 quad2->SetNew(child2_quad_state, this->quad_rect_, this->quad_rect_,
656 SK_ColorGREEN, false);
657 CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_,
658 child_pass_id1, this->render_pass_.get());
659 CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_,
660 child_pass_id2, this->render_pass_.get());
661
662 this->pass_list_.push_back(child_pass1.Pass());
663 this->pass_list_.push_back(child_pass2.Pass());
664 SCOPED_TRACE("IntersectingRenderQuadsPass");
665 this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>();
666 }
667 template <typename TypeParam>
668 class IntersectingQuadGLPixelTest
669 : public IntersectingQuadPixelTest<TypeParam> {
670 public:
671 void SetUp() override {
672 IntersectingQuadPixelTest<TypeParam>::SetUp();
673 video_resource_updater_.reset(
674 new VideoResourceUpdater(this->output_surface_->context_provider(),
675 this->resource_provider_.get()));
676 video_resource_updater2_.reset(
677 new VideoResourceUpdater(this->output_surface_->context_provider(),
678 this->resource_provider_.get()));
679 }
680
681 protected:
682 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
683 scoped_ptr<VideoResourceUpdater> video_resource_updater2_;
684 };
685
686 typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport>
687 GLRendererTypes;
688
689 TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes);
690
691 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
692 this->SetupQuadStateAndRenderPass();
693
694 CreateTestYUVVideoDrawQuad_Solid(
695 this->front_quad_state_, media::VideoFrame::YV12, false,
696 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 29, 255, 107,
697 this->render_pass_.get(), this->video_resource_updater_.get(),
698 this->quad_rect_, this->resource_provider_.get());
699
700 CreateTestYUVVideoDrawQuad_Solid(
701 this->back_quad_state_, media::VideoFrame::YV12, false,
702 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, this->render_pass_.get(),
703 this->video_resource_updater2_.get(), this->quad_rect_,
704 this->resource_provider_.get());
705
706 SCOPED_TRACE("IntersectingVideoQuads");
707 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>();
708 }
709
324 // TODO(skaslev): The software renderer does not support non-premultplied alpha. 710 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
325 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { 711 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
326 gfx::Rect rect(this->device_viewport_size_); 712 gfx::Rect rect(this->device_viewport_size_);
327 713
328 RenderPassId id(1, 1); 714 RenderPassId id(1, 1);
329 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 715 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
330 716
331 SharedQuadState* shared_state = 717 SharedQuadState* shared_state =
332 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 718 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
333 719
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 pass_list.push_back(pass.Pass()); 767 pass_list.push_back(pass.Pass());
382 768
383 EXPECT_TRUE(this->RunPixelTest( 769 EXPECT_TRUE(this->RunPixelTest(
384 &pass_list, 770 &pass_list,
385 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 771 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
386 FuzzyPixelOffByOneComparator(true))); 772 FuzzyPixelOffByOneComparator(true)));
387 } 773 }
388 774
389 class VideoGLRendererPixelTest : public GLRendererPixelTest { 775 class VideoGLRendererPixelTest : public GLRendererPixelTest {
390 protected: 776 protected:
391 void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state,
392 media::VideoFrame::Format format,
393 bool is_transparent,
394 const gfx::RectF& tex_coord_rect,
395 RenderPass* render_pass) {
396 const gfx::Rect rect(this->device_viewport_size_);
397
398 scoped_refptr<media::VideoFrame> video_frame =
399 media::VideoFrame::CreateFrame(
400 format, rect.size(), rect, rect.size(), base::TimeDelta());
401
402 // YUV values representing a striped pattern, for validating texture
403 // coordinates for sampling.
404 uint8_t y_value = 0;
405 uint8_t u_value = 0;
406 uint8_t v_value = 0;
407 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
408 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
409 video_frame->stride(media::VideoFrame::kYPlane) * i;
410 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
411 ++j) {
412 y_row[j] = (y_value += 1);
413 }
414 }
415 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
416 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
417 video_frame->stride(media::VideoFrame::kUPlane) * i;
418 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
419 video_frame->stride(media::VideoFrame::kVPlane) * i;
420 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
421 ++j) {
422 u_row[j] = (u_value += 3);
423 v_row[j] = (v_value += 5);
424 }
425 }
426 CreateTestYUVVideoDrawQuad_FromVideoFrame(
427 shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
428 }
429
430 void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state,
431 media::VideoFrame::Format format,
432 bool is_transparent,
433 const gfx::RectF& tex_coord_rect,
434 uint8 y,
435 uint8 u,
436 uint8 v,
437 RenderPass* render_pass) {
438 const gfx::Rect rect(this->device_viewport_size_);
439
440 scoped_refptr<media::VideoFrame> video_frame =
441 media::VideoFrame::CreateFrame(
442 format, rect.size(), rect, rect.size(), base::TimeDelta());
443
444 // YUV values of a solid, constant, color. Useful for testing that color
445 // space/color range are being handled properly.
446 memset(video_frame->data(media::VideoFrame::kYPlane),
447 y,
448 video_frame->stride(media::VideoFrame::kYPlane) *
449 video_frame->rows(media::VideoFrame::kYPlane));
450 memset(video_frame->data(media::VideoFrame::kUPlane),
451 u,
452 video_frame->stride(media::VideoFrame::kUPlane) *
453 video_frame->rows(media::VideoFrame::kUPlane));
454 memset(video_frame->data(media::VideoFrame::kVPlane),
455 v,
456 video_frame->stride(media::VideoFrame::kVPlane) *
457 video_frame->rows(media::VideoFrame::kVPlane));
458
459 CreateTestYUVVideoDrawQuad_FromVideoFrame(
460 shared_state, video_frame, is_transparent, tex_coord_rect, render_pass);
461 }
462
463 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
464 const SharedQuadState* shared_state,
465 scoped_refptr<media::VideoFrame> video_frame,
466 bool is_transparent,
467 const gfx::RectF& tex_coord_rect,
468 RenderPass* render_pass) {
469 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
470 const YUVVideoDrawQuad::ColorSpace color_space =
471 (video_frame->format() == media::VideoFrame::YV12J
472 ? YUVVideoDrawQuad::REC_601_JPEG
473 : YUVVideoDrawQuad::REC_601);
474 const gfx::Rect rect(this->device_viewport_size_);
475 const gfx::Rect opaque_rect(0, 0, 0, 0);
476
477 if (with_alpha)
478 memset(video_frame->data(media::VideoFrame::kAPlane),
479 is_transparent ? 0 : 128,
480 video_frame->stride(media::VideoFrame::kAPlane) *
481 video_frame->rows(media::VideoFrame::kAPlane));
482
483 VideoFrameExternalResources resources =
484 video_resource_updater_->CreateExternalResourcesFromVideoFrame(
485 video_frame);
486
487 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
488 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
489 resources.mailboxes.size());
490 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
491 resources.release_callbacks.size());
492
493 ResourceProvider::ResourceId y_resource =
494 resource_provider_->CreateResourceFromTextureMailbox(
495 resources.mailboxes[media::VideoFrame::kYPlane],
496 SingleReleaseCallbackImpl::Create(
497 resources.release_callbacks[media::VideoFrame::kYPlane]));
498 ResourceProvider::ResourceId u_resource =
499 resource_provider_->CreateResourceFromTextureMailbox(
500 resources.mailboxes[media::VideoFrame::kUPlane],
501 SingleReleaseCallbackImpl::Create(
502 resources.release_callbacks[media::VideoFrame::kUPlane]));
503 ResourceProvider::ResourceId v_resource =
504 resource_provider_->CreateResourceFromTextureMailbox(
505 resources.mailboxes[media::VideoFrame::kVPlane],
506 SingleReleaseCallbackImpl::Create(
507 resources.release_callbacks[media::VideoFrame::kVPlane]));
508 ResourceProvider::ResourceId a_resource = 0;
509 if (with_alpha) {
510 a_resource = resource_provider_->CreateResourceFromTextureMailbox(
511 resources.mailboxes[media::VideoFrame::kAPlane],
512 SingleReleaseCallbackImpl::Create(
513 resources.release_callbacks[media::VideoFrame::kAPlane]));
514 }
515
516 YUVVideoDrawQuad* yuv_quad =
517 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
518 yuv_quad->SetNew(shared_state,
519 rect,
520 opaque_rect,
521 rect,
522 tex_coord_rect,
523 y_resource,
524 u_resource,
525 v_resource,
526 a_resource,
527 color_space);
528 }
529
530 void SetUp() override { 777 void SetUp() override {
531 GLRendererPixelTest::SetUp(); 778 GLRendererPixelTest::SetUp();
532 video_resource_updater_.reset(new VideoResourceUpdater( 779 video_resource_updater_.reset(new VideoResourceUpdater(
533 output_surface_->context_provider(), resource_provider_.get())); 780 output_surface_->context_provider(), resource_provider_.get()));
534 } 781 }
535 782
536 private:
537 scoped_ptr<VideoResourceUpdater> video_resource_updater_; 783 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
538 }; 784 };
539 785
540 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { 786 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
541 gfx::Rect rect(this->device_viewport_size_); 787 gfx::Rect rect(this->device_viewport_size_);
542 788
543 RenderPassId id(1, 1); 789 RenderPassId id(1, 1);
544 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 790 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
545 791
546 SharedQuadState* shared_state = 792 SharedQuadState* shared_state =
547 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 793 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
548 794
549 CreateTestYUVVideoDrawQuad_Striped(shared_state, 795 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
550 media::VideoFrame::YV12, 796 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
551 false, 797 pass.get(), video_resource_updater_.get(),
552 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 798 gfx::Rect(this->device_viewport_size_),
553 pass.get()); 799 this->resource_provider_.get());
554 800
555 RenderPassList pass_list; 801 RenderPassList pass_list;
556 pass_list.push_back(pass.Pass()); 802 pass_list.push_back(pass.Pass());
557 803
558 EXPECT_TRUE( 804 EXPECT_TRUE(
559 this->RunPixelTest(&pass_list, 805 this->RunPixelTest(&pass_list,
560 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), 806 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
561 FuzzyPixelOffByOneComparator(true))); 807 FuzzyPixelOffByOneComparator(true)));
562 } 808 }
563 809
564 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { 810 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
565 gfx::Rect rect(this->device_viewport_size_); 811 gfx::Rect rect(this->device_viewport_size_);
566 812
567 RenderPassId id(1, 1); 813 RenderPassId id(1, 1);
568 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 814 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
569 815
570 SharedQuadState* shared_state = 816 SharedQuadState* shared_state =
571 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 817 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
572 818
573 // Intentionally sets frame format to I420 for testing coverage. 819 // Intentionally sets frame format to I420 for testing coverage.
574 CreateTestYUVVideoDrawQuad_Striped(shared_state, 820 CreateTestYUVVideoDrawQuad_Striped(
575 media::VideoFrame::I420, 821 shared_state, media::VideoFrame::I420, false,
576 false, 822 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(),
577 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), 823 video_resource_updater_.get(), gfx::Rect(this->device_viewport_size_),
578 pass.get()); 824 this->resource_provider_.get());
579 825
580 RenderPassList pass_list; 826 RenderPassList pass_list;
581 pass_list.push_back(pass.Pass()); 827 pass_list.push_back(pass.Pass());
582 828
583 EXPECT_TRUE(this->RunPixelTest( 829 EXPECT_TRUE(this->RunPixelTest(
584 &pass_list, 830 &pass_list,
585 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), 831 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
586 FuzzyPixelOffByOneComparator(true))); 832 FuzzyPixelOffByOneComparator(true)));
587 } 833 }
588 834
589 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) { 835 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) {
590 gfx::Rect rect(this->device_viewport_size_); 836 gfx::Rect rect(this->device_viewport_size_);
591 837
592 RenderPassId id(1, 1); 838 RenderPassId id(1, 1);
593 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 839 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
594 840
595 SharedQuadState* shared_state = 841 SharedQuadState* shared_state =
596 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 842 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
597 843
598 // In MPEG color range YUV values of (15,128,128) should produce black. 844 // In MPEG color range YUV values of (15,128,128) should produce black.
599 CreateTestYUVVideoDrawQuad_Solid(shared_state, 845 CreateTestYUVVideoDrawQuad_Solid(
600 media::VideoFrame::YV12, 846 shared_state, media::VideoFrame::YV12, false,
601 false, 847 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
602 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 848 video_resource_updater_.get(), gfx::Rect(this->device_viewport_size_),
603 15, 849 this->resource_provider_.get());
604 128,
605 128,
606 pass.get());
607 850
608 RenderPassList pass_list; 851 RenderPassList pass_list;
609 pass_list.push_back(pass.Pass()); 852 pass_list.push_back(pass.Pass());
610 853
611 // If we didn't get black out of the YUV values above, then we probably have a 854 // If we didn't get black out of the YUV values above, then we probably have a
612 // color range issue. 855 // color range issue.
613 EXPECT_TRUE(this->RunPixelTest(&pass_list, 856 EXPECT_TRUE(this->RunPixelTest(&pass_list,
614 base::FilePath(FILE_PATH_LITERAL("black.png")), 857 base::FilePath(FILE_PATH_LITERAL("black.png")),
615 FuzzyPixelOffByOneComparator(true))); 858 FuzzyPixelOffByOneComparator(true)));
616 } 859 }
617 860
618 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { 861 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) {
619 gfx::Rect rect(this->device_viewport_size_); 862 gfx::Rect rect(this->device_viewport_size_);
620 863
621 RenderPassId id(1, 1); 864 RenderPassId id(1, 1);
622 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 865 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
623 866
624 SharedQuadState* shared_state = 867 SharedQuadState* shared_state =
625 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 868 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
626 869
627 // YUV of (149,43,21) should be green (0,255,0) in RGB. 870 // YUV of (149,43,21) should be green (0,255,0) in RGB.
628 CreateTestYUVVideoDrawQuad_Solid(shared_state, 871 CreateTestYUVVideoDrawQuad_Solid(
629 media::VideoFrame::YV12J, 872 shared_state, media::VideoFrame::YV12J, false,
630 false, 873 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
631 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 874 video_resource_updater_.get(), gfx::Rect(this->device_viewport_size_),
632 149, 875 this->resource_provider_.get());
633 43,
634 21,
635 pass.get());
636 876
637 RenderPassList pass_list; 877 RenderPassList pass_list;
638 pass_list.push_back(pass.Pass()); 878 pass_list.push_back(pass.Pass());
639 879
640 EXPECT_TRUE(this->RunPixelTest(&pass_list, 880 EXPECT_TRUE(this->RunPixelTest(&pass_list,
641 base::FilePath(FILE_PATH_LITERAL("green.png")), 881 base::FilePath(FILE_PATH_LITERAL("green.png")),
642 FuzzyPixelOffByOneComparator(true))); 882 FuzzyPixelOffByOneComparator(true)));
643 } 883 }
644 884
645 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) { 885 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) {
646 gfx::Rect rect(this->device_viewport_size_); 886 gfx::Rect rect(this->device_viewport_size_);
647 887
648 RenderPassId id(1, 1); 888 RenderPassId id(1, 1);
649 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 889 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
650 890
651 SharedQuadState* shared_state = 891 SharedQuadState* shared_state =
652 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 892 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
653 893
654 // Dark grey in JPEG color range (in MPEG, this is black). 894 // Dark grey in JPEG color range (in MPEG, this is black).
655 CreateTestYUVVideoDrawQuad_Solid(shared_state, 895 CreateTestYUVVideoDrawQuad_Solid(
656 media::VideoFrame::YV12J, 896 shared_state, media::VideoFrame::YV12J, false,
657 false, 897 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
658 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 898 video_resource_updater_.get(), gfx::Rect(this->device_viewport_size_),
659 15, 899 this->resource_provider_.get());
660 128,
661 128,
662 pass.get());
663 900
664 RenderPassList pass_list; 901 RenderPassList pass_list;
665 pass_list.push_back(pass.Pass()); 902 pass_list.push_back(pass.Pass());
666 903
667 EXPECT_TRUE( 904 EXPECT_TRUE(
668 this->RunPixelTest(&pass_list, 905 this->RunPixelTest(&pass_list,
669 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")), 906 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
670 FuzzyPixelOffByOneComparator(true))); 907 FuzzyPixelOffByOneComparator(true)));
671 } 908 }
672 909
673 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { 910 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
674 gfx::Rect rect(this->device_viewport_size_); 911 gfx::Rect rect(this->device_viewport_size_);
675 912
676 RenderPassId id(1, 1); 913 RenderPassId id(1, 1);
677 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 914 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
678 915
679 SharedQuadState* shared_state = 916 SharedQuadState* shared_state =
680 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 917 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
681 918
682 CreateTestYUVVideoDrawQuad_Striped(shared_state, 919 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
683 media::VideoFrame::YV12A, 920 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
684 false, 921 pass.get(), video_resource_updater_.get(),
685 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 922 gfx::Rect(this->device_viewport_size_),
686 pass.get()); 923 this->resource_provider_.get());
687 924
688 SolidColorDrawQuad* color_quad = 925 SolidColorDrawQuad* color_quad =
689 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 926 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
690 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); 927 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
691 928
692 RenderPassList pass_list; 929 RenderPassList pass_list;
693 pass_list.push_back(pass.Pass()); 930 pass_list.push_back(pass.Pass());
694 931
695 EXPECT_TRUE(this->RunPixelTest( 932 EXPECT_TRUE(this->RunPixelTest(
696 &pass_list, 933 &pass_list,
697 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), 934 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
698 FuzzyPixelOffByOneComparator(true))); 935 FuzzyPixelOffByOneComparator(true)));
699 } 936 }
700 937
701 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { 938 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
702 gfx::Rect rect(this->device_viewport_size_); 939 gfx::Rect rect(this->device_viewport_size_);
703 940
704 RenderPassId id(1, 1); 941 RenderPassId id(1, 1);
705 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 942 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
706 943
707 SharedQuadState* shared_state = 944 SharedQuadState* shared_state =
708 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 945 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
709 946
710 CreateTestYUVVideoDrawQuad_Striped(shared_state, 947 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
711 media::VideoFrame::YV12A, 948 true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
712 true, 949 pass.get(), video_resource_updater_.get(),
713 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 950 gfx::Rect(this->device_viewport_size_),
714 pass.get()); 951 this->resource_provider_.get());
715 952
716 SolidColorDrawQuad* color_quad = 953 SolidColorDrawQuad* color_quad =
717 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 954 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
718 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false); 955 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false);
719 956
720 RenderPassList pass_list; 957 RenderPassList pass_list;
721 pass_list.push_back(pass.Pass()); 958 pass_list.push_back(pass.Pass());
722 959
723 EXPECT_TRUE(this->RunPixelTest( 960 EXPECT_TRUE(this->RunPixelTest(
724 &pass_list, 961 &pass_list,
(...skipping 1694 matching lines...) Expand 10 before | Expand all | Expand 10 after
2419 EXPECT_TRUE(this->RunPixelTest( 2656 EXPECT_TRUE(this->RunPixelTest(
2420 &pass_list, 2657 &pass_list,
2421 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")), 2658 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2422 FuzzyPixelOffByOneComparator(true))); 2659 FuzzyPixelOffByOneComparator(true)));
2423 } 2660 }
2424 2661
2425 #endif // !defined(OS_ANDROID) 2662 #endif // !defined(OS_ANDROID)
2426 2663
2427 } // namespace 2664 } // namespace
2428 } // namespace cc 2665 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698