| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stdio.h> | 5 #include <stdio.h> |
| 6 #include <cmath> | 6 #include <cmath> |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include <GLES2/gl2.h> | 10 #include <GLES2/gl2.h> |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 return true; | 251 return true; |
| 252 } | 252 } |
| 253 } | 253 } |
| 254 return false; | 254 return false; |
| 255 } | 255 } |
| 256 | 256 |
| 257 // Make sure that the stages of the scaler pipeline are sane. | 257 // Make sure that the stages of the scaler pipeline are sane. |
| 258 void ValidateScalerStages( | 258 void ValidateScalerStages( |
| 259 content::GLHelper::ScalerQuality quality, | 259 content::GLHelper::ScalerQuality quality, |
| 260 const std::vector<GLHelperScaling::ScalerStage>& scaler_stages, | 260 const std::vector<GLHelperScaling::ScalerStage>& scaler_stages, |
| 261 const gfx::Size& dst_size, |
| 261 const std::string& message) { | 262 const std::string& message) { |
| 262 bool previous_error = HasFailure(); | 263 bool previous_error = HasFailure(); |
| 263 // First, check that the input size for each stage is equal to | 264 // First, check that the input size for each stage is equal to |
| 264 // the output size of the previous stage. | 265 // the output size of the previous stage. |
| 265 for (size_t i = 1; i < scaler_stages.size(); i++) { | 266 for (size_t i = 1; i < scaler_stages.size(); i++) { |
| 266 EXPECT_EQ(scaler_stages[i - 1].dst_size.width(), | 267 EXPECT_EQ(scaler_stages[i - 1].dst_size.width(), |
| 267 scaler_stages[i].src_size.width()); | 268 scaler_stages[i].src_size.width()); |
| 268 EXPECT_EQ(scaler_stages[i - 1].dst_size.height(), | 269 EXPECT_EQ(scaler_stages[i - 1].dst_size.height(), |
| 269 scaler_stages[i].src_size.height()); | 270 scaler_stages[i].src_size.height()); |
| 270 EXPECT_EQ(scaler_stages[i].src_subrect.x(), 0); | 271 EXPECT_EQ(scaler_stages[i].src_subrect.x(), 0); |
| 271 EXPECT_EQ(scaler_stages[i].src_subrect.y(), 0); | 272 EXPECT_EQ(scaler_stages[i].src_subrect.y(), 0); |
| 272 EXPECT_EQ(scaler_stages[i].src_subrect.width(), | 273 EXPECT_EQ(scaler_stages[i].src_subrect.width(), |
| 273 scaler_stages[i].src_size.width()); | 274 scaler_stages[i].src_size.width()); |
| 274 EXPECT_EQ(scaler_stages[i].src_subrect.height(), | 275 EXPECT_EQ(scaler_stages[i].src_subrect.height(), |
| 275 scaler_stages[i].src_size.height()); | 276 scaler_stages[i].src_size.height()); |
| 276 } | 277 } |
| 277 | 278 |
| 279 // Check the output size matches the destination of the last stage |
| 280 EXPECT_EQ(scaler_stages[scaler_stages.size() - 1].dst_size.width(), |
| 281 dst_size.width()); |
| 282 EXPECT_EQ(scaler_stages[scaler_stages.size() - 1].dst_size.height(), |
| 283 dst_size.height()); |
| 284 |
| 278 // Used to verify that up-scales are not attempted after some | 285 // Used to verify that up-scales are not attempted after some |
| 279 // other scale. | 286 // other scale. |
| 280 bool scaled_x = false; | 287 bool scaled_x = false; |
| 281 bool scaled_y = false; | 288 bool scaled_y = false; |
| 282 | 289 |
| 283 for (size_t i = 0; i < scaler_stages.size(); i++) { | 290 for (size_t i = 0; i < scaler_stages.size(); i++) { |
| 284 // Note: 2.0 means scaling down by 50% | 291 // Note: 2.0 means scaling down by 50% |
| 285 double x_scale = | 292 double x_scale = |
| 286 static_cast<double>(scaler_stages[i].src_subrect.width()) / | 293 static_cast<double>(scaler_stages[i].src_subrect.width()) / |
| 287 static_cast<double>(scaler_stages[i].dst_size.width()); | 294 static_cast<double>(scaler_stages[i].dst_size.width()); |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 kQualityNames[quality]); | 637 kQualityNames[quality]); |
| 631 | 638 |
| 632 std::vector<GLHelperScaling::ScalerStage> stages; | 639 std::vector<GLHelperScaling::ScalerStage> stages; |
| 633 helper_scaling_->ComputeScalerStages(kQualities[quality], | 640 helper_scaling_->ComputeScalerStages(kQualities[quality], |
| 634 gfx::Size(xsize, ysize), | 641 gfx::Size(xsize, ysize), |
| 635 gfx::Rect(0, 0, xsize, ysize), | 642 gfx::Rect(0, 0, xsize, ysize), |
| 636 gfx::Size(scaled_xsize, scaled_ysize), | 643 gfx::Size(scaled_xsize, scaled_ysize), |
| 637 flip, | 644 flip, |
| 638 false, | 645 false, |
| 639 &stages); | 646 &stages); |
| 640 ValidateScalerStages(kQualities[quality], stages, message); | 647 ValidateScalerStages(kQualities[quality], |
| 648 stages, |
| 649 gfx::Size(scaled_xsize, scaled_ysize), |
| 650 message); |
| 641 | 651 |
| 642 WebGLId dst_texture = | 652 WebGLId dst_texture = |
| 643 helper_->CopyAndScaleTexture(src_texture, | 653 helper_->CopyAndScaleTexture(src_texture, |
| 644 gfx::Size(xsize, ysize), | 654 gfx::Size(xsize, ysize), |
| 645 gfx::Size(scaled_xsize, scaled_ysize), | 655 gfx::Size(scaled_xsize, scaled_ysize), |
| 646 flip, | 656 flip, |
| 647 kQualities[quality]); | 657 kQualities[quality]); |
| 648 | 658 |
| 649 SkBitmap output_pixels; | 659 SkBitmap output_pixels; |
| 650 output_pixels.allocN32Pixels(scaled_xsize, scaled_ysize); | 660 output_pixels.allocN32Pixels(scaled_xsize, scaled_ysize); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 std::vector<GLHelperScaling::ScalerStage> stages; | 702 std::vector<GLHelperScaling::ScalerStage> stages; |
| 693 helper_scaling_->ComputeScalerStages(kQualities[quality], | 703 helper_scaling_->ComputeScalerStages(kQualities[quality], |
| 694 gfx::Size(xsize, ysize), | 704 gfx::Size(xsize, ysize), |
| 695 gfx::Rect(0, 0, xsize, ysize), | 705 gfx::Rect(0, 0, xsize, ysize), |
| 696 gfx::Size(dst_xsize, dst_ysize), | 706 gfx::Size(dst_xsize, dst_ysize), |
| 697 false, | 707 false, |
| 698 false, | 708 false, |
| 699 &stages); | 709 &stages); |
| 700 ValidateScalerStages(kQualities[quality], | 710 ValidateScalerStages(kQualities[quality], |
| 701 stages, | 711 stages, |
| 712 gfx::Size(dst_xsize, dst_ysize), |
| 702 base::StringPrintf( | 713 base::StringPrintf( |
| 703 "input size: %dx%d " | 714 "input size: %dx%d " |
| 704 "output size: %dx%d " | 715 "output size: %dx%d " |
| 705 "quality: %s", | 716 "quality: %s", |
| 706 xsize, | 717 xsize, |
| 707 ysize, | 718 ysize, |
| 708 dst_xsize, | 719 dst_xsize, |
| 709 dst_ysize, | 720 dst_ysize, |
| 710 kQualityNames[quality])); | 721 kQualityNames[quality])); |
| 711 } | 722 } |
| 712 | 723 |
| 713 // Create a scaling pipeline and make sure that the steps | 724 // Create a scaling pipeline and make sure that the steps |
| 714 // are exactly the steps we expect. | 725 // are exactly the steps we expect. |
| 715 void CheckPipeline(content::GLHelper::ScalerQuality quality, | 726 void CheckPipeline(content::GLHelper::ScalerQuality quality, |
| 716 int xsize, | 727 int xsize, |
| 717 int ysize, | 728 int ysize, |
| 718 int dst_xsize, | 729 int dst_xsize, |
| 719 int dst_ysize, | 730 int dst_ysize, |
| 720 const std::string& description) { | 731 const std::string& description) { |
| 721 std::vector<GLHelperScaling::ScalerStage> stages; | 732 std::vector<GLHelperScaling::ScalerStage> stages; |
| 722 helper_scaling_->ComputeScalerStages(quality, | 733 helper_scaling_->ComputeScalerStages(quality, |
| 723 gfx::Size(xsize, ysize), | 734 gfx::Size(xsize, ysize), |
| 724 gfx::Rect(0, 0, xsize, ysize), | 735 gfx::Rect(0, 0, xsize, ysize), |
| 725 gfx::Size(dst_xsize, dst_ysize), | 736 gfx::Size(dst_xsize, dst_ysize), |
| 726 false, | 737 false, |
| 727 false, | 738 false, |
| 728 &stages); | 739 &stages); |
| 729 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, stages, ""); | 740 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, |
| 741 stages, |
| 742 gfx::Size(dst_xsize, dst_ysize), |
| 743 ""); |
| 730 EXPECT_EQ(PrintStages(stages), description); | 744 EXPECT_EQ(PrintStages(stages), description); |
| 731 } | 745 } |
| 732 | 746 |
| 733 // Note: Left/Right means Top/Bottom when used for Y dimension. | 747 // Note: Left/Right means Top/Bottom when used for Y dimension. |
| 734 enum Margin { | 748 enum Margin { |
| 735 MarginLeft, | 749 MarginLeft, |
| 736 MarginMiddle, | 750 MarginMiddle, |
| 737 MarginRight, | 751 MarginRight, |
| 738 MarginInvalid, | 752 MarginInvalid, |
| 739 }; | 753 }; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1278 gfx::Size(xsize, ysize), | 1292 gfx::Size(xsize, ysize), |
| 1279 gfx::Rect(0, 0, xsize, ysize), | 1293 gfx::Rect(0, 0, xsize, ysize), |
| 1280 gfx::Size(dst_xsize, dst_ysize), | 1294 gfx::Size(dst_xsize, dst_ysize), |
| 1281 false, | 1295 false, |
| 1282 false, | 1296 false, |
| 1283 &x_ops_, | 1297 &x_ops_, |
| 1284 &y_ops_, | 1298 &y_ops_, |
| 1285 &stages); | 1299 &stages); |
| 1286 EXPECT_EQ(x_ops_.size(), 0U); | 1300 EXPECT_EQ(x_ops_.size(), 0U); |
| 1287 EXPECT_EQ(y_ops_.size(), 0U); | 1301 EXPECT_EQ(y_ops_.size(), 0U); |
| 1288 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, stages, ""); | 1302 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, |
| 1303 stages, |
| 1304 gfx::Size(dst_xsize, dst_ysize), |
| 1305 ""); |
| 1289 EXPECT_EQ(PrintStages(stages), description); | 1306 EXPECT_EQ(PrintStages(stages), description); |
| 1290 } | 1307 } |
| 1291 | 1308 |
| 1292 void CheckOptimizationsTest() { | 1309 void CheckOptimizationsTest() { |
| 1293 // Basic upscale. X and Y should be combined into one pass. | 1310 // Basic upscale. X and Y should be combined into one pass. |
| 1294 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000)); | 1311 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000)); |
| 1295 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000)); | 1312 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000)); |
| 1296 CheckPipeline2(1024, 768, 2000, 2000, "1024x768 -> 2000x2000 bilinear\n"); | 1313 CheckPipeline2(1024, 768, 2000, 2000, "1024x768 -> 2000x2000 bilinear\n"); |
| 1297 | 1314 |
| 1298 // X scaled 1/2, Y upscaled, should still be one pass. | 1315 // X scaled 1/2, Y upscaled, should still be one pass. |
| 1299 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 512)); | 1316 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 512)); |
| 1300 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000)); | 1317 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000)); |
| 1301 CheckPipeline2(1024, 768, 512, 2000, "1024x768 -> 512x2000 bilinear\n"); | 1318 CheckPipeline2(1024, 768, 512, 2000, "1024x768 -> 512x2000 bilinear\n"); |
| 1302 | 1319 |
| 1303 // X upscaled, Y scaled 1/2, one bilinear pass | 1320 // X upscaled, Y scaled 1/2, one bilinear pass |
| 1304 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000)); | 1321 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000)); |
| 1305 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 384)); | 1322 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 384)); |
| 1306 CheckPipeline2(1024, 768, 2000, 384, "1024x768 -> 2000x384 bilinear\n"); | 1323 CheckPipeline2(1024, 768, 2000, 384, "1024x768 -> 2000x384 bilinear\n"); |
| 1307 | 1324 |
| 1308 // X scaled 1/2, Y scaled 1/2, one bilinear pass | 1325 // X scaled 1/2, Y scaled 1/2, one bilinear pass |
| 1309 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 512)); | 1326 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 512)); |
| 1310 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 384)); | 1327 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 384)); |
| 1311 CheckPipeline2(1024, 768, 2000, 384, "1024x768 -> 512x384 bilinear\n"); | 1328 CheckPipeline2(1024, 768, 512, 384, "1024x768 -> 512x384 bilinear\n"); |
| 1312 | 1329 |
| 1313 // X scaled 1/2, Y scaled to 60%, one bilinear2 pass. | 1330 // X scaled 1/2, Y scaled to 60%, one bilinear2 pass. |
| 1314 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 50)); | 1331 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 50)); |
| 1315 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); | 1332 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); |
| 1316 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); | 1333 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); |
| 1317 CheckPipeline2(100, 100, 50, 60, "100x100 -> 50x60 bilinear2 Y\n"); | 1334 CheckPipeline2(100, 100, 50, 60, "100x100 -> 50x60 bilinear2 Y\n"); |
| 1318 | 1335 |
| 1319 // X scaled to 60%, Y scaled 1/2, one bilinear2 pass. | 1336 // X scaled to 60%, Y scaled 1/2, one bilinear2 pass. |
| 1320 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); | 1337 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); |
| 1321 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); | 1338 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); |
| 1322 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 50)); | 1339 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 50)); |
| 1323 CheckPipeline2(100, 100, 50, 60, "100x100 -> 60x50 bilinear2 X\n"); | 1340 CheckPipeline2(100, 100, 60, 50, "100x100 -> 60x50 bilinear2 X\n"); |
| 1324 | 1341 |
| 1325 // X scaled to 60%, Y scaled 60%, one bilinear2x2 pass. | 1342 // X scaled to 60%, Y scaled 60%, one bilinear2x2 pass. |
| 1326 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); | 1343 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); |
| 1327 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); | 1344 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); |
| 1328 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); | 1345 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); |
| 1329 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); | 1346 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); |
| 1330 CheckPipeline2(100, 100, 60, 60, "100x100 -> 60x60 bilinear2x2\n"); | 1347 CheckPipeline2(100, 100, 60, 60, "100x100 -> 60x60 bilinear2x2\n"); |
| 1331 | 1348 |
| 1332 // X scaled to 40%, Y scaled 40%, two bilinear3 passes. | 1349 // X scaled to 40%, Y scaled 40%, two bilinear3 passes. |
| 1333 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40)); | 1350 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40)); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 128)); | 1425 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 128)); |
| 1409 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 64)); | 1426 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 64)); |
| 1410 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 32)); | 1427 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 32)); |
| 1411 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 16)); | 1428 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 16)); |
| 1412 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 8)); | 1429 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 8)); |
| 1413 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 4)); | 1430 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 4)); |
| 1414 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 2)); | 1431 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 2)); |
| 1415 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 1)); | 1432 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 1)); |
| 1416 CheckPipeline2(100, | 1433 CheckPipeline2(100, |
| 1417 100, | 1434 100, |
| 1418 30, | 1435 1, |
| 1419 30, | 1436 1, |
| 1420 "100x100 -> 100x32 bilinear4 Y\n" | 1437 "100x100 -> 100x32 bilinear4 Y\n" |
| 1421 "100x32 -> 100x4 bilinear4 Y\n" | 1438 "100x32 -> 100x4 bilinear4 Y\n" |
| 1422 "100x4 -> 64x1 bilinear2x2\n" | 1439 "100x4 -> 64x1 bilinear2x2\n" |
| 1423 "64x1 -> 8x1 bilinear4 X\n" | 1440 "64x1 -> 8x1 bilinear4 X\n" |
| 1424 "8x1 -> 1x1 bilinear4 X\n"); | 1441 "8x1 -> 1x1 bilinear4 X\n"); |
| 1425 } | 1442 } |
| 1426 | 1443 |
| 1427 scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context_; | 1444 scoped_ptr<WebGraphicsContext3DInProcessCommandBufferImpl> context_; |
| 1428 gpu::ContextSupport* context_support_; | 1445 gpu::ContextSupport* context_support_; |
| 1429 scoped_ptr<content::GLHelper> helper_; | 1446 scoped_ptr<content::GLHelper> helper_; |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 CommandLine::Init(argc, argv); | 1668 CommandLine::Init(argc, argv); |
| 1652 base::TestSuite* suite = new content::ContentTestSuite(argc, argv); | 1669 base::TestSuite* suite = new content::ContentTestSuite(argc, argv); |
| 1653 #if defined(OS_MACOSX) | 1670 #if defined(OS_MACOSX) |
| 1654 base::mac::ScopedNSAutoreleasePool pool; | 1671 base::mac::ScopedNSAutoreleasePool pool; |
| 1655 #endif | 1672 #endif |
| 1656 | 1673 |
| 1657 content::UnitTestTestSuite runner(suite); | 1674 content::UnitTestTestSuite runner(suite); |
| 1658 base::MessageLoop message_loop; | 1675 base::MessageLoop message_loop; |
| 1659 return runner.Run(); | 1676 return runner.Run(); |
| 1660 } | 1677 } |
| OLD | NEW |