diff options
author | dan sinclair <dsinclair@google.com> | 2019-10-15 15:55:08 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-15 15:55:08 -0400 |
commit | b0708a96acc2e7f04ab6a2e4fcd9391ffaffcc15 (patch) | |
tree | 3aa28d80f470e1de095c78bd92b897c14b634a9b /src/amberscript/parser_buffer_test.cc | |
parent | 98e3e7ed84039d189d6d23eaed55efd62d3edbcf (diff) | |
download | amber-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.cc | 201 |
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 |