aboutsummaryrefslogtreecommitdiff
path: root/src/amberscript/parser_buffer_test.cc
diff options
context:
space:
mode:
authordan sinclair <dsinclair@google.com>2019-10-15 15:55:08 -0400
committerGitHub <noreply@github.com>2019-10-15 15:55:08 -0400
commitb0708a96acc2e7f04ab6a2e4fcd9391ffaffcc15 (patch)
tree3aa28d80f470e1de095c78bd92b897c14b634a9b /src/amberscript/parser_buffer_test.cc
parent98e3e7ed84039d189d6d23eaed55efd62d3edbcf (diff)
downloadamber-b0708a96acc2e7f04ab6a2e4fcd9391ffaffcc15.tar.gz
[AmberScript] Adding struct support (#688)
This CL adds support for the STRUCT syntax in AmberScript. STRUCTS can be used in buffers. They can be compared as expected. If no OFFSET or STRIDE data is provided we will calculate the padding and offsets based on the current layout. Fixes #544
Diffstat (limited to 'src/amberscript/parser_buffer_test.cc')
-rw-r--r--src/amberscript/parser_buffer_test.cc201
1 files changed, 200 insertions, 1 deletions
diff --git a/src/amberscript/parser_buffer_test.cc b/src/amberscript/parser_buffer_test.cc
index a0aa357..1381ec8 100644
--- a/src/amberscript/parser_buffer_test.cc
+++ b/src/amberscript/parser_buffer_test.cc
@@ -733,7 +733,10 @@ TEST_P(AmberScriptParserBufferDataTypeInvalidTest, BufferTypes) {
Parser parser;
Result r = parser.Parse(in);
ASSERT_FALSE(r.IsSuccess()) << test_data.name;
- EXPECT_EQ("1: invalid data_type provided", r.Error()) << test_data.name;
+ EXPECT_EQ(
+ std::string("1: invalid data type '") + test_data.name + "' provided",
+ r.Error())
+ << test_data.name;
}
INSTANTIATE_TEST_SUITE_P(
AmberScriptParserBufferDataTypeInvalidTestSamples,
@@ -762,5 +765,201 @@ INSTANTIATE_TEST_SUITE_P(
NameData{"mat2x2"},
NameData{"mat2x2<>"})); // NOLINT(whitespace/parens)
+TEST_F(AmberScriptParserTest, BufferWithStructStd140) {
+ std::string in = R"(
+STRUCT s
+ uint32 d
+ uint32 e
+END
+
+STRUCT my_data
+ float a
+ uint32 b
+ s c
+END
+
+BUFFER my_buffer DATA_TYPE my_data STD140 DATA
+ 1 # a
+ 64 # b
+128 # c.d
+220 # c.e
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->GetType()->IsStruct());
+ EXPECT_EQ(Format::Layout::kStd140, buffer->GetFormat()->GetLayout());
+
+ EXPECT_EQ(1U, buffer->ElementCount());
+ EXPECT_EQ(32U, buffer->GetSizeInBytes());
+
+ const auto* data = buffer->GetValues<uint8_t>();
+ EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
+ EXPECT_EQ(64,
+ *reinterpret_cast<const uint32_t*>(data + 4 /* sizeof(float) */));
+ EXPECT_EQ(128,
+ *reinterpret_cast<const uint32_t*>(data + 16 /* 8 round -> 16 */));
+ EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(
+ data + 20 /* 8 round -> 16 + 4 */));
+}
+
+TEST_F(AmberScriptParserTest, BufferWithStructStd430) {
+ std::string in = R"(
+STRUCT s
+ uint32 d
+ uint32 e
+END
+
+STRUCT my_data
+ float a
+ uint32 b
+ s c
+END
+
+BUFFER my_buffer DATA_TYPE my_data STD430 DATA
+ 1 # a
+ 64 # b
+128 # c.d
+220 # c.e
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->GetType()->IsStruct());
+ EXPECT_EQ(Format::Layout::kStd430, buffer->GetFormat()->GetLayout());
+
+ EXPECT_EQ(1U, buffer->ElementCount());
+ EXPECT_EQ(16U, buffer->GetSizeInBytes());
+
+ const auto* data = buffer->GetValues<uint8_t>();
+ EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
+ EXPECT_EQ(64, *reinterpret_cast<const uint32_t*>(data + 4));
+ EXPECT_EQ(128, *reinterpret_cast<const uint32_t*>(data + 8));
+ EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(data + 12));
+}
+
+TEST_F(AmberScriptParserTest, BufferWithStructAndPaddingStd430) {
+ std::string in = R"(
+STRUCT s
+ uint32 d OFFSET 8
+ uint32 e OFFSET 16
+END
+
+STRUCT my_data
+ float a OFFSET 8
+ uint32 b OFFSET 16
+ s c;
+END
+
+BUFFER my_buffer DATA_TYPE my_data STD430 DATA
+ 1 # a
+ 64 # b
+128 # c.d
+220 # c.e
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->GetType()->IsStruct());
+ EXPECT_EQ(Format::Layout::kStd430, buffer->GetFormat()->GetLayout());
+
+ EXPECT_EQ(1U, buffer->ElementCount());
+ EXPECT_EQ(40U, buffer->GetSizeInBytes());
+
+ const auto* data = buffer->GetValues<uint8_t>();
+ EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 8));
+ EXPECT_EQ(64, *reinterpret_cast<const uint32_t*>(data + 16));
+ EXPECT_EQ(128, *reinterpret_cast<const uint32_t*>(data + 28));
+ EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(data + 36));
+}
+
+TEST_F(AmberScriptParserTest, BufferWithStructPartialInitialization) {
+ std::string in = R"(
+STRUCT my_data
+ uint32 a
+ float b
+ uint32 c
+ uint32 d
+END
+
+BUFFER my_buffer DATA_TYPE my_data STD430 DATA
+ 1 # a
+ 64 # b
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+ EXPECT_EQ("12: Mismatched number of items in buffer", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferWithStruct_vec_Std140) {
+ std::string in = R"(
+
+STRUCT my_data
+ float a
+ vec3<float> b
+END
+
+BUFFER my_buffer DATA_TYPE my_data STD140 DATA
+ 1 # a
+ 64 128 220 # b
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->GetType()->IsStruct());
+ EXPECT_EQ(Format::Layout::kStd140, buffer->GetFormat()->GetLayout());
+
+ EXPECT_EQ(1U, buffer->ElementCount());
+ EXPECT_EQ(32U, buffer->GetSizeInBytes());
+
+ const auto* data = buffer->GetValues<uint8_t>();
+ EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
+ EXPECT_FLOAT_EQ(64, *reinterpret_cast<const float*>(data + 16));
+ EXPECT_FLOAT_EQ(128, *reinterpret_cast<const float*>(data + 20));
+ EXPECT_FLOAT_EQ(220, *reinterpret_cast<const float*>(data + 24));
+}
+
} // namespace amberscript
} // namespace amber