| Index: o3d/gpu_plugin/gpu_processor_unittest.cc
|
| ===================================================================
|
| --- o3d/gpu_plugin/gpu_processor_unittest.cc (revision 26879)
|
| +++ o3d/gpu_plugin/gpu_processor_unittest.cc (working copy)
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "base/at_exit.h"
|
| #include "base/message_loop.h"
|
| +#include "o3d/command_buffer/common/cross/cmd_buffer_format.h"
|
| +#include "o3d/command_buffer/service/cross/mocks.h"
|
| #include "o3d/gpu_plugin/command_buffer_mock.h"
|
| #include "o3d/gpu_plugin/gpu_processor.h"
|
| #include "o3d/gpu_plugin/np_utils/np_browser_stub.h"
|
| @@ -33,8 +35,30 @@
|
| command_buffer_ = NPCreateObject<MockCommandBuffer>(NULL);
|
| ON_CALL(*command_buffer_.Get(), GetRingBuffer())
|
| .WillByDefault(Return(shared_memory_));
|
| + ON_CALL(*command_buffer_.Get(), GetSize())
|
| + .WillByDefault(Return(sizeof(buffer_)));
|
|
|
| - processor_ = new GPUProcessor(command_buffer_);
|
| +#if defined(OS_WIN)
|
| + gapi_ = new command_buffer::GAPID3D9;
|
| +#endif
|
| +
|
| + async_api_.reset(new StrictMock<command_buffer::AsyncAPIMock>);
|
| +
|
| + decoder_ = new command_buffer::GAPIDecoder(gapi_);
|
| +
|
| + parser_ = new command_buffer::CommandParser(buffer_,
|
| + sizeof(buffer_),
|
| + 0,
|
| + sizeof(buffer_),
|
| + 0,
|
| + async_api_.get());
|
| +
|
| + processor_ = new GPUProcessor(NULL,
|
| + command_buffer_,
|
| + gapi_,
|
| + decoder_,
|
| + parser_,
|
| + 2);
|
| }
|
|
|
| virtual void TearDown() {
|
| @@ -49,115 +73,234 @@
|
| NPObjectPointer<MockCommandBuffer> command_buffer_;
|
| NPObjectPointer<NiceMock<MockSharedMemory> > shared_memory_;
|
| int32 buffer_[1024 / sizeof(int32)];
|
| + command_buffer::GAPIDecoder* decoder_;
|
| + command_buffer::CommandParser* parser_;
|
| + scoped_ptr<command_buffer::AsyncAPIMock> async_api_;
|
| scoped_refptr<GPUProcessor> processor_;
|
| +
|
| +#if defined(OS_WIN)
|
| + command_buffer::GAPID3D9* gapi_;
|
| +#endif
|
| };
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorDoesNothingIfNoSharedMemory) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0));
|
| +TEST_F(GPUProcessorTest, ProcessorDoesNothingIfRingBufferIsEmpty) {
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| .WillOnce(Return(0));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(1024));
|
| - ON_CALL(*command_buffer_.Get(), GetRingBuffer())
|
| - .WillByDefault(Return(NPObjectPointer<CHRSharedMemory>()));
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(0));
|
|
|
| processor_->ProcessCommands();
|
| +
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_NO_ERROR,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_FALSE(command_buffer_->GetErrorStatus());
|
| }
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorDoesNothingIfSharedMemoryIsUnmapped) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0));
|
| +TEST_F(GPUProcessorTest, ProcessesOneCommand) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 2;
|
| + buffer_[1] = 123;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(0));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(1024));
|
| - shared_memory_->ptr = NULL;
|
| + .WillOnce(Return(2));
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(2));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[1]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| processor_->ProcessCommands();
|
| +
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_NO_ERROR,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_FALSE(command_buffer_->GetErrorStatus());
|
| }
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorDoesNothingIfCommandBufferIsZeroSize) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0));
|
| +TEST_F(GPUProcessorTest, ProcessesTwoCommands) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 2;
|
| + buffer_[1] = 123;
|
| + header[2].command = 8;
|
| + header[2].size = 1;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(0));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(0));
|
| + .WillOnce(Return(3));
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(3));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[1]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| + EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[3]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| processor_->ProcessCommands();
|
| }
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorDoesNothingIfCommandBufferIsEmpty) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0));
|
| +TEST_F(GPUProcessorTest, PostsTaskToFinishRemainingCommands) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 2;
|
| + buffer_[1] = 123;
|
| + header[2].command = 8;
|
| + header[2].size = 1;
|
| + header[3].command = 9;
|
| + header[3].size = 1;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(0));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(sizeof(buffer_)));
|
| + .WillOnce(Return(4));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 1, &buffer_[1]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| + EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[3]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(3));
|
| +
|
| processor_->ProcessCommands();
|
| -}
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorHandlesSingleNopCommand) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0));
|
| + // ProcessCommands is called a second time when the pending task is run.
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| .WillOnce(Return(4));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(sizeof(buffer_)));
|
| +
|
| + EXPECT_CALL(*async_api_, DoCommand(9, 0, &buffer_[4]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| EXPECT_CALL(*command_buffer_, SetGetOffset(4));
|
|
|
| - processor_->ProcessCommands();
|
| + MessageLoop::current()->RunAllPending();
|
| }
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorWrapsAroundToBeginningOfCommandBuffer) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(4));
|
| +TEST_F(GPUProcessorTest, SetsErrorCodeOnCommandBuffer) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 1;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(0));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(8));
|
| - EXPECT_CALL(*command_buffer_, SetGetOffset(0));
|
| + .WillOnce(Return(1));
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(1));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[1]))
|
| + .WillOnce(Return(
|
| + command_buffer::BufferSyncInterface::PARSE_UNKNOWN_COMMAND));
|
| +
|
| processor_->ProcessCommands();
|
| +
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_UNKNOWN_COMMAND,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_FALSE(command_buffer_->GetErrorStatus());
|
| }
|
|
|
| TEST_F(GPUProcessorTest,
|
| - ProcessorHandlesSingleCommandAndPostsTaskToProcessAdditionalCommands) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0))
|
| - .WillOnce(Return(4));
|
| + RecoverableParseErrorsAreNotClearedByFollowingSuccessfulCommands) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 1;
|
| + header[1].command = 8;
|
| + header[1].size = 1;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(8))
|
| - .WillOnce(Return(8));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(sizeof(buffer_)))
|
| - .WillOnce(Return(sizeof(buffer_)));
|
| - EXPECT_CALL(*command_buffer_, SetGetOffset(4));
|
| + .WillOnce(Return(2));
|
| + EXPECT_CALL(*command_buffer_, SetGetOffset(2));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[1]))
|
| + .WillOnce(Return(
|
| + command_buffer::BufferSyncInterface::PARSE_UNKNOWN_COMMAND));
|
| +
|
| + EXPECT_CALL(*async_api_, DoCommand(8, 0, &buffer_[2]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_NO_ERROR));
|
| +
|
| processor_->ProcessCommands();
|
|
|
| - EXPECT_CALL(*command_buffer_, SetGetOffset(8));
|
| - MessageLoop::current()->RunAllPending();
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_UNKNOWN_COMMAND,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_FALSE(command_buffer_->GetErrorStatus());
|
| }
|
|
|
| -TEST_F(GPUProcessorTest, ProcessorDoesNotImmediatelyHandlePartialCommands) {
|
| - EXPECT_CALL(*command_buffer_, GetGetOffset())
|
| - .WillOnce(Return(0))
|
| - .WillOnce(Return(0));
|
| +TEST_F(GPUProcessorTest, UnrecoverableParseErrorsRaiseTheErrorStatus) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 1;
|
| + header[1].command = 8;
|
| + header[1].size = 1;
|
| +
|
| EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| - .WillOnce(Return(2))
|
| - .WillOnce(Return(4));
|
| - EXPECT_CALL(*command_buffer_, GetSize())
|
| - .WillOnce(Return(sizeof(buffer_)))
|
| - .WillOnce(Return(sizeof(buffer_)));
|
| + .WillOnce(Return(2));
|
|
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[1]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_INVALID_SIZE));
|
| +
|
| processor_->ProcessCommands();
|
|
|
| - EXPECT_CALL(*command_buffer_, SetGetOffset(4));
|
| - MessageLoop::current()->RunAllPending();
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_INVALID_SIZE,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_TRUE(command_buffer_->GetErrorStatus());
|
| }
|
|
|
| +TEST_F(GPUProcessorTest, ProcessCommandsDoesNothingAfterUnrecoverableError) {
|
| + command_buffer::CommandHeader* header =
|
| + reinterpret_cast<command_buffer::CommandHeader*>(&buffer_[0]);
|
| + header[0].command = 7;
|
| + header[0].size = 1;
|
| + header[1].command = 8;
|
| + header[1].size = 1;
|
| +
|
| + EXPECT_CALL(*command_buffer_, GetPutOffset())
|
| + .WillOnce(Return(2));
|
| +
|
| + EXPECT_CALL(*async_api_, DoCommand(7, 0, &buffer_[1]))
|
| + .WillOnce(Return(command_buffer::BufferSyncInterface::PARSE_INVALID_SIZE));
|
| +
|
| + processor_->ProcessCommands();
|
| + processor_->ProcessCommands();
|
| +
|
| + EXPECT_EQ(command_buffer::BufferSyncInterface::PARSE_INVALID_SIZE,
|
| + command_buffer_->ResetParseError());
|
| + EXPECT_TRUE(command_buffer_->GetErrorStatus());
|
| +}
|
| +
|
| +TEST_F(GPUProcessorTest, CanGetAddressOfSharedMemory) {
|
| + EXPECT_CALL(*command_buffer_.Get(), GetRegisteredObject(7))
|
| + .WillOnce(Return(shared_memory_));
|
| +
|
| + EXPECT_EQ(&buffer_[0], processor_->GetSharedMemoryAddress(7));
|
| +}
|
| +
|
| +ACTION_P2(SetPointee, address, value) {
|
| + *address = value;
|
| +}
|
| +
|
| +TEST_F(GPUProcessorTest, GetAddressOfSharedMemoryMapsMemoryIfUnmapped) {
|
| + EXPECT_CALL(*command_buffer_.Get(), GetRegisteredObject(7))
|
| + .WillOnce(Return(shared_memory_));
|
| +
|
| + shared_memory_->ptr = NULL;
|
| +
|
| + EXPECT_CALL(*shared_memory_.Get(), Map())
|
| + .WillOnce(DoAll(SetPointee(&shared_memory_->ptr, &buffer_[0]),
|
| + Return(true)));
|
| +
|
| + EXPECT_EQ(&buffer_[0], processor_->GetSharedMemoryAddress(7));
|
| +}
|
| +
|
| +TEST_F(GPUProcessorTest, CanGetSizeOfSharedMemory) {
|
| + EXPECT_CALL(*command_buffer_.Get(), GetRegisteredObject(7))
|
| + .WillOnce(Return(shared_memory_));
|
| +
|
| + EXPECT_EQ(sizeof(buffer_), processor_->GetSharedMemorySize(7));
|
| +}
|
| +
|
| +TEST_F(GPUProcessorTest, SetTokenForwardsToCommandBuffer) {
|
| + processor_->set_token(7);
|
| + EXPECT_EQ(7, command_buffer_->GetToken());
|
| +}
|
| +
|
| } // namespace gpu_plugin
|
| } // namespace o3d
|
|
|