| 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 | 9 |
| 10 // The ANGLE shader translator now uses native GLenums | |
| 11 // TODO(jmadill): delete these defines when the ANGLE | |
| 12 // roll reliably passes translator version 126 | |
| 13 #if (ANGLE_SH_VERSION >= 126) | |
| 14 #define SH_VERTEX_SHADER GL_VERTEX_SHADER | |
| 15 #define SH_FRAGMENT_SHADER GL_FRAGMENT_SHADER | |
| 16 #define SH_FLOAT_VEC4 GL_FLOAT_VEC4 | |
| 17 #endif | |
| 18 | |
| 19 namespace gpu { | 10 namespace gpu { |
| 20 namespace gles2 { | 11 namespace gles2 { |
| 21 | 12 |
| 22 class ShaderTranslatorTest : public testing::Test { | 13 class ShaderTranslatorTest : public testing::Test { |
| 23 public: | 14 public: |
| 24 ShaderTranslatorTest() { | 15 ShaderTranslatorTest() { |
| 25 } | 16 } |
| 26 | 17 |
| 27 virtual ~ShaderTranslatorTest() { | 18 virtual ~ShaderTranslatorTest() { |
| 28 } | 19 } |
| 29 | 20 |
| 30 protected: | 21 protected: |
| 31 virtual void SetUp() { | 22 virtual void SetUp() { |
| 32 ShBuiltInResources resources; | 23 ShBuiltInResources resources; |
| 33 ShInitBuiltInResources(&resources); | 24 ShInitBuiltInResources(&resources); |
| 34 resources.MaxExpressionComplexity = 32; | 25 resources.MaxExpressionComplexity = 32; |
| 35 resources.MaxCallStackDepth = 32; | 26 resources.MaxCallStackDepth = 32; |
| 36 | 27 |
| 37 vertex_translator_ = new ShaderTranslator(); | 28 vertex_translator_ = new ShaderTranslator(); |
| 38 fragment_translator_ = new ShaderTranslator(); | 29 fragment_translator_ = new ShaderTranslator(); |
| 39 | 30 |
| 40 ASSERT_TRUE(vertex_translator_->Init( | 31 ASSERT_TRUE(vertex_translator_->Init( |
| 41 SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, | 32 GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
| 42 ShaderTranslatorInterface::kGlsl, | 33 ShaderTranslatorInterface::kGlsl, |
| 43 SH_EMULATE_BUILT_IN_FUNCTIONS)); | 34 SH_EMULATE_BUILT_IN_FUNCTIONS)); |
| 44 ASSERT_TRUE(fragment_translator_->Init( | 35 ASSERT_TRUE(fragment_translator_->Init( |
| 45 SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, | 36 GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, |
| 46 ShaderTranslatorInterface::kGlsl, | 37 ShaderTranslatorInterface::kGlsl, |
| 47 static_cast<ShCompileOptions>(0))); | 38 static_cast<ShCompileOptions>(0))); |
| 48 // Post-init the results must be empty. | 39 // Post-init the results must be empty. |
| 49 // Vertex translator results. | 40 // Vertex translator results. |
| 50 EXPECT_TRUE(vertex_translator_->translated_shader() == NULL); | 41 EXPECT_TRUE(vertex_translator_->translated_shader() == NULL); |
| 51 EXPECT_TRUE(vertex_translator_->info_log() == NULL); | 42 EXPECT_TRUE(vertex_translator_->info_log() == NULL); |
| 52 EXPECT_TRUE(vertex_translator_->attrib_map().empty()); | 43 EXPECT_TRUE(vertex_translator_->attrib_map().empty()); |
| 53 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); | 44 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); |
| 54 // Fragment translator results. | 45 // Fragment translator results. |
| 55 EXPECT_TRUE(fragment_translator_->translated_shader() == NULL); | 46 EXPECT_TRUE(fragment_translator_->translated_shader() == NULL); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 142 |
| 152 EXPECT_TRUE(vertex_translator_->Translate(shader)); | 143 EXPECT_TRUE(vertex_translator_->Translate(shader)); |
| 153 // Info log must be NULL. | 144 // Info log must be NULL. |
| 154 EXPECT_TRUE(vertex_translator_->info_log() == NULL); | 145 EXPECT_TRUE(vertex_translator_->info_log() == NULL); |
| 155 // Translated shader must be valid and non-empty. | 146 // Translated shader must be valid and non-empty. |
| 156 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); | 147 ASSERT_TRUE(vertex_translator_->translated_shader() != NULL); |
| 157 EXPECT_GT(strlen(vertex_translator_->translated_shader()), 0u); | 148 EXPECT_GT(strlen(vertex_translator_->translated_shader()), 0u); |
| 158 // There should be no uniforms. | 149 // There should be no uniforms. |
| 159 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); | 150 EXPECT_TRUE(vertex_translator_->uniform_map().empty()); |
| 160 // There should be one attribute with following characteristics: | 151 // There should be one attribute with following characteristics: |
| 161 // name:vPosition type:SH_FLOAT_VEC4 size:1. | 152 // name:vPosition type:GL_FLOAT_VEC4 size:1. |
| 162 const ShaderTranslator::VariableMap& attrib_map = | 153 const ShaderTranslator::VariableMap& attrib_map = |
| 163 vertex_translator_->attrib_map(); | 154 vertex_translator_->attrib_map(); |
| 164 EXPECT_EQ(1u, attrib_map.size()); | 155 EXPECT_EQ(1u, attrib_map.size()); |
| 165 ShaderTranslator::VariableMap::const_iterator iter = | 156 ShaderTranslator::VariableMap::const_iterator iter = |
| 166 attrib_map.find("vPosition"); | 157 attrib_map.find("vPosition"); |
| 167 EXPECT_TRUE(iter != attrib_map.end()); | 158 EXPECT_TRUE(iter != attrib_map.end()); |
| 168 EXPECT_EQ(SH_FLOAT_VEC4, iter->second.type); | 159 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); |
| 169 EXPECT_EQ(1, iter->second.size); | 160 EXPECT_EQ(1, iter->second.size); |
| 170 EXPECT_EQ("vPosition", iter->second.name); | 161 EXPECT_EQ("vPosition", iter->second.name); |
| 171 } | 162 } |
| 172 | 163 |
| 173 TEST_F(ShaderTranslatorTest, GetUniforms) { | 164 TEST_F(ShaderTranslatorTest, GetUniforms) { |
| 174 const char* shader = | 165 const char* shader = |
| 175 "precision mediump float;\n" | 166 "precision mediump float;\n" |
| 176 "struct Foo {\n" | 167 "struct Foo {\n" |
| 177 " vec4 color[1];\n" | 168 " vec4 color[1];\n" |
| 178 "};\n" | 169 "};\n" |
| 179 "struct Bar {\n" | 170 "struct Bar {\n" |
| 180 " Foo foo;\n" | 171 " Foo foo;\n" |
| 181 "};\n" | 172 "};\n" |
| 182 "uniform Bar bar[2];\n" | 173 "uniform Bar bar[2];\n" |
| 183 "void main() {\n" | 174 "void main() {\n" |
| 184 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" | 175 " gl_FragColor = bar[0].foo.color[0] + bar[1].foo.color[0];\n" |
| 185 "}"; | 176 "}"; |
| 186 | 177 |
| 187 EXPECT_TRUE(fragment_translator_->Translate(shader)); | 178 EXPECT_TRUE(fragment_translator_->Translate(shader)); |
| 188 // Info log must be NULL. | 179 // Info log must be NULL. |
| 189 EXPECT_TRUE(fragment_translator_->info_log() == NULL); | 180 EXPECT_TRUE(fragment_translator_->info_log() == NULL); |
| 190 // Translated shader must be valid and non-empty. | 181 // Translated shader must be valid and non-empty. |
| 191 ASSERT_TRUE(fragment_translator_->translated_shader() != NULL); | 182 ASSERT_TRUE(fragment_translator_->translated_shader() != NULL); |
| 192 EXPECT_GT(strlen(fragment_translator_->translated_shader()), 0u); | 183 EXPECT_GT(strlen(fragment_translator_->translated_shader()), 0u); |
| 193 // There should be no attributes. | 184 // There should be no attributes. |
| 194 EXPECT_TRUE(fragment_translator_->attrib_map().empty()); | 185 EXPECT_TRUE(fragment_translator_->attrib_map().empty()); |
| 195 // There should be two uniforms with following characteristics: | 186 // There should be two uniforms with following characteristics: |
| 196 // 1. name:bar[0].foo.color[0] type:SH_FLOAT_VEC4 size:1 | 187 // 1. name:bar[0].foo.color[0] type:GL_FLOAT_VEC4 size:1 |
| 197 // 2. name:bar[1].foo.color[0] type:SH_FLOAT_VEC4 size:1 | 188 // 2. name:bar[1].foo.color[0] type:GL_FLOAT_VEC4 size:1 |
| 198 const ShaderTranslator::VariableMap& uniform_map = | 189 const ShaderTranslator::VariableMap& uniform_map = |
| 199 fragment_translator_->uniform_map(); | 190 fragment_translator_->uniform_map(); |
| 200 EXPECT_EQ(2u, uniform_map.size()); | 191 EXPECT_EQ(2u, uniform_map.size()); |
| 201 // First uniform. | 192 // First uniform. |
| 202 ShaderTranslator::VariableMap::const_iterator iter = | 193 ShaderTranslator::VariableMap::const_iterator iter = |
| 203 uniform_map.find("bar[0].foo.color[0]"); | 194 uniform_map.find("bar[0].foo.color[0]"); |
| 204 EXPECT_TRUE(iter != uniform_map.end()); | 195 EXPECT_TRUE(iter != uniform_map.end()); |
| 205 EXPECT_EQ(SH_FLOAT_VEC4, iter->second.type); | 196 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); |
| 206 EXPECT_EQ(1, iter->second.size); | 197 EXPECT_EQ(1, iter->second.size); |
| 207 EXPECT_EQ("bar[0].foo.color[0]", iter->second.name); | 198 EXPECT_EQ("bar[0].foo.color[0]", iter->second.name); |
| 208 // Second uniform. | 199 // Second uniform. |
| 209 iter = uniform_map.find("bar[1].foo.color[0]"); | 200 iter = uniform_map.find("bar[1].foo.color[0]"); |
| 210 EXPECT_TRUE(iter != uniform_map.end()); | 201 EXPECT_TRUE(iter != uniform_map.end()); |
| 211 EXPECT_EQ(SH_FLOAT_VEC4, iter->second.type); | 202 EXPECT_EQ(GL_FLOAT_VEC4, iter->second.type); |
| 212 EXPECT_EQ(1, iter->second.size); | 203 EXPECT_EQ(1, iter->second.size); |
| 213 EXPECT_EQ("bar[1].foo.color[0]", iter->second.name); | 204 EXPECT_EQ("bar[1].foo.color[0]", iter->second.name); |
| 214 } | 205 } |
| 215 | 206 |
| 216 #if defined(OS_MACOSX) | 207 #if defined(OS_MACOSX) |
| 217 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) { | 208 TEST_F(ShaderTranslatorTest, BuiltInFunctionEmulation) { |
| 218 // This test might become invalid in the future when ANGLE Translator is no | 209 // This test might become invalid in the future when ANGLE Translator is no |
| 219 // longer emulate dot(float, float) in Mac, or the emulated function name is | 210 // longer emulate dot(float, float) in Mac, or the emulated function name is |
| 220 // no longer webgl_dot_emu. | 211 // no longer webgl_dot_emu. |
| 221 const char* shader = | 212 const char* shader = |
| (...skipping 13 matching lines...) Expand all Loading... |
| 235 | 226 |
| 236 TEST_F(ShaderTranslatorTest, OptionsString) { | 227 TEST_F(ShaderTranslatorTest, OptionsString) { |
| 237 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator(); | 228 scoped_refptr<ShaderTranslator> translator_1 = new ShaderTranslator(); |
| 238 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator(); | 229 scoped_refptr<ShaderTranslator> translator_2 = new ShaderTranslator(); |
| 239 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator(); | 230 scoped_refptr<ShaderTranslator> translator_3 = new ShaderTranslator(); |
| 240 | 231 |
| 241 ShBuiltInResources resources; | 232 ShBuiltInResources resources; |
| 242 ShInitBuiltInResources(&resources); | 233 ShInitBuiltInResources(&resources); |
| 243 | 234 |
| 244 ASSERT_TRUE(translator_1->Init( | 235 ASSERT_TRUE(translator_1->Init( |
| 245 SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, | 236 GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
| 246 ShaderTranslatorInterface::kGlsl, | 237 ShaderTranslatorInterface::kGlsl, |
| 247 SH_EMULATE_BUILT_IN_FUNCTIONS)); | 238 SH_EMULATE_BUILT_IN_FUNCTIONS)); |
| 248 ASSERT_TRUE(translator_2->Init( | 239 ASSERT_TRUE(translator_2->Init( |
| 249 SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, | 240 GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, |
| 250 ShaderTranslatorInterface::kGlsl, | 241 ShaderTranslatorInterface::kGlsl, |
| 251 static_cast<ShCompileOptions>(0))); | 242 static_cast<ShCompileOptions>(0))); |
| 252 resources.EXT_draw_buffers = 1; | 243 resources.EXT_draw_buffers = 1; |
| 253 ASSERT_TRUE(translator_3->Init( | 244 ASSERT_TRUE(translator_3->Init( |
| 254 SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources, | 245 GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
| 255 ShaderTranslatorInterface::kGlsl, | 246 ShaderTranslatorInterface::kGlsl, |
| 256 SH_EMULATE_BUILT_IN_FUNCTIONS)); | 247 SH_EMULATE_BUILT_IN_FUNCTIONS)); |
| 257 | 248 |
| 258 std::string options_1( | 249 std::string options_1( |
| 259 translator_1->GetStringForOptionsThatWouldAffectCompilation()); | 250 translator_1->GetStringForOptionsThatWouldAffectCompilation()); |
| 260 std::string options_2( | 251 std::string options_2( |
| 261 translator_1->GetStringForOptionsThatWouldAffectCompilation()); | 252 translator_1->GetStringForOptionsThatWouldAffectCompilation()); |
| 262 std::string options_3( | 253 std::string options_3( |
| 263 translator_2->GetStringForOptionsThatWouldAffectCompilation()); | 254 translator_2->GetStringForOptionsThatWouldAffectCompilation()); |
| 264 std::string options_4( | 255 std::string options_4( |
| 265 translator_3->GetStringForOptionsThatWouldAffectCompilation()); | 256 translator_3->GetStringForOptionsThatWouldAffectCompilation()); |
| 266 | 257 |
| 267 EXPECT_EQ(options_1, options_2); | 258 EXPECT_EQ(options_1, options_2); |
| 268 EXPECT_NE(options_1, options_3); | 259 EXPECT_NE(options_1, options_3); |
| 269 EXPECT_NE(options_1, options_4); | 260 EXPECT_NE(options_1, options_4); |
| 270 EXPECT_NE(options_3, options_4); | 261 EXPECT_NE(options_3, options_4); |
| 271 } | 262 } |
| 272 | 263 |
| 273 } // namespace gles2 | 264 } // namespace gles2 |
| 274 } // namespace gpu | 265 } // namespace gpu |
| 275 | 266 |
| OLD | NEW |