Chromium Code Reviews| Index: gpu/command_buffer/service/program_manager_unittest.cc |
| diff --git a/gpu/command_buffer/service/program_manager_unittest.cc b/gpu/command_buffer/service/program_manager_unittest.cc |
| index 1bf0a760e7007ea464d7cd85606780aca3fcd528..ef91a611989d3757e1fbdff4112a6387f92a59c0 100644 |
| --- a/gpu/command_buffer/service/program_manager_unittest.cc |
| +++ b/gpu/command_buffer/service/program_manager_unittest.cc |
| @@ -211,12 +211,20 @@ class ProgramManagerWithShaderTest : public testing::Test { |
| protected: |
| typedef TestHelper::AttribInfo AttribInfo; |
| typedef TestHelper::UniformInfo UniformInfo; |
| + |
| + typedef enum { |
| + kVarUniform, |
| + kVarVarying, |
| + kVarAttribute |
| + } VarCategory; |
| + |
| typedef struct { |
| int type; |
| int size; |
| int precision; |
| int static_use; |
| std::string name; |
| + VarCategory category; |
| } VarInfo; |
| virtual void SetUp() { |
| @@ -281,10 +289,10 @@ class ProgramManagerWithShaderTest : public testing::Test { |
| return (static_cast<bool>(link_status) == expected_link_status); |
| } |
| - Program* SetupVaryingsTest(const VarInfo* vertex_varyings, |
| - size_t vertex_varying_size, |
| - const VarInfo* fragment_varyings, |
| - size_t fragment_varying_size) { |
| + Program* SetupShaderVariableTest(const VarInfo* vertex_variables, |
|
Zhenyao Mo
2013/09/06 23:50:18
I could probably turn more tests to use this funct
|
| + size_t vertex_variable_size, |
| + const VarInfo* fragment_variables, |
| + size_t fragment_variable_size) { |
| // Set up shader |
| const GLuint kVShaderClientId = 1; |
| const GLuint kVShaderServiceId = 11; |
| @@ -295,13 +303,27 @@ class ProgramManagerWithShaderTest : public testing::Test { |
| ShaderTranslator::VariableMap vertex_attrib_map; |
| ShaderTranslator::VariableMap vertex_uniform_map; |
| ShaderTranslator::VariableMap vertex_varying_map; |
| - for (size_t ii = 0; ii < vertex_varying_size; ++ii) { |
| - vertex_varying_map[vertex_varyings[ii].name] = |
| - ShaderTranslator::VariableInfo(vertex_varyings[ii].type, |
| - vertex_varyings[ii].size, |
| - vertex_varyings[ii].precision, |
| - vertex_varyings[ii].static_use, |
| - vertex_varyings[ii].name); |
| + for (size_t ii = 0; ii < vertex_variable_size; ++ii) { |
| + ShaderTranslator::VariableMap* map = NULL; |
| + switch (vertex_variables[ii].category) { |
| + case kVarAttribute: |
| + map = &vertex_attrib_map; |
| + break; |
| + case kVarUniform: |
| + map = &vertex_uniform_map; |
| + break; |
| + case kVarVarying: |
| + map = &vertex_varying_map; |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + (*map)[vertex_variables[ii].name] = |
| + ShaderTranslator::VariableInfo(vertex_variables[ii].type, |
| + vertex_variables[ii].size, |
| + vertex_variables[ii].precision, |
| + vertex_variables[ii].static_use, |
| + vertex_variables[ii].name); |
| } |
| ShaderTranslator::NameMap vertex_name_map; |
| EXPECT_CALL(vertex_shader_translator, attrib_map()) |
| @@ -317,13 +339,27 @@ class ProgramManagerWithShaderTest : public testing::Test { |
| ShaderTranslator::VariableMap frag_attrib_map; |
| ShaderTranslator::VariableMap frag_uniform_map; |
| ShaderTranslator::VariableMap frag_varying_map; |
| - for (size_t ii = 0; ii < fragment_varying_size; ++ii) { |
| - frag_varying_map[fragment_varyings[ii].name] = |
| - ShaderTranslator::VariableInfo(fragment_varyings[ii].type, |
| - fragment_varyings[ii].size, |
| - fragment_varyings[ii].precision, |
| - fragment_varyings[ii].static_use, |
| - fragment_varyings[ii].name); |
| + for (size_t ii = 0; ii < fragment_variable_size; ++ii) { |
| + ShaderTranslator::VariableMap* map; |
| + switch (fragment_variables[ii].category) { |
| + case kVarAttribute: |
| + map = &frag_attrib_map; |
| + break; |
| + case kVarUniform: |
| + map = &frag_uniform_map; |
| + break; |
| + case kVarVarying: |
| + map = &frag_varying_map; |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + (*map)[fragment_variables[ii].name] = |
| + ShaderTranslator::VariableInfo(fragment_variables[ii].type, |
| + fragment_variables[ii].size, |
| + fragment_variables[ii].precision, |
| + fragment_variables[ii].static_use, |
| + fragment_variables[ii].name); |
| } |
| ShaderTranslator::NameMap frag_name_map; |
| EXPECT_CALL(frag_shader_translator, attrib_map()) |
| @@ -1177,10 +1213,10 @@ TEST_F(ProgramManagerWithShaderTest, UniformsPrecisionMismatch) { |
| // shader, linking should fail. |
| TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
| const VarInfo kVertexVarying = |
| - { SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, "a" }; |
| + { SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| const VarInfo kFragmentVarying = |
| - { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a" }; |
| - Program* program = SetupVaryingsTest( |
| + { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| + Program* program = SetupShaderVariableTest( |
| &kVertexVarying, 1, &kFragmentVarying, 1); |
| EXPECT_TRUE(program->DetectVaryingsMismatch()); |
| @@ -1191,10 +1227,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
| // shader, linking should fail. |
| TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
| const VarInfo kVertexVarying = |
| - { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a" }; |
| + { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| const VarInfo kFragmentVarying = |
| - { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a" }; |
| - Program* program = SetupVaryingsTest( |
| + { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| + Program* program = SetupShaderVariableTest( |
| &kVertexVarying, 1, &kFragmentVarying, 1); |
| EXPECT_TRUE(program->DetectVaryingsMismatch()); |
| @@ -1205,10 +1241,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
| // shader, linking should succeed. |
| TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
| const VarInfo kVertexVarying = |
| - { SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, "a" }; |
| + { SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, "a", kVarVarying }; |
| const VarInfo kFragmentVarying = |
| - { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a" }; |
| - Program* program = SetupVaryingsTest( |
| + { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| + Program* program = SetupShaderVariableTest( |
| &kVertexVarying, 1, &kFragmentVarying, 1); |
| EXPECT_FALSE(program->DetectVaryingsMismatch()); |
| @@ -1219,8 +1255,8 @@ TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
| // declared in vertex shader, link should fail. |
| TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
| const VarInfo kFragmentVarying = |
| - { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a" }; |
| - Program* program = SetupVaryingsTest( |
| + { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }; |
| + Program* program = SetupShaderVariableTest( |
| NULL, 0, &kFragmentVarying, 1); |
| EXPECT_TRUE(program->DetectVaryingsMismatch()); |
| @@ -1232,25 +1268,40 @@ TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
| // succeed. |
| TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
| const VarInfo kFragmentVarying = |
| - { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0, "a" }; |
| - Program* program = SetupVaryingsTest( |
| + { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0, "a", kVarVarying }; |
| + Program* program = SetupShaderVariableTest( |
| NULL, 0, &kFragmentVarying, 1); |
| EXPECT_FALSE(program->DetectVaryingsMismatch()); |
| EXPECT_TRUE(LinkAsExpected(program, true)); |
| } |
| +// Uniforms and attributes are both global variables, thus sharing |
| +// the same namespace. Any name conflicts should cause link |
| +// failure. |
| +TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { |
| + const VarInfo kVertexAttribute = |
| + { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarAttribute }; |
| + const VarInfo kFragmentUniform = |
| + { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a", kVarUniform }; |
| + Program* program = SetupShaderVariableTest( |
| + &kVertexAttribute, 1, &kFragmentUniform, 1); |
| + |
| + EXPECT_TRUE(program->DetectGlobalNameConflicts()); |
| + EXPECT_TRUE(LinkAsExpected(program, false)); |
| +} |
| + |
| // Varyings go over 8 rows. |
| TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
| const VarInfo kVertexVaryings[] = { |
| - { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a" }, |
| - { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
| + { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }, |
| + { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying } |
| }; |
| const VarInfo kFragmentVaryings[] = { |
| - { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a" }, |
| - { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
| + { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }, |
| + { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying } |
| }; |
| - Program* program = SetupVaryingsTest( |
| + Program* program = SetupShaderVariableTest( |
| kVertexVaryings, 2, kFragmentVaryings, 2); |
| EXPECT_FALSE(program->CheckVaryingsPacking()); |
| @@ -1260,14 +1311,14 @@ TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { |
| // Varyings go over 8 rows but some are inactive |
| TEST_F(ProgramManagerWithShaderTest, TooManyInactiveVaryings) { |
| const VarInfo kVertexVaryings[] = { |
| - { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a" }, |
| - { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
| + { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a", kVarVarying }, |
| + { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying } |
| }; |
| const VarInfo kFragmentVaryings[] = { |
| - { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 0, "a" }, |
| - { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
| + { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 0, "a", kVarVarying }, |
| + { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b", kVarVarying } |
| }; |
| - Program* program = SetupVaryingsTest( |
| + Program* program = SetupShaderVariableTest( |
| kVertexVaryings, 2, kFragmentVaryings, 2); |
| EXPECT_TRUE(program->CheckVaryingsPacking()); |