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

Side by Side Diff: third_party/WebKit/Source/platform/image-encoders/JPEGImageEncoderTest.cpp

Issue 2576223002: NEON-ize RGBA to RGB code (Closed)
Patch Set: Updating comments Created 4 years 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/timer/elapsed_timer.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7
8 // TODO(cavalcantii): use regular macro, see https://crbug.com/673067.
9 #ifdef __ARM_NEON__
10 #include "platform/image-encoders/RGBAtoRGB.h"
11 #endif
12
13 namespace blink {
14
15 static const size_t channelsRGBA = 4;
16 static const size_t channelsRGB = 3;
17
18 class RGBAtoRGBTest : public ::testing::Test {
19 public:
20 RGBAtoRGBTest() {}
21 };
22
23 TEST_F(RGBAtoRGBTest, testEmpty) {
24 EXPECT_TRUE(true);
25 }
26
27 inline size_t calculateRGBAPixels(size_t inputBufferSize) {
28 size_t pixels = inputBufferSize / channelsRGBA;
29 return pixels;
30 }
31
32 inline size_t calculateRGBOutputSize(size_t inputBufferSize) {
33 size_t pixels = calculateRGBAPixels(inputBufferSize);
34 pixels *= channelsRGB;
35 return pixels;
36 }
37
38 #ifdef __ARM_NEON__
msarett 2016/12/18 18:48:37 Is there a reason to only test on Arm NEON? This
39 TEST_F(RGBAtoRGBTest, testOpaqueCaseEven8pixels) {
40 unsigned char canvas[] = {255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0,
41 255, 255, 0, 0, 255, 0, 255, 0, 255, 0, 255,
42 0, 255, 0, 255, 0, 255, 0, 255, 0, 255};
43
44 unsigned char expected[] = {255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 0,
45 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0};
46
47 size_t pixels = calculateRGBAPixels(sizeof(canvas));
48 size_t rgbSize = calculateRGBOutputSize(sizeof(canvas));
49 unsigned char output[rgbSize];
50 memset(output, 0, rgbSize);
51
52 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
53
54 EXPECT_EQ(memcmp(expected, output, rgbSize), 0);
55 }
56
57 TEST_F(RGBAtoRGBTest, testCaseEven16pixels) {
58 unsigned char canvas[] = {
59 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255,
60 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255,
61 0, 255, 0, 255, 0, 255, 0, 0, 255, 128, 0, 0, 255,
62 128, 0, 0, 255, 128, 0, 0, 255, 128, 128, 128, 128, 128,
63 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128};
64
65 size_t pixels = calculateRGBAPixels(sizeof(canvas));
66 size_t rgbSize = calculateRGBOutputSize(sizeof(canvas));
67 unsigned char output[rgbSize];
68 unsigned char expected[rgbSize];
69 memset(output, 0, rgbSize);
70 memset(expected, 0, rgbSize);
71
72 blink::RGBAtoRGBScalar(canvas, static_cast<unsigned>(pixels), expected);
73 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
74
75 EXPECT_EQ(memcmp(expected, output, rgbSize), 0);
76 }
77
78 TEST_F(RGBAtoRGBTest, testCaseOdd17pixels) {
79 unsigned char canvas[] = {
80 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0,
81 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255,
82 0, 255, 0, 255, 0, 0, 255, 128, 0, 0, 255, 128, 0, 0,
83 255, 128, 0, 0, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128,
84 128, 128, 128, 128, 128, 128, 128, 128, 10, 10, 10, 100};
85
86 size_t pixels = calculateRGBAPixels(sizeof(canvas));
87 size_t rgbSize = calculateRGBOutputSize(sizeof(canvas));
88 unsigned char output[rgbSize];
89 unsigned char expected[rgbSize];
90 memset(output, 0, rgbSize);
91 memset(expected, 0, rgbSize);
92
93 blink::RGBAtoRGBScalar(canvas, static_cast<unsigned>(pixels), expected);
94 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
95
96 EXPECT_EQ(memcmp(expected, output, rgbSize), 0);
97 }
98
99 TEST_F(RGBAtoRGBTest, testCaseEven32pixels) {
100 unsigned char canvas[] = {
101 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0, 0,
102 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255,
103 0, 255, 0, 0, 255, 128, 0, 0, 255, 128, 0, 0, 255, 128, 0,
104 0, 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
105 128, 128, 128, 128, 128, 128, 128, 255, 128, 128, 128, 255, 128, 128, 128,
106 255, 128, 128, 128, 255, 255, 0, 0, 255, 255, 0, 0, 255, 255, 0,
107 0, 255, 255, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0,
108 255, 0, 255, 0, 255, 0, 255, 0, 0, 255, 128, 0, 0, 255, 128,
109 0, 0, 255, 128, 0, 0, 255, 128};
110
111 size_t pixels = calculateRGBAPixels(sizeof(canvas));
112 size_t rgbSize = calculateRGBOutputSize(sizeof(canvas));
113 unsigned char output[rgbSize];
114 unsigned char expected[rgbSize];
115 memset(output, 0, rgbSize);
116 memset(expected, 0, rgbSize);
117
118 blink::RGBAtoRGBScalar(canvas, static_cast<unsigned>(pixels), expected);
119 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
120
121 EXPECT_EQ(memcmp(expected, output, rgbSize), 0);
122 }
123
124 static base::TimeDelta testNpixels(bool fastPath = true,
125 const size_t width = 1024,
126 const size_t height = 1024,
127 bool setAlpha = true) {
128 size_t pixels = width * height;
129 size_t canvasLen = channelsRGBA * width * height;
130 size_t outputLen = channelsRGB * width * height;
131 unsigned char* canvas = new unsigned char[canvasLen];
132 unsigned char* output = new unsigned char[outputLen];
133
134 auto cleanup = [&]() {
135 if (canvas)
136 delete[] canvas;
137 if (output)
138 delete[] output;
139 };
140
141 if (!canvas || !output) {
142 cleanup();
143 return base::TimeDelta();
144 }
145
146 if (setAlpha) {
147 memset(canvas, 128, canvasLen);
148 } else {
149 memset(canvas, 200, canvasLen);
150 }
151
152 base::ElapsedTimer runTime;
153 if (fastPath) {
154 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
155 } else {
156 blink::RGBAtoRGBScalar(canvas, static_cast<unsigned>(pixels), output);
157 }
158
159 auto result = runTime.Elapsed();
160 cleanup();
161 return result;
162 }
163
164 TEST_F(RGBAtoRGBTest, testPerf1k) {
165 auto neonElapsed = testNpixels();
166 auto scalarElapsed = testNpixels(false);
167
168 EXPECT_TRUE(neonElapsed < scalarElapsed)
169 << "Neon: " << neonElapsed << "\tScalar: " << scalarElapsed << std::endl;
170 }
171
172 TEST_F(RGBAtoRGBTest, testPerf4k) {
173 auto neonElapsed = testNpixels(true, 4000, 4000);
174 auto scalarElapsed = testNpixels(false, 4000, 4000);
175
176 EXPECT_TRUE(neonElapsed < scalarElapsed)
177 << "Neon: " << neonElapsed << "\tScalar: " << scalarElapsed << std::endl;
178 }
179
180 // This width will force the tail case, cause width = (16 * 64) + 15.
181 static bool testRandNpixels(const size_t width = 1039,
182 const size_t height = 1024,
183 bool setAlpha = true) {
184 size_t pixels = width * height;
185 size_t canvasLen = channelsRGBA * pixels;
186 size_t outputLen = channelsRGB * pixels;
187 unsigned char* canvas = new unsigned char[canvasLen];
188 unsigned char* expected = new unsigned char[outputLen];
189 unsigned char* output = new unsigned char[outputLen];
190
191 auto cleanup = [&]() {
192 if (canvas)
193 delete[] canvas;
194 if (expected)
195 delete[] expected;
196 if (output)
197 delete[] output;
198 };
199
200 if (!canvas || !output || !expected) {
201 cleanup();
202 return false;
203 }
204
205 if (setAlpha) {
206 memset(canvas, 128, canvasLen);
207 } else {
208 memset(canvas, 200, canvasLen);
209 }
210
211 srand(time(0));
212 unsigned char* ptr = canvas;
213 for (size_t i = 0; i < pixels; ++i) {
214 *ptr++ = static_cast<unsigned char>(rand() % 255);
215 *ptr++ = static_cast<unsigned char>(rand() % 255);
216 *ptr++ = static_cast<unsigned char>(rand() % 255);
217 *ptr++ = static_cast<unsigned char>(rand() % 255);
218 }
219
220 blink::RGBAtoRGBScalar(canvas, static_cast<unsigned>(pixels), expected);
221 blink::RGBAtoRGBNeon(canvas, static_cast<unsigned>(pixels), output);
222
223 bool result = memcmp(expected, output, outputLen) == 0;
224
225 cleanup();
226 return result;
227 }
228
229 TEST_F(RGBAtoRGBTest, randomPixels) {
230 EXPECT_TRUE(testRandNpixels());
231 }
232
233 #endif
234 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698