OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |