| Index: gpu/command_buffer/service/common_decoder_unittest.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/common_decoder_unittest.cc (revision 37239)
|
| +++ gpu/command_buffer/service/common_decoder_unittest.cc (working copy)
|
| @@ -70,17 +70,23 @@
|
|
|
| class MockCommandBufferEngine : public CommandBufferEngine {
|
| public:
|
| - static const int32 kValidShmId = 1;
|
| + static const int32 kStartValidShmId = 1;
|
| + static const int32 kValidShmId = 2;
|
| + static const int32 kInvalidShmId = 3;
|
| + static const size_t kBufferSize = 1024;
|
| + static const uint32 kValidOffset = kBufferSize / 2;
|
| + static const uint32 kInvalidOffset = kBufferSize;
|
|
|
| MockCommandBufferEngine()
|
| : CommandBufferEngine(),
|
| - token_() {
|
| + token_(),
|
| + get_offset_(0) {
|
| }
|
|
|
| // Overridden from CommandBufferEngine.
|
| virtual Buffer GetSharedMemoryBuffer(int32 shm_id) {
|
| Buffer buffer;
|
| - if (shm_id == kValidShmId) {
|
| + if (IsValidSharedMemoryId(shm_id)) {
|
| buffer.ptr = buffer_;
|
| buffer.size = kBufferSize;
|
| }
|
| @@ -95,7 +101,7 @@
|
|
|
| uint32 GetSharedMemoryOffset(const void* memory) {
|
| ptrdiff_t offset = reinterpret_cast<const int8*>(memory) - &buffer_[0];
|
| - DCHECK(offset >= 0);
|
| + DCHECK_GE(offset, 0);
|
| DCHECK(offset < kBufferSize);
|
| return static_cast<uint32>(offset);
|
| }
|
| @@ -109,11 +115,28 @@
|
| return token_;
|
| }
|
|
|
| + // Overridden from CommandBufferEngine.
|
| + virtual bool SetGetOffset(int32 offset) {
|
| + if (offset < kBufferSize) {
|
| + get_offset_ = offset;
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + // Overridden from CommandBufferEngine.
|
| + virtual int32 GetGetOffset() {
|
| + return get_offset_;
|
| + }
|
| +
|
| private:
|
| - static const size_t kBufferSize = 1024;
|
| + bool IsValidSharedMemoryId(int32 shm_id) {
|
| + return shm_id == kValidShmId || shm_id == kStartValidShmId;
|
| + }
|
|
|
| int8 buffer_[kBufferSize];
|
| int32 token_;
|
| + int32 get_offset_;
|
| };
|
|
|
| class CommonDecoderTest : public testing::Test {
|
| @@ -145,6 +168,10 @@
|
| TestCommonDecoder decoder_;
|
| };
|
|
|
| +TEST_F(CommonDecoderTest, Initialize) {
|
| + EXPECT_EQ(0u, engine_.GetGetOffset());
|
| +}
|
| +
|
| TEST_F(CommonDecoderTest, HandleNoop) {
|
| cmd::Noop cmd;
|
| const uint32 kSkipCount = 5;
|
| @@ -164,28 +191,117 @@
|
| }
|
|
|
| TEST_F(CommonDecoderTest, Jump) {
|
| - // cmd::Jump cmd;
|
| - // TODO(gman): implement.
|
| + cmd::Jump cmd;
|
| + // Check valid args succeed.
|
| + cmd.Init(MockCommandBufferEngine::kValidOffset);
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(MockCommandBufferEngine::kValidOffset,
|
| + engine_.GetGetOffset());
|
| + // Check invalid offset fails.
|
| + cmd.Init(MockCommandBufferEngine::kInvalidOffset);
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(MockCommandBufferEngine::kValidOffset,
|
| + engine_.GetGetOffset());
|
| }
|
|
|
| +// NOTE: The read_pointer checks for relative commands do not take into account
|
| +// that the actual implementation of CommandBufferEngine uses the parse
|
| +// which will advance the read pointer to the start of the next command.
|
| +
|
| TEST_F(CommonDecoderTest, JumpRelative) {
|
| - // cmd::JumpRelative cmd;
|
| - // TODO(gman): implement.
|
| + cmd::JumpRelative cmd;
|
| + // Check valid positive offset succeeds.
|
| + const int32 kPositiveOffset = 16;
|
| + cmd.Init(kPositiveOffset);
|
| + uint32 read_pointer = engine_.GetGetOffset();
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer + kPositiveOffset, engine_.GetGetOffset());
|
| + // Check valid negative offset succeeds.
|
| + const int32 kNegativeOffset = -8;
|
| + read_pointer = engine_.GetGetOffset();
|
| + cmd.Init(kNegativeOffset);
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer + kNegativeOffset, engine_.GetGetOffset());
|
| + // Check invalid offset fails.
|
| + cmd.Init(MockCommandBufferEngine::kInvalidOffset);
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer + kNegativeOffset, engine_.GetGetOffset());
|
| }
|
|
|
| TEST_F(CommonDecoderTest, Call) {
|
| - // cmd::Call cmd;
|
| - // TODO(gman): implement.
|
| + cmd::Call cmd;
|
| + // Check valid args succeed.
|
| + cmd.Init(MockCommandBufferEngine::kValidOffset);
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(MockCommandBufferEngine::kValidOffset,
|
| + engine_.GetGetOffset());
|
| + // Check invalid offset fails.
|
| + cmd.Init(MockCommandBufferEngine::kInvalidOffset);
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + EXPECT_EQ(MockCommandBufferEngine::kValidOffset,
|
| + engine_.GetGetOffset());
|
| + // Check that the call values are on the stack.
|
| + cmd::Return return_cmd;
|
| + return_cmd.Init();
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(return_cmd));
|
| + EXPECT_EQ(0u, engine_.GetGetOffset());
|
| + // Check that stack overflow fails.
|
| + cmd.Init(MockCommandBufferEngine::kValidOffset);
|
| + for (unsigned int ii = 0; ii < CommonDecoder::kMaxStackDepth; ++ii) {
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + }
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| TEST_F(CommonDecoderTest, CallRelative) {
|
| - // cmd::CallRelative cmd;
|
| - // TODO(gman): implement.
|
| + cmd::CallRelative cmd;
|
| + // Check valid positive offset succeeds.
|
| + const int32 kPositiveOffset = 16;
|
| + cmd.Init(kPositiveOffset);
|
| + uint32 read_pointer_1 = engine_.GetGetOffset();
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer_1 + kPositiveOffset, engine_.GetGetOffset());
|
| + // Check valid negative offset succeeds.
|
| + const int32 kNegativeOffset = -8;
|
| + uint32 read_pointer_2 = engine_.GetGetOffset();
|
| + cmd.Init(kNegativeOffset);
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer_2 + kNegativeOffset, engine_.GetGetOffset());
|
| + // Check invalid offset fails.
|
| + cmd.Init(MockCommandBufferEngine::kInvalidOffset);
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer_2 + kNegativeOffset, engine_.GetGetOffset());
|
| +
|
| + // Check that the call values are on the stack.
|
| + cmd::Return return_cmd;
|
| + return_cmd.Init();
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(return_cmd));
|
| + // See note above.
|
| + EXPECT_EQ(read_pointer_1 + kPositiveOffset, engine_.GetGetOffset());
|
| +
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(return_cmd));
|
| + // See note above.
|
| + EXPECT_EQ(0u, engine_.GetGetOffset());
|
| + // Check that stack overflow fails.
|
| + cmd.Init(kPositiveOffset);
|
| + for (unsigned int ii = 0; ii < CommonDecoder::kMaxStackDepth; ++ii) {
|
| + EXPECT_EQ(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| + }
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| TEST_F(CommonDecoderTest, Return) {
|
| - // cmd::Return cmd;
|
| - // TODO(gman): implement.
|
| + // Success is tested by Call and CallRelative
|
| + // Test that an empty stack fails.
|
| + cmd::Return cmd;
|
| + cmd.Init();
|
| + EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| TEST_F(CommonDecoderTest, SetBucketSize) {
|
| @@ -413,6 +529,5 @@
|
| EXPECT_NE(parse_error::kParseNoError, ExecuteCmd(cmd));
|
| }
|
|
|
| -
|
| } // namespace gpu
|
|
|
|
|