Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Unified Diff: o3d/gpu_plugin/gpu_processor_unittest.cc

Issue 234001: GPUProcessor uses O3D command buffer service to render to a window.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « o3d/gpu_plugin/gpu_processor.cc ('k') | o3d/gpu_plugin/gpu_processor_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « o3d/gpu_plugin/gpu_processor.cc ('k') | o3d/gpu_plugin/gpu_processor_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698