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 c23845829b947c5c4a9d6145b208fe208525d4c9..1bf0a760e7007ea464d7cd85606780aca3fcd528 100644 |
--- a/gpu/command_buffer/service/program_manager_unittest.cc |
+++ b/gpu/command_buffer/service/program_manager_unittest.cc |
@@ -36,12 +36,14 @@ namespace gpu { |
namespace gles2 { |
namespace { |
+const uint32 kMaxVaryingVectors = 8; |
+ |
void ShaderCacheCb(const std::string& key, const std::string& shader) {} |
-} // namespace |
+} // namespace anonymous |
class ProgramManagerTest : public testing::Test { |
public: |
- ProgramManagerTest() : manager_(NULL) { } |
+ ProgramManagerTest() : manager_(NULL, kMaxVaryingVectors) { } |
virtual ~ProgramManagerTest() { |
manager_.Destroy(false); |
} |
@@ -139,7 +141,7 @@ TEST_F(ProgramManagerTest, Program) { |
class ProgramManagerWithShaderTest : public testing::Test { |
public: |
ProgramManagerWithShaderTest() |
- : manager_(NULL), program_(NULL) { |
+ : manager_(NULL, kMaxVaryingVectors), program_(NULL) { |
} |
virtual ~ProgramManagerWithShaderTest() { |
@@ -209,6 +211,13 @@ class ProgramManagerWithShaderTest : public testing::Test { |
protected: |
typedef TestHelper::AttribInfo AttribInfo; |
typedef TestHelper::UniformInfo UniformInfo; |
+ typedef struct { |
+ int type; |
+ int size; |
+ int precision; |
+ int static_use; |
+ std::string name; |
+ } VarInfo; |
virtual void SetUp() { |
gl_.reset(new StrictMock<gfx::MockGLInterface>()); |
@@ -272,16 +281,10 @@ class ProgramManagerWithShaderTest : public testing::Test { |
return (static_cast<bool>(link_status) == expected_link_status); |
} |
- Program* SetupVaryingsMatchingTest(bool vertex_varying_declare, |
- int vertex_varying_type, |
- int vertex_varying_size, |
- int vertex_varying_precision, |
- int vertex_varying_static_use, |
- bool frag_varying_declare, |
- int frag_varying_type, |
- int frag_varying_size, |
- int frag_varying_precision, |
- int frag_varying_static_use) { |
+ Program* SetupVaryingsTest(const VarInfo* vertex_varyings, |
+ size_t vertex_varying_size, |
+ const VarInfo* fragment_varyings, |
+ size_t fragment_varying_size) { |
// Set up shader |
const GLuint kVShaderClientId = 1; |
const GLuint kVShaderServiceId = 11; |
@@ -292,10 +295,13 @@ class ProgramManagerWithShaderTest : public testing::Test { |
ShaderTranslator::VariableMap vertex_attrib_map; |
ShaderTranslator::VariableMap vertex_uniform_map; |
ShaderTranslator::VariableMap vertex_varying_map; |
- if (vertex_varying_declare) { |
- vertex_varying_map["a"] = ShaderTranslator::VariableInfo( |
- vertex_varying_type, vertex_varying_size, |
- vertex_varying_precision, vertex_varying_static_use, "a"); |
+ 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); |
} |
ShaderTranslator::NameMap vertex_name_map; |
EXPECT_CALL(vertex_shader_translator, attrib_map()) |
@@ -311,10 +317,13 @@ class ProgramManagerWithShaderTest : public testing::Test { |
ShaderTranslator::VariableMap frag_attrib_map; |
ShaderTranslator::VariableMap frag_uniform_map; |
ShaderTranslator::VariableMap frag_varying_map; |
- if (frag_varying_declare) { |
- frag_varying_map["a"] = ShaderTranslator::VariableInfo( |
- frag_varying_type, frag_varying_size, |
- frag_varying_precision, frag_varying_static_use, "a"); |
+ 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); |
} |
ShaderTranslator::NameMap frag_name_map; |
EXPECT_CALL(frag_shader_translator, attrib_map()) |
@@ -1167,9 +1176,12 @@ TEST_F(ProgramManagerWithShaderTest, UniformsPrecisionMismatch) { |
// If a varying has different type in the vertex and fragment |
// shader, linking should fail. |
TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
- Program* program = SetupVaryingsMatchingTest( |
- true, SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, |
- true, SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1); |
+ const VarInfo kVertexVarying = |
+ { SH_FLOAT_VEC3, 1, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ const VarInfo kFragmentVarying = |
+ { SH_FLOAT_VEC4, 1, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ Program* program = SetupVaryingsTest( |
+ &kVertexVarying, 1, &kFragmentVarying, 1); |
EXPECT_TRUE(program->DetectVaryingsMismatch()); |
EXPECT_TRUE(LinkAsExpected(program, false)); |
@@ -1178,9 +1190,12 @@ TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { |
// If a varying has different array size in the vertex and fragment |
// shader, linking should fail. |
TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
- Program* program = SetupVaryingsMatchingTest( |
- true, SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, |
- true, SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1); |
+ const VarInfo kVertexVarying = |
+ { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ const VarInfo kFragmentVarying = |
+ { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ Program* program = SetupVaryingsTest( |
+ &kVertexVarying, 1, &kFragmentVarying, 1); |
EXPECT_TRUE(program->DetectVaryingsMismatch()); |
EXPECT_TRUE(LinkAsExpected(program, false)); |
@@ -1189,9 +1204,12 @@ TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { |
// If a varying has different precision in the vertex and fragment |
// shader, linking should succeed. |
TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
- Program* program = SetupVaryingsMatchingTest( |
- true, SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, |
- true, SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1); |
+ const VarInfo kVertexVarying = |
+ { SH_FLOAT, 2, SH_PRECISION_HIGHP, 1, "a" }; |
+ const VarInfo kFragmentVarying = |
+ { SH_FLOAT, 2, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ Program* program = SetupVaryingsTest( |
+ &kVertexVarying, 1, &kFragmentVarying, 1); |
EXPECT_FALSE(program->DetectVaryingsMismatch()); |
EXPECT_TRUE(LinkAsExpected(program, true)); |
@@ -1200,9 +1218,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { |
// If a varying is statically used in fragment shader but not |
// declared in vertex shader, link should fail. |
TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
- Program* program = SetupVaryingsMatchingTest( |
- false, 0, 0, 0, 0, |
- true, SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1); |
+ const VarInfo kFragmentVarying = |
+ { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 1, "a" }; |
+ Program* program = SetupVaryingsTest( |
+ NULL, 0, &kFragmentVarying, 1); |
EXPECT_TRUE(program->DetectVaryingsMismatch()); |
EXPECT_TRUE(LinkAsExpected(program, false)); |
@@ -1212,14 +1231,49 @@ TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { |
// shader, even if it's not declared in vertex shader, link should |
// succeed. |
TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { |
- Program* program = SetupVaryingsMatchingTest( |
- false, 0, 0, 0, 0, |
- true, SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0); |
+ const VarInfo kFragmentVarying = |
+ { SH_FLOAT, 3, SH_PRECISION_MEDIUMP, 0, "a" }; |
+ Program* program = SetupVaryingsTest( |
+ NULL, 0, &kFragmentVarying, 1); |
EXPECT_FALSE(program->DetectVaryingsMismatch()); |
EXPECT_TRUE(LinkAsExpected(program, true)); |
} |
+// 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" } |
+ }; |
+ const VarInfo kFragmentVaryings[] = { |
+ { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 1, "a" }, |
+ { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
+ }; |
+ Program* program = SetupVaryingsTest( |
+ kVertexVaryings, 2, kFragmentVaryings, 2); |
+ |
+ EXPECT_FALSE(program->CheckVaryingsPacking()); |
+ EXPECT_TRUE(LinkAsExpected(program, false)); |
+} |
+ |
+// 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" } |
+ }; |
+ const VarInfo kFragmentVaryings[] = { |
+ { SH_FLOAT_VEC4, 4, SH_PRECISION_MEDIUMP, 0, "a" }, |
+ { SH_FLOAT_VEC4, 5, SH_PRECISION_MEDIUMP, 1, "b" } |
+ }; |
+ Program* program = SetupVaryingsTest( |
+ kVertexVaryings, 2, kFragmentVaryings, 2); |
+ |
+ EXPECT_TRUE(program->CheckVaryingsPacking()); |
+ EXPECT_TRUE(LinkAsExpected(program, true)); |
+} |
+ |
TEST_F(ProgramManagerWithShaderTest, ClearWithSamplerTypes) { |
const GLuint kVShaderClientId = 2001; |
const GLuint kFShaderClientId = 2002; |
@@ -1378,7 +1432,7 @@ class ProgramManagerWithCacheTest : public testing::Test { |
ProgramManagerWithCacheTest() |
: cache_(new MockProgramCache()), |
- manager_(cache_.get()), |
+ manager_(cache_.get(), kMaxVaryingVectors), |
vertex_shader_(NULL), |
fragment_shader_(NULL), |
program_(NULL) { |