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

Side by Side Diff: content/browser/compositor/gl_helper_unittest.cc

Issue 1802383002: Move gl_helper to content/browser/compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 9 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 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <string.h> 8 #include <string.h>
9 #include <cmath> 9 #include <cmath>
10 #include <string> 10 #include <string>
(...skipping 11 matching lines...) Expand all
22 #include "base/macros.h" 22 #include "base/macros.h"
23 #include "base/memory/ref_counted_memory.h" 23 #include "base/memory/ref_counted_memory.h"
24 #include "base/message_loop/message_loop.h" 24 #include "base/message_loop/message_loop.h"
25 #include "base/run_loop.h" 25 #include "base/run_loop.h"
26 #include "base/strings/stringprintf.h" 26 #include "base/strings/stringprintf.h"
27 #include "base/synchronization/waitable_event.h" 27 #include "base/synchronization/waitable_event.h"
28 #include "base/test/launcher/unit_test_launcher.h" 28 #include "base/test/launcher/unit_test_launcher.h"
29 #include "base/test/test_suite.h" 29 #include "base/test/test_suite.h"
30 #include "base/time/time.h" 30 #include "base/time/time.h"
31 #include "base/trace_event/trace_event.h" 31 #include "base/trace_event/trace_event.h"
32 #include "content/common/gpu/client/gl_helper.h" 32 #include "content/browser/compositor/gl_helper.h"
33 #include "content/common/gpu/client/gl_helper_readback_support.h" 33 #include "content/browser/compositor/gl_helper_readback_support.h"
34 #include "content/common/gpu/client/gl_helper_scaling.h" 34 #include "content/browser/compositor/gl_helper_scaling.h"
35 #include "gpu/command_buffer/client/gl_in_process_context.h" 35 #include "gpu/command_buffer/client/gl_in_process_context.h"
36 #include "gpu/command_buffer/client/gles2_implementation.h" 36 #include "gpu/command_buffer/client/gles2_implementation.h"
37 #include "media/base/video_frame.h" 37 #include "media/base/video_frame.h"
38 #include "testing/gtest/include/gtest/gtest.h" 38 #include "testing/gtest/include/gtest/gtest.h"
39 #include "third_party/skia/include/core/SkBitmap.h" 39 #include "third_party/skia/include/core/SkBitmap.h"
40 #include "third_party/skia/include/core/SkTypes.h" 40 #include "third_party/skia/include/core/SkTypes.h"
41 #include "ui/gl/gl_implementation.h" 41 #include "ui/gl/gl_implementation.h"
42 42
43 namespace content { 43 namespace content {
44 44
45 content::GLHelper::ScalerQuality kQualities[] = { 45 content::GLHelper::ScalerQuality kQualities[] = {
46 content::GLHelper::SCALER_QUALITY_BEST, 46 content::GLHelper::SCALER_QUALITY_BEST,
47 content::GLHelper::SCALER_QUALITY_GOOD, 47 content::GLHelper::SCALER_QUALITY_GOOD,
48 content::GLHelper::SCALER_QUALITY_FAST, }; 48 content::GLHelper::SCALER_QUALITY_FAST,
49 };
49 50
50 const char* kQualityNames[] = {"best", "good", "fast", }; 51 const char* kQualityNames[] = {
52 "best", "good", "fast",
53 };
51 54
52 class GLHelperTest : public testing::Test { 55 class GLHelperTest : public testing::Test {
53 protected: 56 protected:
54 void SetUp() override { 57 void SetUp() override {
55 gpu::gles2::ContextCreationAttribHelper attributes; 58 gpu::gles2::ContextCreationAttribHelper attributes;
56 attributes.alpha_size = 8; 59 attributes.alpha_size = 8;
57 attributes.depth_size = 24; 60 attributes.depth_size = 24;
58 attributes.red_size = 8; 61 attributes.red_size = 8;
59 attributes.green_size = 8; 62 attributes.green_size = 8;
60 attributes.blue_size = 8; 63 attributes.blue_size = 8;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 } 112 }
110 } 113 }
111 114
112 // End tracing, return tracing data in a simple map 115 // End tracing, return tracing data in a simple map
113 // of event name->counts. 116 // of event name->counts.
114 void EndTracing(std::map<std::string, int>* event_counts) { 117 void EndTracing(std::map<std::string, int>* event_counts) {
115 std::string json_data = "["; 118 std::string json_data = "[";
116 base::trace_event::TraceLog::GetInstance()->SetDisabled(); 119 base::trace_event::TraceLog::GetInstance()->SetDisabled();
117 base::RunLoop run_loop; 120 base::RunLoop run_loop;
118 base::trace_event::TraceLog::GetInstance()->Flush( 121 base::trace_event::TraceLog::GetInstance()->Flush(
119 base::Bind(&GLHelperTest::TraceDataCB, 122 base::Bind(&GLHelperTest::TraceDataCB, run_loop.QuitClosure(),
120 run_loop.QuitClosure(),
121 base::Unretained(&json_data))); 123 base::Unretained(&json_data)));
122 run_loop.Run(); 124 run_loop.Run();
123 json_data.append("]"); 125 json_data.append("]");
124 126
125 std::string error_msg; 127 std::string error_msg;
126 scoped_ptr<base::Value> trace_data = 128 scoped_ptr<base::Value> trace_data =
127 base::JSONReader::ReadAndReturnError(json_data, 0, NULL, &error_msg); 129 base::JSONReader::ReadAndReturnError(json_data, 0, NULL, &error_msg);
128 CHECK(trace_data) 130 CHECK(trace_data) << "JSON parsing failed (" << error_msg
129 << "JSON parsing failed (" << error_msg << ") JSON data:" << std::endl 131 << ") JSON data:" << std::endl
130 << json_data; 132 << json_data;
131 133
132 base::ListValue* list; 134 base::ListValue* list;
133 CHECK(trace_data->GetAsList(&list)); 135 CHECK(trace_data->GetAsList(&list));
134 for (size_t i = 0; i < list->GetSize(); i++) { 136 for (size_t i = 0; i < list->GetSize(); i++) {
135 base::Value* item = NULL; 137 base::Value* item = NULL;
136 if (list->Get(i, &item)) { 138 if (list->Get(i, &item)) {
137 base::DictionaryValue* dict; 139 base::DictionaryValue* dict;
138 CHECK(item->GetAsDictionary(&dict)); 140 CHECK(item->GetAsDictionary(&dict));
139 std::string name; 141 std::string name;
140 CHECK(dict->GetString("name", &name)); 142 CHECK(dict->GetString("name", &name));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 } 211 }
210 LOG(ERROR) << formatted; 212 LOG(ERROR) << formatted;
211 } 213 }
212 } 214 }
213 215
214 // Print out the individual steps of a scaler pipeline. 216 // Print out the individual steps of a scaler pipeline.
215 std::string PrintStages( 217 std::string PrintStages(
216 const std::vector<GLHelperScaling::ScalerStage>& scaler_stages) { 218 const std::vector<GLHelperScaling::ScalerStage>& scaler_stages) {
217 std::string ret; 219 std::string ret;
218 for (size_t i = 0; i < scaler_stages.size(); i++) { 220 for (size_t i = 0; i < scaler_stages.size(); i++) {
219 ret.append(base::StringPrintf("%dx%d -> %dx%d ", 221 ret.append(base::StringPrintf(
220 scaler_stages[i].src_size.width(), 222 "%dx%d -> %dx%d ", scaler_stages[i].src_size.width(),
221 scaler_stages[i].src_size.height(), 223 scaler_stages[i].src_size.height(), scaler_stages[i].dst_size.width(),
222 scaler_stages[i].dst_size.width(), 224 scaler_stages[i].dst_size.height()));
223 scaler_stages[i].dst_size.height()));
224 bool xy_matters = false; 225 bool xy_matters = false;
225 switch (scaler_stages[i].shader) { 226 switch (scaler_stages[i].shader) {
226 case GLHelperScaling::SHADER_BILINEAR: 227 case GLHelperScaling::SHADER_BILINEAR:
227 ret.append("bilinear"); 228 ret.append("bilinear");
228 break; 229 break;
229 case GLHelperScaling::SHADER_BILINEAR2: 230 case GLHelperScaling::SHADER_BILINEAR2:
230 ret.append("bilinear2"); 231 ret.append("bilinear2");
231 xy_matters = true; 232 xy_matters = true;
232 break; 233 break;
233 case GLHelperScaling::SHADER_BILINEAR3: 234 case GLHelperScaling::SHADER_BILINEAR3:
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 EXPECT_EQ(y_scale, 2.0); 389 EXPECT_EQ(y_scale, 2.0);
389 } 390 }
390 break; 391 break;
391 } 392 }
392 393
393 if (!scaler_stages[i].scale_x) { 394 if (!scaler_stages[i].scale_x) {
394 std::swap(x_samples, y_samples); 395 std::swap(x_samples, y_samples);
395 } 396 }
396 397
397 if (x_samples) { 398 if (x_samples) {
398 EXPECT_TRUE(CheckScale(x_scale, x_samples, scaled_x)) 399 EXPECT_TRUE(CheckScale(x_scale, x_samples, scaled_x)) << "x_scale = "
399 << "x_scale = " << x_scale; 400 << x_scale;
400 } 401 }
401 if (y_samples) { 402 if (y_samples) {
402 EXPECT_TRUE(CheckScale(y_scale, y_samples, scaled_y)) 403 EXPECT_TRUE(CheckScale(y_scale, y_samples, scaled_y)) << "y_scale = "
403 << "y_scale = " << y_scale; 404 << y_scale;
404 } 405 }
405 406
406 if (x_scale != 1.0) { 407 if (x_scale != 1.0) {
407 scaled_x = true; 408 scaled_x = true;
408 } 409 }
409 if (y_scale != 1.0) { 410 if (y_scale != 1.0) {
410 scaled_y = true; 411 scaled_y = true;
411 } 412 }
412 } 413 }
413 414
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 CHECK_EQ(input->colorType(), kRGBA_8888_SkColorType); 504 CHECK_EQ(input->colorType(), kRGBA_8888_SkColorType);
504 505
505 for (int dst_y = 0; dst_y < output->height(); dst_y++) { 506 for (int dst_y = 0; dst_y < output->height(); dst_y++) {
506 for (int dst_x = 0; dst_x < output->width(); dst_x++) { 507 for (int dst_x = 0; dst_x < output->width(); dst_x++) {
507 float c0 = ChannelAsFloat(input, dst_x, dst_y, 0); 508 float c0 = ChannelAsFloat(input, dst_x, dst_y, 0);
508 float c1 = ChannelAsFloat(input, dst_x, dst_y, 1); 509 float c1 = ChannelAsFloat(input, dst_x, dst_y, 1);
509 float c2 = ChannelAsFloat(input, dst_x, dst_y, 2); 510 float c2 = ChannelAsFloat(input, dst_x, dst_y, 2);
510 float value = c0 * kRGBtoGrayscaleColorWeights[0] + 511 float value = c0 * kRGBtoGrayscaleColorWeights[0] +
511 c1 * kRGBtoGrayscaleColorWeights[1] + 512 c1 * kRGBtoGrayscaleColorWeights[1] +
512 c2 * kRGBtoGrayscaleColorWeights[2]; 513 c2 * kRGBtoGrayscaleColorWeights[2];
513 SetChannel( 514 SetChannel(output, dst_x, dst_y, 0,
514 output, dst_x, dst_y, 0, static_cast<int>(value * 255.0f + 0.5f)); 515 static_cast<int>(value * 255.0f + 0.5f));
515 } 516 }
516 } 517 }
517 } 518 }
518 519
519 // Very slow bicubic / bilinear scaler for reference. 520 // Very slow bicubic / bilinear scaler for reference.
520 void ScaleSlow(SkBitmap* input, 521 void ScaleSlow(SkBitmap* input,
521 SkBitmap* output, 522 SkBitmap* output,
522 content::GLHelper::ScalerQuality quality) { 523 content::GLHelper::ScalerQuality quality) {
523 float xscale = static_cast<float>(input->width()) / output->width(); 524 float xscale = static_cast<float>(input->width()) / output->width();
524 float yscale = static_cast<float>(input->height()) / output->height(); 525 float yscale = static_cast<float>(input->height()) / output->height();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 int xmag = 1 << xshift; 566 int xmag = 1 << xshift;
566 int ymag = 1 << yshift; 567 int ymag = 1 << yshift;
567 if (xmag == 4 && output->width() * 3 >= input->width()) { 568 if (xmag == 4 && output->width() * 3 >= input->width()) {
568 xmag = 3; 569 xmag = 3;
569 } 570 }
570 if (ymag == 4 && output->height() * 3 >= input->height()) { 571 if (ymag == 4 && output->height() * 3 >= input->height()) {
571 ymag = 3; 572 ymag = 3;
572 } 573 }
573 for (int x = 0; x < xmag; x++) { 574 for (int x = 0; x < xmag; x++) {
574 for (int y = 0; y < ymag; y++) { 575 for (int y = 0; y < ymag; y++) {
575 value += Bilinear(input, 576 value += Bilinear(
576 (dst_x * xmag + x + 0.5) * xscale / xmag, 577 input, (dst_x * xmag + x + 0.5) * xscale / xmag,
577 (dst_y * ymag + y + 0.5) * yscale / ymag, 578 (dst_y * ymag + y + 0.5) * yscale / ymag, channel);
578 channel);
579 sum += 1.0; 579 sum += 1.0;
580 } 580 }
581 } 581 }
582 break; 582 break;
583 } 583 }
584 584
585 case content::GLHelper::SCALER_QUALITY_FAST: 585 case content::GLHelper::SCALER_QUALITY_FAST:
586 value = Bilinear(input, dst_x_in_src, dst_y_in_src, channel); 586 value = Bilinear(input, dst_x_in_src, dst_y_in_src, channel);
587 sum = 1.0; 587 sum = 1.0;
588 } 588 }
589 value /= sum; 589 value /= sum;
590 SetChannel(output, 590 SetChannel(output, dst_x, dst_y, channel,
591 dst_x,
592 dst_y,
593 channel,
594 static_cast<int>(value * 255.0f + 0.5f)); 591 static_cast<int>(value * 255.0f + 0.5f));
595 } 592 }
596 } 593 }
597 } 594 }
598 } 595 }
599 596
600 void FlipSKBitmap(SkBitmap* bitmap) { 597 void FlipSKBitmap(SkBitmap* bitmap) {
601 int bpp = bitmap->bytesPerPixel(); 598 int bpp = bitmap->bytesPerPixel();
602 DCHECK(bpp == 4 || bpp == 1); 599 DCHECK(bpp == 4 || bpp == 1);
603 int top_line = 0; 600 int top_line = 0;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 672
676 ScaleSlowRecursive(input, &tmp, quality); 673 ScaleSlowRecursive(input, &tmp, quality);
677 ScaleSlowRecursive(&tmp, output, quality); 674 ScaleSlowRecursive(&tmp, output, quality);
678 } 675 }
679 676
680 // Creates an RGBA SkBitmap 677 // Creates an RGBA SkBitmap
681 scoped_ptr<SkBitmap> CreateTestBitmap(int width, 678 scoped_ptr<SkBitmap> CreateTestBitmap(int width,
682 int height, 679 int height,
683 int test_pattern) { 680 int test_pattern) {
684 scoped_ptr<SkBitmap> bitmap(new SkBitmap); 681 scoped_ptr<SkBitmap> bitmap(new SkBitmap);
685 bitmap->allocPixels(SkImageInfo::Make( 682 bitmap->allocPixels(SkImageInfo::Make(width, height, kRGBA_8888_SkColorType,
686 width, height, kRGBA_8888_SkColorType, kPremul_SkAlphaType)); 683 kPremul_SkAlphaType));
687 684
688 for (int x = 0; x < width; ++x) { 685 for (int x = 0; x < width; ++x) {
689 for (int y = 0; y < height; ++y) { 686 for (int y = 0; y < height; ++y) {
690 switch (test_pattern) { 687 switch (test_pattern) {
691 case 0: // Smooth test pattern 688 case 0: // Smooth test pattern
692 SetChannel(bitmap.get(), x, y, 0, x * 10); 689 SetChannel(bitmap.get(), x, y, 0, x * 10);
693 SetChannel(bitmap.get(), x, y, 0, y == 0 ? x * 50 : x * 10); 690 SetChannel(bitmap.get(), x, y, 0, y == 0 ? x * 50 : x * 10);
694 SetChannel(bitmap.get(), x, y, 1, y * 10); 691 SetChannel(bitmap.get(), x, y, 1, y * 10);
695 SetChannel(bitmap.get(), x, y, 2, (x + y) * 10); 692 SetChannel(bitmap.get(), x, y, 2, (x + y) * 10);
696 SetChannel(bitmap.get(), x, y, 3, 255); 693 SetChannel(bitmap.get(), x, y, 3, 255);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 size_t quality_index) { 735 size_t quality_index) {
739 DCHECK(out_color_type == kAlpha_8_SkColorType || 736 DCHECK(out_color_type == kAlpha_8_SkColorType ||
740 out_color_type == kRGBA_8888_SkColorType || 737 out_color_type == kRGBA_8888_SkColorType ||
741 out_color_type == kBGRA_8888_SkColorType); 738 out_color_type == kBGRA_8888_SkColorType);
742 GLuint src_texture; 739 GLuint src_texture;
743 gl_->GenTextures(1, &src_texture); 740 gl_->GenTextures(1, &src_texture);
744 GLuint framebuffer; 741 GLuint framebuffer;
745 gl_->GenFramebuffers(1, &framebuffer); 742 gl_->GenFramebuffers(1, &framebuffer);
746 scoped_ptr<SkBitmap> input_pixels = 743 scoped_ptr<SkBitmap> input_pixels =
747 CreateTestBitmap(xsize, ysize, test_pattern); 744 CreateTestBitmap(xsize, ysize, test_pattern);
748 BindTextureAndFrameBuffer( 745 BindTextureAndFrameBuffer(src_texture, framebuffer, input_pixels.get(),
749 src_texture, framebuffer, input_pixels.get(), xsize, ysize); 746 xsize, ysize);
750 747
751 std::string message = base::StringPrintf( 748 std::string message = base::StringPrintf(
752 "input size: %dx%d " 749 "input size: %dx%d "
753 "output size: %dx%d " 750 "output size: %dx%d "
754 "pattern: %d , quality: %s, " 751 "pattern: %d , quality: %s, "
755 "out_color_type: %d", 752 "out_color_type: %d",
756 xsize, 753 xsize, ysize, scaled_xsize, scaled_ysize, test_pattern,
757 ysize, 754 kQualityNames[quality_index], out_color_type);
758 scaled_xsize,
759 scaled_ysize,
760 test_pattern,
761 kQualityNames[quality_index],
762 out_color_type);
763 755
764 // Transform the bitmap using GLHelper::CropScaleReadbackAndCleanTexture. 756 // Transform the bitmap using GLHelper::CropScaleReadbackAndCleanTexture.
765 SkBitmap output_pixels; 757 SkBitmap output_pixels;
766 output_pixels.allocPixels(SkImageInfo::Make( 758 output_pixels.allocPixels(SkImageInfo::Make(
767 scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType)); 759 scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType));
768 base::RunLoop run_loop; 760 base::RunLoop run_loop;
769 gfx::Size encoded_texture_size; 761 gfx::Size encoded_texture_size;
770 helper_->CropScaleReadbackAndCleanTexture( 762 helper_->CropScaleReadbackAndCleanTexture(
771 src_texture, 763 src_texture, gfx::Size(xsize, ysize), gfx::Rect(xsize, ysize),
772 gfx::Size(xsize, ysize),
773 gfx::Rect(xsize, ysize),
774 gfx::Size(scaled_xsize, scaled_ysize), 764 gfx::Size(scaled_xsize, scaled_ysize),
775 static_cast<unsigned char*>(output_pixels.getPixels()), 765 static_cast<unsigned char*>(output_pixels.getPixels()), out_color_type,
776 out_color_type,
777 base::Bind(&callcallback, run_loop.QuitClosure()), 766 base::Bind(&callcallback, run_loop.QuitClosure()),
778 kQualities[quality_index]); 767 kQualities[quality_index]);
779 run_loop.Run(); 768 run_loop.Run();
780 // CropScaleReadbackAndCleanTexture flips the pixels. Flip them back. 769 // CropScaleReadbackAndCleanTexture flips the pixels. Flip them back.
781 FlipSKBitmap(&output_pixels); 770 FlipSKBitmap(&output_pixels);
782 771
783 // If the bitmap shouldn't have changed - compare against input. 772 // If the bitmap shouldn't have changed - compare against input.
784 if (xsize == scaled_xsize && ysize == scaled_ysize && 773 if (xsize == scaled_xsize && ysize == scaled_ysize &&
785 out_color_type != kAlpha_8_SkColorType) { 774 out_color_type != kAlpha_8_SkColorType) {
786 const std::vector<GLHelperScaling::ScalerStage> dummy_stages; 775 const std::vector<GLHelperScaling::ScalerStage> dummy_stages;
787 Compare(input_pixels.get(), 776 Compare(input_pixels.get(), &output_pixels, 0, NULL, dummy_stages,
788 &output_pixels,
789 0,
790 NULL,
791 dummy_stages,
792 message + " comparing against input"); 777 message + " comparing against input");
793 return; 778 return;
794 } 779 }
795 780
796 // Now transform the bitmap using the reference implementation. 781 // Now transform the bitmap using the reference implementation.
797 SkBitmap scaled_pixels; 782 SkBitmap scaled_pixels;
798 scaled_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, 783 scaled_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, scaled_ysize,
799 scaled_ysize,
800 kRGBA_8888_SkColorType, 784 kRGBA_8888_SkColorType,
801 kPremul_SkAlphaType)); 785 kPremul_SkAlphaType));
802 SkBitmap truth_pixels; 786 SkBitmap truth_pixels;
803 // Step 1: Scale 787 // Step 1: Scale
804 ScaleSlowRecursive( 788 ScaleSlowRecursive(input_pixels.get(), &scaled_pixels,
805 input_pixels.get(), &scaled_pixels, kQualities[quality_index]); 789 kQualities[quality_index]);
806 // Step 2: Encode to grayscale if needed. 790 // Step 2: Encode to grayscale if needed.
807 if (out_color_type == kAlpha_8_SkColorType) { 791 if (out_color_type == kAlpha_8_SkColorType) {
808 truth_pixels.allocPixels(SkImageInfo::Make( 792 truth_pixels.allocPixels(SkImageInfo::Make(
809 scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType)); 793 scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType));
810 EncodeToGrayscaleSlow(&scaled_pixels, &truth_pixels); 794 EncodeToGrayscaleSlow(&scaled_pixels, &truth_pixels);
811 } else { 795 } else {
812 truth_pixels = scaled_pixels; 796 truth_pixels = scaled_pixels;
813 } 797 }
814 798
815 // Now compare the results. 799 // Now compare the results.
816 SkAutoLockPixels lock_input(truth_pixels); 800 SkAutoLockPixels lock_input(truth_pixels);
817 const std::vector<GLHelperScaling::ScalerStage> dummy_stages; 801 const std::vector<GLHelperScaling::ScalerStage> dummy_stages;
818 Compare(&truth_pixels, 802 Compare(&truth_pixels, &output_pixels, 2, input_pixels.get(), dummy_stages,
819 &output_pixels,
820 2,
821 input_pixels.get(),
822 dummy_stages,
823 message + " comparing against transformed/scaled"); 803 message + " comparing against transformed/scaled");
824 804
825 gl_->DeleteTextures(1, &src_texture); 805 gl_->DeleteTextures(1, &src_texture);
826 gl_->DeleteFramebuffers(1, &framebuffer); 806 gl_->DeleteFramebuffers(1, &framebuffer);
827 } 807 }
828 808
829 // Scaling test: Create a test image, scale it using GLHelperScaling 809 // Scaling test: Create a test image, scale it using GLHelperScaling
830 // and a reference implementation and compare the results. 810 // and a reference implementation and compare the results.
831 void TestScale(int xsize, 811 void TestScale(int xsize,
832 int ysize, 812 int ysize,
833 int scaled_xsize, 813 int scaled_xsize,
834 int scaled_ysize, 814 int scaled_ysize,
835 int test_pattern, 815 int test_pattern,
836 size_t quality_index, 816 size_t quality_index,
837 bool flip) { 817 bool flip) {
838 GLuint src_texture; 818 GLuint src_texture;
839 gl_->GenTextures(1, &src_texture); 819 gl_->GenTextures(1, &src_texture);
840 GLuint framebuffer; 820 GLuint framebuffer;
841 gl_->GenFramebuffers(1, &framebuffer); 821 gl_->GenFramebuffers(1, &framebuffer);
842 scoped_ptr<SkBitmap> input_pixels = 822 scoped_ptr<SkBitmap> input_pixels =
843 CreateTestBitmap(xsize, ysize, test_pattern); 823 CreateTestBitmap(xsize, ysize, test_pattern);
844 BindTextureAndFrameBuffer( 824 BindTextureAndFrameBuffer(src_texture, framebuffer, input_pixels.get(),
845 src_texture, framebuffer, input_pixels.get(), xsize, ysize); 825 xsize, ysize);
846 826
847 std::string message = base::StringPrintf( 827 std::string message = base::StringPrintf(
848 "input size: %dx%d " 828 "input size: %dx%d "
849 "output size: %dx%d " 829 "output size: %dx%d "
850 "pattern: %d quality: %s", 830 "pattern: %d quality: %s",
851 xsize, 831 xsize, ysize, scaled_xsize, scaled_ysize, test_pattern,
852 ysize,
853 scaled_xsize,
854 scaled_ysize,
855 test_pattern,
856 kQualityNames[quality_index]); 832 kQualityNames[quality_index]);
857 833
858 std::vector<GLHelperScaling::ScalerStage> stages; 834 std::vector<GLHelperScaling::ScalerStage> stages;
859 helper_scaling_->ComputeScalerStages(kQualities[quality_index], 835 helper_scaling_->ComputeScalerStages(kQualities[quality_index],
860 gfx::Size(xsize, ysize), 836 gfx::Size(xsize, ysize),
861 gfx::Rect(0, 0, xsize, ysize), 837 gfx::Rect(0, 0, xsize, ysize),
862 gfx::Size(scaled_xsize, scaled_ysize), 838 gfx::Size(scaled_xsize, scaled_ysize),
863 flip, 839 flip,
864 false, 840 false,
865 &stages); 841 &stages);
866 ValidateScalerStages(kQualities[quality_index], 842 ValidateScalerStages(kQualities[quality_index],
867 stages, 843 stages,
868 gfx::Size(scaled_xsize, scaled_ysize), 844 gfx::Size(scaled_xsize, scaled_ysize),
869 message); 845 message);
870 846
871 GLuint dst_texture = helper_->CopyAndScaleTexture( 847 GLuint dst_texture = helper_->CopyAndScaleTexture(
872 src_texture, gfx::Size(xsize, ysize), 848 src_texture, gfx::Size(xsize, ysize),
873 gfx::Size(scaled_xsize, scaled_ysize), flip, kQualities[quality_index]); 849 gfx::Size(scaled_xsize, scaled_ysize), flip, kQualities[quality_index]);
874 850
875 SkBitmap output_pixels; 851 SkBitmap output_pixels;
876 output_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, 852 output_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, scaled_ysize,
877 scaled_ysize,
878 kRGBA_8888_SkColorType, 853 kRGBA_8888_SkColorType,
879 kPremul_SkAlphaType)); 854 kPremul_SkAlphaType));
880 855
881 helper_->ReadbackTextureSync( 856 helper_->ReadbackTextureSync(
882 dst_texture, 857 dst_texture, gfx::Rect(0, 0, scaled_xsize, scaled_ysize),
883 gfx::Rect(0, 0, scaled_xsize, scaled_ysize),
884 static_cast<unsigned char*>(output_pixels.getPixels()), 858 static_cast<unsigned char*>(output_pixels.getPixels()),
885 kRGBA_8888_SkColorType); 859 kRGBA_8888_SkColorType);
886 if (flip) { 860 if (flip) {
887 // Flip the pixels back. 861 // Flip the pixels back.
888 FlipSKBitmap(&output_pixels); 862 FlipSKBitmap(&output_pixels);
889 } 863 }
890 864
891 // If the bitmap shouldn't have changed - compare against input. 865 // If the bitmap shouldn't have changed - compare against input.
892 if (xsize == scaled_xsize && ysize == scaled_ysize) { 866 if (xsize == scaled_xsize && ysize == scaled_ysize) {
893 Compare(input_pixels.get(), 867 Compare(input_pixels.get(), &output_pixels, 0, NULL, stages,
894 &output_pixels,
895 0,
896 NULL,
897 stages,
898 message + " comparing against input"); 868 message + " comparing against input");
899 return; 869 return;
900 } 870 }
901 871
902 // Now scale the bitmap using the reference implementation. 872 // Now scale the bitmap using the reference implementation.
903 SkBitmap truth_pixels; 873 SkBitmap truth_pixels;
904 truth_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, 874 truth_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, scaled_ysize,
905 scaled_ysize,
906 kRGBA_8888_SkColorType, 875 kRGBA_8888_SkColorType,
907 kPremul_SkAlphaType)); 876 kPremul_SkAlphaType));
908 ScaleSlowRecursive( 877 ScaleSlowRecursive(input_pixels.get(), &truth_pixels,
909 input_pixels.get(), &truth_pixels, kQualities[quality_index]); 878 kQualities[quality_index]);
910 Compare(&truth_pixels, 879 Compare(&truth_pixels, &output_pixels, 2, input_pixels.get(), stages,
911 &output_pixels,
912 2,
913 input_pixels.get(),
914 stages,
915 message + " comparing against scaled"); 880 message + " comparing against scaled");
916 881
917 gl_->DeleteTextures(1, &src_texture); 882 gl_->DeleteTextures(1, &src_texture);
918 gl_->DeleteTextures(1, &dst_texture); 883 gl_->DeleteTextures(1, &dst_texture);
919 gl_->DeleteFramebuffers(1, &framebuffer); 884 gl_->DeleteFramebuffers(1, &framebuffer);
920 } 885 }
921 886
922 // Create a scaling pipeline and check that it is made up of 887 // Create a scaling pipeline and check that it is made up of
923 // valid scaling operations. 888 // valid scaling operations.
924 void TestScalerPipeline(size_t quality, 889 void TestScalerPipeline(size_t quality,
925 int xsize, 890 int xsize,
926 int ysize, 891 int ysize,
927 int dst_xsize, 892 int dst_xsize,
928 int dst_ysize) { 893 int dst_ysize) {
929 std::vector<GLHelperScaling::ScalerStage> stages; 894 std::vector<GLHelperScaling::ScalerStage> stages;
930 helper_scaling_->ComputeScalerStages(kQualities[quality], 895 helper_scaling_->ComputeScalerStages(
931 gfx::Size(xsize, ysize), 896 kQualities[quality], gfx::Size(xsize, ysize),
932 gfx::Rect(0, 0, xsize, ysize), 897 gfx::Rect(0, 0, xsize, ysize), gfx::Size(dst_xsize, dst_ysize), false,
933 gfx::Size(dst_xsize, dst_ysize), 898 false, &stages);
934 false, 899 ValidateScalerStages(kQualities[quality], stages,
935 false,
936 &stages);
937 ValidateScalerStages(kQualities[quality],
938 stages,
939 gfx::Size(dst_xsize, dst_ysize), 900 gfx::Size(dst_xsize, dst_ysize),
940 base::StringPrintf( 901 base::StringPrintf("input size: %dx%d "
941 "input size: %dx%d " 902 "output size: %dx%d "
942 "output size: %dx%d " 903 "quality: %s",
943 "quality: %s", 904 xsize, ysize, dst_xsize, dst_ysize,
944 xsize, 905 kQualityNames[quality]));
945 ysize,
946 dst_xsize,
947 dst_ysize,
948 kQualityNames[quality]));
949 } 906 }
950 907
951 // Create a scaling pipeline and make sure that the steps 908 // Create a scaling pipeline and make sure that the steps
952 // are exactly the steps we expect. 909 // are exactly the steps we expect.
953 void CheckPipeline(content::GLHelper::ScalerQuality quality, 910 void CheckPipeline(content::GLHelper::ScalerQuality quality,
954 int xsize, 911 int xsize,
955 int ysize, 912 int ysize,
956 int dst_xsize, 913 int dst_xsize,
957 int dst_ysize, 914 int dst_ysize,
958 const std::string& description) { 915 const std::string& description) {
959 std::vector<GLHelperScaling::ScalerStage> stages; 916 std::vector<GLHelperScaling::ScalerStage> stages;
960 helper_scaling_->ComputeScalerStages(quality, 917 helper_scaling_->ComputeScalerStages(
961 gfx::Size(xsize, ysize), 918 quality, gfx::Size(xsize, ysize), gfx::Rect(0, 0, xsize, ysize),
962 gfx::Rect(0, 0, xsize, ysize), 919 gfx::Size(dst_xsize, dst_ysize), false, false, &stages);
963 gfx::Size(dst_xsize, dst_ysize), 920 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, stages,
964 false, 921 gfx::Size(dst_xsize, dst_ysize), "");
965 false,
966 &stages);
967 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD,
968 stages,
969 gfx::Size(dst_xsize, dst_ysize),
970 "");
971 EXPECT_EQ(PrintStages(stages), description); 922 EXPECT_EQ(PrintStages(stages), description);
972 } 923 }
973 924
974 // Note: Left/Right means Top/Bottom when used for Y dimension. 925 // Note: Left/Right means Top/Bottom when used for Y dimension.
975 enum Margin { 926 enum Margin {
976 MarginLeft, 927 MarginLeft,
977 MarginMiddle, 928 MarginMiddle,
978 MarginRight, 929 MarginRight,
979 MarginInvalid, 930 MarginInvalid,
980 }; 931 };
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1063 PrintChannel(source, 1); 1014 PrintChannel(source, 1);
1064 LOG(ERROR) << "-------before yuv conversion: blue-------"; 1015 LOG(ERROR) << "-------before yuv conversion: blue-------";
1065 PrintChannel(source, 2); 1016 PrintChannel(source, 2);
1066 } 1017 }
1067 return; 1018 return;
1068 } 1019 }
1069 } 1020 }
1070 } 1021 }
1071 } 1022 }
1072 1023
1073 void DrawGridToBitmap(int w, int h, 1024 void DrawGridToBitmap(int w,
1025 int h,
1074 SkColor background_color, 1026 SkColor background_color,
1075 SkColor grid_color, 1027 SkColor grid_color,
1076 int grid_pitch, 1028 int grid_pitch,
1077 int grid_width, 1029 int grid_width,
1078 SkBitmap& bmp) { 1030 SkBitmap& bmp) {
1079 ASSERT_GT(grid_pitch, 0); 1031 ASSERT_GT(grid_pitch, 0);
1080 ASSERT_GT(grid_width, 0); 1032 ASSERT_GT(grid_width, 0);
1081 ASSERT_NE(background_color, grid_color); 1033 ASSERT_NE(background_color, grid_color);
1082 1034
1083 for (int y = 0; y < h; ++y) { 1035 for (int y = 0; y < h; ++y) {
1084 bool y_on_grid = ((y % grid_pitch) < grid_width); 1036 bool y_on_grid = ((y % grid_pitch) < grid_width);
1085 1037
1086 for (int x = 0; x < w; ++x) { 1038 for (int x = 0; x < w; ++x) {
1087 bool on_grid = (y_on_grid || ((x % grid_pitch) < grid_width)); 1039 bool on_grid = (y_on_grid || ((x % grid_pitch) < grid_width));
1088 1040
1089 if (bmp.colorType() == kRGBA_8888_SkColorType || 1041 if (bmp.colorType() == kRGBA_8888_SkColorType ||
1090 bmp.colorType() == kBGRA_8888_SkColorType) { 1042 bmp.colorType() == kBGRA_8888_SkColorType) {
1091 *bmp.getAddr32(x, y) = (on_grid ? grid_color : background_color); 1043 *bmp.getAddr32(x, y) = (on_grid ? grid_color : background_color);
1092 } else if (bmp.colorType() == kRGB_565_SkColorType) { 1044 } else if (bmp.colorType() == kRGB_565_SkColorType) {
1093 *bmp.getAddr16(x, y) = (on_grid ? grid_color : background_color); 1045 *bmp.getAddr16(x, y) = (on_grid ? grid_color : background_color);
1094 } 1046 }
1095 } 1047 }
1096 } 1048 }
1097 } 1049 }
1098 1050
1099 void DrawCheckerToBitmap(int w, int h, 1051 void DrawCheckerToBitmap(int w,
1100 SkColor color1, SkColor color2, 1052 int h,
1101 int rect_w, int rect_h, 1053 SkColor color1,
1054 SkColor color2,
1055 int rect_w,
1056 int rect_h,
1102 SkBitmap& bmp) { 1057 SkBitmap& bmp) {
1103 ASSERT_GT(rect_w, 0); 1058 ASSERT_GT(rect_w, 0);
1104 ASSERT_GT(rect_h, 0); 1059 ASSERT_GT(rect_h, 0);
1105 ASSERT_NE(color1, color2); 1060 ASSERT_NE(color1, color2);
1106 1061
1107 for (int y = 0; y < h; ++y) { 1062 for (int y = 0; y < h; ++y) {
1108 bool y_bit = (((y / rect_h) & 0x1) == 0); 1063 bool y_bit = (((y / rect_h) & 0x1) == 0);
1109 1064
1110 for (int x = 0; x < w; ++x) { 1065 for (int x = 0; x < w; ++x) {
1111 bool x_bit = (((x / rect_w) & 0x1) == 0); 1066 bool x_bit = (((x / rect_w) & 0x1) == 0);
(...skipping 23 matching lines...) Expand all
1135 case kRGB_565_SkColorType: 1090 case kRGB_565_SkColorType:
1136 result = (std::abs(c1 - c2) <= 7); 1091 result = (std::abs(c1 - c2) <= 7);
1137 break; 1092 break;
1138 default: 1093 default:
1139 break; 1094 break;
1140 } 1095 }
1141 return result; 1096 return result;
1142 } 1097 }
1143 1098
1144 bool ColorsClose(SkColor color1, SkColor color2, SkColorType color_type) { 1099 bool ColorsClose(SkColor color1, SkColor color2, SkColorType color_type) {
1145 bool red = ColorComponentsClose(SkColorGetR(color1), 1100 bool red = ColorComponentsClose(SkColorGetR(color1), SkColorGetR(color2),
1146 SkColorGetR(color2), color_type); 1101 color_type);
1147 bool green = ColorComponentsClose(SkColorGetG(color1), 1102 bool green = ColorComponentsClose(SkColorGetG(color1), SkColorGetG(color2),
1148 SkColorGetG(color2), color_type); 1103 color_type);
1149 bool blue = ColorComponentsClose(SkColorGetB(color1), 1104 bool blue = ColorComponentsClose(SkColorGetB(color1), SkColorGetB(color2),
1150 SkColorGetB(color2), color_type); 1105 color_type);
1151 bool alpha = ColorComponentsClose(SkColorGetA(color1), 1106 bool alpha = ColorComponentsClose(SkColorGetA(color1), SkColorGetA(color2),
1152 SkColorGetA(color2), color_type); 1107 color_type);
1153 if (color_type == kRGB_565_SkColorType) { 1108 if (color_type == kRGB_565_SkColorType) {
1154 return red && blue && green; 1109 return red && blue && green;
1155 } 1110 }
1156 return red && blue && green && alpha; 1111 return red && blue && green && alpha;
1157 } 1112 }
1158 1113
1159 bool IsEqual(const SkBitmap& bmp1, const SkBitmap& bmp2) { 1114 bool IsEqual(const SkBitmap& bmp1, const SkBitmap& bmp2) {
1160 if (bmp1.isNull() && bmp2.isNull()) 1115 if (bmp1.isNull() && bmp2.isNull())
1161 return true; 1116 return true;
1162 if (bmp1.width() != bmp2.width() || 1117 if (bmp1.width() != bmp2.width() || bmp1.height() != bmp2.height()) {
1163 bmp1.height() != bmp2.height()) { 1118 LOG(ERROR) << "Bitmap geometry check failure";
1164 LOG(ERROR) << "Bitmap geometry check failure"; 1119 return false;
1165 return false;
1166 } 1120 }
1167 if (bmp1.colorType() != bmp2.colorType()) 1121 if (bmp1.colorType() != bmp2.colorType())
1168 return false; 1122 return false;
1169 1123
1170 SkAutoLockPixels lock1(bmp1); 1124 SkAutoLockPixels lock1(bmp1);
1171 SkAutoLockPixels lock2(bmp2); 1125 SkAutoLockPixels lock2(bmp2);
1172 if (!bmp1.getPixels() || !bmp2.getPixels()) { 1126 if (!bmp1.getPixels() || !bmp2.getPixels()) {
1173 LOG(ERROR) << "Empty Bitmap!"; 1127 LOG(ERROR) << "Empty Bitmap!";
1174 return false; 1128 return false;
1175 } 1129 }
1176 for (int y = 0; y < bmp1.height(); ++y) { 1130 for (int y = 0; y < bmp1.height(); ++y) {
1177 for (int x = 0; x < bmp1.width(); ++x) { 1131 for (int x = 0; x < bmp1.width(); ++x) {
1178 if (!ColorsClose(bmp1.getColor(x,y), 1132 if (!ColorsClose(bmp1.getColor(x, y), bmp2.getColor(x, y),
1179 bmp2.getColor(x,y),
1180 bmp1.colorType())) { 1133 bmp1.colorType())) {
1181 LOG(ERROR) << "Bitmap color comparision failure"; 1134 LOG(ERROR) << "Bitmap color comparision failure";
1182 return false; 1135 return false;
1183 } 1136 }
1184 } 1137 }
1185 } 1138 }
1186 return true; 1139 return true;
1187 } 1140 }
1188 1141
1189 void BindAndAttachTextureWithPixels(GLuint src_texture, 1142 void BindAndAttachTextureWithPixels(GLuint src_texture,
(...skipping 22 matching lines...) Expand all
1212 input_pixels.getPixels()); 1165 input_pixels.getPixels());
1213 } 1166 }
1214 1167
1215 void ReadBackTexture(GLuint src_texture, 1168 void ReadBackTexture(GLuint src_texture,
1216 const gfx::Size& src_size, 1169 const gfx::Size& src_size,
1217 unsigned char* pixels, 1170 unsigned char* pixels,
1218 SkColorType color_type, 1171 SkColorType color_type,
1219 bool async) { 1172 bool async) {
1220 if (async) { 1173 if (async) {
1221 base::RunLoop run_loop; 1174 base::RunLoop run_loop;
1222 helper_->ReadbackTextureAsync(src_texture, 1175 helper_->ReadbackTextureAsync(
1223 src_size, 1176 src_texture, src_size, pixels, color_type,
1224 pixels, 1177 base::Bind(&callcallback, run_loop.QuitClosure()));
1225 color_type,
1226 base::Bind(&callcallback,
1227 run_loop.QuitClosure()));
1228 run_loop.Run(); 1178 run_loop.Run();
1229 } else { 1179 } else {
1230 helper_->ReadbackTextureSync(src_texture, 1180 helper_->ReadbackTextureSync(src_texture, gfx::Rect(src_size), pixels,
1231 gfx::Rect(src_size),
1232 pixels,
1233 color_type); 1181 color_type);
1234 } 1182 }
1235 } 1183 }
1236 // Test basic format readback. 1184 // Test basic format readback.
1237 bool TestTextureFormatReadback(const gfx::Size& src_size, 1185 bool TestTextureFormatReadback(const gfx::Size& src_size,
1238 SkColorType color_type, 1186 SkColorType color_type,
1239 bool async) { 1187 bool async) {
1240 SkImageInfo info = 1188 SkImageInfo info = SkImageInfo::Make(src_size.width(), src_size.height(),
1241 SkImageInfo::Make(src_size.width(), 1189 color_type, kPremul_SkAlphaType);
1242 src_size.height(),
1243 color_type,
1244 kPremul_SkAlphaType);
1245 if (!helper_->IsReadbackConfigSupported(color_type)) { 1190 if (!helper_->IsReadbackConfigSupported(color_type)) {
1246 LOG(INFO) << "Skipping test format not supported" << color_type; 1191 LOG(INFO) << "Skipping test format not supported" << color_type;
1247 return true; 1192 return true;
1248 } 1193 }
1249 GLuint src_texture; 1194 GLuint src_texture;
1250 gl_->GenTextures(1, &src_texture); 1195 gl_->GenTextures(1, &src_texture);
1251 SkBitmap input_pixels; 1196 SkBitmap input_pixels;
1252 input_pixels.allocPixels(info); 1197 input_pixels.allocPixels(info);
1253 // Test Pattern-1, Fill with Plain color pattern. 1198 // Test Pattern-1, Fill with Plain color pattern.
1254 // Erase the input bitmap with red color. 1199 // Erase the input bitmap with red color.
1255 input_pixels.eraseColor(SK_ColorRED); 1200 input_pixels.eraseColor(SK_ColorRED);
1256 BindAndAttachTextureWithPixels(src_texture, 1201 BindAndAttachTextureWithPixels(src_texture, color_type, src_size,
1257 color_type,
1258 src_size,
1259 input_pixels); 1202 input_pixels);
1260 SkBitmap output_pixels; 1203 SkBitmap output_pixels;
1261 output_pixels.allocPixels(info); 1204 output_pixels.allocPixels(info);
1262 // Initialize the output bitmap with Green color. 1205 // Initialize the output bitmap with Green color.
1263 // When the readback is over output bitmap should have the red color. 1206 // When the readback is over output bitmap should have the red color.
1264 output_pixels.eraseColor(SK_ColorGREEN); 1207 output_pixels.eraseColor(SK_ColorGREEN);
1265 uint8_t* pixels = static_cast<uint8_t*>(output_pixels.getPixels()); 1208 uint8_t* pixels = static_cast<uint8_t*>(output_pixels.getPixels());
1266 ReadBackTexture(src_texture, src_size, pixels, color_type, async); 1209 ReadBackTexture(src_texture, src_size, pixels, color_type, async);
1267 bool result = IsEqual(input_pixels, output_pixels); 1210 bool result = IsEqual(input_pixels, output_pixels);
1268 if (!result) { 1211 if (!result) {
1269 LOG(ERROR) << "Bitmap comparision failure Pattern-1"; 1212 LOG(ERROR) << "Bitmap comparision failure Pattern-1";
1270 return false; 1213 return false;
1271 } 1214 }
1272 const int rect_w = 10, rect_h = 4, src_grid_pitch = 10, src_grid_width = 4; 1215 const int rect_w = 10, rect_h = 4, src_grid_pitch = 10, src_grid_width = 4;
1273 const SkColor color1 = SK_ColorRED, color2 = SK_ColorBLUE; 1216 const SkColor color1 = SK_ColorRED, color2 = SK_ColorBLUE;
1274 // Test Pattern-2, Fill with Grid Pattern. 1217 // Test Pattern-2, Fill with Grid Pattern.
1275 DrawGridToBitmap(src_size.width(), src_size.height(), 1218 DrawGridToBitmap(src_size.width(), src_size.height(), color2, color1,
1276 color2, color1, 1219 src_grid_pitch, src_grid_width, input_pixels);
1277 src_grid_pitch, src_grid_width, 1220 BindAndAttachTextureWithPixels(src_texture, color_type, src_size,
1278 input_pixels);
1279 BindAndAttachTextureWithPixels(src_texture,
1280 color_type,
1281 src_size,
1282 input_pixels); 1221 input_pixels);
1283 ReadBackTexture(src_texture, src_size, pixels, color_type, async); 1222 ReadBackTexture(src_texture, src_size, pixels, color_type, async);
1284 result = IsEqual(input_pixels, output_pixels); 1223 result = IsEqual(input_pixels, output_pixels);
1285 if (!result) { 1224 if (!result) {
1286 LOG(ERROR) << "Bitmap comparision failure Pattern-2"; 1225 LOG(ERROR) << "Bitmap comparision failure Pattern-2";
1287 return false; 1226 return false;
1288 } 1227 }
1289 // Test Pattern-3, Fill with CheckerBoard Pattern. 1228 // Test Pattern-3, Fill with CheckerBoard Pattern.
1290 DrawCheckerToBitmap(src_size.width(), 1229 DrawCheckerToBitmap(src_size.width(), src_size.height(), color1, color2,
1291 src_size.height(), 1230 rect_w, rect_h, input_pixels);
1292 color1, 1231 BindAndAttachTextureWithPixels(src_texture, color_type, src_size,
1293 color2, rect_w, rect_h, input_pixels);
1294 BindAndAttachTextureWithPixels(src_texture,
1295 color_type,
1296 src_size,
1297 input_pixels); 1232 input_pixels);
1298 ReadBackTexture(src_texture, src_size, pixels, color_type, async); 1233 ReadBackTexture(src_texture, src_size, pixels, color_type, async);
1299 result = IsEqual(input_pixels, output_pixels); 1234 result = IsEqual(input_pixels, output_pixels);
1300 if (!result) { 1235 if (!result) {
1301 LOG(ERROR) << "Bitmap comparision failure Pattern-3"; 1236 LOG(ERROR) << "Bitmap comparision failure Pattern-3";
1302 return false; 1237 return false;
1303 } 1238 }
1304 gl_->DeleteTextures(1, &src_texture); 1239 gl_->DeleteTextures(1, &src_texture);
1305 if (HasFailure()) { 1240 if (HasFailure()) {
1306 return false; 1241 return false;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 gl_->ShallowFlushCHROMIUM(); 1298 gl_->ShallowFlushCHROMIUM();
1364 1299
1365 gpu::SyncToken sync_token; 1300 gpu::SyncToken sync_token;
1366 gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); 1301 gl_->GenSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
1367 1302
1368 std::string message = base::StringPrintf( 1303 std::string message = base::StringPrintf(
1369 "input size: %dx%d " 1304 "input size: %dx%d "
1370 "output size: %dx%d " 1305 "output size: %dx%d "
1371 "margin: %dx%d " 1306 "margin: %dx%d "
1372 "pattern: %d %s %s", 1307 "pattern: %d %s %s",
1373 xsize, 1308 xsize, ysize, output_xsize, output_ysize, xmargin, ymargin,
1374 ysize, 1309 test_pattern, flip ? "flip" : "noflip", flip ? "mrt" : "nomrt");
1375 output_xsize,
1376 output_ysize,
1377 xmargin,
1378 ymargin,
1379 test_pattern,
1380 flip ? "flip" : "noflip",
1381 flip ? "mrt" : "nomrt");
1382 scoped_ptr<ReadbackYUVInterface> yuv_reader( 1310 scoped_ptr<ReadbackYUVInterface> yuv_reader(
1383 helper_->CreateReadbackPipelineYUV( 1311 helper_->CreateReadbackPipelineYUV(
1384 quality, 1312 quality, gfx::Size(xsize, ysize), gfx::Rect(0, 0, xsize, ysize),
1385 gfx::Size(xsize, ysize), 1313 gfx::Size(xsize, ysize), flip, use_mrt));
1386 gfx::Rect(0, 0, xsize, ysize),
1387 gfx::Size(xsize, ysize),
1388 flip,
1389 use_mrt));
1390 1314
1391 scoped_refptr<media::VideoFrame> output_frame = 1315 scoped_refptr<media::VideoFrame> output_frame =
1392 media::VideoFrame::CreateFrame( 1316 media::VideoFrame::CreateFrame(
1393 media::PIXEL_FORMAT_YV12, 1317 media::PIXEL_FORMAT_YV12,
1394 // The coded size of the output frame is rounded up to the next 1318 // The coded size of the output frame is rounded up to the next
1395 // 16-byte boundary. This tests that the readback is being 1319 // 16-byte boundary. This tests that the readback is being
1396 // positioned inside the frame's visible region, and not dependent 1320 // positioned inside the frame's visible region, and not dependent
1397 // on its coded size. 1321 // on its coded size.
1398 gfx::Size((output_xsize + 15) & ~15, (output_ysize + 15) & ~15), 1322 gfx::Size((output_xsize + 15) & ~15, (output_ysize + 15) & ~15),
1399 gfx::Rect(0, 0, output_xsize, output_ysize), 1323 gfx::Rect(0, 0, output_xsize, output_ysize),
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 float_to_byte(Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 0) * 1378 float_to_byte(Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 0) *
1455 kRGBtoVColorWeights[0] + 1379 kRGBtoVColorWeights[0] +
1456 Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 1) * 1380 Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 1) *
1457 kRGBtoVColorWeights[1] + 1381 kRGBtoVColorWeights[1] +
1458 Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 2) * 1382 Bilinear(&input_pixels, x * 2 + 1.0, y * 2 + 1.0, 2) *
1459 kRGBtoVColorWeights[2] + 1383 kRGBtoVColorWeights[2] +
1460 kRGBtoVColorWeights[3]); 1384 kRGBtoVColorWeights[3]);
1461 } 1385 }
1462 } 1386 }
1463 1387
1464 ComparePlane(Y, 1388 ComparePlane(
1465 y_stride, 1389 Y, y_stride, output_frame->visible_data(media::VideoFrame::kYPlane),
1466 output_frame->visible_data(media::VideoFrame::kYPlane), 1390 output_frame->stride(media::VideoFrame::kYPlane), 2, output_xsize,
1467 output_frame->stride(media::VideoFrame::kYPlane), 1391 output_ysize, &input_pixels, message + " Y plane");
1468 2, 1392 ComparePlane(
1469 output_xsize, 1393 U, u_stride, output_frame->visible_data(media::VideoFrame::kUPlane),
1470 output_ysize, 1394 output_frame->stride(media::VideoFrame::kUPlane), 2, output_xsize / 2,
1471 &input_pixels, 1395 output_ysize / 2, &input_pixels, message + " U plane");
1472 message + " Y plane"); 1396 ComparePlane(
1473 ComparePlane(U, 1397 V, v_stride, output_frame->visible_data(media::VideoFrame::kVPlane),
1474 u_stride, 1398 output_frame->stride(media::VideoFrame::kVPlane), 2, output_xsize / 2,
1475 output_frame->visible_data(media::VideoFrame::kUPlane), 1399 output_ysize / 2, &input_pixels, message + " V plane");
1476 output_frame->stride(media::VideoFrame::kUPlane),
1477 2,
1478 output_xsize / 2,
1479 output_ysize / 2,
1480 &input_pixels,
1481 message + " U plane");
1482 ComparePlane(V,
1483 v_stride,
1484 output_frame->visible_data(media::VideoFrame::kVPlane),
1485 output_frame->stride(media::VideoFrame::kVPlane),
1486 2,
1487 output_xsize / 2,
1488 output_ysize / 2,
1489 &input_pixels,
1490 message + " V plane");
1491 1400
1492 gl_->DeleteTextures(1, &src_texture); 1401 gl_->DeleteTextures(1, &src_texture);
1493 } 1402 }
1494 1403
1495 void TestAddOps(int src, int dst, bool scale_x, bool allow3) { 1404 void TestAddOps(int src, int dst, bool scale_x, bool allow3) {
1496 std::deque<GLHelperScaling::ScaleOp> ops; 1405 std::deque<GLHelperScaling::ScaleOp> ops;
1497 GLHelperScaling::ScaleOp::AddOps(src, dst, scale_x, allow3, &ops); 1406 GLHelperScaling::ScaleOp::AddOps(src, dst, scale_x, allow3, &ops);
1498 // Scale factor 3 is a special case. 1407 // Scale factor 3 is a special case.
1499 // It is currently only allowed by itself. 1408 // It is currently only allowed by itself.
1500 if (allow3 && dst * 3 >= src && dst * 2 < src) { 1409 if (allow3 && dst * 3 >= src && dst * 2 < src) {
(...skipping 30 matching lines...) Expand all
1531 EXPECT_EQ(tmp, src); 1440 EXPECT_EQ(tmp, src);
1532 } 1441 }
1533 1442
1534 void CheckPipeline2(int xsize, 1443 void CheckPipeline2(int xsize,
1535 int ysize, 1444 int ysize,
1536 int dst_xsize, 1445 int dst_xsize,
1537 int dst_ysize, 1446 int dst_ysize,
1538 const std::string& description) { 1447 const std::string& description) {
1539 std::vector<GLHelperScaling::ScalerStage> stages; 1448 std::vector<GLHelperScaling::ScalerStage> stages;
1540 helper_scaling_->ConvertScalerOpsToScalerStages( 1449 helper_scaling_->ConvertScalerOpsToScalerStages(
1541 content::GLHelper::SCALER_QUALITY_GOOD, 1450 content::GLHelper::SCALER_QUALITY_GOOD, gfx::Size(xsize, ysize),
1542 gfx::Size(xsize, ysize), 1451 gfx::Rect(0, 0, xsize, ysize), gfx::Size(dst_xsize, dst_ysize), false,
1543 gfx::Rect(0, 0, xsize, ysize), 1452 false, &x_ops_, &y_ops_, &stages);
1544 gfx::Size(dst_xsize, dst_ysize),
1545 false,
1546 false,
1547 &x_ops_,
1548 &y_ops_,
1549 &stages);
1550 EXPECT_EQ(x_ops_.size(), 0U); 1453 EXPECT_EQ(x_ops_.size(), 0U);
1551 EXPECT_EQ(y_ops_.size(), 0U); 1454 EXPECT_EQ(y_ops_.size(), 0U);
1552 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, 1455 ValidateScalerStages(content::GLHelper::SCALER_QUALITY_GOOD, stages,
1553 stages, 1456 gfx::Size(dst_xsize, dst_ysize), "");
1554 gfx::Size(dst_xsize, dst_ysize),
1555 "");
1556 EXPECT_EQ(PrintStages(stages), description); 1457 EXPECT_EQ(PrintStages(stages), description);
1557 } 1458 }
1558 1459
1559 void CheckOptimizationsTest() { 1460 void CheckOptimizationsTest() {
1560 // Basic upscale. X and Y should be combined into one pass. 1461 // Basic upscale. X and Y should be combined into one pass.
1561 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000)); 1462 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 2000));
1562 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000)); 1463 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 2000));
1563 CheckPipeline2(1024, 768, 2000, 2000, "1024x768 -> 2000x2000 bilinear\n"); 1464 CheckPipeline2(1024, 768, 2000, 2000, "1024x768 -> 2000x2000 bilinear\n");
1564 1465
1565 // X scaled 1/2, Y upscaled, should still be one pass. 1466 // X scaled 1/2, Y upscaled, should still be one pass.
(...skipping 26 matching lines...) Expand all
1592 // X scaled to 60%, Y scaled 60%, one bilinear2x2 pass. 1493 // X scaled to 60%, Y scaled 60%, one bilinear2x2 pass.
1593 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); 1494 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120));
1594 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); 1495 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60));
1595 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); 1496 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120));
1596 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); 1497 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60));
1597 CheckPipeline2(100, 100, 60, 60, "100x100 -> 60x60 bilinear2x2\n"); 1498 CheckPipeline2(100, 100, 60, 60, "100x100 -> 60x60 bilinear2x2\n");
1598 1499
1599 // X scaled to 40%, Y scaled 40%, two bilinear3 passes. 1500 // X scaled to 40%, Y scaled 40%, two bilinear3 passes.
1600 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40)); 1501 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40));
1601 y_ops_.push_back(GLHelperScaling::ScaleOp(3, false, 40)); 1502 y_ops_.push_back(GLHelperScaling::ScaleOp(3, false, 40));
1602 CheckPipeline2(100, 1503 CheckPipeline2(100, 100, 40, 40,
1603 100,
1604 40,
1605 40,
1606 "100x100 -> 100x40 bilinear3 Y\n" 1504 "100x100 -> 100x40 bilinear3 Y\n"
1607 "100x40 -> 40x40 bilinear3 X\n"); 1505 "100x40 -> 40x40 bilinear3 X\n");
1608 1506
1609 // X scaled to 60%, Y scaled 40% 1507 // X scaled to 60%, Y scaled 40%
1610 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); 1508 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120));
1611 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); 1509 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60));
1612 y_ops_.push_back(GLHelperScaling::ScaleOp(3, false, 40)); 1510 y_ops_.push_back(GLHelperScaling::ScaleOp(3, false, 40));
1613 CheckPipeline2(100, 1511 CheckPipeline2(100, 100, 60, 40,
1614 100,
1615 60,
1616 40,
1617 "100x100 -> 100x40 bilinear3 Y\n" 1512 "100x100 -> 100x40 bilinear3 Y\n"
1618 "100x40 -> 60x40 bilinear2 X\n"); 1513 "100x40 -> 60x40 bilinear2 X\n");
1619 1514
1620 // X scaled to 40%, Y scaled 60% 1515 // X scaled to 40%, Y scaled 60%
1621 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40)); 1516 x_ops_.push_back(GLHelperScaling::ScaleOp(3, true, 40));
1622 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); 1517 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120));
1623 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); 1518 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60));
1624 CheckPipeline2(100, 1519 CheckPipeline2(100, 100, 40, 60,
1625 100,
1626 40,
1627 60,
1628 "100x100 -> 100x60 bilinear2 Y\n" 1520 "100x100 -> 100x60 bilinear2 Y\n"
1629 "100x60 -> 40x60 bilinear3 X\n"); 1521 "100x60 -> 40x60 bilinear3 X\n");
1630 1522
1631 // X scaled to 30%, Y scaled 30% 1523 // X scaled to 30%, Y scaled 30%
1632 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120)); 1524 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 120));
1633 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60)); 1525 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 60));
1634 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 30)); 1526 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 30));
1635 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); 1527 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120));
1636 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); 1528 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60));
1637 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30)); 1529 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30));
1638 CheckPipeline2(100, 1530 CheckPipeline2(100, 100, 30, 30,
1639 100,
1640 30,
1641 30,
1642 "100x100 -> 100x30 bilinear4 Y\n" 1531 "100x100 -> 100x30 bilinear4 Y\n"
1643 "100x30 -> 30x30 bilinear4 X\n"); 1532 "100x30 -> 30x30 bilinear4 X\n");
1644 1533
1645 // X scaled to 50%, Y scaled 30% 1534 // X scaled to 50%, Y scaled 30%
1646 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 50)); 1535 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 50));
1647 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); 1536 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120));
1648 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); 1537 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60));
1649 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30)); 1538 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30));
1650 CheckPipeline2(100, 100, 50, 30, "100x100 -> 50x30 bilinear4 Y\n"); 1539 CheckPipeline2(100, 100, 50, 30, "100x100 -> 50x30 bilinear4 Y\n");
1651 1540
1652 // X scaled to 150%, Y scaled 30% 1541 // X scaled to 150%, Y scaled 30%
1653 // Note that we avoid combinding X and Y passes 1542 // Note that we avoid combinding X and Y passes
1654 // as that would probably be LESS efficient here. 1543 // as that would probably be LESS efficient here.
1655 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 150)); 1544 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 150));
1656 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120)); 1545 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 120));
1657 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60)); 1546 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 60));
1658 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30)); 1547 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 30));
1659 CheckPipeline2(100, 1548 CheckPipeline2(100, 100, 150, 30,
1660 100,
1661 150,
1662 30,
1663 "100x100 -> 100x30 bilinear4 Y\n" 1549 "100x100 -> 100x30 bilinear4 Y\n"
1664 "100x30 -> 150x30 bilinear\n"); 1550 "100x30 -> 150x30 bilinear\n");
1665 1551
1666 // X scaled to 1%, Y scaled 1% 1552 // X scaled to 1%, Y scaled 1%
1667 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 128)); 1553 x_ops_.push_back(GLHelperScaling::ScaleOp(0, true, 128));
1668 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 64)); 1554 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 64));
1669 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 32)); 1555 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 32));
1670 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 16)); 1556 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 16));
1671 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 8)); 1557 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 8));
1672 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 4)); 1558 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 4));
1673 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 2)); 1559 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 2));
1674 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 1)); 1560 x_ops_.push_back(GLHelperScaling::ScaleOp(2, true, 1));
1675 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 128)); 1561 y_ops_.push_back(GLHelperScaling::ScaleOp(0, false, 128));
1676 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 64)); 1562 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 64));
1677 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 32)); 1563 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 32));
1678 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 16)); 1564 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 16));
1679 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 8)); 1565 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 8));
1680 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 4)); 1566 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 4));
1681 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 2)); 1567 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 2));
1682 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 1)); 1568 y_ops_.push_back(GLHelperScaling::ScaleOp(2, false, 1));
1683 CheckPipeline2(100, 1569 CheckPipeline2(100, 100, 1, 1,
1684 100,
1685 1,
1686 1,
1687 "100x100 -> 100x32 bilinear4 Y\n" 1570 "100x100 -> 100x32 bilinear4 Y\n"
1688 "100x32 -> 100x4 bilinear4 Y\n" 1571 "100x32 -> 100x4 bilinear4 Y\n"
1689 "100x4 -> 64x1 bilinear2x2\n" 1572 "100x4 -> 64x1 bilinear2x2\n"
1690 "64x1 -> 8x1 bilinear4 X\n" 1573 "64x1 -> 8x1 bilinear4 X\n"
1691 "8x1 -> 1x1 bilinear4 X\n"); 1574 "8x1 -> 1x1 bilinear4 X\n");
1692 } 1575 }
1693 1576
1694 scoped_ptr<gpu::GLInProcessContext> context_; 1577 scoped_ptr<gpu::GLInProcessContext> context_;
1695 gpu::gles2::GLES2Interface* gl_; 1578 gpu::gles2::GLES2Interface* gl_;
1696 scoped_ptr<content::GLHelper> helper_; 1579 scoped_ptr<content::GLHelper> helper_;
1697 scoped_ptr<content::GLHelperScaling> helper_scaling_; 1580 scoped_ptr<content::GLHelperScaling> helper_scaling_;
1698 std::deque<GLHelperScaling::ScaleOp> x_ops_, y_ops_; 1581 std::deque<GLHelperScaling::ScaleOp> x_ops_, y_ops_;
1699 }; 1582 };
1700 1583
1701 class GLHelperPixelTest : public GLHelperTest { 1584 class GLHelperPixelTest : public GLHelperTest {
1702 private: 1585 private:
1703 gfx::DisableNullDrawGLBindings enable_pixel_output_; 1586 gfx::DisableNullDrawGLBindings enable_pixel_output_;
1704 }; 1587 };
1705 1588
1706 TEST_F(GLHelperTest, RGBASyncReadbackTest) { 1589 TEST_F(GLHelperTest, RGBASyncReadbackTest) {
1707 const int kTestSize = 64; 1590 const int kTestSize = 64;
1708 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1591 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1709 kRGBA_8888_SkColorType, 1592 kRGBA_8888_SkColorType, false);
1710 false);
1711 EXPECT_EQ(result, true); 1593 EXPECT_EQ(result, true);
1712 } 1594 }
1713 1595
1714
1715 TEST_F(GLHelperTest, BGRASyncReadbackTest) { 1596 TEST_F(GLHelperTest, BGRASyncReadbackTest) {
1716 const int kTestSize = 64; 1597 const int kTestSize = 64;
1717 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1598 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1718 kBGRA_8888_SkColorType, 1599 kBGRA_8888_SkColorType, false);
1719 false);
1720 EXPECT_EQ(result, true); 1600 EXPECT_EQ(result, true);
1721 } 1601 }
1722 1602
1723 TEST_F(GLHelperTest, RGB565SyncReadbackTest) { 1603 TEST_F(GLHelperTest, RGB565SyncReadbackTest) {
1724 const int kTestSize = 64; 1604 const int kTestSize = 64;
1725 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1605 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1726 kRGB_565_SkColorType, 1606 kRGB_565_SkColorType, false);
1727 false);
1728 EXPECT_EQ(result, true); 1607 EXPECT_EQ(result, true);
1729 } 1608 }
1730 1609
1731 TEST_F(GLHelperTest, RGBAASyncReadbackTest) { 1610 TEST_F(GLHelperTest, RGBAASyncReadbackTest) {
1732 const int kTestSize = 64; 1611 const int kTestSize = 64;
1733 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1612 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1734 kRGBA_8888_SkColorType, 1613 kRGBA_8888_SkColorType, true);
1735 true);
1736 EXPECT_EQ(result, true); 1614 EXPECT_EQ(result, true);
1737 } 1615 }
1738 1616
1739 TEST_F(GLHelperTest, BGRAASyncReadbackTest) { 1617 TEST_F(GLHelperTest, BGRAASyncReadbackTest) {
1740 const int kTestSize = 64; 1618 const int kTestSize = 64;
1741 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1619 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1742 kBGRA_8888_SkColorType, 1620 kBGRA_8888_SkColorType, true);
1743 true);
1744 EXPECT_EQ(result, true); 1621 EXPECT_EQ(result, true);
1745 } 1622 }
1746 1623
1747 TEST_F(GLHelperTest, RGB565ASyncReadbackTest) { 1624 TEST_F(GLHelperTest, RGB565ASyncReadbackTest) {
1748 const int kTestSize = 64; 1625 const int kTestSize = 64;
1749 bool result = TestTextureFormatReadback(gfx::Size(kTestSize,kTestSize), 1626 bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
1750 kRGB_565_SkColorType, 1627 kRGB_565_SkColorType, true);
1751 true);
1752 EXPECT_EQ(result, true); 1628 EXPECT_EQ(result, true);
1753 } 1629 }
1754 1630
1755 TEST_F(GLHelperPixelTest, YUVReadbackOptTest) { 1631 TEST_F(GLHelperPixelTest, YUVReadbackOptTest) {
1756 // This test uses the gpu.service/gpu_decoder tracing events to detect how 1632 // This test uses the gpu.service/gpu_decoder tracing events to detect how
1757 // many scaling passes are actually performed by the YUV readback pipeline. 1633 // many scaling passes are actually performed by the YUV readback pipeline.
1758 StartTracing(TRACE_DISABLED_BY_DEFAULT("gpu.service") "," 1634 StartTracing(TRACE_DISABLED_BY_DEFAULT(
1759 TRACE_DISABLED_BY_DEFAULT("gpu_decoder")); 1635 "gpu.service") "," TRACE_DISABLED_BY_DEFAULT("gpu_decoder"));
1760 1636
1761 TestYUVReadback(800, 1637 TestYUVReadback(800, 400, 800, 400, 0, 0, 1, false, true,
1762 400,
1763 800,
1764 400,
1765 0,
1766 0,
1767 1,
1768 false,
1769 true,
1770 content::GLHelper::SCALER_QUALITY_FAST); 1638 content::GLHelper::SCALER_QUALITY_FAST);
1771 1639
1772 std::map<std::string, int> event_counts; 1640 std::map<std::string, int> event_counts;
1773 EndTracing(&event_counts); 1641 EndTracing(&event_counts);
1774 int draw_buffer_calls = event_counts["kDrawBuffersEXTImmediate"]; 1642 int draw_buffer_calls = event_counts["kDrawBuffersEXTImmediate"];
1775 int draw_arrays_calls = event_counts["kDrawArrays"]; 1643 int draw_arrays_calls = event_counts["kDrawArrays"];
1776 VLOG(1) << "Draw buffer calls: " << draw_buffer_calls; 1644 VLOG(1) << "Draw buffer calls: " << draw_buffer_calls;
1777 VLOG(1) << "DrawArrays calls: " << draw_arrays_calls; 1645 VLOG(1) << "DrawArrays calls: " << draw_arrays_calls;
1778 1646
1779 if (draw_buffer_calls) { 1647 if (draw_buffer_calls) {
1780 // When using MRT, the YUV readback code should only 1648 // When using MRT, the YUV readback code should only
1781 // execute two draw arrays, and scaling should be integrated 1649 // execute two draw arrays, and scaling should be integrated
1782 // into those two calls since we are using the FAST scalign 1650 // into those two calls since we are using the FAST scalign
1783 // quality. 1651 // quality.
1784 EXPECT_EQ(2, draw_arrays_calls); 1652 EXPECT_EQ(2, draw_arrays_calls);
1785 } else { 1653 } else {
1786 // When not using MRT, there are three passes for the YUV, 1654 // When not using MRT, there are three passes for the YUV,
1787 // and one for the scaling. 1655 // and one for the scaling.
1788 EXPECT_EQ(4, draw_arrays_calls); 1656 EXPECT_EQ(4, draw_arrays_calls);
1789 } 1657 }
1790 } 1658 }
1791 1659
1792 class GLHelperPixelYuvReadback : 1660 class GLHelperPixelYuvReadback
1793 public GLHelperPixelTest, 1661 : public GLHelperPixelTest,
1794 public ::testing::WithParamInterface< 1662 public ::testing::WithParamInterface<
1795 std::tr1::tuple<bool, bool, unsigned int, unsigned int>> {}; 1663 std::tr1::tuple<bool, bool, unsigned int, unsigned int>> {};
1796 1664
1797 int kYUVReadBackSizes[] = {2, 4, 14}; 1665 int kYUVReadBackSizes[] = {2, 4, 14};
1798 1666
1799 TEST_P(GLHelperPixelYuvReadback, Test) { 1667 TEST_P(GLHelperPixelYuvReadback, Test) {
1800 bool flip = std::tr1::get<0>(GetParam()); 1668 bool flip = std::tr1::get<0>(GetParam());
1801 bool use_mrt = std::tr1::get<1>(GetParam()); 1669 bool use_mrt = std::tr1::get<1>(GetParam());
1802 unsigned int x = std::tr1::get<2>(GetParam()); 1670 unsigned int x = std::tr1::get<2>(GetParam());
1803 unsigned int y = std::tr1::get<3>(GetParam()); 1671 unsigned int y = std::tr1::get<3>(GetParam());
1804 1672
1805 for (unsigned int ox = x; ox < arraysize(kYUVReadBackSizes); ox++) { 1673 for (unsigned int ox = x; ox < arraysize(kYUVReadBackSizes); ox++) {
1806 for (unsigned int oy = y; oy < arraysize(kYUVReadBackSizes); oy++) { 1674 for (unsigned int oy = y; oy < arraysize(kYUVReadBackSizes); oy++) {
1807 // If output is a subsection of the destination frame, (letterbox) 1675 // If output is a subsection of the destination frame, (letterbox)
1808 // then try different variations of where the subsection goes. 1676 // then try different variations of where the subsection goes.
1809 for (Margin xm = x < ox ? MarginLeft : MarginRight; 1677 for (Margin xm = x < ox ? MarginLeft : MarginRight; xm <= MarginRight;
1810 xm <= MarginRight;
1811 xm = NextMargin(xm)) { 1678 xm = NextMargin(xm)) {
1812 for (Margin ym = y < oy ? MarginLeft : MarginRight; 1679 for (Margin ym = y < oy ? MarginLeft : MarginRight; ym <= MarginRight;
1813 ym <= MarginRight;
1814 ym = NextMargin(ym)) { 1680 ym = NextMargin(ym)) {
1815 for (int pattern = 0; pattern < 3; pattern++) { 1681 for (int pattern = 0; pattern < 3; pattern++) {
1816 TestYUVReadback(kYUVReadBackSizes[x], 1682 TestYUVReadback(
1817 kYUVReadBackSizes[y], 1683 kYUVReadBackSizes[x], kYUVReadBackSizes[y],
1818 kYUVReadBackSizes[ox], 1684 kYUVReadBackSizes[ox], kYUVReadBackSizes[oy],
1819 kYUVReadBackSizes[oy], 1685 compute_margin(kYUVReadBackSizes[x], kYUVReadBackSizes[ox], xm),
1820 compute_margin(kYUVReadBackSizes[x], 1686 compute_margin(kYUVReadBackSizes[y], kYUVReadBackSizes[oy], ym),
1821 kYUVReadBackSizes[ox], xm), 1687 pattern, flip, use_mrt, content::GLHelper::SCALER_QUALITY_GOOD);
1822 compute_margin(kYUVReadBackSizes[y],
1823 kYUVReadBackSizes[oy], ym),
1824 pattern,
1825 flip,
1826 use_mrt,
1827 content::GLHelper::SCALER_QUALITY_GOOD);
1828 if (HasFailure()) { 1688 if (HasFailure()) {
1829 return; 1689 return;
1830 } 1690 }
1831 } 1691 }
1832 } 1692 }
1833 } 1693 }
1834 } 1694 }
1835 } 1695 }
1836 } 1696 }
1837 1697
1838 // First argument is intentionally empty. 1698 // First argument is intentionally empty.
1839 INSTANTIATE_TEST_CASE_P( 1699 INSTANTIATE_TEST_CASE_P(
1840 , 1700 ,
1841 GLHelperPixelYuvReadback, 1701 GLHelperPixelYuvReadback,
1842 ::testing::Combine( 1702 ::testing::Combine(
1843 ::testing::Bool(), 1703 ::testing::Bool(),
1844 ::testing::Bool(), 1704 ::testing::Bool(),
1845 ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes)), 1705 ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes)),
1846 ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes)))); 1706 ::testing::Range<unsigned int>(0, arraysize(kYUVReadBackSizes))));
1847
1848 1707
1849 int kRGBReadBackSizes[] = {3, 6, 16}; 1708 int kRGBReadBackSizes[] = {3, 6, 16};
1850 1709
1851 class GLHelperPixelReadbackTest : 1710 class GLHelperPixelReadbackTest
1852 public GLHelperPixelTest, 1711 : public GLHelperPixelTest,
1853 public ::testing::WithParamInterface< 1712 public ::testing::WithParamInterface<std::tr1::tuple<unsigned int,
1854 std::tr1::tuple<unsigned int, 1713 unsigned int,
1855 unsigned int, 1714 unsigned int,
1856 unsigned int, 1715 unsigned int,
1857 unsigned int, 1716 unsigned int>> {};
1858 unsigned int>> {};
1859 1717
1860 // Per pixel tests, all sizes are small so that we can print 1718 // Per pixel tests, all sizes are small so that we can print
1861 // out the generated bitmaps. 1719 // out the generated bitmaps.
1862 TEST_P(GLHelperPixelReadbackTest, ScaleTest) { 1720 TEST_P(GLHelperPixelReadbackTest, ScaleTest) {
1863 unsigned int q_index = std::tr1::get<0>(GetParam()); 1721 unsigned int q_index = std::tr1::get<0>(GetParam());
1864 unsigned int x = std::tr1::get<1>(GetParam()); 1722 unsigned int x = std::tr1::get<1>(GetParam());
1865 unsigned int y = std::tr1::get<2>(GetParam()); 1723 unsigned int y = std::tr1::get<2>(GetParam());
1866 unsigned int dst_x = std::tr1::get<3>(GetParam()); 1724 unsigned int dst_x = std::tr1::get<3>(GetParam());
1867 unsigned int dst_y = std::tr1::get<4>(GetParam()); 1725 unsigned int dst_y = std::tr1::get<4>(GetParam());
1868 1726
1869 for (int flip = 0; flip <= 1; flip++) { 1727 for (int flip = 0; flip <= 1; flip++) {
1870 for (int pattern = 0; pattern < 3; pattern++) { 1728 for (int pattern = 0; pattern < 3; pattern++) {
1871 TestScale(kRGBReadBackSizes[x], 1729 TestScale(kRGBReadBackSizes[x], kRGBReadBackSizes[y],
1872 kRGBReadBackSizes[y], 1730 kRGBReadBackSizes[dst_x], kRGBReadBackSizes[dst_y], pattern,
1873 kRGBReadBackSizes[dst_x], 1731 q_index, flip == 1);
1874 kRGBReadBackSizes[dst_y],
1875 pattern,
1876 q_index,
1877 flip == 1);
1878 if (HasFailure()) { 1732 if (HasFailure()) {
1879 return; 1733 return;
1880 } 1734 }
1881 } 1735 }
1882 } 1736 }
1883 } 1737 }
1884 1738
1885
1886 // Per pixel tests, all sizes are small so that we can print 1739 // Per pixel tests, all sizes are small so that we can print
1887 // out the generated bitmaps. 1740 // out the generated bitmaps.
1888 TEST_P(GLHelperPixelReadbackTest, CropScaleReadbackAndCleanTextureTest) { 1741 TEST_P(GLHelperPixelReadbackTest, CropScaleReadbackAndCleanTextureTest) {
1889 unsigned int q_index = std::tr1::get<0>(GetParam()); 1742 unsigned int q_index = std::tr1::get<0>(GetParam());
1890 unsigned int x = std::tr1::get<1>(GetParam()); 1743 unsigned int x = std::tr1::get<1>(GetParam());
1891 unsigned int y = std::tr1::get<2>(GetParam()); 1744 unsigned int y = std::tr1::get<2>(GetParam());
1892 unsigned int dst_x = std::tr1::get<3>(GetParam()); 1745 unsigned int dst_x = std::tr1::get<3>(GetParam());
1893 unsigned int dst_y = std::tr1::get<4>(GetParam()); 1746 unsigned int dst_y = std::tr1::get<4>(GetParam());
1894 1747
1895 const SkColorType kColorTypes[] = { 1748 const SkColorType kColorTypes[] = {
1896 kAlpha_8_SkColorType, kRGBA_8888_SkColorType, kBGRA_8888_SkColorType}; 1749 kAlpha_8_SkColorType, kRGBA_8888_SkColorType, kBGRA_8888_SkColorType};
1897 for (size_t color_type = 0; color_type < arraysize(kColorTypes); 1750 for (size_t color_type = 0; color_type < arraysize(kColorTypes);
1898 color_type++) { 1751 color_type++) {
1899 for (int pattern = 0; pattern < 3; pattern++) { 1752 for (int pattern = 0; pattern < 3; pattern++) {
1900 TestCropScaleReadbackAndCleanTexture(kRGBReadBackSizes[x], 1753 TestCropScaleReadbackAndCleanTexture(
1901 kRGBReadBackSizes[y], 1754 kRGBReadBackSizes[x], kRGBReadBackSizes[y], kRGBReadBackSizes[dst_x],
1902 kRGBReadBackSizes[dst_x], 1755 kRGBReadBackSizes[dst_y], pattern, kColorTypes[color_type], false,
1903 kRGBReadBackSizes[dst_y], 1756 q_index);
1904 pattern,
1905 kColorTypes[color_type],
1906 false,
1907 q_index);
1908 if (HasFailure()) 1757 if (HasFailure())
1909 return; 1758 return;
1910 } 1759 }
1911 } 1760 }
1912 } 1761 }
1913 1762
1914 INSTANTIATE_TEST_CASE_P( 1763 INSTANTIATE_TEST_CASE_P(
1915 , 1764 ,
1916 GLHelperPixelReadbackTest, 1765 GLHelperPixelReadbackTest,
1917 ::testing::Combine( 1766 ::testing::Combine(
1918 ::testing::Range<unsigned int>(0, arraysize(kQualities)), 1767 ::testing::Range<unsigned int>(0, arraysize(kQualities)),
1919 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)), 1768 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)),
1920 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)), 1769 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)),
1921 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)), 1770 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)),
1922 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes)))); 1771 ::testing::Range<unsigned int>(0, arraysize(kRGBReadBackSizes))));
1923 1772
1924 // Validate that all scaling generates valid pipelines. 1773 // Validate that all scaling generates valid pipelines.
1925 TEST_F(GLHelperTest, ValidateScalerPipelines) { 1774 TEST_F(GLHelperTest, ValidateScalerPipelines) {
1926 int sizes[] = {7, 99, 128, 256, 512, 719, 720, 721, 1920, 2011, 3217, 4096}; 1775 int sizes[] = {7, 99, 128, 256, 512, 719, 720, 721, 1920, 2011, 3217, 4096};
1927 for (size_t q = 0; q < arraysize(kQualities); q++) { 1776 for (size_t q = 0; q < arraysize(kQualities); q++) {
1928 for (size_t x = 0; x < arraysize(sizes); x++) { 1777 for (size_t x = 0; x < arraysize(sizes); x++) {
1929 for (size_t y = 0; y < arraysize(sizes); y++) { 1778 for (size_t y = 0; y < arraysize(sizes); y++) {
1930 for (size_t dst_x = 0; dst_x < arraysize(sizes); dst_x++) { 1779 for (size_t dst_x = 0; dst_x < arraysize(sizes); dst_x++) {
1931 for (size_t dst_y = 0; dst_y < arraysize(sizes); dst_y++) { 1780 for (size_t dst_y = 0; dst_y < arraysize(sizes); dst_y++) {
1932 TestScalerPipeline( 1781 TestScalerPipeline(q, sizes[x], sizes[y], sizes[dst_x],
1933 q, sizes[x], sizes[y], sizes[dst_x], sizes[dst_y]); 1782 sizes[dst_y]);
1934 if (HasFailure()) { 1783 if (HasFailure()) {
1935 return; 1784 return;
1936 } 1785 }
1937 } 1786 }
1938 } 1787 }
1939 } 1788 }
1940 } 1789 }
1941 } 1790 }
1942 } 1791 }
1943 1792
1944 // Make sure we don't create overly complicated pipelines 1793 // Make sure we don't create overly complicated pipelines
1945 // for a few common use cases. 1794 // for a few common use cases.
1946 TEST_F(GLHelperTest, CheckSpecificPipelines) { 1795 TEST_F(GLHelperTest, CheckSpecificPipelines) {
1947 // Upscale should be single pass. 1796 // Upscale should be single pass.
1948 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 1797 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 1024, 700, 1280, 720,
1949 1024,
1950 700,
1951 1280,
1952 720,
1953 "1024x700 -> 1280x720 bilinear\n"); 1798 "1024x700 -> 1280x720 bilinear\n");
1954 // Slight downscale should use BILINEAR2X2. 1799 // Slight downscale should use BILINEAR2X2.
1955 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 1800 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 1280, 720, 1024, 700,
1956 1280,
1957 720,
1958 1024,
1959 700,
1960 "1280x720 -> 1024x700 bilinear2x2\n"); 1801 "1280x720 -> 1024x700 bilinear2x2\n");
1961 // Most common tab capture pipeline on the Pixel. 1802 // Most common tab capture pipeline on the Pixel.
1962 // Should be using two BILINEAR3 passes. 1803 // Should be using two BILINEAR3 passes.
1963 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 1804 CheckPipeline(content::GLHelper::SCALER_QUALITY_GOOD, 2560, 1476, 1249, 720,
1964 2560,
1965 1476,
1966 1249,
1967 720,
1968 "2560x1476 -> 2560x720 bilinear3 Y\n" 1805 "2560x1476 -> 2560x720 bilinear3 Y\n"
1969 "2560x720 -> 1249x720 bilinear3 X\n"); 1806 "2560x720 -> 1249x720 bilinear3 X\n");
1970 } 1807 }
1971 1808
1972 TEST_F(GLHelperTest, ScalerOpTest) { 1809 TEST_F(GLHelperTest, ScalerOpTest) {
1973 for (int allow3 = 0; allow3 <= 1; allow3++) { 1810 for (int allow3 = 0; allow3 <= 1; allow3++) {
1974 for (int dst = 1; dst < 2049; dst += 1 + (dst >> 3)) { 1811 for (int dst = 1; dst < 2049; dst += 1 + (dst >> 3)) {
1975 for (int src = 1; src < 2049; src++) { 1812 for (int src = 1; src < 2049; src++) {
1976 TestAddOps(src, dst, allow3 == 1, (src & 1) == 1); 1813 TestAddOps(src, dst, allow3 == 1, (src & 1) == 1);
1977 if (HasFailure()) { 1814 if (HasFailure()) {
1978 LOG(ERROR) << "Failed for src=" << src << " dst=" << dst 1815 LOG(ERROR) << "Failed for src=" << src << " dst=" << dst
1979 << " allow3=" << allow3; 1816 << " allow3=" << allow3;
1980 return; 1817 return;
1981 } 1818 }
1982 } 1819 }
1983 } 1820 }
1984 } 1821 }
1985 } 1822 }
1986 1823
1987 TEST_F(GLHelperTest, CheckOptimizations) { 1824 TEST_F(GLHelperTest, CheckOptimizations) {
1988 // Test in baseclass since it is friends with GLHelperScaling 1825 // Test in baseclass since it is friends with GLHelperScaling
1989 CheckOptimizationsTest(); 1826 CheckOptimizationsTest();
1990 } 1827 }
1991 1828
1992 } // namespace content 1829 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/compositor/gl_helper_scaling.cc ('k') | content/browser/compositor/gpu_process_transport_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698