OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/memory/aligned_memory.h" | 9 #include "base/memory/aligned_memory.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
11 #include "cc/base/math_util.h" | 11 #include "cc/base/math_util.h" |
12 #include "cc/paint/paint_flags.h" | 12 #include "cc/paint/paint_flags.h" |
13 #include "cc/paint/skia_paint_canvas.h" | 13 #include "cc/paint/skia_paint_canvas.h" |
14 #include "cc/quads/draw_quad.h" | 14 #include "cc/quads/draw_quad.h" |
15 #include "cc/quads/picture_draw_quad.h" | 15 #include "cc/quads/picture_draw_quad.h" |
16 #include "cc/quads/texture_draw_quad.h" | 16 #include "cc/quads/texture_draw_quad.h" |
17 #include "cc/resources/video_resource_updater.h" | 17 #include "cc/resources/video_resource_updater.h" |
18 #include "cc/test/fake_raster_source.h" | 18 #include "cc/test/fake_raster_source.h" |
19 #include "cc/test/fake_recording_source.h" | 19 #include "cc/test/fake_recording_source.h" |
20 #include "cc/test/pixel_test.h" | 20 #include "cc/test/pixel_test.h" |
| 21 #include "cc/test/test_in_process_context_provider.h" |
21 #include "components/viz/service/display/gl_renderer.h" | 22 #include "components/viz/service/display/gl_renderer.h" |
22 #include "gpu/command_buffer/client/gles2_interface.h" | 23 #include "gpu/command_buffer/client/gles2_interface.h" |
23 #include "media/base/video_frame.h" | 24 #include "media/base/video_frame.h" |
24 #include "third_party/skia/include/core/SkColorPriv.h" | 25 #include "third_party/skia/include/core/SkColorPriv.h" |
25 #include "third_party/skia/include/core/SkImageFilter.h" | 26 #include "third_party/skia/include/core/SkImageFilter.h" |
26 #include "third_party/skia/include/core/SkMatrix.h" | 27 #include "third_party/skia/include/core/SkMatrix.h" |
27 #include "third_party/skia/include/core/SkRefCnt.h" | 28 #include "third_party/skia/include/core/SkRefCnt.h" |
28 #include "third_party/skia/include/core/SkSurface.h" | 29 #include "third_party/skia/include/core/SkSurface.h" |
29 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" | 30 #include "third_party/skia/include/effects/SkColorFilterImageFilter.h" |
30 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" | 31 #include "third_party/skia/include/effects/SkColorMatrixFilter.h" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 | 294 |
294 YUVVideoDrawQuad* yuv_quad = | 295 YUVVideoDrawQuad* yuv_quad = |
295 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 296 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
296 uint32_t bits_per_channel = 8; | 297 uint32_t bits_per_channel = 8; |
297 if (video_frame->format() == media::PIXEL_FORMAT_YUV420P10 || | 298 if (video_frame->format() == media::PIXEL_FORMAT_YUV420P10 || |
298 video_frame->format() == media::PIXEL_FORMAT_YUV422P10 || | 299 video_frame->format() == media::PIXEL_FORMAT_YUV422P10 || |
299 video_frame->format() == media::PIXEL_FORMAT_YUV444P10) { | 300 video_frame->format() == media::PIXEL_FORMAT_YUV444P10) { |
300 bits_per_channel = 10; | 301 bits_per_channel = 10; |
301 } | 302 } |
302 | 303 |
| 304 viz::ResourceFormat yuv_highbit_resource_format = |
| 305 resource_provider->YuvResourceFormat(bits_per_channel); |
| 306 |
| 307 float multitplier = 1.0; |
| 308 int shift = 16 - bits_per_channel; |
| 309 |
| 310 if (yuv_highbit_resource_format != viz::R16_EXT) |
| 311 bits_per_channel = 8; |
| 312 else |
| 313 multitplier = (1 << shift) + 1.0 / (1 << (bits_per_channel - shift)); |
| 314 |
303 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, | 315 yuv_quad->SetNew(shared_state, rect, opaque_rect, visible_rect, |
304 needs_blending, ya_tex_coord_rect, uv_tex_coord_rect, | 316 needs_blending, ya_tex_coord_rect, uv_tex_coord_rect, |
305 ya_tex_size, uv_tex_size, y_resource, u_resource, v_resource, | 317 ya_tex_size, uv_tex_size, y_resource, u_resource, v_resource, |
306 a_resource, color_space, video_color_space, 0.0f, 1.0f, | 318 a_resource, color_space, video_color_space, 0.0f, |
307 bits_per_channel); | 319 multitplier, bits_per_channel); |
308 } | 320 } |
309 | 321 |
310 void CreateTestY16TextureDrawQuad_FromVideoFrame( | 322 void CreateTestY16TextureDrawQuad_FromVideoFrame( |
311 const SharedQuadState* shared_state, | 323 const SharedQuadState* shared_state, |
312 scoped_refptr<media::VideoFrame> video_frame, | 324 scoped_refptr<media::VideoFrame> video_frame, |
313 const gfx::RectF& tex_coord_rect, | 325 const gfx::RectF& tex_coord_rect, |
314 RenderPass* render_pass, | 326 RenderPass* render_pass, |
315 VideoResourceUpdater* video_resource_updater, | 327 VideoResourceUpdater* video_resource_updater, |
316 const gfx::Rect& rect, | 328 const gfx::Rect& rect, |
317 const gfx::Rect& visible_rect, | 329 const gfx::Rect& visible_rect, |
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 GLRendererPixelTest::SetUp(); | 1302 GLRendererPixelTest::SetUp(); |
1291 bool use_stream_video_draw_quad = false; | 1303 bool use_stream_video_draw_quad = false; |
1292 video_resource_updater_.reset(new VideoResourceUpdater( | 1304 video_resource_updater_.reset(new VideoResourceUpdater( |
1293 output_surface_->context_provider(), resource_provider_.get(), | 1305 output_surface_->context_provider(), resource_provider_.get(), |
1294 use_stream_video_draw_quad)); | 1306 use_stream_video_draw_quad)); |
1295 } | 1307 } |
1296 | 1308 |
1297 std::unique_ptr<VideoResourceUpdater> video_resource_updater_; | 1309 std::unique_ptr<VideoResourceUpdater> video_resource_updater_; |
1298 }; | 1310 }; |
1299 | 1311 |
| 1312 enum class HighbitTexture { |
| 1313 Y8, |
| 1314 R16_EXT, |
| 1315 }; |
| 1316 |
1300 class VideoGLRendererPixelHiLoTest | 1317 class VideoGLRendererPixelHiLoTest |
1301 : public VideoGLRendererPixelTest, | 1318 : public VideoGLRendererPixelTest, |
1302 public ::testing::WithParamInterface<bool> {}; | 1319 public ::testing::WithParamInterface< |
| 1320 ::testing::tuple<bool, HighbitTexture>> { |
| 1321 public: |
| 1322 void SetSupportHighbitTexture(HighbitTexture texture) { |
| 1323 TestInProcessContextProvider* context_provider = |
| 1324 GetTestInProcessContextProvider(); |
| 1325 switch (texture) { |
| 1326 case HighbitTexture::Y8: |
| 1327 break; |
| 1328 case HighbitTexture::R16_EXT: |
| 1329 context_provider->SetSupportTextureNorm16(true); |
| 1330 video_resource_updater_->UseR16ForTesting(true); |
| 1331 break; |
| 1332 } |
| 1333 } |
| 1334 |
| 1335 private: |
| 1336 TestInProcessContextProvider* GetTestInProcessContextProvider() { |
| 1337 return static_cast<TestInProcessContextProvider*>( |
| 1338 output_surface_->context_provider()); |
| 1339 } |
| 1340 }; |
1303 | 1341 |
1304 TEST_P(VideoGLRendererPixelHiLoTest, SimpleYUVRect) { | 1342 TEST_P(VideoGLRendererPixelHiLoTest, SimpleYUVRect) { |
1305 gfx::Rect rect(this->device_viewport_size_); | 1343 gfx::Rect rect(this->device_viewport_size_); |
1306 | 1344 |
1307 int id = 1; | 1345 int id = 1; |
1308 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1346 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1309 | 1347 |
1310 SharedQuadState* shared_state = | 1348 SharedQuadState* shared_state = |
1311 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1349 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1312 | 1350 |
1313 bool highbit = GetParam(); | 1351 const bool highbit = testing::get<0>(GetParam()); |
| 1352 const HighbitTexture format = testing::get<1>(GetParam()); |
| 1353 SetSupportHighbitTexture(format); |
| 1354 |
1314 CreateTestYUVVideoDrawQuad_Striped( | 1355 CreateTestYUVVideoDrawQuad_Striped( |
1315 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, | 1356 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, |
1316 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), | 1357 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), |
1317 video_resource_updater_.get(), rect, rect, resource_provider_.get()); | 1358 video_resource_updater_.get(), rect, rect, resource_provider_.get()); |
1318 | 1359 |
1319 RenderPassList pass_list; | 1360 RenderPassList pass_list; |
1320 pass_list.push_back(std::move(pass)); | 1361 pass_list.push_back(std::move(pass)); |
1321 | 1362 |
1322 EXPECT_TRUE( | 1363 EXPECT_TRUE( |
1323 this->RunPixelTest(&pass_list, | 1364 this->RunPixelTest(&pass_list, |
1324 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), | 1365 base::FilePath(FILE_PATH_LITERAL("yuv_stripes.png")), |
1325 FuzzyPixelOffByOneComparator(true))); | 1366 FuzzyPixelOffByOneComparator(true))); |
1326 } | 1367 } |
1327 | 1368 |
1328 TEST_P(VideoGLRendererPixelHiLoTest, ClippedYUVRect) { | 1369 TEST_P(VideoGLRendererPixelHiLoTest, ClippedYUVRect) { |
1329 gfx::Rect viewport(this->device_viewport_size_); | 1370 gfx::Rect viewport(this->device_viewport_size_); |
1330 gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5, | 1371 gfx::Rect draw_rect(this->device_viewport_size_.width() * 1.5, |
1331 this->device_viewport_size_.height() * 1.5); | 1372 this->device_viewport_size_.height() * 1.5); |
1332 | 1373 |
1333 int id = 1; | 1374 int id = 1; |
1334 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport); | 1375 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, viewport); |
1335 | 1376 |
1336 SharedQuadState* shared_state = | 1377 SharedQuadState* shared_state = |
1337 CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get()); | 1378 CreateTestSharedQuadState(gfx::Transform(), viewport, pass.get()); |
1338 | 1379 |
1339 bool highbit = GetParam(); | 1380 const bool highbit = testing::get<0>(GetParam()); |
| 1381 const HighbitTexture format = testing::get<1>(GetParam()); |
| 1382 SetSupportHighbitTexture(format); |
| 1383 |
1340 CreateTestYUVVideoDrawQuad_Striped( | 1384 CreateTestYUVVideoDrawQuad_Striped( |
1341 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, | 1385 shared_state, media::PIXEL_FORMAT_YV12, false, highbit, |
1342 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), | 1386 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), pass.get(), |
1343 video_resource_updater_.get(), draw_rect, viewport, | 1387 video_resource_updater_.get(), draw_rect, viewport, |
1344 resource_provider_.get()); | 1388 resource_provider_.get()); |
1345 RenderPassList pass_list; | 1389 RenderPassList pass_list; |
1346 pass_list.push_back(std::move(pass)); | 1390 pass_list.push_back(std::move(pass)); |
1347 | 1391 |
1348 EXPECT_TRUE(this->RunPixelTest( | 1392 EXPECT_TRUE(this->RunPixelTest( |
1349 &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")), | 1393 &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")), |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1392 pass_list.push_back(std::move(pass)); | 1436 pass_list.push_back(std::move(pass)); |
1393 | 1437 |
1394 // If we didn't get black out of the YUV values above, then we probably have a | 1438 // If we didn't get black out of the YUV values above, then we probably have a |
1395 // color range issue. | 1439 // color range issue. |
1396 EXPECT_TRUE(this->RunPixelTest(&pass_list, | 1440 EXPECT_TRUE(this->RunPixelTest(&pass_list, |
1397 base::FilePath(FILE_PATH_LITERAL("black.png")), | 1441 base::FilePath(FILE_PATH_LITERAL("black.png")), |
1398 FuzzyPixelOffByOneComparator(true))); | 1442 FuzzyPixelOffByOneComparator(true))); |
1399 } | 1443 } |
1400 | 1444 |
1401 // First argument (test case prefix) is intentionally left empty. | 1445 // First argument (test case prefix) is intentionally left empty. |
1402 INSTANTIATE_TEST_CASE_P(, VideoGLRendererPixelHiLoTest, ::testing::Bool()); | 1446 INSTANTIATE_TEST_CASE_P( |
| 1447 , |
| 1448 VideoGLRendererPixelHiLoTest, |
| 1449 testing::Combine(testing::Bool(), |
| 1450 testing::Values(HighbitTexture::Y8, |
| 1451 HighbitTexture::R16_EXT))); |
1403 | 1452 |
1404 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { | 1453 TEST_F(VideoGLRendererPixelTest, SimpleYUVJRect) { |
1405 gfx::Rect rect(this->device_viewport_size_); | 1454 gfx::Rect rect(this->device_viewport_size_); |
1406 | 1455 |
1407 int id = 1; | 1456 int id = 1; |
1408 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); | 1457 std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect); |
1409 | 1458 |
1410 SharedQuadState* shared_state = | 1459 SharedQuadState* shared_state = |
1411 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); | 1460 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get()); |
1412 | 1461 |
(...skipping 2194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3607 INSTANTIATE_TEST_CASE_P( | 3656 INSTANTIATE_TEST_CASE_P( |
3608 ToColorSpace, | 3657 ToColorSpace, |
3609 ColorTransformPixelTest, | 3658 ColorTransformPixelTest, |
3610 testing::Combine(testing::ValuesIn(intermediate_color_spaces), | 3659 testing::Combine(testing::ValuesIn(intermediate_color_spaces), |
3611 testing::ValuesIn(dst_color_spaces))); | 3660 testing::ValuesIn(dst_color_spaces))); |
3612 | 3661 |
3613 #endif // !defined(OS_ANDROID) | 3662 #endif // !defined(OS_ANDROID) |
3614 | 3663 |
3615 } // namespace | 3664 } // namespace |
3616 } // namespace cc | 3665 } // namespace cc |
OLD | NEW |