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

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

Issue 566023002: Clean up interfaces between Shader / ShaderTranslator / ANGLE side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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 18 matching lines...) Expand all
29 fragment_translator_ = new ShaderTranslator(); 29 fragment_translator_ = new ShaderTranslator();
30 30
31 ASSERT_TRUE(vertex_translator_->Init( 31 ASSERT_TRUE(vertex_translator_->Init(
32 GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, 32 GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
33 ShaderTranslatorInterface::kGlsl, 33 ShaderTranslatorInterface::kGlsl,
34 SH_EMULATE_BUILT_IN_FUNCTIONS)); 34 SH_EMULATE_BUILT_IN_FUNCTIONS));
35 ASSERT_TRUE(fragment_translator_->Init( 35 ASSERT_TRUE(fragment_translator_->Init(
36 GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, 36 GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources,
37 ShaderTranslatorInterface::kGlsl, 37 ShaderTranslatorInterface::kGlsl,
38 static_cast<ShCompileOptions>(0))); 38 static_cast<ShCompileOptions>(0)));
39 // Post-init the results must be empty.
40 // Vertex translator results.
41 EXPECT_TRUE(vertex_translator_->translated_shader() == NULL);
42 EXPECT_TRUE(vertex_translator_->info_log() == NULL);
43 EXPECT_TRUE(vertex_translator_->attrib_map().empty());
44 EXPECT_TRUE(vertex_translator_->uniform_map().empty());
45 // Fragment translator results.
46 EXPECT_TRUE(fragment_translator_->translated_shader() == NULL);
47 EXPECT_TRUE(fragment_translator_->info_log() == NULL);
48 EXPECT_TRUE(fragment_translator_->attrib_map().empty());
49 EXPECT_TRUE(fragment_translator_->uniform_map().empty());
50 } 39 }
51 virtual void TearDown() { 40 virtual void TearDown() {
52 vertex_translator_ = NULL; 41 vertex_translator_ = NULL;
53 fragment_translator_ = NULL; 42 fragment_translator_ = NULL;
54 } 43 }
55 44
56 scoped_refptr<ShaderTranslator> vertex_translator_; 45 scoped_refptr<ShaderTranslator> vertex_translator_;
57 scoped_refptr<ShaderTranslator> fragment_translator_; 46 scoped_refptr<ShaderTranslator> fragment_translator_;
58 }; 47 };
59 48
60 TEST_F(ShaderTranslatorTest, ValidVertexShader) { 49 TEST_F(ShaderTranslatorTest, ValidVertexShader) {
61 const char* shader = 50 const char* shader =
62 "void main() {\n" 51 "void main() {\n"
63 " gl_Position = vec4(1.0);\n" 52 " gl_Position = vec4(1.0);\n"
64 "}"; 53 "}";
65 54
66 // A valid shader should be successfully translated. 55 // A valid shader should be successfully translated.
67 EXPECT_TRUE(vertex_translator_->Translate(shader)); 56 std::string info_log, translated_source;
57 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
58 ShaderTranslatorInterface::NameMap name_map;
59 EXPECT_TRUE(vertex_translator_->Translate(shader,
60 &info_log,
61 &translated_source,
62 &attrib_map,
63 &uniform_map,
64 &varying_map,
65 &name_map));
68 // Info log must be NULL. 66 // Info log must be NULL.
69 EXPECT_TRUE(vertex_translator_->info_log() == NULL); 67 EXPECT_TRUE(info_log.empty());
70 // Translated shader must be valid and non-empty. 68 // Translated shader must be valid and non-empty.
71 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); 69 ASSERT_FALSE(translated_source.empty());
72 EXPECT_GT(strlen(vertex_translator_->translated_shader()), 0u); 70 // There should be no attributes, uniforms, varyings.
73 // There should be no attributes or uniforms. 71 EXPECT_TRUE(attrib_map.empty());
74 EXPECT_TRUE(vertex_translator_->attrib_map().empty()); 72 EXPECT_TRUE(uniform_map.empty());
75 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); 73 EXPECT_TRUE(varying_map.empty());
74 // There should be no name mapping.
75 EXPECT_TRUE(name_map.empty());
76 } 76 }
77 77
78 TEST_F(ShaderTranslatorTest, InvalidVertexShader) { 78 TEST_F(ShaderTranslatorTest, InvalidVertexShader) {
79 const char* bad_shader = "foo-bar"; 79 const char* bad_shader = "foo-bar";
80 const char* good_shader = 80 const char* good_shader =
81 "void main() {\n" 81 "void main() {\n"
82 " gl_Position = vec4(1.0);\n" 82 " gl_Position = vec4(1.0);\n"
83 "}"; 83 "}";
84 84
85 // An invalid shader should fail. 85 // An invalid shader should fail.
86 EXPECT_FALSE(vertex_translator_->Translate(bad_shader)); 86 std::string info_log, translated_source;
87 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
88 ShaderTranslatorInterface::NameMap name_map;
89 EXPECT_FALSE(vertex_translator_->Translate(bad_shader,
90 &info_log,
91 &translated_source,
92 &attrib_map,
93 &uniform_map,
94 &varying_map,
95 &name_map));
87 // Info log must be valid and non-empty. 96 // Info log must be valid and non-empty.
88 ASSERT_TRUE(vertex_translator_->info_log() != NULL); 97 ASSERT_FALSE(info_log.empty());
89 EXPECT_GT(strlen(vertex_translator_->info_log()), 0u);
90 // Translated shader must be NULL. 98 // Translated shader must be NULL.
91 EXPECT_TRUE(vertex_translator_->translated_shader() == NULL); 99 EXPECT_TRUE(translated_source.empty());
92 // There should be no attributes or uniforms. 100 // There should be no attributes, uniforms, varyings, or name mapping.
93 EXPECT_TRUE(vertex_translator_->attrib_map().empty()); 101 EXPECT_TRUE(attrib_map.empty());
94 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); 102 EXPECT_TRUE(uniform_map.empty());
103 EXPECT_TRUE(varying_map.empty());
104 EXPECT_TRUE(name_map.empty());
95 105
96 // Try a good shader after bad. 106 // Try a good shader after bad.
97 EXPECT_TRUE(vertex_translator_->Translate(good_shader)); 107 info_log.clear();
98 EXPECT_TRUE(vertex_translator_->info_log() == NULL); 108 EXPECT_TRUE(vertex_translator_->Translate(good_shader,
99 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); 109 &info_log,
100 EXPECT_GT(strlen(vertex_translator_->translated_shader()), 0u); 110 &translated_source,
111 &attrib_map,
112 &uniform_map,
113 &varying_map,
114 &name_map));
115 EXPECT_TRUE(info_log.empty());
116 EXPECT_FALSE(translated_source.empty());
101 } 117 }
102 118
103 TEST_F(ShaderTranslatorTest, ValidFragmentShader) { 119 TEST_F(ShaderTranslatorTest, ValidFragmentShader) {
104 const char* shader = 120 const char* shader =
105 "void main() {\n" 121 "void main() {\n"
106 " gl_FragColor = vec4(1.0);\n" 122 " gl_FragColor = vec4(1.0);\n"
107 "}"; 123 "}";
108 124
109 // A valid shader should be successfully translated. 125 // A valid shader should be successfully translated.
110 EXPECT_TRUE(fragment_translator_->Translate(shader)); 126 std::string info_log, translated_source;
127 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
128 ShaderTranslatorInterface::NameMap name_map;
129 EXPECT_TRUE(fragment_translator_->Translate(shader,
130 &info_log,
131 &translated_source,
132 &attrib_map,
133 &uniform_map,
134 &varying_map,
135 &name_map));
111 // Info log must be NULL. 136 // Info log must be NULL.
112 EXPECT_TRUE(fragment_translator_->info_log() == NULL); 137 EXPECT_TRUE(info_log.empty());
113 // Translated shader must be valid and non-empty. 138 // Translated shader must be valid and non-empty.
114 ASSERT_TRUE(fragment_translator_->translated_shader() != NULL); 139 ASSERT_FALSE(translated_source.empty());
115 EXPECT_GT(strlen(fragment_translator_->translated_shader()), 0u); 140 // There should be no attributes, uniforms, varyings, or name mapping.
116 // There should be no attributes or uniforms. 141 EXPECT_TRUE(attrib_map.empty());
117 EXPECT_TRUE(fragment_translator_->attrib_map().empty()); 142 EXPECT_TRUE(uniform_map.empty());
118 EXPECT_TRUE(fragment_translator_->uniform_map().empty()); 143 EXPECT_TRUE(varying_map.empty());
144 EXPECT_TRUE(name_map.empty());
119 } 145 }
120 146
121 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) { 147 TEST_F(ShaderTranslatorTest, InvalidFragmentShader) {
122 const char* shader = "foo-bar"; 148 const char* shader = "foo-bar";
123 149
150 std::string info_log, translated_source;
151 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
152 ShaderTranslatorInterface::NameMap name_map;
124 // An invalid shader should fail. 153 // An invalid shader should fail.
125 EXPECT_FALSE(fragment_translator_->Translate(shader)); 154 EXPECT_FALSE(fragment_translator_->Translate(shader,
155 &info_log,
156 &translated_source,
157 &attrib_map,
158 &uniform_map,
159 &varying_map,
160 &name_map));
126 // Info log must be valid and non-empty. 161 // Info log must be valid and non-empty.
127 ASSERT_TRUE(fragment_translator_->info_log() != NULL); 162 EXPECT_FALSE(info_log.empty());
128 EXPECT_GT(strlen(fragment_translator_->info_log()), 0u);
129 // Translated shader must be NULL. 163 // Translated shader must be NULL.
130 EXPECT_TRUE(fragment_translator_->translated_shader() == NULL); 164 EXPECT_TRUE(translated_source.empty());
131 // There should be no attributes or uniforms. 165 // There should be no attributes or uniforms.
132 EXPECT_TRUE(fragment_translator_->attrib_map().empty()); 166 EXPECT_TRUE(attrib_map.empty());
133 EXPECT_TRUE(fragment_translator_->uniform_map().empty()); 167 EXPECT_TRUE(uniform_map.empty());
168 EXPECT_TRUE(varying_map.empty());
169 EXPECT_TRUE(name_map.empty());
134 } 170 }
135 171
136 TEST_F(ShaderTranslatorTest, GetAttributes) { 172 TEST_F(ShaderTranslatorTest, GetAttributes) {
137 const char* shader = 173 const char* shader =
138 "attribute vec4 vPosition;\n" 174 "attribute vec4 vPosition;\n"
139 "void main() {\n" 175 "void main() {\n"
140 " gl_Position = vPosition;\n" 176 " gl_Position = vPosition;\n"
141 "}"; 177 "}";
142 178
143 EXPECT_TRUE(vertex_translator_->Translate(shader)); 179 std::string info_log, translated_source;
180 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
181 ShaderTranslatorInterface::NameMap name_map;
182 EXPECT_TRUE(vertex_translator_->Translate(shader,
183 &info_log,
184 &translated_source,
185 &attrib_map,
186 &uniform_map,
187 &varying_map,
188 &name_map));
144 // Info log must be NULL. 189 // Info log must be NULL.
145 EXPECT_TRUE(vertex_translator_->info_log() == NULL); 190 EXPECT_TRUE(info_log.empty());
146 // Translated shader must be valid and non-empty. 191 // Translated shader must be valid and non-empty.
147 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); 192 EXPECT_FALSE(translated_source.empty());
148 EXPECT_GT(strlen(vertex_translator_->translated_shader()), 0u);
149 // There should be no uniforms. 193 // There should be no uniforms.
150 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); 194 EXPECT_TRUE(uniform_map.empty());
151 // There should be one attribute with following characteristics: 195 // There should be one attribute with following characteristics:
152 // name:vPosition type:GL_FLOAT_VEC4 size:1. 196 // name:vPosition type:GL_FLOAT_VEC4 size:1.
153 const ShaderTranslator::VariableMap& attrib_map =
154 vertex_translator_->attrib_map();
155 EXPECT_EQ(1u, attrib_map.size()); 197 EXPECT_EQ(1u, attrib_map.size());
156 ShaderTranslator::VariableMap::const_iterator iter = 198 ShaderTranslator::VariableMap::const_iterator iter =
157 attrib_map.find("vPosition"); 199 attrib_map.find("vPosition");
158 EXPECT_TRUE(iter != attrib_map.end()); 200 EXPECT_TRUE(iter != attrib_map.end());
159 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 201 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type);
160 EXPECT_EQ(1, iter->second.size); 202 EXPECT_EQ(1, iter->second.size);
161 EXPECT_EQ("vPosition", iter->second.name); 203 EXPECT_EQ("vPosition", iter->second.name);
162 } 204 }
163 205
164 TEST_F(ShaderTranslatorTest, GetUniforms) { 206 TEST_F(ShaderTranslatorTest, GetUniforms) {
165 const char* shader = 207 const char* shader =
166 "precision mediump float;\n" 208 "precision mediump float;\n"
167 "struct Foo {\n" 209 "struct Foo {\n"
168 " vec4 color[1];\n" 210 " vec4 color[1];\n"
169 "};\n" 211 "};\n"
170 "struct Bar {\n" 212 "struct Bar {\n"
171 " Foo foo;\n" 213 " Foo foo;\n"
172 "};\n" 214 "};\n"
173 "uniform Bar bar[2];\n" 215 "uniform Bar bar[2];\n"
174 "void main() {\n" 216 "void main() {\n"
175 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" 217 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n"
176 "}"; 218 "}";
177 219
178 EXPECT_TRUE(fragment_translator_->Translate(shader)); 220 std::string info_log, translated_source;
221 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
222 ShaderTranslatorInterface::NameMap name_map;
223 EXPECT_TRUE(fragment_translator_->Translate(shader,
224 &info_log,
225 &translated_source,
226 &attrib_map,
227 &uniform_map,
228 &varying_map,
229 &name_map));
179 // Info log must be NULL. 230 // Info log must be NULL.
180 EXPECT_TRUE(fragment_translator_->info_log() == NULL); 231 EXPECT_TRUE(info_log.empty());
181 // Translated shader must be valid and non-empty. 232 // Translated shader must be valid and non-empty.
182 ASSERT_TRUE(fragment_translator_->translated_shader() != NULL); 233 EXPECT_FALSE(translated_source.empty());
183 EXPECT_GT(strlen(fragment_translator_->translated_shader()), 0u);
184 // There should be no attributes. 234 // There should be no attributes.
185 EXPECT_TRUE(fragment_translator_->attrib_map().empty()); 235 EXPECT_TRUE(attrib_map.empty());
186 // There should be two uniforms with following characteristics: 236 // There should be two uniforms with following characteristics:
187 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1 237 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1
188 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1 238 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1
189 const ShaderTranslator::VariableMap& uniform_map =
190 fragment_translator_->uniform_map();
191 EXPECT_EQ(2u, uniform_map.size()); 239 EXPECT_EQ(2u, uniform_map.size());
192 // First uniform. 240 // First uniform.
193 ShaderTranslator::VariableMap::const_iterator iter = 241 ShaderTranslator::VariableMap::const_iterator iter =
194 uniform_map.find("bar[0].foo.color[0]"); 242 uniform_map.find("bar[0].foo.color[0]");
195 EXPECT_TRUE(iter != uniform_map.end()); 243 EXPECT_TRUE(iter != uniform_map.end());
196 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 244 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type);
197 EXPECT_EQ(1, iter->second.size); 245 EXPECT_EQ(1, iter->second.size);
198 EXPECT_EQ("bar[0].foo.color[0]", iter->second.name); 246 EXPECT_EQ("bar[0].foo.color[0]", iter->second.name);
199 // Second uniform. 247 // Second uniform.
200 iter = uniform_map.find("bar[1].foo.color[0]"); 248 iter = uniform_map.find("bar[1].foo.color[0]");
201 EXPECT_TRUE(iter != uniform_map.end()); 249 EXPECT_TRUE(iter != uniform_map.end());
202 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); 250 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type);
203 EXPECT_EQ(1, iter->second.size); 251 EXPECT_EQ(1, iter->second.size);
204 EXPECT_EQ("bar[1].foo.color[0]", iter->second.name); 252 EXPECT_EQ("bar[1].foo.color[0]", iter->second.name);
205 } 253 }
206 254
207 #if defined(OS_MACOSX) 255 #if defined(OS_MACOSX)
208 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) { 256 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) {
209 // This test might become invalid in the future when ANGLE Translator is no 257 // This test might become invalid in the future when ANGLE Translator is no
210 // longer emulate dot(float, float) in Mac, or the emulated function name is 258 // longer emulate dot(float, float) in Mac, or the emulated function name is
211 // no longer webgl_dot_emu. 259 // no longer webgl_dot_emu.
212 const char* shader = 260 const char* shader =
213 "void main() {\n" 261 "void main() {\n"
214 " gl_Position = vec4(dot(1.0, 1.0), 1.0, 1.0, 1.0);\n" 262 " gl_Position = vec4(dot(1.0, 1.0), 1.0, 1.0, 1.0);\n"
215 "}"; 263 "}";
216 264
217 EXPECT_TRUE(vertex_translator_->Translate(shader)); 265 std::string info_log, translated_source;
266 ShaderTranslatorInterface::VariableMap attrib_map, uniform_map, varying_map;
267 ShaderTranslatorInterface::NameMap name_map;
268 EXPECT_TRUE(vertex_translator_->Translate(shader,
269 &info_log,
270 &translated_source,
271 &attrib_map,
272 &uniform_map,
273 &varying_map,
274 &name_map));
218 // Info log must be NULL. 275 // Info log must be NULL.
219 EXPECT_TRUE(vertex_translator_->info_log() == NULL); 276 EXPECT_TRUE(info_log.empty());
220 // Translated shader must be valid and non-empty. 277 // Translated shader must be valid and non-empty.
221 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); 278 ASSERT_FALSE(translated_source.empty());
222 EXPECT_TRUE(strstr(vertex_translator_->translated_shader(), 279 EXPECT_TRUE(strstr(translated_source.c_str(),
223 "webgl_dot_emu") != NULL); 280 "webgl_dot_emu") != NULL);
224 } 281 }
225 #endif 282 #endif
226 283
227 TEST_F(ShaderTranslatorTest, OptionsString) { 284 TEST_F(ShaderTranslatorTest, OptionsString) {
228 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator(); 285 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator();
229 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator(); 286 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator();
230 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator(); 287 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator();
231 288
232 ShBuiltInResources resources; 289 ShBuiltInResources resources;
(...skipping 24 matching lines...) Expand all
257 314
258 EXPECT_EQ(options_1, options_2); 315 EXPECT_EQ(options_1, options_2);
259 EXPECT_NE(options_1, options_3); 316 EXPECT_NE(options_1, options_3);
260 EXPECT_NE(options_1, options_4); 317 EXPECT_NE(options_1, options_4);
261 EXPECT_NE(options_3, options_4); 318 EXPECT_NE(options_3, options_4);
262 } 319 }
263 320
264 } // namespace gles2 321 } // namespace gles2
265 } // namespace gpu 322 } // namespace gpu
266 323
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