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

Side by Side Diff: gpu/command_buffer/service/shader_translator_unittest.cc

Issue 619723008: Switch to use ANGLE's new APIs to query shader variables. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: win build fix Created 6 years, 2 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 (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 9
10 namespace gpu { 10 namespace gpu {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 }; 47 };
48 48
49 TEST_F(ShaderTranslatorTest, ValidVertexShader) { 49 TEST_F(ShaderTranslatorTest, ValidVertexShader) {
50 const char* shader = 50 const char* shader =
51 "void main() {\n" 51 "void main() {\n"
52 " gl_Position = vec4(1.0);\n" 52 " gl_Position = vec4(1.0);\n"
53 "}"; 53 "}";
54 54
55 // A valid shader should be successfully translated. 55 // A valid shader should be successfully translated.
56 std::string info_log, translated_source; 56 std::string info_log, translated_source;
57 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 57 AttributeMap attrib_map;
58 ShaderTranslatorInterface::NameMap name_map; 58 UniformMap uniform_map;
59 VaryingMap varying_map;
60 NameMap name_map;
59 EXPECT_TRUE(vertex_translator_->Translate(shader, 61 EXPECT_TRUE(vertex_translator_->Translate(shader,
60 &info_log, 62 &info_log,
61 &translated_source, 63 &translated_source,
62 &attrib_map, 64 &attrib_map,
63 &uniform_map, 65 &uniform_map,
64 &varying_map, 66 &varying_map,
65 &name_map)); 67 &name_map));
66 // Info log must be NULL. 68 // Info log must be NULL.
67 EXPECT_TRUE(info_log.empty()); 69 EXPECT_TRUE(info_log.empty());
68 // Translated shader must be valid and non-empty. 70 // Translated shader must be valid and non-empty.
69 ASSERT_FALSE(translated_source.empty()); 71 ASSERT_FALSE(translated_source.empty());
70 // There should be no attributes, uniforms, varyings. 72 // There should be no attributes, uniforms, varyings.
71 EXPECT_TRUE(attrib_map.empty()); 73 EXPECT_TRUE(attrib_map.empty());
72 EXPECT_TRUE(uniform_map.empty()); 74 EXPECT_TRUE(uniform_map.empty());
73 EXPECT_TRUE(varying_map.empty()); 75 EXPECT_TRUE(varying_map.empty());
74 // There should be no name mapping. 76 // There should be no name mapping.
75 EXPECT_TRUE(name_map.empty()); 77 EXPECT_TRUE(name_map.empty());
76 } 78 }
77 79
78 TEST_F(ShaderTranslatorTest, InvalidVertexShader) { 80 TEST_F(ShaderTranslatorTest, InvalidVertexShader) {
79 const char* bad_shader = "foo-bar"; 81 const char* bad_shader = "foo-bar";
80 const char* good_shader = 82 const char* good_shader =
81 "void main() {\n" 83 "void main() {\n"
82 " gl_Position = vec4(1.0);\n" 84 " gl_Position = vec4(1.0);\n"
83 "}"; 85 "}";
84 86
85 // An invalid shader should fail. 87 // An invalid shader should fail.
86 std::string info_log, translated_source; 88 std::string info_log, translated_source;
87 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 89 AttributeMap attrib_map;
88 ShaderTranslatorInterface::NameMap name_map; 90 UniformMap uniform_map;
91 VaryingMap varying_map;
92 NameMap name_map;
89 EXPECT_FALSE(vertex_translator_->Translate(bad_shader, 93 EXPECT_FALSE(vertex_translator_->Translate(bad_shader,
90 &info_log, 94 &info_log,
91 &translated_source, 95 &translated_source,
92 &attrib_map, 96 &attrib_map,
93 &uniform_map, 97 &uniform_map,
94 &varying_map, 98 &varying_map,
95 &name_map)); 99 &name_map));
96 // Info log must be valid and non-empty. 100 // Info log must be valid and non-empty.
97 ASSERT_FALSE(info_log.empty()); 101 ASSERT_FALSE(info_log.empty());
98 // Translated shader must be NULL. 102 // Translated shader must be NULL.
(...skipping 18 matching lines...) Expand all
117 } 121 }
118 122
119 TEST_F(ShaderTranslatorTest, ValidFragmentShader) { 123 TEST_F(ShaderTranslatorTest, ValidFragmentShader) {
120 const char* shader = 124 const char* shader =
121 "void main() {\n" 125 "void main() {\n"
122 " gl_FragColor = vec4(1.0);\n" 126 " gl_FragColor = vec4(1.0);\n"
123 "}"; 127 "}";
124 128
125 // A valid shader should be successfully translated. 129 // A valid shader should be successfully translated.
126 std::string info_log, translated_source; 130 std::string info_log, translated_source;
127 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 131 AttributeMap attrib_map;
128 ShaderTranslatorInterface::NameMap name_map; 132 UniformMap uniform_map;
133 VaryingMap varying_map;
134 NameMap name_map;
129 EXPECT_TRUE(fragment_translator_->Translate(shader, 135 EXPECT_TRUE(fragment_translator_->Translate(shader,
130 &info_log, 136 &info_log,
131 &translated_source, 137 &translated_source,
132 &attrib_map, 138 &attrib_map,
133 &uniform_map, 139 &uniform_map,
134 &varying_map, 140 &varying_map,
135 &name_map)); 141 &name_map));
136 // Info log must be NULL. 142 // Info log must be NULL.
137 EXPECT_TRUE(info_log.empty()); 143 EXPECT_TRUE(info_log.empty());
138 // Translated shader must be valid and non-empty. 144 // Translated shader must be valid and non-empty.
139 ASSERT_FALSE(translated_source.empty()); 145 ASSERT_FALSE(translated_source.empty());
140 // There should be no attributes, uniforms, varyings, or name mapping. 146 // There should be no attributes, uniforms, varyings, or name mapping.
141 EXPECT_TRUE(attrib_map.empty()); 147 EXPECT_TRUE(attrib_map.empty());
142 EXPECT_TRUE(uniform_map.empty()); 148 EXPECT_TRUE(uniform_map.empty());
143 EXPECT_TRUE(varying_map.empty()); 149 EXPECT_TRUE(varying_map.empty());
144 EXPECT_TRUE(name_map.empty()); 150 EXPECT_TRUE(name_map.empty());
145 } 151 }
146 152
147 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) { 153 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) {
148 const char* shader = "foo-bar"; 154 const char* shader = "foo-bar";
149 155
150 std::string info_log, translated_source; 156 std::string info_log, translated_source;
151 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 157 AttributeMap attrib_map;
152 ShaderTranslatorInterface::NameMap name_map; 158 UniformMap uniform_map;
159 VaryingMap varying_map;
160 NameMap name_map;
153 // An invalid shader should fail. 161 // An invalid shader should fail.
154 EXPECT_FALSE(fragment_translator_->Translate(shader, 162 EXPECT_FALSE(fragment_translator_->Translate(shader,
155 &info_log, 163 &info_log,
156 &translated_source, 164 &translated_source,
157 &attrib_map, 165 &attrib_map,
158 &uniform_map, 166 &uniform_map,
159 &varying_map, 167 &varying_map,
160 &name_map)); 168 &name_map));
161 // Info log must be valid and non-empty. 169 // Info log must be valid and non-empty.
162 EXPECT_FALSE(info_log.empty()); 170 EXPECT_FALSE(info_log.empty());
163 // Translated shader must be NULL. 171 // Translated shader must be NULL.
164 EXPECT_TRUE(translated_source.empty()); 172 EXPECT_TRUE(translated_source.empty());
165 // There should be no attributes or uniforms. 173 // There should be no attributes or uniforms.
166 EXPECT_TRUE(attrib_map.empty()); 174 EXPECT_TRUE(attrib_map.empty());
167 EXPECT_TRUE(uniform_map.empty()); 175 EXPECT_TRUE(uniform_map.empty());
168 EXPECT_TRUE(varying_map.empty()); 176 EXPECT_TRUE(varying_map.empty());
169 EXPECT_TRUE(name_map.empty()); 177 EXPECT_TRUE(name_map.empty());
170 } 178 }
171 179
172 TEST_F(ShaderTranslatorTest, GetAttributes) { 180 TEST_F(ShaderTranslatorTest, GetAttributes) {
173 const char* shader = 181 const char* shader =
174 "attribute vec4 vPosition;\n" 182 "attribute vec4 vPosition;\n"
175 "void main() {\n" 183 "void main() {\n"
176 " gl_Position = vPosition;\n" 184 " gl_Position = vPosition;\n"
177 "}"; 185 "}";
178 186
179 std::string info_log, translated_source; 187 std::string info_log, translated_source;
180 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 188 AttributeMap attrib_map;
181 ShaderTranslatorInterface::NameMap name_map; 189 UniformMap uniform_map;
190 VaryingMap varying_map;
191 NameMap name_map;
182 EXPECT_TRUE(vertex_translator_->Translate(shader, 192 EXPECT_TRUE(vertex_translator_->Translate(shader,
183 &info_log, 193 &info_log,
184 &translated_source, 194 &translated_source,
185 &attrib_map, 195 &attrib_map,
186 &uniform_map, 196 &uniform_map,
187 &varying_map, 197 &varying_map,
188 &name_map)); 198 &name_map));
189 // Info log must be NULL. 199 // Info log must be NULL.
190 EXPECT_TRUE(info_log.empty()); 200 EXPECT_TRUE(info_log.empty());
191 // Translated shader must be valid and non-empty. 201 // Translated shader must be valid and non-empty.
192 EXPECT_FALSE(translated_source.empty()); 202 EXPECT_FALSE(translated_source.empty());
193 // There should be no uniforms. 203 // There should be no uniforms.
194 EXPECT_TRUE(uniform_map.empty()); 204 EXPECT_TRUE(uniform_map.empty());
195 // There should be one attribute with following characteristics: 205 // There should be one attribute with following characteristics:
196 // name:vPosition type:GL_FLOAT_VEC4 size:1. 206 // name:vPosition type:GL_FLOAT_VEC4 size:0.
197 EXPECT_EQ(1u, attrib_map.size()); 207 EXPECT_EQ(1u, attrib_map.size());
198 ShaderTranslator::VariableMap::const_iterator iter = 208 AttributeMap::const_iterator iter = attrib_map.find("vPosition");
199 attrib_map.find("vPosition");
200 EXPECT_TRUE(iter != attrib_map.end()); 209 EXPECT_TRUE(iter != attrib_map.end());
201 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 210 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), iter->second.type);
202 EXPECT_EQ(1, iter->second.size); 211 EXPECT_EQ(0u, iter->second.arraySize);
203 EXPECT_EQ("vPosition", iter->second.name); 212 EXPECT_EQ("vPosition", iter->second.name);
204 } 213 }
205 214
206 TEST_F(ShaderTranslatorTest, GetUniforms) { 215 TEST_F(ShaderTranslatorTest, GetUniforms) {
207 const char* shader = 216 const char* shader =
208 "precision mediump float;\n" 217 "precision mediump float;\n"
209 "struct Foo {\n" 218 "struct Foo {\n"
210 " vec4 color[1];\n" 219 " vec4 color[1];\n"
211 "};\n" 220 "};\n"
212 "struct Bar {\n" 221 "struct Bar {\n"
213 " Foo foo;\n" 222 " Foo foo;\n"
214 "};\n" 223 "};\n"
215 "uniform Bar bar[2];\n" 224 "uniform Bar bar[2];\n"
216 "void main() {\n" 225 "void main() {\n"
217 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" 226 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n"
218 "}"; 227 "}";
219 228
220 std::string info_log, translated_source; 229 std::string info_log, translated_source;
221 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 230 AttributeMap attrib_map;
222 ShaderTranslatorInterface::NameMap name_map; 231 UniformMap uniform_map;
232 VaryingMap varying_map;
233 NameMap name_map;
223 EXPECT_TRUE(fragment_translator_->Translate(shader, 234 EXPECT_TRUE(fragment_translator_->Translate(shader,
224 &info_log, 235 &info_log,
225 &translated_source, 236 &translated_source,
226 &attrib_map, 237 &attrib_map,
227 &uniform_map, 238 &uniform_map,
228 &varying_map, 239 &varying_map,
229 &name_map)); 240 &name_map));
230 // Info log must be NULL. 241 // Info log must be NULL.
231 EXPECT_TRUE(info_log.empty()); 242 EXPECT_TRUE(info_log.empty());
232 // Translated shader must be valid and non-empty. 243 // Translated shader must be valid and non-empty.
233 EXPECT_FALSE(translated_source.empty()); 244 EXPECT_FALSE(translated_source.empty());
234 // There should be no attributes. 245 // There should be no attributes.
235 EXPECT_TRUE(attrib_map.empty()); 246 EXPECT_TRUE(attrib_map.empty());
236 // There should be two uniforms with following characteristics: 247 // There should be two uniforms with following characteristics:
237 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1 248 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1
238 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1 249 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1
239 EXPECT_EQ(2u, uniform_map.size()); 250 // However, there will be only one entry "bar" in the map.
251 EXPECT_EQ(1u, uniform_map.size());
252 UniformMap::const_iterator iter = uniform_map.find("bar");
253 EXPECT_TRUE(iter != uniform_map.end());
240 // First uniform. 254 // First uniform.
241 ShaderTranslator::VariableMap::const_iterator iter = 255 const sh::ShaderVariable* info;
242 uniform_map.find("bar[0].foo.color[0]"); 256 std::string original_name;
243 EXPECT_TRUE(iter != uniform_map.end()); 257 EXPECT_TRUE(iter->second.findInfoByMappedName(
244 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 258 "bar[0].foo.color[0]", &info, &original_name));
245 EXPECT_EQ(1, iter->second.size); 259 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type);
246 EXPECT_EQ("bar[0].foo.color[0]", iter->second.name); 260 EXPECT_EQ(1u, info->arraySize);
261 EXPECT_STREQ("color", info->name.c_str());
262 EXPECT_STREQ("bar[0].foo.color[0]", original_name.c_str());
247 // Second uniform. 263 // Second uniform.
248 iter = uniform_map.find("bar[1].foo.color[0]"); 264 EXPECT_TRUE(iter->second.findInfoByMappedName(
249 EXPECT_TRUE(iter != uniform_map.end()); 265 "bar[1].foo.color[0]", &info, &original_name));
250 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 266 EXPECT_EQ(static_cast<GLenum>(GL_FLOAT_VEC4), info->type);
251 EXPECT_EQ(1, iter->second.size); 267 EXPECT_EQ(1u, info->arraySize);
252 EXPECT_EQ("bar[1].foo.color[0]", iter->second.name); 268 EXPECT_STREQ("color", info->name.c_str());
269 EXPECT_STREQ("bar[1].foo.color[0]", original_name.c_str());
253 } 270 }
254 271
255 #if defined(OS_MACOSX) 272 #if defined(OS_MACOSX)
256 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) { 273 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) {
257 // This test might become invalid in the future when ANGLE Translator is no 274 // This test might become invalid in the future when ANGLE Translator is no
258 // longer emulate dot(float, float) in Mac, or the emulated function name is 275 // longer emulate dot(float, float) in Mac, or the emulated function name is
259 // no longer webgl_dot_emu. 276 // no longer webgl_dot_emu.
260 const char* shader = 277 const char* shader =
261 "void main() {\n" 278 "void main() {\n"
262 " gl_Position = vec4(dot(1.0, 1.0), 1.0, 1.0, 1.0);\n" 279 " gl_Position = vec4(dot(1.0, 1.0), 1.0, 1.0, 1.0);\n"
263 "}"; 280 "}";
264 281
265 std::string info_log, translated_source; 282 std::string info_log, translated_source;
266 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map; 283 AttributeMap attrib_map;
267 ShaderTranslatorInterface::NameMap name_map; 284 UniformMap uniform_map;
285 VaryingMap varying_map;
286 NameMap name_map;
268 EXPECT_TRUE(vertex_translator_->Translate(shader, 287 EXPECT_TRUE(vertex_translator_->Translate(shader,
269 &info_log, 288 &info_log,
270 &translated_source, 289 &translated_source,
271 &attrib_map, 290 &attrib_map,
272 &uniform_map, 291 &uniform_map,
273 &varying_map, 292 &varying_map,
274 &name_map)); 293 &name_map));
275 // Info log must be NULL. 294 // Info log must be NULL.
276 EXPECT_TRUE(info_log.empty()); 295 EXPECT_TRUE(info_log.empty());
277 // Translated shader must be valid and non-empty. 296 // Translated shader must be valid and non-empty.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 333
315 EXPECT_EQ(options_1, options_2); 334 EXPECT_EQ(options_1, options_2);
316 EXPECT_NE(options_1, options_3); 335 EXPECT_NE(options_1, options_3);
317 EXPECT_NE(options_1, options_4); 336 EXPECT_NE(options_1, options_4);
318 EXPECT_NE(options_3, options_4); 337 EXPECT_NE(options_3, options_4);
319 } 338 }
320 339
321 } // namespace gles2 340 } // namespace gles2
322 } // namespace gpu 341 } // namespace gpu
323 342
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/shader_translator.cc ('k') | gpu/command_buffer/service/test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698