| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Tests for the Command Buffer Helper. | 5 // Tests for the Command Buffer Helper. |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "gpu/command_buffer/client/cmd_buffer_helper.h" | 10 #include "gpu/command_buffer/client/cmd_buffer_helper.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 namespace gpu { | 21 namespace gpu { |
| 22 | 22 |
| 23 using testing::Return; | 23 using testing::Return; |
| 24 using testing::Mock; | 24 using testing::Mock; |
| 25 using testing::Truly; | 25 using testing::Truly; |
| 26 using testing::Sequence; | 26 using testing::Sequence; |
| 27 using testing::DoAll; | 27 using testing::DoAll; |
| 28 using testing::Invoke; | 28 using testing::Invoke; |
| 29 using testing::_; | 29 using testing::_; |
| 30 | 30 |
| 31 const int32 kTotalNumCommandEntries = 12; | 31 const int32 kTotalNumCommandEntries = 10; |
| 32 const int32 kUsableNumCommandEntries = 10; | |
| 33 const int32 kCommandBufferSizeBytes = | 32 const int32 kCommandBufferSizeBytes = |
| 34 kTotalNumCommandEntries * sizeof(CommandBufferEntry); | 33 kTotalNumCommandEntries * sizeof(CommandBufferEntry); |
| 35 const int32 kUnusedCommandId = 5; // we use 0 and 2 currently. | 34 const int32 kUnusedCommandId = 5; // we use 0 and 2 currently. |
| 36 | 35 |
| 37 // Test fixture for CommandBufferHelper test - Creates a CommandBufferHelper, | 36 // Test fixture for CommandBufferHelper test - Creates a CommandBufferHelper, |
| 38 // using a CommandBufferEngine with a mock AsyncAPIInterface for its interface | 37 // using a CommandBufferEngine with a mock AsyncAPIInterface for its interface |
| 39 // (calling it directly, not through the RPC mechanism). | 38 // (calling it directly, not through the RPC mechanism). |
| 40 class CommandBufferHelperTest : public testing::Test { | 39 class CommandBufferHelperTest : public testing::Test { |
| 41 protected: | 40 protected: |
| 42 // Helper so mock can handle the Jump command. | |
| 43 class DoJumpCommand { | |
| 44 public: | |
| 45 explicit DoJumpCommand(GpuScheduler* gpu_scheduler) | |
| 46 : gpu_scheduler_(gpu_scheduler) { | |
| 47 } | |
| 48 | |
| 49 error::Error DoCommand( | |
| 50 unsigned int command, | |
| 51 unsigned int arg_count, | |
| 52 const void* cmd_data) { | |
| 53 const cmd::Jump* jump_cmd = static_cast<const cmd::Jump*>(cmd_data); | |
| 54 gpu_scheduler_->parser()->set_get(jump_cmd->offset); | |
| 55 return error::kNoError; | |
| 56 }; | |
| 57 | |
| 58 private: | |
| 59 GpuScheduler* gpu_scheduler_; | |
| 60 }; | |
| 61 | |
| 62 virtual void SetUp() { | 41 virtual void SetUp() { |
| 63 api_mock_.reset(new AsyncAPIMock); | 42 api_mock_.reset(new AsyncAPIMock); |
| 64 // ignore noops in the mock - we don't want to inspect the internals of the | 43 // ignore noops in the mock - we don't want to inspect the internals of the |
| 65 // helper. | 44 // helper. |
| 66 EXPECT_CALL(*api_mock_, DoCommand(cmd::kNoop, _, _)) | 45 EXPECT_CALL(*api_mock_, DoCommand(cmd::kNoop, _, _)) |
| 67 .WillRepeatedly(Return(error::kNoError)); | 46 .WillRepeatedly(Return(error::kNoError)); |
| 68 | 47 |
| 69 { | 48 { |
| 70 TransferBufferManager* manager = new TransferBufferManager(); | 49 TransferBufferManager* manager = new TransferBufferManager(); |
| 71 transfer_buffer_manager_.reset(manager); | 50 transfer_buffer_manager_.reset(manager); |
| 72 EXPECT_TRUE(manager->Initialize()); | 51 EXPECT_TRUE(manager->Initialize()); |
| 73 } | 52 } |
| 74 command_buffer_.reset( | 53 command_buffer_.reset( |
| 75 new CommandBufferService(transfer_buffer_manager_.get())); | 54 new CommandBufferService(transfer_buffer_manager_.get())); |
| 76 EXPECT_TRUE(command_buffer_->Initialize()); | 55 EXPECT_TRUE(command_buffer_->Initialize()); |
| 77 | 56 |
| 78 gpu_scheduler_.reset(new GpuScheduler( | 57 gpu_scheduler_.reset(new GpuScheduler( |
| 79 command_buffer_.get(), api_mock_.get(), NULL)); | 58 command_buffer_.get(), api_mock_.get(), NULL)); |
| 80 command_buffer_->SetPutOffsetChangeCallback(base::Bind( | 59 command_buffer_->SetPutOffsetChangeCallback(base::Bind( |
| 81 &GpuScheduler::PutChanged, base::Unretained(gpu_scheduler_.get()))); | 60 &GpuScheduler::PutChanged, base::Unretained(gpu_scheduler_.get()))); |
| 82 command_buffer_->SetGetBufferChangeCallback(base::Bind( | 61 command_buffer_->SetGetBufferChangeCallback(base::Bind( |
| 83 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); | 62 &GpuScheduler::SetGetBuffer, base::Unretained(gpu_scheduler_.get()))); |
| 84 | 63 |
| 85 do_jump_command_.reset(new DoJumpCommand(gpu_scheduler_.get())); | |
| 86 EXPECT_CALL(*api_mock_, DoCommand(cmd::kJump, _, _)) | |
| 87 .WillRepeatedly( | |
| 88 Invoke(do_jump_command_.get(), &DoJumpCommand::DoCommand)); | |
| 89 | |
| 90 | |
| 91 api_mock_->set_engine(gpu_scheduler_.get()); | 64 api_mock_->set_engine(gpu_scheduler_.get()); |
| 92 | 65 |
| 93 helper_.reset(new CommandBufferHelper(command_buffer_.get())); | 66 helper_.reset(new CommandBufferHelper(command_buffer_.get())); |
| 94 helper_->Initialize(kCommandBufferSizeBytes); | 67 helper_->Initialize(kCommandBufferSizeBytes); |
| 95 } | 68 } |
| 96 | 69 |
| 97 virtual void TearDown() { | 70 virtual void TearDown() { |
| 98 // If the GpuScheduler posts any tasks, this forces them to run. | 71 // If the GpuScheduler posts any tasks, this forces them to run. |
| 99 MessageLoop::current()->RunUntilIdle(); | 72 MessageLoop::current()->RunUntilIdle(); |
| 100 } | 73 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 #if defined(OS_MACOSX) | 138 #if defined(OS_MACOSX) |
| 166 base::mac::ScopedNSAutoreleasePool autorelease_pool_; | 139 base::mac::ScopedNSAutoreleasePool autorelease_pool_; |
| 167 #endif | 140 #endif |
| 168 MessageLoop message_loop_; | 141 MessageLoop message_loop_; |
| 169 scoped_ptr<AsyncAPIMock> api_mock_; | 142 scoped_ptr<AsyncAPIMock> api_mock_; |
| 170 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; | 143 scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; |
| 171 scoped_ptr<CommandBufferService> command_buffer_; | 144 scoped_ptr<CommandBufferService> command_buffer_; |
| 172 scoped_ptr<GpuScheduler> gpu_scheduler_; | 145 scoped_ptr<GpuScheduler> gpu_scheduler_; |
| 173 scoped_ptr<CommandBufferHelper> helper_; | 146 scoped_ptr<CommandBufferHelper> helper_; |
| 174 Sequence sequence_; | 147 Sequence sequence_; |
| 175 scoped_ptr<DoJumpCommand> do_jump_command_; | |
| 176 }; | 148 }; |
| 177 | 149 |
| 178 // Checks that commands in the buffer are properly executed, and that the | 150 // Checks that commands in the buffer are properly executed, and that the |
| 179 // status/error stay valid. | 151 // status/error stay valid. |
| 180 TEST_F(CommandBufferHelperTest, TestCommandProcessing) { | 152 TEST_F(CommandBufferHelperTest, TestCommandProcessing) { |
| 181 // Check initial state of the engine - it should have been configured by the | 153 // Check initial state of the engine - it should have been configured by the |
| 182 // helper. | 154 // helper. |
| 183 EXPECT_TRUE(GetParser() != NULL); | 155 EXPECT_TRUE(GetParser() != NULL); |
| 184 EXPECT_EQ(error::kNoError, GetError()); | 156 EXPECT_EQ(error::kNoError, GetError()); |
| 185 EXPECT_EQ(0, GetGetOffset()); | 157 EXPECT_EQ(0, GetGetOffset()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 | 199 |
| 228 // Check the error status. | 200 // Check the error status. |
| 229 EXPECT_EQ(error::kNoError, GetError()); | 201 EXPECT_EQ(error::kNoError, GetError()); |
| 230 } | 202 } |
| 231 | 203 |
| 232 // Checks the case where the command inserted exactly matches the space left in | 204 // Checks the case where the command inserted exactly matches the space left in |
| 233 // the command buffer. | 205 // the command buffer. |
| 234 TEST_F(CommandBufferHelperTest, TestCommandWrappingExactMultiple) { | 206 TEST_F(CommandBufferHelperTest, TestCommandWrappingExactMultiple) { |
| 235 const int32 kCommandSize = 5; | 207 const int32 kCommandSize = 5; |
| 236 const size_t kNumArgs = kCommandSize - 1; | 208 const size_t kNumArgs = kCommandSize - 1; |
| 237 COMPILE_ASSERT(kUsableNumCommandEntries % kCommandSize == 0, | 209 COMPILE_ASSERT(kTotalNumCommandEntries % kCommandSize == 0, |
| 238 Not_multiple_of_num_command_entries); | 210 Not_multiple_of_num_command_entries); |
| 239 CommandBufferEntry args1[kNumArgs]; | 211 CommandBufferEntry args1[kNumArgs]; |
| 240 for (size_t ii = 0; ii < kNumArgs; ++ii) { | 212 for (size_t ii = 0; ii < kNumArgs; ++ii) { |
| 241 args1[0].value_uint32 = ii + 1; | 213 args1[0].value_uint32 = ii + 1; |
| 242 } | 214 } |
| 243 | 215 |
| 244 for (unsigned int i = 0; i < 5; ++i) { | 216 for (unsigned int i = 0; i < 5; ++i) { |
| 245 AddCommandWithExpect( | 217 AddCommandWithExpect( |
| 246 error::kNoError, i + kUnusedCommandId, kNumArgs, args1); | 218 error::kNoError, i + kUnusedCommandId, kNumArgs, args1); |
| 247 } | 219 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 } | 324 } |
| 353 } | 325 } |
| 354 | 326 |
| 355 TEST_F(CommandBufferHelperTest, IsContextLost) { | 327 TEST_F(CommandBufferHelperTest, IsContextLost) { |
| 356 EXPECT_FALSE(helper_->IsContextLost()); | 328 EXPECT_FALSE(helper_->IsContextLost()); |
| 357 command_buffer_->SetParseError(error::kGenericError); | 329 command_buffer_->SetParseError(error::kGenericError); |
| 358 EXPECT_TRUE(helper_->IsContextLost()); | 330 EXPECT_TRUE(helper_->IsContextLost()); |
| 359 } | 331 } |
| 360 | 332 |
| 361 } // namespace gpu | 333 } // namespace gpu |
| OLD | NEW |