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

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: Added comment to test. Created 5 years, 10 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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 rect, 104 rect,
105 pass_id, 105 pass_id,
106 0, // mask_resource_id 106 0, // mask_resource_id
107 gfx::Vector2dF(), // mask_uv_scale 107 gfx::Vector2dF(), // mask_uv_scale
108 gfx::Size(), // mask_texture_size 108 gfx::Size(), // mask_texture_size
109 FilterOperations(), // foreground filters 109 FilterOperations(), // foreground filters
110 gfx::Vector2dF(), // filters scale 110 gfx::Vector2dF(), // filters scale
111 FilterOperations()); // background filters 111 FilterOperations()); // background filters
112 } 112 }
113 113
114 void CreateTestTwoColoredTextureDrawQuad(const gfx::Rect& rect,
115 SkColor texel_color,
116 SkColor texel_stripe_color,
117 SkColor background_color,
118 bool premultiplied_alpha,
119 const SharedQuadState* shared_state,
120 ResourceProvider* resource_provider,
121 RenderPass* render_pass) {
122 SkPMColor pixel_color = premultiplied_alpha
123 ? SkPreMultiplyColor(texel_color)
124 : SkPackARGB32NoCheck(SkColorGetA(texel_color),
125 SkColorGetR(texel_color),
126 SkColorGetG(texel_color),
127 SkColorGetB(texel_color));
128 SkPMColor pixel_stripe_color =
129 premultiplied_alpha
130 ? SkPreMultiplyColor(texel_stripe_color)
131 : SkPackARGB32NoCheck(SkColorGetA(texel_stripe_color),
132 SkColorGetR(texel_stripe_color),
133 SkColorGetG(texel_stripe_color),
134 SkColorGetB(texel_stripe_color));
135 std::vector<uint32_t> pixels(rect.size().GetArea(), pixel_color);
136 for (int i = rect.height() / 4; i < (rect.height() * 3 / 4); ++i) {
137 for (int k = rect.width() / 4; k < (rect.width() * 3 / 4); ++k) {
138 pixels[i * rect.width() + k] = pixel_stripe_color;
139 }
140 }
141 ResourceProvider::ResourceId resource = resource_provider->CreateResource(
142 rect.size(), GL_CLAMP_TO_EDGE, ResourceProvider::TextureHintImmutable,
143 RGBA_8888);
144 resource_provider->SetPixels(resource,
145 reinterpret_cast<uint8_t*>(&pixels.front()),
146 rect, rect, gfx::Vector2d());
147
148 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
149
150 TextureDrawQuad* quad =
151 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
152 quad->SetNew(shared_state, rect, gfx::Rect(), rect, resource,
153 premultiplied_alpha, gfx::PointF(0.0f, 0.0f), // uv_top_left
enne (OOO) 2015/02/12 18:00:27 If you feel like you need inline comments about wh
awoloszyn 2015/02/23 22:28:27 Done.
154 gfx::PointF(1.0f, 1.0f), // uv_bottom_right
155 background_color, vertex_opacity,
156 false, // flipped
157 false); // nearest_neighbor
158 }
159
114 void CreateTestTextureDrawQuad(const gfx::Rect& rect, 160 void CreateTestTextureDrawQuad(const gfx::Rect& rect,
115 SkColor texel_color, 161 SkColor texel_color,
116 SkColor background_color, 162 SkColor background_color,
117 bool premultiplied_alpha, 163 bool premultiplied_alpha,
118 const SharedQuadState* shared_state, 164 const SharedQuadState* shared_state,
119 ResourceProvider* resource_provider, 165 ResourceProvider* resource_provider,
120 RenderPass* render_pass) { 166 RenderPass* render_pass) {
121 SkPMColor pixel_color = premultiplied_alpha ? 167 SkPMColor pixel_color = premultiplied_alpha ?
122 SkPreMultiplyColor(texel_color) : 168 SkPreMultiplyColor(texel_color) :
123 SkPackARGB32NoCheck(SkColorGetA(texel_color), 169 SkPackARGB32NoCheck(SkColorGetA(texel_color),
(...skipping 25 matching lines...) Expand all
149 resource, 195 resource,
150 premultiplied_alpha, 196 premultiplied_alpha,
151 gfx::PointF(0.0f, 0.0f), // uv_top_left 197 gfx::PointF(0.0f, 0.0f), // uv_top_left
152 gfx::PointF(1.0f, 1.0f), // uv_bottom_right 198 gfx::PointF(1.0f, 1.0f), // uv_bottom_right
153 background_color, 199 background_color,
154 vertex_opacity, 200 vertex_opacity,
155 false, // flipped 201 false, // flipped
156 false); // nearest_neighbor 202 false); // nearest_neighbor
157 } 203 }
158 204
205 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
206 const SharedQuadState* shared_state,
207 scoped_refptr<media::VideoFrame> video_frame,
208 uint8 alpha_value,
209 const gfx::RectF& tex_coord_rect,
210 RenderPass* render_pass,
211 VideoResourceUpdater* video_resource_updater,
212 const gfx::Rect& rect,
213 ResourceProvider* resource_provider) {
214 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
215 const YUVVideoDrawQuad::ColorSpace color_space =
216 (video_frame->format() == media::VideoFrame::YV12J
217 ? YUVVideoDrawQuad::REC_601_JPEG
218 : YUVVideoDrawQuad::REC_601);
219 const gfx::Rect opaque_rect(0, 0, 0, 0);
220
221 if (with_alpha)
enne (OOO) 2015/02/12 18:00:27 style nit: needs curly braces for multi-line body
awoloszyn 2015/02/23 22:28:27 Done.
222 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
223 video_frame->stride(media::VideoFrame::kAPlane) *
224 video_frame->rows(media::VideoFrame::kAPlane));
225
226 VideoFrameExternalResources resources =
227 video_resource_updater->CreateExternalResourcesFromVideoFrame(
228 video_frame);
229
230 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
231 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
232 resources.mailboxes.size());
233 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
234 resources.release_callbacks.size());
235
236 ResourceProvider::ResourceId y_resource =
237 resource_provider->CreateResourceFromTextureMailbox(
238 resources.mailboxes[media::VideoFrame::kYPlane],
239 SingleReleaseCallbackImpl::Create(
240 resources.release_callbacks[media::VideoFrame::kYPlane]));
241 ResourceProvider::ResourceId u_resource =
242 resource_provider->CreateResourceFromTextureMailbox(
243 resources.mailboxes[media::VideoFrame::kUPlane],
244 SingleReleaseCallbackImpl::Create(
245 resources.release_callbacks[media::VideoFrame::kUPlane]));
246 ResourceProvider::ResourceId v_resource =
247 resource_provider->CreateResourceFromTextureMailbox(
248 resources.mailboxes[media::VideoFrame::kVPlane],
249 SingleReleaseCallbackImpl::Create(
250 resources.release_callbacks[media::VideoFrame::kVPlane]));
251 ResourceProvider::ResourceId a_resource = 0;
252 if (with_alpha) {
253 a_resource = resource_provider->CreateResourceFromTextureMailbox(
254 resources.mailboxes[media::VideoFrame::kAPlane],
255 SingleReleaseCallbackImpl::Create(
256 resources.release_callbacks[media::VideoFrame::kAPlane]));
257 }
258
259 YUVVideoDrawQuad* yuv_quad =
260 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
261 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
262 video_frame->coded_size(), y_resource, u_resource,
263 v_resource, a_resource, color_space);
264 }
265
266 void CreateTestYUVVideoDrawQuad_Striped(
267 const SharedQuadState* shared_state,
268 media::VideoFrame::Format format,
269 bool is_transparent,
270 const gfx::RectF& tex_coord_rect,
271 RenderPass* render_pass,
272 VideoResourceUpdater* video_resource_updater,
273 const gfx::Rect& rect,
274 ResourceProvider* resource_provider) {
275 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
276 format, rect.size(), rect, rect.size(), base::TimeDelta());
277
278 // YUV values representing a striped pattern, for validating texture
279 // coordinates for sampling.
280 uint8_t y_value = 0;
281 uint8_t u_value = 0;
282 uint8_t v_value = 0;
283 for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
284 uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
285 video_frame->stride(media::VideoFrame::kYPlane) * i;
286 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
287 ++j) {
288 y_row[j] = (y_value += 1);
289 }
290 }
291 for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
292 uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
293 video_frame->stride(media::VideoFrame::kUPlane) * i;
294 uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
295 video_frame->stride(media::VideoFrame::kVPlane) * i;
296 for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
297 ++j) {
298 u_row[j] = (u_value += 3);
299 v_row[j] = (v_value += 5);
300 }
301 }
302 uint8 alpha_value = is_transparent ? 0 : 128;
303 CreateTestYUVVideoDrawQuad_FromVideoFrame(
304 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
305 video_resource_updater, rect, resource_provider);
306 }
307
308 // Creates a video frame of size background_size filled with yuv_background,
309 // and then draws a foreground rectangle in a different color on top of
310 // that. The foreground rectangle must have coordinates that are divisible
311 // by 2 because YUV is a block format.
312 void CreateTestYUVVideoDrawQuad_TwoColor(
313 const SharedQuadState* shared_state,
314 media::VideoFrame::Format format,
315 bool is_transparent,
316 const gfx::RectF& tex_coord_rect,
317 const gfx::Size& background_size,
318 uint8 y_background,
319 uint8 u_background,
320 uint8 v_background,
321 const gfx::Rect& foreground_rect,
322 uint8 y_foreground,
323 uint8 u_foreground,
324 uint8 v_foreground,
325 RenderPass* render_pass,
326 VideoResourceUpdater* video_resource_updater,
327 ResourceProvider* resource_provider) {
328 const gfx::Rect rect(background_size);
329
330 scoped_refptr<media::VideoFrame> video_frame =
331 media::VideoFrame::CreateFrame(format, background_size, foreground_rect,
332 foreground_rect.size(), base::TimeDelta());
333
334 int planes[] = {media::VideoFrame::kYPlane,
335 media::VideoFrame::kUPlane,
336 media::VideoFrame::kVPlane};
337 uint8 yuv_background[] = {y_background, u_background, v_background};
338 uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground};
339 int sample_size[] = {1, 2, 2};
340
341 for (int i = 0; i < 3; ++i) {
342 memset(video_frame->data(planes[i]), yuv_background[i],
343 video_frame->stride(planes[i]) * video_frame->rows(planes[i]));
344 }
345
346 for (int i = 0; i < 3; ++i) {
347 // Since yuv encoding uses block encoding, widths have to be divisible
348 // by the sample size in order for this function to behave properly.
349 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0);
350 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0);
351 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0);
352 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0);
353
354 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i],
355 foreground_rect.y() / sample_size[i],
356 foreground_rect.width() / sample_size[i],
357 foreground_rect.height() / sample_size[i]);
358 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) {
359 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) {
360 size_t offset = y * video_frame->stride(planes[i]) + x;
361 video_frame->data(planes[i])[offset] = yuv_foreground[i];
362 }
363 }
364 }
365
366 uint8 alpha_value = 255;
367 CreateTestYUVVideoDrawQuad_FromVideoFrame(
368 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
369 video_resource_updater, rect, resource_provider);
370 }
371
372 void CreateTestYUVVideoDrawQuad_Solid(
373 const SharedQuadState* shared_state,
374 media::VideoFrame::Format format,
375 bool is_transparent,
376 const gfx::RectF& tex_coord_rect,
377 uint8 y,
378 uint8 u,
379 uint8 v,
380 RenderPass* render_pass,
381 VideoResourceUpdater* video_resource_updater,
382 const gfx::Rect& rect,
383 ResourceProvider* resource_provider) {
384 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
385 format, rect.size(), rect, rect.size(), base::TimeDelta());
386
387 // YUV values of a solid, constant, color. Useful for testing that color
388 // space/color range are being handled properly.
389 memset(video_frame->data(media::VideoFrame::kYPlane), y,
390 video_frame->stride(media::VideoFrame::kYPlane) *
391 video_frame->rows(media::VideoFrame::kYPlane));
392 memset(video_frame->data(media::VideoFrame::kUPlane), u,
393 video_frame->stride(media::VideoFrame::kUPlane) *
394 video_frame->rows(media::VideoFrame::kUPlane));
395 memset(video_frame->data(media::VideoFrame::kVPlane), v,
396 video_frame->stride(media::VideoFrame::kVPlane) *
397 video_frame->rows(media::VideoFrame::kVPlane));
398
399 uint8 alpha_value = is_transparent ? 0 : 128;
400 CreateTestYUVVideoDrawQuad_FromVideoFrame(
401 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
402 video_resource_updater, rect, resource_provider);
403 }
404
159 typedef ::testing::Types<GLRenderer, 405 typedef ::testing::Types<GLRenderer,
160 SoftwareRenderer, 406 SoftwareRenderer,
161 GLRendererWithExpandedViewport, 407 GLRendererWithExpandedViewport,
162 SoftwareRendererWithExpandedViewport> RendererTypes; 408 SoftwareRendererWithExpandedViewport> RendererTypes;
163 TYPED_TEST_CASE(RendererPixelTest, RendererTypes); 409 TYPED_TEST_CASE(RendererPixelTest, RendererTypes);
164 410
165 template <typename RendererType> 411 template <typename RendererType>
166 class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator { 412 class FuzzyForSoftwareOnlyPixelComparator : public PixelComparator {
167 public: 413 public:
168 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha) 414 explicit FuzzyForSoftwareOnlyPixelComparator(bool discard_alpha)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 560
315 RenderPassList pass_list; 561 RenderPassList pass_list;
316 pass_list.push_back(pass.Pass()); 562 pass_list.push_back(pass.Pass());
317 563
318 EXPECT_TRUE(this->RunPixelTest( 564 EXPECT_TRUE(this->RunPixelTest(
319 &pass_list, 565 &pass_list,
320 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 566 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
321 FuzzyPixelOffByOneComparator(true))); 567 FuzzyPixelOffByOneComparator(true)));
322 } 568 }
323 569
570 template <typename QuadType>
571 static const char* IntersectingQuadImage() {
572 return "intersecting_blue_green_squares.png";
573 }
574 template <>
575 const char* IntersectingQuadImage<SolidColorDrawQuad>() {
576 return "intersecting_blue_green.png";
577 }
578 template <>
579 const char* IntersectingQuadImage<YUVVideoDrawQuad>() {
580 return "intersecting_blue_green_squares_video.png";
581 }
582
583 template <typename TypeParam>
584 class IntersectingQuadPixelTest : public RendererPixelTest<TypeParam> {
585 protected:
586 void SetupQuadStateAndRenderPass() {
587 // This sets up a pair of draw quads. They are both rotated
588 // relative to the root plane, they are also rotated relative to each other.
589 // The intersect in the middle at a non-perpendicular angle so that any
590 // errors are hopefully magnified.
591 // The quads should intersect correctly, as in the front quad should only
592 // be partially in front of the back quad, and partially behind.
593
594 viewport_rect_ = gfx::Rect(this->device_viewport_size_);
595 quad_rect_ = gfx::Rect(0, 0, this->device_viewport_size_.width(),
596 this->device_viewport_size_.height() / 2.0);
597
598 RenderPassId id(1, 1);
599 render_pass_ = CreateTestRootRenderPass(id, viewport_rect_);
600
601 // Create the front quad rotated on the Z and Y axis.
602 gfx::Transform trans;
603 trans.Translate3d(0, 0, 0.707 * this->device_viewport_size_.width() / 2.0);
604 trans.RotateAboutZAxis(45.0);
605 trans.RotateAboutYAxis(45.0);
606 front_quad_state_ =
607 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
608 front_quad_state_->clip_rect = quad_rect_;
609 // Make sure they end up in a 3d sorting context.
610 front_quad_state_->sorting_context_id = 1;
611
612 // Create the back quad, and rotate on just the y axis. This will intersect
613 // the first quad partially.
614 trans = gfx::Transform();
615 trans.Translate3d(0, 0, -0.707 * this->device_viewport_size_.width() / 2.0);
616 trans.RotateAboutYAxis(-45.0);
617 back_quad_state_ =
618 CreateTestSharedQuadState(trans, viewport_rect_, render_pass_.get());
619 back_quad_state_->sorting_context_id = 1;
620 back_quad_state_->clip_rect = quad_rect_;
621 }
622 template <typename T>
623 void AppendBackgroundAndRunTest() {
624 SharedQuadState* background_quad_state = CreateTestSharedQuadState(
625 gfx::Transform(), viewport_rect_, render_pass_.get());
626 SolidColorDrawQuad* background_quad =
627 render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
628 background_quad->SetNew(background_quad_state, viewport_rect_,
629 viewport_rect_, SK_ColorWHITE, false);
630 pass_list_.push_back(render_pass_.Pass());
631 const char* fileName = IntersectingQuadImage<T>();
632 EXPECT_TRUE(this->RunPixelTest(
633 &pass_list_, base::FilePath(FILE_PATH_LITERAL(fileName)),
634 FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)));
635 }
636 template <typename T>
637 T* CreateAndAppendDrawQuad() {
638 return render_pass_->CreateAndAppendDrawQuad<T>();
639 }
640
641 scoped_ptr<RenderPass> render_pass_;
642 gfx::Rect viewport_rect_;
643 SharedQuadState* front_quad_state_;
644 SharedQuadState* back_quad_state_;
645 gfx::Rect quad_rect_;
646 RenderPassList pass_list_;
647 };
648
649 TYPED_TEST_CASE(IntersectingQuadPixelTest, RendererTypes);
650
651 TYPED_TEST(IntersectingQuadPixelTest, SolidColorQuads) {
652 this->SetupQuadStateAndRenderPass();
653
654 SolidColorDrawQuad* quad =
655 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
656 SolidColorDrawQuad* quad2 =
657 this->template CreateAndAppendDrawQuad<SolidColorDrawQuad>();
658
659 quad->SetNew(this->front_quad_state_, this->quad_rect_, this->quad_rect_,
660 SK_ColorBLUE, false);
661 quad2->SetNew(this->back_quad_state_, this->quad_rect_, this->quad_rect_,
662 SK_ColorGREEN, false);
663 SCOPED_TRACE("IntersectingSolidColorQuads");
664 this->template AppendBackgroundAndRunTest<SolidColorDrawQuad>();
665 }
666
667 template <typename TypeParam>
668 SkColor GetColor(const SkColor& color) {
669 return color;
670 }
671
672 template <>
673 SkColor GetColor<GLRenderer>(const SkColor& color) {
674 return SkColorSetARGB(SkColorGetA(color), SkColorGetB(color),
675 SkColorGetG(color), SkColorGetR(color));
676 }
677 template <>
678 SkColor GetColor<GLRendererWithExpandedViewport>(const SkColor& color) {
679 return GetColor<GLRenderer>(color);
680 }
681
682 TYPED_TEST(IntersectingQuadPixelTest, TexturedQuads) {
683 this->SetupQuadStateAndRenderPass();
684 CreateTestTwoColoredTextureDrawQuad(
685 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
686 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
687 true, this->front_quad_state_, this->resource_provider_.get(),
688 this->render_pass_.get());
689 CreateTestTwoColoredTextureDrawQuad(
690 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
691 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
692 true, this->back_quad_state_, this->resource_provider_.get(),
693 this->render_pass_.get());
694
695 SCOPED_TRACE("IntersectingTexturedQuads");
696 this->template AppendBackgroundAndRunTest<TextureDrawQuad>();
697 }
698
699 TYPED_TEST(IntersectingQuadPixelTest, PictureQuads) {
700 this->SetupQuadStateAndRenderPass();
701 gfx::RectF outer_rect(this->quad_rect_);
702 gfx::RectF inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4),
703 this->quad_rect_.y() + (this->quad_rect_.height() / 4),
704 this->quad_rect_.width() / 2,
705 this->quad_rect_.height() / 2);
706
707 SkPaint black_paint;
708 black_paint.setColor(SK_ColorBLACK);
709 SkPaint blue_paint;
710 blue_paint.setColor(SK_ColorBLUE);
711 SkPaint green_paint;
712 green_paint.setColor(SK_ColorGREEN);
713
714 scoped_refptr<FakePicturePileImpl> blue_pile =
715 FakePicturePileImpl::CreateFilledPile(gfx::Size(1000, 1000),
716 this->quad_rect_.size());
717 blue_pile->add_draw_rect_with_paint(outer_rect, black_paint);
718 blue_pile->add_draw_rect_with_paint(inner_rect, blue_paint);
719 blue_pile->RerecordPile();
720
721 PictureDrawQuad* blue_quad =
722 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
723
724 blue_quad->SetNew(this->front_quad_state_, this->quad_rect_, gfx::Rect(),
725 this->quad_rect_, this->quad_rect_, this->quad_rect_.size(),
726 false, RGBA_8888, this->quad_rect_, 1.f, blue_pile);
727
728 scoped_refptr<FakePicturePileImpl> green_pile =
729 FakePicturePileImpl::CreateFilledPile(this->quad_rect_.size(),
730 this->quad_rect_.size());
731 green_pile->add_draw_rect_with_paint(outer_rect, green_paint);
732 green_pile->add_draw_rect_with_paint(inner_rect, black_paint);
733 green_pile->RerecordPile();
734
735 PictureDrawQuad* green_quad =
736 this->render_pass_->template CreateAndAppendDrawQuad<PictureDrawQuad>();
737 green_quad->SetNew(this->back_quad_state_, this->quad_rect_, gfx::Rect(),
738 this->quad_rect_, this->quad_rect_,
739 this->quad_rect_.size(), false, RGBA_8888,
740 this->quad_rect_, 1.f, green_pile);
741 SCOPED_TRACE("IntersectingPictureQuadsPass");
742 this->template AppendBackgroundAndRunTest<PictureDrawQuad>();
743 }
744
745 TYPED_TEST(IntersectingQuadPixelTest, RenderPassQuads) {
746 this->SetupQuadStateAndRenderPass();
747 RenderPassId child_pass_id1(2, 2);
748 RenderPassId child_pass_id2(2, 3);
749 scoped_ptr<RenderPass> child_pass1 =
750 CreateTestRenderPass(child_pass_id1, this->quad_rect_, gfx::Transform());
751 SharedQuadState* child1_quad_state = CreateTestSharedQuadState(
752 gfx::Transform(), this->quad_rect_, child_pass1.get());
753 scoped_ptr<RenderPass> child_pass2 =
754 CreateTestRenderPass(child_pass_id2, this->quad_rect_, gfx::Transform());
755 SharedQuadState* child2_quad_state = CreateTestSharedQuadState(
756 gfx::Transform(), this->quad_rect_, child_pass2.get());
757
758 CreateTestTwoColoredTextureDrawQuad(
759 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)),
760 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 255)), SK_ColorTRANSPARENT,
761 true, child1_quad_state, this->resource_provider_.get(),
762 child_pass1.get());
763 CreateTestTwoColoredTextureDrawQuad(
764 this->quad_rect_, GetColor<TypeParam>(SkColorSetARGB(255, 0, 255, 0)),
765 GetColor<TypeParam>(SkColorSetARGB(255, 0, 0, 0)), SK_ColorTRANSPARENT,
766 true, child2_quad_state, this->resource_provider_.get(),
767 child_pass2.get());
768
769 CreateTestRenderPassDrawQuad(this->front_quad_state_, this->quad_rect_,
770 child_pass_id1, this->render_pass_.get());
771 CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_,
772 child_pass_id2, this->render_pass_.get());
773
774 this->pass_list_.push_back(child_pass1.Pass());
775 this->pass_list_.push_back(child_pass2.Pass());
776 SCOPED_TRACE("IntersectingRenderQuadsPass");
777 this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>();
778 }
779 template <typename TypeParam>
780 class IntersectingQuadGLPixelTest
781 : public IntersectingQuadPixelTest<TypeParam> {
782 public:
783 void SetUp() override {
784 IntersectingQuadPixelTest<TypeParam>::SetUp();
785 video_resource_updater_.reset(
786 new VideoResourceUpdater(this->output_surface_->context_provider(),
787 this->resource_provider_.get()));
788 video_resource_updater2_.reset(
789 new VideoResourceUpdater(this->output_surface_->context_provider(),
790 this->resource_provider_.get()));
791 }
792
793 protected:
794 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
795 scoped_ptr<VideoResourceUpdater> video_resource_updater2_;
796 };
797
798 typedef ::testing::Types<GLRenderer, GLRendererWithExpandedViewport>
799 GLRendererTypes;
800
801 TYPED_TEST_CASE(IntersectingQuadGLPixelTest, GLRendererTypes);
802
803 TYPED_TEST(IntersectingQuadGLPixelTest, YUVVideoQuads) {
804 this->SetupQuadStateAndRenderPass();
805 gfx::Rect inner_rect(this->quad_rect_.x() + (this->quad_rect_.width() / 4),
806 this->quad_rect_.y() + (this->quad_rect_.height() / 4),
807 this->quad_rect_.width() / 2,
808 this->quad_rect_.height() / 2);
809
810 CreateTestYUVVideoDrawQuad_TwoColor(
811 this->front_quad_state_, media::VideoFrame::YV12J, false,
812 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 0, 128, 128,
813 inner_rect, 29, 255, 107, this->render_pass_.get(),
814 this->video_resource_updater_.get(), this->resource_provider_.get());
815
816 CreateTestYUVVideoDrawQuad_TwoColor(
817 this->back_quad_state_, media::VideoFrame::YV12J, false,
818 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), this->quad_rect_.size(), 149, 43, 21,
819 inner_rect, 0, 128, 128, this->render_pass_.get(),
820 this->video_resource_updater2_.get(), this->resource_provider_.get());
821
822 SCOPED_TRACE("IntersectingVideoQuads");
823 this->template AppendBackgroundAndRunTest<YUVVideoDrawQuad>();
824 }
825
324 // TODO(skaslev): The software renderer does not support non-premultplied alpha. 826 // TODO(skaslev): The software renderer does not support non-premultplied alpha.
325 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) { 827 TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithoutBackground) {
326 gfx::Rect rect(this->device_viewport_size_); 828 gfx::Rect rect(this->device_viewport_size_);
327 829
328 RenderPassId id(1, 1); 830 RenderPassId id(1, 1);
329 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 831 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
330 832
331 SharedQuadState* shared_state = 833 SharedQuadState* shared_state =
332 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 834 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
333 835
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 pass_list.push_back(pass.Pass()); 883 pass_list.push_back(pass.Pass());
382 884
383 EXPECT_TRUE(this->RunPixelTest( 885 EXPECT_TRUE(this->RunPixelTest(
384 &pass_list, 886 &pass_list,
385 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")), 887 base::FilePath(FILE_PATH_LITERAL("green_alpha.png")),
386 FuzzyPixelOffByOneComparator(true))); 888 FuzzyPixelOffByOneComparator(true)));
387 } 889 }
388 890
389 class VideoGLRendererPixelTest : public GLRendererPixelTest { 891 class VideoGLRendererPixelTest : public GLRendererPixelTest {
390 protected: 892 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 uint8 alpha_value = is_transparent ? 0 : 128;
427 CreateTestYUVVideoDrawQuad_FromVideoFrame(
428 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
429 }
430
431 void CreateTestYUVVideoDrawQuad_Solid(const SharedQuadState* shared_state,
432 media::VideoFrame::Format format,
433 bool is_transparent,
434 const gfx::RectF& tex_coord_rect,
435 uint8 y,
436 uint8 u,
437 uint8 v,
438 RenderPass* render_pass) {
439 const gfx::Rect rect(this->device_viewport_size_);
440
441 scoped_refptr<media::VideoFrame> video_frame =
442 media::VideoFrame::CreateFrame(
443 format, rect.size(), rect, rect.size(), base::TimeDelta());
444
445 // YUV values of a solid, constant, color. Useful for testing that color
446 // space/color range are being handled properly.
447 memset(video_frame->data(media::VideoFrame::kYPlane),
448 y,
449 video_frame->stride(media::VideoFrame::kYPlane) *
450 video_frame->rows(media::VideoFrame::kYPlane));
451 memset(video_frame->data(media::VideoFrame::kUPlane),
452 u,
453 video_frame->stride(media::VideoFrame::kUPlane) *
454 video_frame->rows(media::VideoFrame::kUPlane));
455 memset(video_frame->data(media::VideoFrame::kVPlane),
456 v,
457 video_frame->stride(media::VideoFrame::kVPlane) *
458 video_frame->rows(media::VideoFrame::kVPlane));
459
460 uint8 alpha_value = is_transparent ? 0 : 128;
461 CreateTestYUVVideoDrawQuad_FromVideoFrame(
462 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
463 }
464
465 void CreateEdgeBleedPass(media::VideoFrame::Format format, 893 void CreateEdgeBleedPass(media::VideoFrame::Format format,
466 RenderPassList* pass_list) { 894 RenderPassList* pass_list) {
467 gfx::Rect rect(200, 200); 895 gfx::Rect rect(200, 200);
468 896
469 RenderPassId id(1, 1); 897 RenderPassId id(1, 1);
470 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 898 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
471 899
472 // Scale the video up so that bilinear filtering kicks in to sample more 900 // Scale the video up so that bilinear filtering kicks in to sample more
473 // than just nearest neighbor would. 901 // than just nearest neighbor would.
474 gfx::Transform scale_by_2; 902 gfx::Transform scale_by_2;
475 scale_by_2.Scale(2.f, 2.f); 903 scale_by_2.Scale(2.f, 2.f);
476 gfx::Rect half_rect(100, 100); 904 gfx::Rect half_rect(100, 100);
477 SharedQuadState* shared_state = 905 SharedQuadState* shared_state =
478 CreateTestSharedQuadState(scale_by_2, half_rect, pass.get()); 906 CreateTestSharedQuadState(scale_by_2, half_rect, pass.get());
479 907
480 gfx::Size background_size(200, 200); 908 gfx::Size background_size(200, 200);
481 gfx::Rect green_rect(16, 20, 100, 100); 909 gfx::Rect green_rect(16, 20, 100, 100);
482 gfx::RectF tex_coord_rect( 910 gfx::RectF tex_coord_rect(
483 static_cast<float>(green_rect.x()) / background_size.width(), 911 static_cast<float>(green_rect.x()) / background_size.width(),
484 static_cast<float>(green_rect.y()) / background_size.height(), 912 static_cast<float>(green_rect.y()) / background_size.height(),
485 static_cast<float>(green_rect.width()) / background_size.width(), 913 static_cast<float>(green_rect.width()) / background_size.width(),
486 static_cast<float>(green_rect.height()) / background_size.height()); 914 static_cast<float>(green_rect.height()) / background_size.height());
487 915
488 // YUV of (149,43,21) should be green (0,255,0) in RGB. 916 // YUV of (149,43,21) should be green (0,255,0) in RGB.
489 // Create a video frame that has a non-green background rect, with a 917 // Create a video frame that has a non-green background rect, with a
490 // green sub-rectangle that should be the only thing displayed in 918 // green sub-rectangle that should be the only thing displayed in
491 // the final image. Bleeding will appear on all four sides of the video 919 // the final image. Bleeding will appear on all four sides of the video
492 // if the tex coords are not clamped. 920 // if the tex coords are not clamped.
493 CreateTestYUVVideoDrawQuad_TwoColor(shared_state, format, false, 921 CreateTestYUVVideoDrawQuad_TwoColor(
494 tex_coord_rect, background_size, 0, 0, 922 shared_state, format, false, tex_coord_rect, background_size, 0, 0, 0,
495 0, green_rect, 149, 43, 21, pass.get()); 923 green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(),
924 resource_provider_.get());
496 pass_list->push_back(pass.Pass()); 925 pass_list->push_back(pass.Pass());
497 } 926 }
498 927
499 // Creates a video frame of size background_size filled with yuv_background,
500 // and then draws a foreground rectangle in a different color on top of
501 // that. The foreground rectangle must have coordinates that are divisible
502 // by 2 because YUV is a block format.
503 void CreateTestYUVVideoDrawQuad_TwoColor(const SharedQuadState* shared_state,
504 media::VideoFrame::Format format,
505 bool is_transparent,
506 const gfx::RectF& tex_coord_rect,
507 const gfx::Size& background_size,
508 uint8 y_background,
509 uint8 u_background,
510 uint8 v_background,
511 const gfx::Rect& foreground_rect,
512 uint8 y_foreground,
513 uint8 u_foreground,
514 uint8 v_foreground,
515 RenderPass* render_pass) {
516 const gfx::Rect rect(background_size);
517
518 scoped_refptr<media::VideoFrame> video_frame =
519 media::VideoFrame::CreateFrame(format, background_size, foreground_rect,
520 foreground_rect.size(),
521 base::TimeDelta());
522
523 int planes[] = {media::VideoFrame::kYPlane,
524 media::VideoFrame::kUPlane,
525 media::VideoFrame::kVPlane};
526 uint8 yuv_background[] = {y_background, u_background, v_background};
527 uint8 yuv_foreground[] = {y_foreground, u_foreground, v_foreground};
528 int sample_size[] = {1, 2, 2};
529
530 for (int i = 0; i < 3; ++i) {
531 memset(video_frame->data(planes[i]), yuv_background[i],
532 video_frame->stride(planes[i]) * video_frame->rows(planes[i]));
533 }
534
535 for (int i = 0; i < 3; ++i) {
536 // Since yuv encoding uses block encoding, widths have to be divisible
537 // by the sample size in order for this function to behave properly.
538 DCHECK_EQ(foreground_rect.x() % sample_size[i], 0);
539 DCHECK_EQ(foreground_rect.y() % sample_size[i], 0);
540 DCHECK_EQ(foreground_rect.width() % sample_size[i], 0);
541 DCHECK_EQ(foreground_rect.height() % sample_size[i], 0);
542
543 gfx::Rect sample_rect(foreground_rect.x() / sample_size[i],
544 foreground_rect.y() / sample_size[i],
545 foreground_rect.width() / sample_size[i],
546 foreground_rect.height() / sample_size[i]);
547 for (int y = sample_rect.y(); y < sample_rect.bottom(); ++y) {
548 for (int x = sample_rect.x(); x < sample_rect.right(); ++x) {
549 size_t offset = y * video_frame->stride(planes[i]) + x;
550 video_frame->data(planes[i])[offset] = yuv_foreground[i];
551 }
552 }
553 }
554
555 uint8 alpha_value = 255;
556 CreateTestYUVVideoDrawQuad_FromVideoFrame(
557 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass);
558 }
559
560 void CreateTestYUVVideoDrawQuad_FromVideoFrame(
561 const SharedQuadState* shared_state,
562 scoped_refptr<media::VideoFrame> video_frame,
563 uint8 alpha_value,
564 const gfx::RectF& tex_coord_rect,
565 RenderPass* render_pass) {
566 const bool with_alpha = (video_frame->format() == media::VideoFrame::YV12A);
567 const YUVVideoDrawQuad::ColorSpace color_space =
568 (video_frame->format() == media::VideoFrame::YV12J
569 ? YUVVideoDrawQuad::REC_601_JPEG
570 : YUVVideoDrawQuad::REC_601);
571 const gfx::Rect rect(shared_state->content_bounds);
572 const gfx::Rect opaque_rect(0, 0, 0, 0);
573
574 if (with_alpha)
575 memset(video_frame->data(media::VideoFrame::kAPlane), alpha_value,
576 video_frame->stride(media::VideoFrame::kAPlane) *
577 video_frame->rows(media::VideoFrame::kAPlane));
578
579 VideoFrameExternalResources resources =
580 video_resource_updater_->CreateExternalResourcesFromVideoFrame(
581 video_frame);
582
583 EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
584 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
585 resources.mailboxes.size());
586 EXPECT_EQ(media::VideoFrame::NumPlanes(video_frame->format()),
587 resources.release_callbacks.size());
588
589 ResourceProvider::ResourceId y_resource =
590 resource_provider_->CreateResourceFromTextureMailbox(
591 resources.mailboxes[media::VideoFrame::kYPlane],
592 SingleReleaseCallbackImpl::Create(
593 resources.release_callbacks[media::VideoFrame::kYPlane]));
594 ResourceProvider::ResourceId u_resource =
595 resource_provider_->CreateResourceFromTextureMailbox(
596 resources.mailboxes[media::VideoFrame::kUPlane],
597 SingleReleaseCallbackImpl::Create(
598 resources.release_callbacks[media::VideoFrame::kUPlane]));
599 ResourceProvider::ResourceId v_resource =
600 resource_provider_->CreateResourceFromTextureMailbox(
601 resources.mailboxes[media::VideoFrame::kVPlane],
602 SingleReleaseCallbackImpl::Create(
603 resources.release_callbacks[media::VideoFrame::kVPlane]));
604 ResourceProvider::ResourceId a_resource = 0;
605 if (with_alpha) {
606 a_resource = resource_provider_->CreateResourceFromTextureMailbox(
607 resources.mailboxes[media::VideoFrame::kAPlane],
608 SingleReleaseCallbackImpl::Create(
609 resources.release_callbacks[media::VideoFrame::kAPlane]));
610 }
611
612 YUVVideoDrawQuad* yuv_quad =
613 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>();
614 yuv_quad->SetNew(shared_state, rect, opaque_rect, rect, tex_coord_rect,
615 video_frame->coded_size(), y_resource, u_resource,
616 v_resource, a_resource, color_space);
617 }
618
619 void SetUp() override { 928 void SetUp() override {
620 GLRendererPixelTest::SetUp(); 929 GLRendererPixelTest::SetUp();
621 video_resource_updater_.reset(new VideoResourceUpdater( 930 video_resource_updater_.reset(new VideoResourceUpdater(
622 output_surface_->context_provider(), resource_provider_.get())); 931 output_surface_->context_provider(), resource_provider_.get()));
623 } 932 }
624 933
625 private:
626 scoped_ptr<VideoResourceUpdater> video_resource_updater_; 934 scoped_ptr<VideoResourceUpdater> video_resource_updater_;
627 }; 935 };
628 936
629 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) { 937 TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
630 gfx::Rect rect(this->device_viewport_size_); 938 gfx::Rect rect(this->device_viewport_size_);
631 939
632 RenderPassId id(1, 1); 940 RenderPassId id(1, 1);
633 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 941 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
634 942
635 SharedQuadState* shared_state = 943 SharedQuadState* shared_state =
636 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 944 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
637 945
638 CreateTestYUVVideoDrawQuad_Striped(shared_state, 946 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12,
639 media::VideoFrame::YV12, 947 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
640 false, 948 pass.get(), video_resource_updater_.get(),
641 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 949 rect, resource_provider_.get());
642 pass.get());
643 950
644 RenderPassList pass_list; 951 RenderPassList pass_list;
645 pass_list.push_back(pass.Pass()); 952 pass_list.push_back(pass.Pass());
646 953
647 EXPECT_TRUE( 954 EXPECT_TRUE(
648 this->RunPixelTest(&pass_list, 955 this->RunPixelTest(&pass_list,
649 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), 956 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")),
650 FuzzyPixelOffByOneComparator(true))); 957 FuzzyPixelOffByOneComparator(true)));
651 } 958 }
652 959
653 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) { 960 TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
654 gfx::Rect rect(this->device_viewport_size_); 961 gfx::Rect rect(this->device_viewport_size_);
655 962
656 RenderPassId id(1, 1); 963 RenderPassId id(1, 1);
657 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 964 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
658 965
659 SharedQuadState* shared_state = 966 SharedQuadState* shared_state =
660 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 967 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
661 968
662 // Intentionally sets frame format to I420 for testing coverage. 969 // Intentionally sets frame format to I420 for testing coverage.
663 CreateTestYUVVideoDrawQuad_Striped(shared_state, 970 CreateTestYUVVideoDrawQuad_Striped(
664 media::VideoFrame::I420, 971 shared_state, media::VideoFrame::I420, false,
665 false, 972 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), pass.get(),
666 gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f), 973 video_resource_updater_.get(), rect, resource_provider_.get());
667 pass.get());
668 974
669 RenderPassList pass_list; 975 RenderPassList pass_list;
670 pass_list.push_back(pass.Pass()); 976 pass_list.push_back(pass.Pass());
671 977
672 EXPECT_TRUE(this->RunPixelTest( 978 EXPECT_TRUE(this->RunPixelTest(
673 &pass_list, 979 &pass_list,
674 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")), 980 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_offset.png")),
675 FuzzyPixelOffByOneComparator(true))); 981 FuzzyPixelOffByOneComparator(true)));
676 } 982 }
677 983
678 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) { 984 TEST_F(VideoGLRendererPixelTest, SimpleYUVRectBlack) {
679 gfx::Rect rect(this->device_viewport_size_); 985 gfx::Rect rect(this->device_viewport_size_);
680 986
681 RenderPassId id(1, 1); 987 RenderPassId id(1, 1);
682 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 988 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
683 989
684 SharedQuadState* shared_state = 990 SharedQuadState* shared_state =
685 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 991 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
686 992
687 // In MPEG color range YUV values of (15,128,128) should produce black. 993 // In MPEG color range YUV values of (15,128,128) should produce black.
688 CreateTestYUVVideoDrawQuad_Solid(shared_state, 994 CreateTestYUVVideoDrawQuad_Solid(
689 media::VideoFrame::YV12, 995 shared_state, media::VideoFrame::YV12, false,
690 false, 996 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
691 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 997 video_resource_updater_.get(), rect, resource_provider_.get());
692 15,
693 128,
694 128,
695 pass.get());
696 998
697 RenderPassList pass_list; 999 RenderPassList pass_list;
698 pass_list.push_back(pass.Pass()); 1000 pass_list.push_back(pass.Pass());
699 1001
700 // If we didn't get black out of the YUV values above, then we probably have a 1002 // If we didn't get black out of the YUV values above, then we probably have a
701 // color range issue. 1003 // color range issue.
702 EXPECT_TRUE(this->RunPixelTest(&pass_list, 1004 EXPECT_TRUE(this->RunPixelTest(&pass_list,
703 base::FilePath(FILE_PATH_LITERAL("black.png")), 1005 base::FilePath(FILE_PATH_LITERAL("black.png")),
704 FuzzyPixelOffByOneComparator(true))); 1006 FuzzyPixelOffByOneComparator(true)));
705 } 1007 }
706 1008
707 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { 1009 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) {
708 gfx::Rect rect(this->device_viewport_size_); 1010 gfx::Rect rect(this->device_viewport_size_);
709 1011
710 RenderPassId id(1, 1); 1012 RenderPassId id(1, 1);
711 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1013 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
712 1014
713 SharedQuadState* shared_state = 1015 SharedQuadState* shared_state =
714 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1016 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
715 1017
716 // YUV of (149,43,21) should be green (0,255,0) in RGB. 1018 // YUV of (149,43,21) should be green (0,255,0) in RGB.
717 CreateTestYUVVideoDrawQuad_Solid(shared_state, 1019 CreateTestYUVVideoDrawQuad_Solid(
718 media::VideoFrame::YV12J, 1020 shared_state, media::VideoFrame::YV12J, false,
719 false, 1021 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
720 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 1022 video_resource_updater_.get(), rect, resource_provider_.get());
721 149,
722 43,
723 21,
724 pass.get());
725 1023
726 RenderPassList pass_list; 1024 RenderPassList pass_list;
727 pass_list.push_back(pass.Pass()); 1025 pass_list.push_back(pass.Pass());
728 1026
729 EXPECT_TRUE(this->RunPixelTest(&pass_list, 1027 EXPECT_TRUE(this->RunPixelTest(&pass_list,
730 base::FilePath(FILE_PATH_LITERAL("green.png")), 1028 base::FilePath(FILE_PATH_LITERAL("green.png")),
731 FuzzyPixelOffByOneComparator(true))); 1029 FuzzyPixelOffByOneComparator(true)));
732 } 1030 }
733 1031
734 // Test that a YUV video doesn't bleed outside of its tex coords when the 1032 // Test that a YUV video doesn't bleed outside of its tex coords when the
(...skipping 17 matching lines...) Expand all
752 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) { 1050 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRectGrey) {
753 gfx::Rect rect(this->device_viewport_size_); 1051 gfx::Rect rect(this->device_viewport_size_);
754 1052
755 RenderPassId id(1, 1); 1053 RenderPassId id(1, 1);
756 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1054 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
757 1055
758 SharedQuadState* shared_state = 1056 SharedQuadState* shared_state =
759 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1057 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
760 1058
761 // Dark grey in JPEG color range (in MPEG, this is black). 1059 // Dark grey in JPEG color range (in MPEG, this is black).
762 CreateTestYUVVideoDrawQuad_Solid(shared_state, 1060 CreateTestYUVVideoDrawQuad_Solid(
763 media::VideoFrame::YV12J, 1061 shared_state, media::VideoFrame::YV12J, false,
764 false, 1062 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 15, 128, 128, pass.get(),
765 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 1063 video_resource_updater_.get(), rect, resource_provider_.get());
766 15,
767 128,
768 128,
769 pass.get());
770 1064
771 RenderPassList pass_list; 1065 RenderPassList pass_list;
772 pass_list.push_back(pass.Pass()); 1066 pass_list.push_back(pass.Pass());
773 1067
774 EXPECT_TRUE( 1068 EXPECT_TRUE(
775 this->RunPixelTest(&pass_list, 1069 this->RunPixelTest(&pass_list,
776 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")), 1070 base::FilePath(FILE_PATH_LITERAL("dark_grey.png")),
777 FuzzyPixelOffByOneComparator(true))); 1071 FuzzyPixelOffByOneComparator(true)));
778 } 1072 }
779 1073
780 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) { 1074 TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
781 gfx::Rect rect(this->device_viewport_size_); 1075 gfx::Rect rect(this->device_viewport_size_);
782 1076
783 RenderPassId id(1, 1); 1077 RenderPassId id(1, 1);
784 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1078 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
785 1079
786 SharedQuadState* shared_state = 1080 SharedQuadState* shared_state =
787 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1081 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
788 1082
789 CreateTestYUVVideoDrawQuad_Striped(shared_state, 1083 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
790 media::VideoFrame::YV12A, 1084 false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
791 false, 1085 pass.get(), video_resource_updater_.get(),
792 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 1086 rect, resource_provider_.get());
793 pass.get());
794 1087
795 SolidColorDrawQuad* color_quad = 1088 SolidColorDrawQuad* color_quad =
796 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 1089 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
797 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); 1090 color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false);
798 1091
799 RenderPassList pass_list; 1092 RenderPassList pass_list;
800 pass_list.push_back(pass.Pass()); 1093 pass_list.push_back(pass.Pass());
801 1094
802 EXPECT_TRUE(this->RunPixelTest( 1095 EXPECT_TRUE(this->RunPixelTest(
803 &pass_list, 1096 &pass_list,
804 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")), 1097 base::FilePath(FILE_PATH_LITERAL("yuv_stripes_alpha.png")),
805 FuzzyPixelOffByOneComparator(true))); 1098 FuzzyPixelOffByOneComparator(true)));
806 } 1099 }
807 1100
808 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) { 1101 TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
809 gfx::Rect rect(this->device_viewport_size_); 1102 gfx::Rect rect(this->device_viewport_size_);
810 1103
811 RenderPassId id(1, 1); 1104 RenderPassId id(1, 1);
812 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); 1105 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
813 1106
814 SharedQuadState* shared_state = 1107 SharedQuadState* shared_state =
815 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); 1108 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
816 1109
817 CreateTestYUVVideoDrawQuad_Striped(shared_state, 1110 CreateTestYUVVideoDrawQuad_Striped(shared_state, media::VideoFrame::YV12A,
818 media::VideoFrame::YV12A, 1111 true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f),
819 true, 1112 pass.get(), video_resource_updater_.get(),
820 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 1113 rect, resource_provider_.get());
821 pass.get());
822 1114
823 SolidColorDrawQuad* color_quad = 1115 SolidColorDrawQuad* color_quad =
824 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 1116 pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
825 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false); 1117 color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false);
826 1118
827 RenderPassList pass_list; 1119 RenderPassList pass_list;
828 pass_list.push_back(pass.Pass()); 1120 pass_list.push_back(pass.Pass());
829 1121
830 EXPECT_TRUE(this->RunPixelTest( 1122 EXPECT_TRUE(this->RunPixelTest(
831 &pass_list, 1123 &pass_list,
(...skipping 1694 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 EXPECT_TRUE(this->RunPixelTest( 2818 EXPECT_TRUE(this->RunPixelTest(
2527 &pass_list, 2819 &pass_list,
2528 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")), 2820 base::FilePath(FILE_PATH_LITERAL("wrap_mode_repeat.png")),
2529 FuzzyPixelOffByOneComparator(true))); 2821 FuzzyPixelOffByOneComparator(true)));
2530 } 2822 }
2531 2823
2532 #endif // !defined(OS_ANDROID) 2824 #endif // !defined(OS_ANDROID)
2533 2825
2534 } // namespace 2826 } // namespace
2535 } // namespace cc 2827 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698