OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 <GLES2/gl2.h> | 5 #include <GLES2/gl2.h> |
6 | 6 |
7 #include "gpu/command_buffer/service/shader_translator.h" | 7 #include "gpu/command_buffer/service/shader_translator.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "ui/gl/gl_version_info.h" | 9 #include "ui/gl/gl_version_info.h" |
10 | 10 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 "void main() {\n" | 53 "void main() {\n" |
54 " gl_Position = vec4(1.0);\n" | 54 " gl_Position = vec4(1.0);\n" |
55 "}"; | 55 "}"; |
56 | 56 |
57 // A valid shader should be successfully translated. | 57 // A valid shader should be successfully translated. |
58 std::string info_log, translated_source; | 58 std::string info_log, translated_source; |
59 int shader_version; | 59 int shader_version; |
60 AttributeMap attrib_map; | 60 AttributeMap attrib_map; |
61 UniformMap uniform_map; | 61 UniformMap uniform_map; |
62 VaryingMap varying_map; | 62 VaryingMap varying_map; |
| 63 AttributeList output_variable_list; |
63 NameMap name_map; | 64 NameMap name_map; |
64 EXPECT_TRUE(vertex_translator_->Translate(shader, | 65 EXPECT_TRUE(vertex_translator_->Translate( |
65 &info_log, | 66 shader, &info_log, &translated_source, &shader_version, &attrib_map, |
66 &translated_source, | 67 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
67 &shader_version, | |
68 &attrib_map, | |
69 &uniform_map, | |
70 &varying_map, | |
71 &name_map)); | |
72 // Info log must be NULL. | 68 // Info log must be NULL. |
73 EXPECT_TRUE(info_log.empty()); | 69 EXPECT_TRUE(info_log.empty()); |
74 // Translated shader must be valid and non-empty. | 70 // Translated shader must be valid and non-empty. |
75 ASSERT_FALSE(translated_source.empty()); | 71 ASSERT_FALSE(translated_source.empty()); |
76 // There should be no attributes, uniforms, and only one built-in | 72 // There should be no attributes, uniforms, and only one built-in |
77 // varying: gl_Position. | 73 // varying: gl_Position. |
78 EXPECT_TRUE(attrib_map.empty()); | 74 EXPECT_TRUE(attrib_map.empty()); |
79 EXPECT_TRUE(uniform_map.empty()); | 75 EXPECT_TRUE(uniform_map.empty()); |
80 EXPECT_EQ(1u, varying_map.size()); | 76 EXPECT_EQ(1u, varying_map.size()); |
| 77 EXPECT_TRUE(output_variable_list.empty()); |
81 // There should be no name mapping. | 78 // There should be no name mapping. |
82 EXPECT_TRUE(name_map.empty()); | 79 EXPECT_TRUE(name_map.empty()); |
83 } | 80 } |
84 | 81 |
85 TEST_F(ShaderTranslatorTest, InvalidVertexShader) { | 82 TEST_F(ShaderTranslatorTest, InvalidVertexShader) { |
86 const char* bad_shader = "foo-bar"; | 83 const char* bad_shader = "foo-bar"; |
87 const char* good_shader = | 84 const char* good_shader = |
88 "void main() {\n" | 85 "void main() {\n" |
89 " gl_Position = vec4(1.0);\n" | 86 " gl_Position = vec4(1.0);\n" |
90 "}"; | 87 "}"; |
91 | 88 |
92 // An invalid shader should fail. | 89 // An invalid shader should fail. |
93 std::string info_log, translated_source; | 90 std::string info_log, translated_source; |
94 int shader_version; | 91 int shader_version; |
95 AttributeMap attrib_map; | 92 AttributeMap attrib_map; |
96 UniformMap uniform_map; | 93 UniformMap uniform_map; |
97 VaryingMap varying_map; | 94 VaryingMap varying_map; |
| 95 AttributeList output_variable_list; |
98 NameMap name_map; | 96 NameMap name_map; |
99 EXPECT_FALSE(vertex_translator_->Translate(bad_shader, | 97 EXPECT_FALSE(vertex_translator_->Translate( |
100 &info_log, | 98 bad_shader, &info_log, &translated_source, &shader_version, &attrib_map, |
101 &translated_source, | 99 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
102 &shader_version, | |
103 &attrib_map, | |
104 &uniform_map, | |
105 &varying_map, | |
106 &name_map)); | |
107 // Info log must be valid and non-empty. | 100 // Info log must be valid and non-empty. |
108 ASSERT_FALSE(info_log.empty()); | 101 ASSERT_FALSE(info_log.empty()); |
109 // Translated shader must be NULL. | 102 // Translated shader must be NULL. |
110 EXPECT_TRUE(translated_source.empty()); | 103 EXPECT_TRUE(translated_source.empty()); |
111 // There should be no attributes, uniforms, varyings, or name mapping. | 104 // There should be no attributes, uniforms, varyings, or name mapping. |
112 EXPECT_TRUE(attrib_map.empty()); | 105 EXPECT_TRUE(attrib_map.empty()); |
113 EXPECT_TRUE(uniform_map.empty()); | 106 EXPECT_TRUE(uniform_map.empty()); |
114 EXPECT_TRUE(varying_map.empty()); | 107 EXPECT_TRUE(varying_map.empty()); |
| 108 EXPECT_TRUE(output_variable_list.empty()); |
115 EXPECT_TRUE(name_map.empty()); | 109 EXPECT_TRUE(name_map.empty()); |
116 | 110 |
117 // Try a good shader after bad. | 111 // Try a good shader after bad. |
118 info_log.clear(); | 112 info_log.clear(); |
119 EXPECT_TRUE(vertex_translator_->Translate(good_shader, | 113 EXPECT_TRUE(vertex_translator_->Translate( |
120 &info_log, | 114 good_shader, &info_log, &translated_source, &shader_version, &attrib_map, |
121 &translated_source, | 115 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
122 &shader_version, | |
123 &attrib_map, | |
124 &uniform_map, | |
125 &varying_map, | |
126 &name_map)); | |
127 EXPECT_TRUE(info_log.empty()); | 116 EXPECT_TRUE(info_log.empty()); |
128 EXPECT_FALSE(translated_source.empty()); | 117 EXPECT_FALSE(translated_source.empty()); |
129 } | 118 } |
130 | 119 |
131 TEST_F(ShaderTranslatorTest, ValidFragmentShader) { | 120 TEST_F(ShaderTranslatorTest, ValidFragmentShader) { |
132 const char* shader = | 121 const char* shader = |
133 "void main() {\n" | 122 "void main() {\n" |
134 " gl_FragColor = vec4(1.0);\n" | 123 " gl_FragColor = vec4(1.0);\n" |
135 "}"; | 124 "}"; |
136 | 125 |
137 // A valid shader should be successfully translated. | 126 // A valid shader should be successfully translated. |
138 std::string info_log, translated_source; | 127 std::string info_log, translated_source; |
139 int shader_version; | 128 int shader_version; |
140 AttributeMap attrib_map; | 129 AttributeMap attrib_map; |
141 UniformMap uniform_map; | 130 UniformMap uniform_map; |
142 VaryingMap varying_map; | 131 VaryingMap varying_map; |
| 132 AttributeList output_variable_list; |
143 NameMap name_map; | 133 NameMap name_map; |
144 EXPECT_TRUE(fragment_translator_->Translate(shader, | 134 EXPECT_TRUE(fragment_translator_->Translate( |
145 &info_log, | 135 shader, &info_log, &translated_source, &shader_version, &attrib_map, |
146 &translated_source, | 136 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
147 &shader_version, | |
148 &attrib_map, | |
149 &uniform_map, | |
150 &varying_map, | |
151 &name_map)); | |
152 // Info log must be NULL. | 137 // Info log must be NULL. |
153 EXPECT_TRUE(info_log.empty()); | 138 EXPECT_TRUE(info_log.empty()); |
154 // Translated shader must be valid and non-empty. | 139 // Translated shader must be valid and non-empty. |
155 ASSERT_FALSE(translated_source.empty()); | 140 ASSERT_FALSE(translated_source.empty()); |
156 // There should be no attributes, uniforms, varyings, or name mapping. | 141 // There should be no attributes, uniforms, varyings, or name mapping. |
157 EXPECT_TRUE(attrib_map.empty()); | 142 EXPECT_TRUE(attrib_map.empty()); |
158 EXPECT_TRUE(uniform_map.empty()); | 143 EXPECT_TRUE(uniform_map.empty()); |
159 EXPECT_TRUE(varying_map.empty()); | 144 EXPECT_TRUE(varying_map.empty()); |
160 EXPECT_TRUE(name_map.empty()); | 145 EXPECT_TRUE(name_map.empty()); |
| 146 // gl_FragColor. |
| 147 EXPECT_EQ(1u, output_variable_list.size()); |
161 } | 148 } |
162 | 149 |
163 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) { | 150 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) { |
164 const char* shader = "foo-bar"; | 151 const char* shader = "foo-bar"; |
165 | 152 |
166 std::string info_log, translated_source; | 153 std::string info_log, translated_source; |
167 int shader_version; | 154 int shader_version; |
168 AttributeMap attrib_map; | 155 AttributeMap attrib_map; |
169 UniformMap uniform_map; | 156 UniformMap uniform_map; |
170 VaryingMap varying_map; | 157 VaryingMap varying_map; |
| 158 AttributeList output_variable_list; |
171 NameMap name_map; | 159 NameMap name_map; |
172 // An invalid shader should fail. | 160 // An invalid shader should fail. |
173 EXPECT_FALSE(fragment_translator_->Translate(shader, | 161 EXPECT_FALSE(fragment_translator_->Translate( |
174 &info_log, | 162 shader, &info_log, &translated_source, &shader_version, &attrib_map, |
175 &translated_source, | 163 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
176 &shader_version, | |
177 &attrib_map, | |
178 &uniform_map, | |
179 &varying_map, | |
180 &name_map)); | |
181 // Info log must be valid and non-empty. | 164 // Info log must be valid and non-empty. |
182 EXPECT_FALSE(info_log.empty()); | 165 EXPECT_FALSE(info_log.empty()); |
183 // Translated shader must be NULL. | 166 // Translated shader must be NULL. |
184 EXPECT_TRUE(translated_source.empty()); | 167 EXPECT_TRUE(translated_source.empty()); |
185 // There should be no attributes or uniforms. | 168 // There should be no attributes or uniforms. |
186 EXPECT_TRUE(attrib_map.empty()); | 169 EXPECT_TRUE(attrib_map.empty()); |
187 EXPECT_TRUE(uniform_map.empty()); | 170 EXPECT_TRUE(uniform_map.empty()); |
188 EXPECT_TRUE(varying_map.empty()); | 171 EXPECT_TRUE(varying_map.empty()); |
| 172 EXPECT_TRUE(output_variable_list.empty()); |
189 EXPECT_TRUE(name_map.empty()); | 173 EXPECT_TRUE(name_map.empty()); |
190 } | 174 } |
191 | 175 |
192 TEST_F(ShaderTranslatorTest, GetAttributes) { | 176 TEST_F(ShaderTranslatorTest, GetAttributes) { |
193 const char* shader = | 177 const char* shader = |
194 "attribute vec4 vPosition;\n" | 178 "attribute vec4 vPosition;\n" |
195 "void main() {\n" | 179 "void main() {\n" |
196 " gl_Position = vPosition;\n" | 180 " gl_Position = vPosition;\n" |
197 "}"; | 181 "}"; |
198 | 182 |
199 std::string info_log, translated_source; | 183 std::string info_log, translated_source; |
200 int shader_version; | 184 int shader_version; |
201 AttributeMap attrib_map; | 185 AttributeMap attrib_map; |
202 UniformMap uniform_map; | 186 UniformMap uniform_map; |
203 VaryingMap varying_map; | 187 VaryingMap varying_map; |
| 188 AttributeList output_variable_list; |
204 NameMap name_map; | 189 NameMap name_map; |
205 EXPECT_TRUE(vertex_translator_->Translate(shader, | 190 EXPECT_TRUE(vertex_translator_->Translate( |
206 &info_log, | 191 shader, &info_log, &translated_source, &shader_version, &attrib_map, |
207 &translated_source, | 192 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
208 &shader_version, | |
209 &attrib_map, | |
210 &uniform_map, | |
211 &varying_map, | |
212 &name_map)); | |
213 // Info log must be NULL. | 193 // Info log must be NULL. |
214 EXPECT_TRUE(info_log.empty()); | 194 EXPECT_TRUE(info_log.empty()); |
215 // Translated shader must be valid and non-empty. | 195 // Translated shader must be valid and non-empty. |
216 EXPECT_FALSE(translated_source.empty()); | 196 EXPECT_FALSE(translated_source.empty()); |
217 // There should be no uniforms. | 197 // There should be no uniforms. |
218 EXPECT_TRUE(uniform_map.empty()); | 198 EXPECT_TRUE(uniform_map.empty()); |
219 // There should be one attribute with following characteristics: | 199 // There should be one attribute with following characteristics: |
220 // name:vPosition type:GL_FLOAT_VEC4 size:0. | 200 // name:vPosition type:GL_FLOAT_VEC4 size:0. |
221 EXPECT_EQ(1u, attrib_map.size()); | 201 EXPECT_EQ(1u, attrib_map.size()); |
222 AttributeMap::const_iterator iter = attrib_map.find("vPosition"); | 202 AttributeMap::const_iterator iter = attrib_map.find("vPosition"); |
(...skipping 15 matching lines...) Expand all Loading... |
238 "uniform Bar bar[2];\n" | 218 "uniform Bar bar[2];\n" |
239 "void main() {\n" | 219 "void main() {\n" |
240 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" | 220 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" |
241 "}"; | 221 "}"; |
242 | 222 |
243 std::string info_log, translated_source; | 223 std::string info_log, translated_source; |
244 int shader_version; | 224 int shader_version; |
245 AttributeMap attrib_map; | 225 AttributeMap attrib_map; |
246 UniformMap uniform_map; | 226 UniformMap uniform_map; |
247 VaryingMap varying_map; | 227 VaryingMap varying_map; |
| 228 AttributeList output_variable_list; |
248 NameMap name_map; | 229 NameMap name_map; |
249 EXPECT_TRUE(fragment_translator_->Translate(shader, | 230 EXPECT_TRUE(fragment_translator_->Translate( |
250 &info_log, | 231 shader, &info_log, &translated_source, &shader_version, &attrib_map, |
251 &translated_source, | 232 &uniform_map, &varying_map, &output_variable_list, &name_map)); |
252 &shader_version, | |
253 &attrib_map, | |
254 &uniform_map, | |
255 &varying_map, | |
256 &name_map)); | |
257 // Info log must be NULL. | 233 // Info log must be NULL. |
258 EXPECT_TRUE(info_log.empty()); | 234 EXPECT_TRUE(info_log.empty()); |
259 // Translated shader must be valid and non-empty. | 235 // Translated shader must be valid and non-empty. |
260 EXPECT_FALSE(translated_source.empty()); | 236 EXPECT_FALSE(translated_source.empty()); |
261 // There should be no attributes. | 237 // There should be no attributes. |
262 EXPECT_TRUE(attrib_map.empty()); | 238 EXPECT_TRUE(attrib_map.empty()); |
263 // There should be two uniforms with following characteristics: | 239 // There should be two uniforms with following characteristics: |
264 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1 | 240 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1 |
265 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1 | 241 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1 |
266 // However, there will be only one entry "bar" in the map. | 242 // However, there will be only one entry "bar" in the map. |
267 EXPECT_EQ(1u, uniform_map.size()); | 243 EXPECT_EQ(1u, uniform_map.size()); |
268 UniformMap::const_iterator iter = uniform_map.find("bar"); | 244 UniformMap::const_iterator iter = uniform_map.find("bar"); |
269 EXPECT_TRUE(iter != uniform_map.end()); | 245 EXPECT_TRUE(iter != uniform_map.end()); |
270 // First uniform. | 246 // First uniform. |
271 const sh::ShaderVariable* info; | 247 const sh::ShaderVariable* info; |
272 std::string original_name; | 248 std::string original_name; |
273 EXPECT_TRUE(iter->second.findInfoByMappedName( | 249 EXPECT_TRUE(iter->second.findInfoByMappedName( |
274 "bar[0].foo.color[0]", &info, &original_name)); | 250 "bar[0].foo.color[0]", &info, &original_name)); |
275 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type); | 251 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type); |
276 EXPECT_EQ(1u, info->arraySize); | 252 EXPECT_EQ(1u, info->arraySize); |
277 EXPECT_STREQ("color", info->name.c_str()); | 253 EXPECT_STREQ("color", info->name.c_str()); |
278 EXPECT_STREQ("bar[0].foo.color[0]", original_name.c_str()); | 254 EXPECT_STREQ("bar[0].foo.color[0]", original_name.c_str()); |
279 // Second uniform. | 255 // Second uniform. |
280 EXPECT_TRUE(iter->second.findInfoByMappedName( | 256 EXPECT_TRUE(iter->second.findInfoByMappedName( |
281 "bar[1].foo.color[0]", &info, &original_name)); | 257 "bar[1].foo.color[0]", &info, &original_name)); |
282 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type); | 258 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type); |
283 EXPECT_EQ(1u, info->arraySize); | 259 EXPECT_EQ(1u, info->arraySize); |
284 EXPECT_STREQ("color", info->name.c_str()); | 260 EXPECT_STREQ("color", info->name.c_str()); |
285 EXPECT_STREQ("bar[1].foo.color[0]", original_name.c_str()); | 261 EXPECT_STREQ("bar[1].foo.color[0]", original_name.c_str()); |
| 262 EXPECT_EQ(1u, output_variable_list.size()); |
| 263 ASSERT_TRUE(output_variable_list.size() > 0); |
| 264 EXPECT_EQ(output_variable_list[0].mappedName, "gl_FragColor"); |
286 } | 265 } |
287 | 266 |
288 TEST_F(ShaderTranslatorTest, OptionsString) { | 267 TEST_F(ShaderTranslatorTest, OptionsString) { |
289 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator(); | 268 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator(); |
290 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator(); | 269 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator(); |
291 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator(); | 270 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator(); |
292 | 271 |
293 ShBuiltInResources resources; | 272 ShBuiltInResources resources; |
294 ShInitBuiltInResources(&resources); | 273 ShInitBuiltInResources(&resources); |
295 | 274 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 ShShaderOutput shader_output_language = | 324 ShShaderOutput shader_output_language = |
346 ShaderTranslator::GetShaderOutputLanguageForContext( | 325 ShaderTranslator::GetShaderOutputLanguageForContext( |
347 output_context_version); | 326 output_context_version); |
348 ASSERT_TRUE(translator->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, | 327 ASSERT_TRUE(translator->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
349 shader_output_language, compile_options)); | 328 shader_output_language, compile_options)); |
350 | 329 |
351 std::string translated_source; | 330 std::string translated_source; |
352 int shader_version; | 331 int shader_version; |
353 EXPECT_TRUE(translator->Translate(kShader, nullptr, &translated_source, | 332 EXPECT_TRUE(translator->Translate(kShader, nullptr, &translated_source, |
354 &shader_version, nullptr, nullptr, nullptr, | 333 &shader_version, nullptr, nullptr, nullptr, |
355 nullptr)); | 334 nullptr, nullptr)); |
356 | 335 |
357 std::string expected_version_directive = testing::get<1>(GetParam()); | 336 std::string expected_version_directive = testing::get<1>(GetParam()); |
358 if (expected_version_directive.empty()) { | 337 if (expected_version_directive.empty()) { |
359 EXPECT_TRUE(translated_source.find("#version") == std::string::npos) | 338 EXPECT_TRUE(translated_source.find("#version") == std::string::npos) |
360 << "Translation was:\n" << translated_source; | 339 << "Translation was:\n" << translated_source; |
361 } else { | 340 } else { |
362 EXPECT_TRUE(translated_source.find(expected_version_directive) != | 341 EXPECT_TRUE(translated_source.find(expected_version_directive) != |
363 std::string::npos) | 342 std::string::npos) |
364 << "Translation was:\n" << translated_source; | 343 << "Translation was:\n" << translated_source; |
365 } | 344 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 ShaderTranslatorOutputVersionTest, | 401 ShaderTranslatorOutputVersionTest, |
423 testing::Values(make_gl_glsl_tuple("opengl es 2.0", ""), | 402 testing::Values(make_gl_glsl_tuple("opengl es 2.0", ""), |
424 make_gl_glsl_tuple("opengl es 3.0", ""), | 403 make_gl_glsl_tuple("opengl es 3.0", ""), |
425 make_gl_glsl_tuple("opengl es 3.1", ""), | 404 make_gl_glsl_tuple("opengl es 3.1", ""), |
426 make_gl_glsl_tuple("opengl es 3.2", | 405 make_gl_glsl_tuple("opengl es 3.2", |
427 ""))); | 406 ""))); |
428 | 407 |
429 } // namespace gles2 | 408 } // namespace gles2 |
430 } // namespace gpu | 409 } // namespace gpu |
431 | 410 |
OLD | NEW |