| 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 OutputVariableList 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 OutputVariableList 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 OutputVariableList 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 OutputVariableList 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 OutputVariableList 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 OutputVariableList 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 |