Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / common / gles2_cmd_utils_unittest.cc
1 // Copyright (c) 2012 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 "gpu/command_buffer/common/gles2_cmd_utils.h"
6
7 #include <limits>
8 #include <GLES2/gl2.h>
9 #include <GLES2/gl2ext.h>
10 #include <GLES2/gl2extchromium.h>
11
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace gpu {
15 namespace gles2 {
16
17 class GLES2UtilTest : public testing:: Test {
18  protected:
19   GLES2Util util_;
20 };
21
22 TEST_F(GLES2UtilTest, SafeMultiplyUint32) {
23   uint32_t result = 0;
24   EXPECT_TRUE(SafeMultiplyUint32(2u, 3u, &result));
25   EXPECT_EQ(6u, result);
26   EXPECT_FALSE(SafeMultiplyUint32(0x80000000u, 2u, &result));
27   EXPECT_EQ(0u, result);
28   EXPECT_TRUE(SafeMultiplyUint32(0x2u, 0x7FFFFFFFu, &result));
29   EXPECT_EQ(0xFFFFFFFEu, result);
30   EXPECT_FALSE(SafeMultiplyUint32(2u, 0x80000000u, &result));
31   EXPECT_EQ(0u, result);
32 }
33
34 TEST_F(GLES2UtilTest, SafeAddUint32) {
35   uint32_t result = 0;
36   EXPECT_TRUE(SafeAddUint32(2u, 3u, &result));
37   EXPECT_EQ(5u, result);
38   EXPECT_FALSE(SafeAddUint32(0x80000000u, 0x80000000u, &result));
39   EXPECT_EQ(0u, result);
40   EXPECT_TRUE(SafeAddUint32(0xFFFFFFFEu, 0x1u, &result));
41   EXPECT_EQ(0xFFFFFFFFu, result);
42   EXPECT_FALSE(SafeAddUint32(0xFFFFFFFEu, 0x2u, &result));
43   EXPECT_EQ(0u, result);
44   EXPECT_TRUE(SafeAddUint32(0x1u, 0xFFFFFFFEu, &result));
45   EXPECT_EQ(0xFFFFFFFFu, result);
46   EXPECT_FALSE(SafeAddUint32(0x2u, 0xFFFFFFFEu, &result));
47   EXPECT_EQ(0u, result);
48 }
49
50 TEST_F(GLES2UtilTest, SafeAddInt32) {
51   int32_t result = 0;
52   const int32_t kMax = std::numeric_limits<int32_t>::max();
53   const int32_t kMin = std::numeric_limits<int32_t>::min();
54   EXPECT_TRUE(SafeAddInt32(2, 3, &result));
55   EXPECT_EQ(5, result);
56   EXPECT_FALSE(SafeAddInt32(kMax, 1, &result));
57   EXPECT_EQ(0, result);
58   EXPECT_TRUE(SafeAddInt32(kMin + 1, -1, &result));
59   EXPECT_EQ(kMin, result);
60   EXPECT_FALSE(SafeAddInt32(kMin, -1, &result));
61   EXPECT_EQ(0, result);
62   EXPECT_TRUE(SafeAddInt32(kMax - 1, 1, &result));
63   EXPECT_EQ(kMax, result);
64   EXPECT_FALSE(SafeAddInt32(1, kMax, &result));
65   EXPECT_EQ(0, result);
66   EXPECT_TRUE(SafeAddInt32(-1, kMin + 1, &result));
67   EXPECT_EQ(kMin, result);
68   EXPECT_FALSE(SafeAddInt32(-1, kMin, &result));
69   EXPECT_EQ(0, result);
70   EXPECT_TRUE(SafeAddInt32(1, kMax - 1, &result));
71   EXPECT_EQ(kMax, result);
72 }
73
74 TEST_F(GLES2UtilTest, GLGetNumValuesReturned) {
75   EXPECT_EQ(0, util_.GLGetNumValuesReturned(GL_COMPRESSED_TEXTURE_FORMATS));
76   EXPECT_EQ(0, util_.GLGetNumValuesReturned(GL_SHADER_BINARY_FORMATS));
77
78   EXPECT_EQ(0, util_.num_compressed_texture_formats());
79   EXPECT_EQ(0, util_.num_shader_binary_formats());
80
81   util_.set_num_compressed_texture_formats(1);
82   util_.set_num_shader_binary_formats(2);
83
84   EXPECT_EQ(1, util_.GLGetNumValuesReturned(GL_COMPRESSED_TEXTURE_FORMATS));
85   EXPECT_EQ(2, util_.GLGetNumValuesReturned(GL_SHADER_BINARY_FORMATS));
86
87   EXPECT_EQ(1, util_.num_compressed_texture_formats());
88   EXPECT_EQ(2, util_.num_shader_binary_formats());
89 }
90
91 TEST_F(GLES2UtilTest, ComputeImageDataSizesFormats) {
92   const uint32_t kWidth = 16;
93   const uint32_t kHeight = 12;
94   uint32_t size;
95   uint32_t unpadded_row_size;
96   uint32_t padded_row_size;
97   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
98       kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size,
99       &padded_row_size));
100   EXPECT_EQ(kWidth * kHeight * 3, size);
101   EXPECT_EQ(kWidth * 3, padded_row_size);
102   EXPECT_EQ(padded_row_size, unpadded_row_size);
103   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
104       kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size,
105       &padded_row_size));
106   EXPECT_EQ(kWidth * kHeight * 4, size);
107   EXPECT_EQ(kWidth * 4, padded_row_size);
108   EXPECT_EQ(padded_row_size, unpadded_row_size);
109   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
110       kWidth, kHeight, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1, &size,
111       &unpadded_row_size, &padded_row_size));
112   EXPECT_EQ(kWidth * kHeight * 1, size);
113   EXPECT_EQ(kWidth * 1, padded_row_size);
114   EXPECT_EQ(padded_row_size, unpadded_row_size);
115   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
116       kWidth, kHeight, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 1, &size,
117       &unpadded_row_size, &padded_row_size));
118   EXPECT_EQ(kWidth * kHeight * 2, size);
119   EXPECT_EQ(kWidth * 2, padded_row_size);
120   EXPECT_EQ(padded_row_size, unpadded_row_size);
121   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
122       kWidth, kHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, 1, &size,
123       &unpadded_row_size, &padded_row_size));
124   EXPECT_EQ(kWidth * kHeight * 4, size);
125   EXPECT_EQ(kWidth * 4, padded_row_size);
126   EXPECT_EQ(padded_row_size, unpadded_row_size);
127   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
128       kWidth, kHeight, GL_ALPHA, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size,
129       &padded_row_size));
130   EXPECT_EQ(kWidth * kHeight * 1, size);
131   EXPECT_EQ(kWidth * 1, padded_row_size);
132   EXPECT_EQ(padded_row_size, unpadded_row_size);
133   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
134       kWidth, kHeight, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 1, &size,
135       &unpadded_row_size, &padded_row_size));
136   EXPECT_EQ(kWidth * kHeight * 2, size);
137   EXPECT_EQ(kWidth * 2, padded_row_size);
138   EXPECT_EQ(padded_row_size, unpadded_row_size);
139   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
140       kWidth, kHeight, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, 1,
141       &size, &unpadded_row_size,
142       &padded_row_size));
143   EXPECT_EQ(kWidth * kHeight * 4, size);
144   EXPECT_EQ(kWidth * 4, padded_row_size);
145   EXPECT_EQ(padded_row_size, unpadded_row_size);
146 }
147
148 TEST_F(GLES2UtilTest, ComputeImageDataSizeTypes) {
149   const uint32_t kWidth = 16;
150   const uint32_t kHeight = 12;
151   uint32_t size;
152   uint32_t unpadded_row_size;
153   uint32_t padded_row_size;
154   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
155       kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size,
156       &padded_row_size));
157   EXPECT_EQ(kWidth * kHeight * 4, size);
158   EXPECT_EQ(kWidth * 4, padded_row_size);
159   EXPECT_EQ(padded_row_size, unpadded_row_size);
160   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
161       kWidth, kHeight, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 1, &size,
162       &unpadded_row_size, &padded_row_size));
163   EXPECT_EQ(kWidth * kHeight * 2, size);
164   EXPECT_EQ(kWidth * 2, padded_row_size);
165   EXPECT_EQ(padded_row_size, unpadded_row_size);
166   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
167       kWidth, kHeight, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 1, &size,
168       &unpadded_row_size, &padded_row_size));
169   EXPECT_EQ(kWidth * kHeight * 2, size);
170   EXPECT_EQ(kWidth * 2, padded_row_size);
171   EXPECT_EQ(padded_row_size, unpadded_row_size);
172   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
173       kWidth, kHeight, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 1, &size,
174       &unpadded_row_size, &padded_row_size));
175   EXPECT_EQ(kWidth * kHeight * 2, size);
176   EXPECT_EQ(kWidth * 2, padded_row_size);
177   EXPECT_EQ(padded_row_size, unpadded_row_size);
178   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
179       kWidth, kHeight, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 1, &size,
180       &unpadded_row_size, &padded_row_size));
181   EXPECT_EQ(kWidth * kHeight * 4, size);
182   EXPECT_EQ(kWidth * 4, padded_row_size);
183   EXPECT_EQ(padded_row_size, unpadded_row_size);
184 }
185
186 TEST_F(GLES2UtilTest, ComputeImageDataSizesUnpackAlignment) {
187   const uint32_t kWidth = 19;
188   const uint32_t kHeight = 12;
189   uint32_t size;
190   uint32_t unpadded_row_size;
191   uint32_t padded_row_size;
192   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
193       kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size,
194       &padded_row_size));
195   EXPECT_EQ(kWidth * kHeight * 3, size);
196   EXPECT_EQ(kWidth * 3, unpadded_row_size);
197   EXPECT_EQ(kWidth * 3, padded_row_size);
198   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
199       kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 2, &size, &unpadded_row_size,
200       &padded_row_size));
201   EXPECT_EQ((kWidth * 3 + 1) * (kHeight - 1) +
202             kWidth * 3, size);
203   EXPECT_EQ(kWidth * 3, unpadded_row_size);
204   EXPECT_EQ(kWidth * 3 + 1, padded_row_size);
205   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
206       kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 4, &size, &unpadded_row_size,
207       &padded_row_size));
208   EXPECT_EQ((kWidth * 3 + 3) * (kHeight - 1) +
209             kWidth * 3, size);
210   EXPECT_EQ(kWidth * 3, unpadded_row_size);
211   EXPECT_EQ(kWidth * 3 + 3, padded_row_size);
212   EXPECT_TRUE(GLES2Util::ComputeImageDataSizes(
213       kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 8, &size, &unpadded_row_size,
214       &padded_row_size));
215   EXPECT_EQ((kWidth * 3 + 7) * (kHeight - 1) +
216             kWidth * 3, size);
217   EXPECT_EQ(kWidth * 3, unpadded_row_size);
218   EXPECT_EQ(kWidth * 3 + 7, padded_row_size);
219 }
220
221 TEST_F(GLES2UtilTest, RenderbufferBytesPerPixel) {
222    EXPECT_EQ(1u, GLES2Util::RenderbufferBytesPerPixel(GL_STENCIL_INDEX8));
223    EXPECT_EQ(2u, GLES2Util::RenderbufferBytesPerPixel(GL_RGBA4));
224    EXPECT_EQ(2u, GLES2Util::RenderbufferBytesPerPixel(GL_RGB565));
225    EXPECT_EQ(2u, GLES2Util::RenderbufferBytesPerPixel(GL_RGB5_A1));
226    EXPECT_EQ(2u, GLES2Util::RenderbufferBytesPerPixel(GL_DEPTH_COMPONENT16));
227    EXPECT_EQ(4u, GLES2Util::RenderbufferBytesPerPixel(GL_RGB));
228    EXPECT_EQ(4u, GLES2Util::RenderbufferBytesPerPixel(GL_RGBA));
229    EXPECT_EQ(
230        4u, GLES2Util::RenderbufferBytesPerPixel(GL_DEPTH24_STENCIL8_OES));
231    EXPECT_EQ(4u, GLES2Util::RenderbufferBytesPerPixel(GL_RGB8_OES));
232    EXPECT_EQ(4u, GLES2Util::RenderbufferBytesPerPixel(GL_RGBA8_OES));
233    EXPECT_EQ(
234        4u, GLES2Util::RenderbufferBytesPerPixel(GL_DEPTH_COMPONENT24_OES));
235    EXPECT_EQ(0u, GLES2Util::RenderbufferBytesPerPixel(-1));
236 }
237
238 TEST_F(GLES2UtilTest, GetChannelsForCompressedFormat) {
239   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(GL_ETC1_RGB8_OES));
240   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
241       GL_COMPRESSED_RGB_S3TC_DXT1_EXT));
242   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
243       GL_COMPRESSED_RGBA_S3TC_DXT1_EXT));
244   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
245       GL_COMPRESSED_RGBA_S3TC_DXT3_EXT));
246   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
247       GL_COMPRESSED_RGBA_S3TC_DXT5_EXT));
248   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(GL_ATC_RGB_AMD));
249   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
250       GL_ATC_RGBA_EXPLICIT_ALPHA_AMD));
251   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
252       GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD));
253   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
254       GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG));
255   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
256       GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG));
257   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
258       GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG));
259   EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(
260       GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG));
261 }
262
263 namespace {
264
265 void CheckParseUniformName(
266     const char* name,
267     bool expected_success,
268     size_t expected_array_pos,
269     int expected_index,
270     bool expected_getting_array) {
271   int index = 1234;
272   size_t array_pos = 1244;
273   bool getting_array = false;
274   bool success = GLES2Util::ParseUniformName(
275       name, &array_pos, &index, &getting_array);
276   EXPECT_EQ(expected_success, success);
277   if (success) {
278     EXPECT_EQ(expected_array_pos, array_pos);
279     EXPECT_EQ(expected_index, index);
280     EXPECT_EQ(expected_getting_array, getting_array);
281   }
282 }
283
284 }  // anonymous namespace
285
286 TEST_F(GLES2UtilTest, ParseUniformName) {
287   CheckParseUniformName("u_name", true, std::string::npos, 0, false);
288   CheckParseUniformName("u_name[]", false, std::string::npos, 0, false);
289   CheckParseUniformName("u_name]", false, std::string::npos, 0, false);
290   CheckParseUniformName("u_name[0a]", false, std::string::npos, 0, false);
291   CheckParseUniformName("u_name[a0]", false, std::string::npos, 0, false);
292   CheckParseUniformName("u_name[0a0]", false, std::string::npos, 0, false);
293   CheckParseUniformName("u_name[0]", true, 6u, 0, true);
294   CheckParseUniformName("u_name[2]", true, 6u, 2, true);
295   CheckParseUniformName("u_name[02]", true, 6u, 2, true);
296   CheckParseUniformName("u_name[20]", true, 6u, 20, true);
297   CheckParseUniformName("u_name[020]", true, 6u, 20, true);
298   CheckParseUniformName("u_name[0][0]", true, 9u, 0, true);
299   CheckParseUniformName("u_name[3][2]", true, 9u, 2, true);
300   CheckParseUniformName("u_name[03][02]", true, 10u, 2, true);
301   CheckParseUniformName("u_name[30][20]", true, 10u, 20, true);
302   CheckParseUniformName("u_name[030][020]", true, 11u, 20, true);
303 }
304
305 }  // namespace gles2
306 }  // namespace gpu