| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/at_exit.h" | 7 #include "base/at_exit.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "gpu/command_buffer/client/cmd_buffer_helper.h" | 9 #include "gpu/command_buffer/client/cmd_buffer_helper.h" |
| 10 #include "gpu/command_buffer/service/mocks.h" | 10 #include "gpu/command_buffer/service/mocks.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 if (put >= parser_put) { | 95 if (put >= parser_put) { |
| 96 // we're on the top side, check we are below the limit. | 96 // we're on the top side, check we are below the limit. |
| 97 EXPECT_GE(kNumCommandEntries, limit); | 97 EXPECT_GE(kNumCommandEntries, limit); |
| 98 } else { | 98 } else { |
| 99 // we're on the bottom side, check we are below get. | 99 // we're on the bottom side, check we are below get. |
| 100 EXPECT_GT(parser_get, limit); | 100 EXPECT_GT(parser_get, limit); |
| 101 } | 101 } |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 | 104 |
| 105 int32 GetGetOffset() { |
| 106 return command_buffer_->GetState().get_offset; |
| 107 } |
| 108 |
| 109 int32 GetPutOffset() { |
| 110 return command_buffer_->GetState().put_offset; |
| 111 } |
| 112 |
| 113 parse_error::ParseError GetError() { |
| 114 return command_buffer_->GetState().error; |
| 115 } |
| 116 |
| 105 CommandBufferOffset get_helper_put() { return helper_->put_; } | 117 CommandBufferOffset get_helper_put() { return helper_->put_; } |
| 106 | 118 |
| 107 base::AtExitManager at_exit_manager_; | 119 base::AtExitManager at_exit_manager_; |
| 108 MessageLoop message_loop_; | 120 MessageLoop message_loop_; |
| 109 scoped_ptr<AsyncAPIMock> api_mock_; | 121 scoped_ptr<AsyncAPIMock> api_mock_; |
| 110 scoped_ptr<CommandBufferService> command_buffer_; | 122 scoped_ptr<CommandBufferService> command_buffer_; |
| 111 CommandParser* parser_; | 123 CommandParser* parser_; |
| 112 scoped_ptr<CommandBufferHelper> helper_; | 124 scoped_ptr<CommandBufferHelper> helper_; |
| 113 Sequence sequence_; | 125 Sequence sequence_; |
| 114 }; | 126 }; |
| 115 | 127 |
| 116 // Checks that commands in the buffer are properly executed, and that the | 128 // Checks that commands in the buffer are properly executed, and that the |
| 117 // status/error stay valid. | 129 // status/error stay valid. |
| 118 TEST_F(CommandBufferHelperTest, TestCommandProcessing) { | 130 TEST_F(CommandBufferHelperTest, TestCommandProcessing) { |
| 119 // Check initial state of the engine - it should have been configured by the | 131 // Check initial state of the engine - it should have been configured by the |
| 120 // helper. | 132 // helper. |
| 121 EXPECT_TRUE(parser_ != NULL); | 133 EXPECT_TRUE(parser_ != NULL); |
| 122 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 134 EXPECT_EQ(parse_error::kParseNoError, GetError()); |
| 123 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | 135 EXPECT_EQ(0, GetGetOffset()); |
| 124 EXPECT_EQ(0, command_buffer_->GetGetOffset()); | |
| 125 | 136 |
| 126 // Add 3 commands through the helper | 137 // Add 3 commands through the helper |
| 127 AddCommandWithExpect(parse_error::kParseNoError, 1, 0, NULL); | 138 AddCommandWithExpect(parse_error::kParseNoError, 1, 0, NULL); |
| 128 | 139 |
| 129 CommandBufferEntry args1[2]; | 140 CommandBufferEntry args1[2]; |
| 130 args1[0].value_uint32 = 3; | 141 args1[0].value_uint32 = 3; |
| 131 args1[1].value_float = 4.f; | 142 args1[1].value_float = 4.f; |
| 132 AddCommandWithExpect(parse_error::kParseNoError, 2, 2, args1); | 143 AddCommandWithExpect(parse_error::kParseNoError, 2, 2, args1); |
| 133 | 144 |
| 134 CommandBufferEntry args2[2]; | 145 CommandBufferEntry args2[2]; |
| 135 args2[0].value_uint32 = 5; | 146 args2[0].value_uint32 = 5; |
| 136 args2[1].value_float = 6.f; | 147 args2[1].value_float = 6.f; |
| 137 AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args2); | 148 AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args2); |
| 138 | 149 |
| 139 helper_->Flush(); | 150 helper_->Flush(); |
| 140 // Check that the engine has work to do now. | 151 // Check that the engine has work to do now. |
| 141 EXPECT_FALSE(parser_->IsEmpty()); | 152 EXPECT_FALSE(parser_->IsEmpty()); |
| 142 | 153 |
| 143 // Wait until it's done. | 154 // Wait until it's done. |
| 144 helper_->Finish(); | 155 helper_->Finish(); |
| 145 // Check that the engine has no more work to do. | 156 // Check that the engine has no more work to do. |
| 146 EXPECT_TRUE(parser_->IsEmpty()); | 157 EXPECT_TRUE(parser_->IsEmpty()); |
| 147 | 158 |
| 148 // Check that the commands did happen. | 159 // Check that the commands did happen. |
| 149 Mock::VerifyAndClearExpectations(api_mock_.get()); | 160 Mock::VerifyAndClearExpectations(api_mock_.get()); |
| 150 | 161 |
| 151 // Check the error status. | 162 // Check the error status. |
| 152 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 163 EXPECT_EQ(parse_error::kParseNoError, GetError()); |
| 153 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | |
| 154 } | 164 } |
| 155 | 165 |
| 156 // Checks that commands in the buffer are properly executed when wrapping the | 166 // Checks that commands in the buffer are properly executed when wrapping the |
| 157 // buffer, and that the status/error stay valid. | 167 // buffer, and that the status/error stay valid. |
| 158 TEST_F(CommandBufferHelperTest, TestCommandWrapping) { | 168 TEST_F(CommandBufferHelperTest, TestCommandWrapping) { |
| 159 // Add 5 commands of size 3 through the helper to make sure we do wrap. | 169 // Add 5 commands of size 3 through the helper to make sure we do wrap. |
| 160 CommandBufferEntry args1[2]; | 170 CommandBufferEntry args1[2]; |
| 161 args1[0].value_uint32 = 3; | 171 args1[0].value_uint32 = 3; |
| 162 args1[1].value_float = 4.f; | 172 args1[1].value_float = 4.f; |
| 163 | 173 |
| 164 for (unsigned int i = 0; i < 5; ++i) { | 174 for (unsigned int i = 0; i < 5; ++i) { |
| 165 AddCommandWithExpect(parse_error::kParseNoError, i + 1, 2, args1); | 175 AddCommandWithExpect(parse_error::kParseNoError, i + 1, 2, args1); |
| 166 } | 176 } |
| 167 | 177 |
| 168 helper_->Finish(); | 178 helper_->Finish(); |
| 169 // Check that the commands did happen. | 179 // Check that the commands did happen. |
| 170 Mock::VerifyAndClearExpectations(api_mock_.get()); | 180 Mock::VerifyAndClearExpectations(api_mock_.get()); |
| 171 | 181 |
| 172 // Check the error status. | 182 // Check the error status. |
| 173 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 183 EXPECT_EQ(parse_error::kParseNoError, GetError()); |
| 174 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | |
| 175 } | |
| 176 | |
| 177 | |
| 178 // Checks that commands in the buffer are properly executed, even if they | |
| 179 // generate a recoverable error. Check that the error status is properly set, | |
| 180 // and reset when queried. | |
| 181 TEST_F(CommandBufferHelperTest, TestRecoverableError) { | |
| 182 CommandBufferEntry args[2]; | |
| 183 args[0].value_uint32 = 3; | |
| 184 args[1].value_float = 4.f; | |
| 185 | |
| 186 // Create a command buffer with 3 commands, 2 of them generating errors | |
| 187 AddCommandWithExpect(parse_error::kParseNoError, 1, 2, args); | |
| 188 AddCommandWithExpect(parse_error::kParseUnknownCommand, 2, 2, args); | |
| 189 AddCommandWithExpect(parse_error::kParseInvalidArguments, 3, 2, | |
| 190 args); | |
| 191 | |
| 192 helper_->Finish(); | |
| 193 // Check that the commands did happen. | |
| 194 Mock::VerifyAndClearExpectations(api_mock_.get()); | |
| 195 | |
| 196 // Check that the error status was set to the first error. | |
| 197 EXPECT_EQ(parse_error::kParseUnknownCommand, | |
| 198 command_buffer_->ResetParseError()); | |
| 199 // Check that the error status was reset after the query. | |
| 200 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | |
| 201 } | 184 } |
| 202 | 185 |
| 203 // Checks that asking for available entries work, and that the parser | 186 // Checks that asking for available entries work, and that the parser |
| 204 // effectively won't use that space. | 187 // effectively won't use that space. |
| 205 TEST_F(CommandBufferHelperTest, TestAvailableEntries) { | 188 TEST_F(CommandBufferHelperTest, TestAvailableEntries) { |
| 206 CommandBufferEntry args[2]; | 189 CommandBufferEntry args[2]; |
| 207 args[0].value_uint32 = 3; | 190 args[0].value_uint32 = 3; |
| 208 args[1].value_float = 4.f; | 191 args[1].value_float = 4.f; |
| 209 | 192 |
| 210 // Add 2 commands through the helper - 8 entries | 193 // Add 2 commands through the helper - 8 entries |
| (...skipping 11 matching lines...) Expand all Loading... |
| 222 // Add more commands. | 205 // Add more commands. |
| 223 AddCommandWithExpect(parse_error::kParseNoError, 5, 2, args); | 206 AddCommandWithExpect(parse_error::kParseNoError, 5, 2, args); |
| 224 | 207 |
| 225 // Wait until everything is done done. | 208 // Wait until everything is done done. |
| 226 helper_->Finish(); | 209 helper_->Finish(); |
| 227 | 210 |
| 228 // Check that the commands did happen. | 211 // Check that the commands did happen. |
| 229 Mock::VerifyAndClearExpectations(api_mock_.get()); | 212 Mock::VerifyAndClearExpectations(api_mock_.get()); |
| 230 | 213 |
| 231 // Check the error status. | 214 // Check the error status. |
| 232 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 215 EXPECT_EQ(parse_error::kParseNoError, GetError()); |
| 233 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | |
| 234 } | 216 } |
| 235 | 217 |
| 236 // Checks that the InsertToken/WaitForToken work. | 218 // Checks that the InsertToken/WaitForToken work. |
| 237 TEST_F(CommandBufferHelperTest, TestToken) { | 219 TEST_F(CommandBufferHelperTest, TestToken) { |
| 238 CommandBufferEntry args[2]; | 220 CommandBufferEntry args[2]; |
| 239 args[0].value_uint32 = 3; | 221 args[0].value_uint32 = 3; |
| 240 args[1].value_float = 4.f; | 222 args[1].value_float = 4.f; |
| 241 | 223 |
| 242 // Add a first command. | 224 // Add a first command. |
| 243 AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args); | 225 AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args); |
| 244 // keep track of the buffer position. | 226 // keep track of the buffer position. |
| 245 CommandBufferOffset command1_put = get_helper_put(); | 227 CommandBufferOffset command1_put = get_helper_put(); |
| 246 int32 token = helper_->InsertToken(); | 228 int32 token = helper_->InsertToken(); |
| 247 | 229 |
| 248 EXPECT_CALL(*api_mock_.get(), DoCommand(cmd::kSetToken, 1, _)) | 230 EXPECT_CALL(*api_mock_.get(), DoCommand(cmd::kSetToken, 1, _)) |
| 249 .WillOnce(DoAll(Invoke(api_mock_.get(), &AsyncAPIMock::SetToken), | 231 .WillOnce(DoAll(Invoke(api_mock_.get(), &AsyncAPIMock::SetToken), |
| 250 Return(parse_error::kParseNoError))); | 232 Return(parse_error::kParseNoError))); |
| 251 // Add another command. | 233 // Add another command. |
| 252 AddCommandWithExpect(parse_error::kParseNoError, 4, 2, args); | 234 AddCommandWithExpect(parse_error::kParseNoError, 4, 2, args); |
| 253 helper_->WaitForToken(token); | 235 helper_->WaitForToken(token); |
| 254 // check that the get pointer is beyond the first command. | 236 // check that the get pointer is beyond the first command. |
| 255 EXPECT_LE(command1_put, command_buffer_->GetGetOffset()); | 237 EXPECT_LE(command1_put, GetGetOffset()); |
| 256 helper_->Finish(); | 238 helper_->Finish(); |
| 257 | 239 |
| 258 // Check that the commands did happen. | 240 // Check that the commands did happen. |
| 259 Mock::VerifyAndClearExpectations(api_mock_.get()); | 241 Mock::VerifyAndClearExpectations(api_mock_.get()); |
| 260 | 242 |
| 261 // Check the error status. | 243 // Check the error status. |
| 262 EXPECT_FALSE(command_buffer_->GetErrorStatus()); | 244 EXPECT_EQ(parse_error::kParseNoError, GetError()); |
| 263 EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError()); | |
| 264 } | 245 } |
| 265 | 246 |
| 266 } // namespace gpu | 247 } // namespace gpu |
| OLD | NEW |