diff options
Diffstat (limited to 'tests/compiler_tests/CollectVariables_test.cpp')
-rw-r--r-- | tests/compiler_tests/CollectVariables_test.cpp | 171 |
1 files changed, 170 insertions, 1 deletions
diff --git a/tests/compiler_tests/CollectVariables_test.cpp b/tests/compiler_tests/CollectVariables_test.cpp index 21ad75fa..0c3160e6 100644 --- a/tests/compiler_tests/CollectVariables_test.cpp +++ b/tests/compiler_tests/CollectVariables_test.cpp @@ -164,6 +164,175 @@ TEST_F(CollectVertexVariablesTest, SimpleInterfaceBlock) EXPECT_TRUE(field.staticUse); EXPECT_GLENUM_EQ(GL_FLOAT, field.type); EXPECT_EQ("f", field.name); - EXPECT_FALSE(field.isRowMajorMatrix); + EXPECT_FALSE(field.isRowMajorLayout); EXPECT_TRUE(field.fields.empty()); } + +TEST_F(CollectVertexVariablesTest, SimpleInstancedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "uniform b {\n" + " float f;\n" + "} blockInstance;" + "void main() {\n" + " gl_Position = vec4(blockInstance.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + const char *shaderStrings[] = { shaderString.c_str() }; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + + const std::vector<sh::InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const sh::InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(sh::BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const sh::InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, field.precision); + EXPECT_TRUE(field.staticUse); + EXPECT_GLENUM_EQ(GL_FLOAT, field.type); + EXPECT_EQ("b.f", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + EXPECT_TRUE(field.fields.empty()); +} + +TEST_F(CollectVertexVariablesTest, StructInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { float f; };" + "uniform b {\n" + " st s;\n" + "};" + "void main() {\n" + " gl_Position = vec4(s.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + const char *shaderStrings[] = { shaderString.c_str() }; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + + const std::vector<sh::InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const sh::InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(sh::BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const sh::InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("s", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + + const sh::ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("f", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} + +TEST_F(CollectVertexVariablesTest, StructInstancedInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { float f; };" + "uniform b {\n" + " st s;\n" + "} instanceName;" + "void main() {\n" + " gl_Position = vec4(instanceName.s.f, 0.0, 0.0, 1.0);\n" + "}\n"; + + const char *shaderStrings[] = { shaderString.c_str() }; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + + const std::vector<sh::InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const sh::InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_FALSE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(sh::BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const sh::InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("b.s", field.name); + EXPECT_FALSE(field.isRowMajorLayout); + + const sh::ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("f", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} + +TEST_F(CollectVertexVariablesTest, NestedStructRowMajorInterfaceBlock) +{ + const std::string &shaderString = + "#version 300 es\n" + "struct st { mat2 m; };" + "layout(row_major) uniform b {\n" + " st s;\n" + "};" + "void main() {\n" + " gl_Position = vec4(s.m);\n" + "}\n"; + + const char *shaderStrings[] = { shaderString.c_str() }; + ASSERT_TRUE(mTranslator->compile(shaderStrings, 1, SH_VARIABLES)); + + const std::vector<sh::InterfaceBlock> &interfaceBlocks = mTranslator->getInterfaceBlocks(); + ASSERT_EQ(1u, interfaceBlocks.size()); + + const sh::InterfaceBlock &interfaceBlock = interfaceBlocks[0]; + + EXPECT_EQ(0u, interfaceBlock.arraySize); + EXPECT_TRUE(interfaceBlock.isRowMajorLayout); + EXPECT_EQ(sh::BLOCKLAYOUT_SHARED, interfaceBlock.layout); + EXPECT_EQ("b", interfaceBlock.name); + EXPECT_TRUE(interfaceBlock.staticUse); + + ASSERT_EQ(1u, interfaceBlock.fields.size()); + + const sh::InterfaceBlockField &field = interfaceBlock.fields[0]; + + EXPECT_TRUE(field.isStruct()); + EXPECT_TRUE(field.staticUse); + EXPECT_EQ("s", field.name); + EXPECT_TRUE(field.isRowMajorLayout); + + const sh::ShaderVariable &member = field.fields[0]; + + // NOTE: we don't currently mark struct members as statically used or not + EXPECT_FALSE(member.isStruct()); + EXPECT_EQ("m", member.name); + EXPECT_GLENUM_EQ(GL_FLOAT_MAT2, member.type); + EXPECT_GLENUM_EQ(GL_HIGH_FLOAT, member.precision); +} |