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

Side by Side Diff: command_buffer/service/cross/cmd_buffer_engine_test.cc

Issue 212018: Change command buffer client code to use structures.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2009, Google Inc. 2 * Copyright 2009, Google Inc.
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 unsigned int shm_id_; 126 unsigned int shm_id_;
127 Sequence sequence_; 127 Sequence sequence_;
128 }; 128 };
129 129
130 // Tests the initialization/termination sequence, checking that it sets the 130 // Tests the initialization/termination sequence, checking that it sets the
131 // engine in the correct states. 131 // engine in the correct states.
132 TEST_F(CommandBufferEngineTest, TestInitialization) { 132 TEST_F(CommandBufferEngineTest, TestInitialization) {
133 // Check initial state 133 // Check initial state
134 EXPECT_TRUE(engine()->rpc_impl() != NULL); 134 EXPECT_TRUE(engine()->rpc_impl() != NULL);
135 EXPECT_TRUE(engine()->parser() == NULL); 135 EXPECT_TRUE(engine()->parser() == NULL);
136 EXPECT_EQ(BufferSyncInterface::NOT_CONNECTED, engine()->GetStatus()); 136 EXPECT_EQ(BufferSyncInterface::kNotConnected, engine()->GetStatus());
137 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 137 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
138 EXPECT_EQ(-1, engine()->Get()); 138 EXPECT_EQ(-1, engine()->Get());
139 EXPECT_EQ(0, engine()->GetToken()); 139 EXPECT_EQ(0, engine()->GetToken());
140 140
141 engine()->InitConnection(); 141 engine()->InitConnection();
142 EXPECT_EQ(BufferSyncInterface::NO_BUFFER, engine()->GetStatus()); 142 EXPECT_EQ(BufferSyncInterface::kNoBuffer, engine()->GetStatus());
143 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 143 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
144 EXPECT_EQ(-1, engine()->Get()); 144 EXPECT_EQ(-1, engine()->Get());
145 145
146 CommandBufferEntry *entries = InitCommandBuffer(25, 5); 146 CommandBufferEntry *entries = InitCommandBuffer(25, 5);
147 ASSERT_TRUE(entries != NULL); 147 ASSERT_TRUE(entries != NULL);
148 148
149 EXPECT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 149 EXPECT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
150 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 150 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
151 EXPECT_EQ(5, engine()->Get()); 151 EXPECT_EQ(5, engine()->Get());
152 EXPECT_TRUE(engine()->parser() != NULL); 152 EXPECT_TRUE(engine()->parser() != NULL);
153 153
154 engine()->set_token(5678); 154 engine()->set_token(5678);
155 EXPECT_EQ(5678, engine()->GetToken()); 155 EXPECT_EQ(5678, engine()->GetToken());
156 156
157 engine()->CloseConnection(); 157 engine()->CloseConnection();
158 DestroyCommandBuffer(); 158 DestroyCommandBuffer();
159 159
160 EXPECT_EQ(BufferSyncInterface::NOT_CONNECTED, engine()->GetStatus()); 160 EXPECT_EQ(BufferSyncInterface::kNotConnected, engine()->GetStatus());
161 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 161 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
162 EXPECT_EQ(-1, engine()->Get()); 162 EXPECT_EQ(-1, engine()->Get());
163 EXPECT_TRUE(engine()->parser() == NULL); 163 EXPECT_TRUE(engine()->parser() == NULL);
164 } 164 }
165 165
166 // Checks that shared memory registration works. 166 // Checks that shared memory registration works.
167 TEST_F(CommandBufferEngineTest, TestSharedMemoryRegistration) { 167 TEST_F(CommandBufferEngineTest, TestSharedMemoryRegistration) {
168 // Create and register a first shared memory buffer. 168 // Create and register a first shared memory buffer.
169 const size_t kShmSize1 = 10; 169 const size_t kShmSize1 = 10;
170 RPCShmHandle shm1 = CreateShm(kShmSize1); 170 RPCShmHandle shm1 = CreateShm(kShmSize1);
171 ASSERT_NE(kRPCInvalidHandle, shm1); 171 ASSERT_NE(kRPCInvalidHandle, shm1);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 TEST_F(CommandBufferEngineTest, TestCommandProcessing) { 224 TEST_F(CommandBufferEngineTest, TestCommandProcessing) {
225 engine()->InitConnection(); 225 engine()->InitConnection();
226 CommandBufferEntry *entries = InitCommandBuffer(10, 0); 226 CommandBufferEntry *entries = InitCommandBuffer(10, 0);
227 ASSERT_TRUE(entries != NULL); 227 ASSERT_TRUE(entries != NULL);
228 228
229 CommandBufferOffset get = engine()->Get(); 229 CommandBufferOffset get = engine()->Get();
230 CommandBufferOffset put = get; 230 CommandBufferOffset put = get;
231 231
232 // Create a command buffer with 3 commands 232 // Create a command buffer with 3 commands
233 put += AddCommandWithExpect(entries + put, 233 put += AddCommandWithExpect(entries + put,
234 BufferSyncInterface::PARSE_NO_ERROR, 234 BufferSyncInterface::kParseNoError,
235 0, 235 0,
236 0, 236 0,
237 NULL); 237 NULL);
238 238
239 CommandBufferEntry args1[2]; 239 CommandBufferEntry args1[2];
240 args1[0].value_uint32 = 3; 240 args1[0].value_uint32 = 3;
241 args1[1].value_float = 4.f; 241 args1[1].value_float = 4.f;
242 put += AddCommandWithExpect(entries + put, 242 put += AddCommandWithExpect(entries + put,
243 BufferSyncInterface::PARSE_NO_ERROR, 243 BufferSyncInterface::kParseNoError,
244 1, 244 1,
245 2, 245 2,
246 args1); 246 args1);
247 247
248 CommandBufferEntry args2[2]; 248 CommandBufferEntry args2[2];
249 args2[0].value_uint32 = 5; 249 args2[0].value_uint32 = 5;
250 args2[1].value_float = 6.f; 250 args2[1].value_float = 6.f;
251 put += AddCommandWithExpect(entries + put, 251 put += AddCommandWithExpect(entries + put,
252 BufferSyncInterface::PARSE_NO_ERROR, 252 BufferSyncInterface::kParseNoError,
253 2, 253 2,
254 2, 254 2,
255 args2); 255 args2);
256 256
257 engine()->Put(put); 257 engine()->Put(put);
258 while (get != put) { 258 while (get != put) {
259 // Check that the parsing progresses, and that no error occurs. 259 // Check that the parsing progresses, and that no error occurs.
260 CommandBufferOffset new_get = engine()->WaitGetChanges(get); 260 CommandBufferOffset new_get = engine()->WaitGetChanges(get);
261 EXPECT_NE(get, new_get); 261 EXPECT_NE(get, new_get);
262 ASSERT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 262 ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
263 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 263 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
264 EXPECT_EQ(new_get, engine()->Get()); 264 EXPECT_EQ(new_get, engine()->Get());
265 get = new_get; 265 get = new_get;
266 } 266 }
267 // Check that the commands did happen. 267 // Check that the commands did happen.
268 Mock::VerifyAndClearExpectations(api_mock()); 268 Mock::VerifyAndClearExpectations(api_mock());
269 269
270 engine()->CloseConnection(); 270 engine()->CloseConnection();
271 DestroyCommandBuffer(); 271 DestroyCommandBuffer();
272 } 272 }
273 273
274 // Checks that commands in the buffer are properly executed when wrapping the 274 // Checks that commands in the buffer are properly executed when wrapping the
275 // buffer, and that the status/error stay valid. 275 // buffer, and that the status/error stay valid.
276 TEST_F(CommandBufferEngineTest, TestCommandWrapping) { 276 TEST_F(CommandBufferEngineTest, TestCommandWrapping) {
277 engine()->InitConnection(); 277 engine()->InitConnection();
278 CommandBufferEntry *entries = InitCommandBuffer(10, 6); 278 CommandBufferEntry *entries = InitCommandBuffer(10, 6);
279 ASSERT_TRUE(entries != NULL); 279 ASSERT_TRUE(entries != NULL);
280 280
281 CommandBufferOffset get = engine()->Get(); 281 CommandBufferOffset get = engine()->Get();
282 CommandBufferOffset put = get; 282 CommandBufferOffset put = get;
283 283
284 // Create a command buffer with 3 commands 284 // Create a command buffer with 3 commands
285 put += AddCommandWithExpect(entries + put, 285 put += AddCommandWithExpect(entries + put,
286 BufferSyncInterface::PARSE_NO_ERROR, 286 BufferSyncInterface::kParseNoError,
287 0, 287 0,
288 0, 288 0,
289 NULL); 289 NULL);
290 290
291 CommandBufferEntry args1[2]; 291 CommandBufferEntry args1[2];
292 args1[0].value_uint32 = 3; 292 args1[0].value_uint32 = 3;
293 args1[1].value_float = 4.f; 293 args1[1].value_float = 4.f;
294 put += AddCommandWithExpect(entries + put, 294 put += AddCommandWithExpect(entries + put,
295 BufferSyncInterface::PARSE_NO_ERROR, 295 BufferSyncInterface::kParseNoError,
296 1, 296 1,
297 2, 297 2,
298 args1); 298 args1);
299 DCHECK_EQ(10, put); 299 DCHECK_EQ(10, put);
300 put = 0; 300 put = 0;
301 301
302 CommandBufferEntry args2[2]; 302 CommandBufferEntry args2[2];
303 args2[0].value_uint32 = 5; 303 args2[0].value_uint32 = 5;
304 args2[1].value_float = 6.f; 304 args2[1].value_float = 6.f;
305 put += AddCommandWithExpect(entries + put, 305 put += AddCommandWithExpect(entries + put,
306 BufferSyncInterface::PARSE_NO_ERROR, 306 BufferSyncInterface::kParseNoError,
307 2, 307 2,
308 2, 308 2,
309 args2); 309 args2);
310 310
311 engine()->Put(put); 311 engine()->Put(put);
312 while (get != put) { 312 while (get != put) {
313 // Check that the parsing progresses, and that no error occurs. 313 // Check that the parsing progresses, and that no error occurs.
314 CommandBufferOffset new_get = engine()->WaitGetChanges(get); 314 CommandBufferOffset new_get = engine()->WaitGetChanges(get);
315 EXPECT_NE(get, new_get); 315 EXPECT_NE(get, new_get);
316 ASSERT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 316 ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
317 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 317 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
318 EXPECT_EQ(new_get, engine()->Get()); 318 EXPECT_EQ(new_get, engine()->Get());
319 get = new_get; 319 get = new_get;
320 } 320 }
321 // Check that the commands did happen. 321 // Check that the commands did happen.
322 Mock::VerifyAndClearExpectations(api_mock()); 322 Mock::VerifyAndClearExpectations(api_mock());
323 323
324 engine()->CloseConnection(); 324 engine()->CloseConnection();
325 DestroyCommandBuffer(); 325 DestroyCommandBuffer();
326 } 326 }
327 327
328 // Checks that commands in the buffer are properly executed when we change the 328 // Checks that commands in the buffer are properly executed when we change the
329 // buffer, and when we close the connection. 329 // buffer, and when we close the connection.
330 TEST_F(CommandBufferEngineTest, TestSetBufferAndClose) { 330 TEST_F(CommandBufferEngineTest, TestSetBufferAndClose) {
331 engine()->InitConnection(); 331 engine()->InitConnection();
332 CommandBufferEntry *entries = InitCommandBuffer(10, 0); 332 CommandBufferEntry *entries = InitCommandBuffer(10, 0);
333 ASSERT_TRUE(entries != NULL); 333 ASSERT_TRUE(entries != NULL);
334 334
335 CommandBufferOffset get = engine()->Get(); 335 CommandBufferOffset get = engine()->Get();
336 CommandBufferOffset put = get; 336 CommandBufferOffset put = get;
337 337
338 // Create a command buffer with 3 commands 338 // Create a command buffer with 3 commands
339 put += AddCommandWithExpect(entries + put, 339 put += AddCommandWithExpect(entries + put,
340 BufferSyncInterface::PARSE_NO_ERROR, 340 BufferSyncInterface::kParseNoError,
341 0, 341 0,
342 0, 342 0,
343 NULL); 343 NULL);
344 344
345 CommandBufferEntry args1[2]; 345 CommandBufferEntry args1[2];
346 args1[0].value_uint32 = 3; 346 args1[0].value_uint32 = 3;
347 args1[1].value_float = 4.f; 347 args1[1].value_float = 4.f;
348 put += AddCommandWithExpect(entries + put, 348 put += AddCommandWithExpect(entries + put,
349 BufferSyncInterface::PARSE_NO_ERROR, 349 BufferSyncInterface::kParseNoError,
350 1, 350 1,
351 2, 351 2,
352 args1); 352 args1);
353 353
354 CommandBufferEntry args2[2]; 354 CommandBufferEntry args2[2];
355 args2[0].value_uint32 = 5; 355 args2[0].value_uint32 = 5;
356 args2[1].value_float = 6.f; 356 args2[1].value_float = 6.f;
357 put += AddCommandWithExpect(entries + put, 357 put += AddCommandWithExpect(entries + put,
358 BufferSyncInterface::PARSE_NO_ERROR, 358 BufferSyncInterface::kParseNoError,
359 2, 359 2,
360 2, 360 2,
361 args2); 361 args2);
362 362
363 engine()->Put(put); 363 engine()->Put(put);
364 364
365 // Setup a new buffer. 365 // Setup a new buffer.
366 const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT 366 const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT
367 RPCShmHandle shm = CreateShm(kShmSize); 367 RPCShmHandle shm = CreateShm(kShmSize);
368 ASSERT_NE(kRPCInvalidHandle, shm); 368 ASSERT_NE(kRPCInvalidHandle, shm);
369 unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize); 369 unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize);
370 ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id); 370 ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id);
371 CommandBufferEntry *entries2 = static_cast<CommandBufferEntry *>( 371 CommandBufferEntry *entries2 = static_cast<CommandBufferEntry *>(
372 engine()->GetSharedMemoryAddress(shm_id)); 372 engine()->GetSharedMemoryAddress(shm_id));
373 engine()->SetCommandBuffer(shm_id, 0, kShmSize, 0); 373 engine()->SetCommandBuffer(shm_id, 0, kShmSize, 0);
374 EXPECT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 374 EXPECT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
375 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 375 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
376 EXPECT_EQ(0, engine()->Get()); 376 EXPECT_EQ(0, engine()->Get());
377 377
378 // Destroy the old command buffer. 378 // Destroy the old command buffer.
379 DestroyCommandBuffer(); 379 DestroyCommandBuffer();
380 380
381 get = engine()->Get(); 381 get = engine()->Get();
382 put = get; 382 put = get;
383 put += AddCommandWithExpect(entries2 + put, 383 put += AddCommandWithExpect(entries2 + put,
384 BufferSyncInterface::PARSE_NO_ERROR, 384 BufferSyncInterface::kParseNoError,
385 1, 385 1,
386 2, 386 2,
387 args1); 387 args1);
388 388
389 engine()->Put(put); 389 engine()->Put(put);
390 390
391 engine()->CloseConnection(); 391 engine()->CloseConnection();
392 // Check that all the commands did happen. 392 // Check that all the commands did happen.
393 Mock::VerifyAndClearExpectations(api_mock()); 393 Mock::VerifyAndClearExpectations(api_mock());
394 394
395 engine()->UnregisterSharedMemory(shm_id); 395 engine()->UnregisterSharedMemory(shm_id);
396 DestroyShm(shm); 396 DestroyShm(shm);
397 } 397 }
398 398
399 // Checks that commands in the buffer are properly executed, even if they 399 // Checks that commands in the buffer are properly executed, even if they
400 // generate a recoverable error. Check that the error status is properly set, 400 // generate a recoverable error. Check that the error status is properly set,
401 // and reset when queried. 401 // and reset when queried.
402 TEST_F(CommandBufferEngineTest, TestRecoverableError) { 402 TEST_F(CommandBufferEngineTest, TestRecoverableError) {
403 engine()->InitConnection(); 403 engine()->InitConnection();
404 CommandBufferEntry *entries = InitCommandBuffer(10, 0); 404 CommandBufferEntry *entries = InitCommandBuffer(10, 0);
405 ASSERT_TRUE(entries != NULL); 405 ASSERT_TRUE(entries != NULL);
406 406
407 CommandBufferOffset get = engine()->Get(); 407 CommandBufferOffset get = engine()->Get();
408 CommandBufferOffset put = get; 408 CommandBufferOffset put = get;
409 409
410 // Create a command buffer with 3 commands, 2 of them generating errors 410 // Create a command buffer with 3 commands, 2 of them generating errors
411 put += AddCommandWithExpect(entries + put, 411 put += AddCommandWithExpect(entries + put,
412 BufferSyncInterface::PARSE_NO_ERROR, 412 BufferSyncInterface::kParseNoError,
413 0, 413 0,
414 0, 414 0,
415 NULL); 415 NULL);
416 416
417 CommandBufferEntry args1[2]; 417 CommandBufferEntry args1[2];
418 args1[0].value_uint32 = 3; 418 args1[0].value_uint32 = 3;
419 args1[1].value_float = 4.f; 419 args1[1].value_float = 4.f;
420 put += AddCommandWithExpect(entries + put, 420 put += AddCommandWithExpect(entries + put,
421 BufferSyncInterface::PARSE_INVALID_ARGUMENTS, 421 BufferSyncInterface::kParseInvalidArguments,
422 1, 422 1,
423 2, 423 2,
424 args1); 424 args1);
425 425
426 CommandBufferEntry args2[2]; 426 CommandBufferEntry args2[2];
427 args2[0].value_uint32 = 5; 427 args2[0].value_uint32 = 5;
428 args2[1].value_float = 6.f; 428 args2[1].value_float = 6.f;
429 put += AddCommandWithExpect(entries + put, 429 put += AddCommandWithExpect(entries + put,
430 BufferSyncInterface::PARSE_UNKNOWN_COMMAND, 430 BufferSyncInterface::kParseUnknownCommand,
431 2, 431 2,
432 2, 432 2,
433 args2); 433 args2);
434 434
435 engine()->Put(put); 435 engine()->Put(put);
436 while (get != put) { 436 while (get != put) {
437 // Check that the parsing progresses, and that no error occurs. 437 // Check that the parsing progresses, and that no error occurs.
438 CommandBufferOffset new_get = engine()->WaitGetChanges(get); 438 CommandBufferOffset new_get = engine()->WaitGetChanges(get);
439 EXPECT_NE(get, new_get); 439 EXPECT_NE(get, new_get);
440 ASSERT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 440 ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
441 EXPECT_EQ(new_get, engine()->Get()); 441 EXPECT_EQ(new_get, engine()->Get());
442 get = new_get; 442 get = new_get;
443 } 443 }
444 // Check that the commands did happen. 444 // Check that the commands did happen.
445 Mock::VerifyAndClearExpectations(api_mock()); 445 Mock::VerifyAndClearExpectations(api_mock());
446 446
447 // Check that the error status was set to the first error. 447 // Check that the error status was set to the first error.
448 EXPECT_EQ(BufferSyncInterface::PARSE_INVALID_ARGUMENTS, 448 EXPECT_EQ(BufferSyncInterface::kParseInvalidArguments,
449 engine()->GetParseError()); 449 engine()->GetParseError());
450 // Check that the error status was reset after the query. 450 // Check that the error status was reset after the query.
451 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 451 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
452 452
453 engine()->CloseConnection(); 453 engine()->CloseConnection();
454 DestroyCommandBuffer(); 454 DestroyCommandBuffer();
455 } 455 }
456 456
457 // Checks that commands in the buffer are properly executed up to the point 457 // Checks that commands in the buffer are properly executed up to the point
458 // where a parsing error happened. Check that at that point the status and 458 // where a parsing error happened. Check that at that point the status and
459 // error are properly set. 459 // error are properly set.
460 TEST_F(CommandBufferEngineTest, TestNonRecoverableError) { 460 TEST_F(CommandBufferEngineTest, TestNonRecoverableError) {
461 engine()->InitConnection(); 461 engine()->InitConnection();
462 // Create a buffer with 6 entries, starting at entry 1, but allocate enough 462 // Create a buffer with 6 entries, starting at entry 1, but allocate enough
463 // memory so that we can add commands that cross over the limit. 463 // memory so that we can add commands that cross over the limit.
464 const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT 464 const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT
465 RPCShmHandle shm = CreateShm(kShmSize); 465 RPCShmHandle shm = CreateShm(kShmSize);
466 ASSERT_NE(kRPCInvalidHandle, shm); 466 ASSERT_NE(kRPCInvalidHandle, shm);
467 unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize); 467 unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize);
468 ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id); 468 ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id);
469 CommandBufferEntry *entries = static_cast<CommandBufferEntry *>( 469 CommandBufferEntry *entries = static_cast<CommandBufferEntry *>(
470 engine()->GetSharedMemoryAddress(shm_id)); 470 engine()->GetSharedMemoryAddress(shm_id));
471 ASSERT_TRUE(entries != NULL); 471 ASSERT_TRUE(entries != NULL);
472 engine()->SetCommandBuffer(shm_id, 0, 6 * sizeof(CommandBufferEntry), 1); 472 engine()->SetCommandBuffer(shm_id, 0, 6 * sizeof(CommandBufferEntry), 1);
473 473
474 CommandBufferOffset get = engine()->Get(); 474 CommandBufferOffset get = engine()->Get();
475 CommandBufferOffset put = get; 475 CommandBufferOffset put = get;
476 476
477 // Create a command buffer with 3 commands, the last one overlapping the end 477 // Create a command buffer with 3 commands, the last one overlapping the end
478 // of the buffer. 478 // of the buffer.
479 put += AddCommandWithExpect(entries + put, 479 put += AddCommandWithExpect(entries + put,
480 BufferSyncInterface::PARSE_NO_ERROR, 480 BufferSyncInterface::kParseNoError,
481 0, 481 0,
482 0, 482 0,
483 NULL); 483 NULL);
484 484
485 CommandBufferEntry args1[2]; 485 CommandBufferEntry args1[2];
486 args1[0].value_uint32 = 3; 486 args1[0].value_uint32 = 3;
487 args1[1].value_float = 4.f; 487 args1[1].value_float = 4.f;
488 put += AddCommandWithExpect(entries + put, 488 put += AddCommandWithExpect(entries + put,
489 BufferSyncInterface::PARSE_NO_ERROR, 489 BufferSyncInterface::kParseNoError,
490 1, 490 1,
491 2, 491 2,
492 args1); 492 args1);
493 493
494 CommandBufferOffset fail_get = put; 494 CommandBufferOffset fail_get = put;
495 CommandHeader header; 495 CommandHeader header;
496 header.size = 3; 496 header.size = 3;
497 header.command = 4; 497 header.command = 4;
498 entries[put++].value_header = header; 498 entries[put++].value_header = header;
499 entries[put++].value_uint32 = 5; 499 entries[put++].value_uint32 = 5;
500 entries[put++].value_uint32 = 6; 500 entries[put++].value_uint32 = 6;
501 501
502 // we should be beyond the end of the buffer now. 502 // we should be beyond the end of the buffer now.
503 DCHECK_LT(6, put); 503 DCHECK_LT(6, put);
504 put = 0; 504 put = 0;
505 505
506 engine()->Put(put); 506 engine()->Put(put);
507 while (get != put) { 507 while (get != put) {
508 // When the parsing stop progressing, break. 508 // When the parsing stop progressing, break.
509 CommandBufferOffset new_get = engine()->WaitGetChanges(get); 509 CommandBufferOffset new_get = engine()->WaitGetChanges(get);
510 if (new_get == get) { 510 if (new_get == get) {
511 EXPECT_EQ(new_get, engine()->Get()); 511 EXPECT_EQ(new_get, engine()->Get());
512 break; 512 break;
513 } 513 }
514 get = new_get; 514 get = new_get;
515 } 515 }
516 // We should be in an error case now. 516 // We should be in an error case now.
517 EXPECT_EQ(BufferSyncInterface::PARSE_ERROR, engine()->GetStatus()); 517 EXPECT_EQ(BufferSyncInterface::kParseError, engine()->GetStatus());
518 // Check that the error status was set to the first error. 518 // Check that the error status was set to the first error.
519 EXPECT_EQ(BufferSyncInterface::PARSE_OUT_OF_BOUNDS, 519 EXPECT_EQ(BufferSyncInterface::kParseOutOfBounds,
520 engine()->GetParseError()); 520 engine()->GetParseError());
521 // Check that the error status was reset after the query. 521 // Check that the error status was reset after the query.
522 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 522 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
523 523
524 // Check that the valid commands did happen. 524 // Check that the valid commands did happen.
525 Mock::VerifyAndClearExpectations(api_mock()); 525 Mock::VerifyAndClearExpectations(api_mock());
526 526
527 engine()->CloseConnection(); 527 engine()->CloseConnection();
528 engine()->UnregisterSharedMemory(shm_id); 528 engine()->UnregisterSharedMemory(shm_id);
529 DestroyShm(shm); 529 DestroyShm(shm);
530 } 530 }
531 531
532 // Checks that HasWork() and DoWork() have the correct semantics. If there is 532 // Checks that HasWork() and DoWork() have the correct semantics. If there is
(...skipping 28 matching lines...) Expand all
561 } 561 }
562 EXPECT_EQ(0, process_mock()->message_count()); 562 EXPECT_EQ(0, process_mock()->message_count());
563 EXPECT_FALSE(process_mock()->would_have_blocked()); 563 EXPECT_FALSE(process_mock()->would_have_blocked());
564 Mock::VerifyAndClearExpectations(process_mock()); 564 Mock::VerifyAndClearExpectations(process_mock());
565 565
566 // Test that if we have commands, we will process them without blocking. 566 // Test that if we have commands, we will process them without blocking.
567 // Create a command buffer with 3 commands 567 // Create a command buffer with 3 commands
568 process_mock()->Reset(); 568 process_mock()->Reset();
569 EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber()); 569 EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
570 put += AddCommandWithExpect(entries + put, 570 put += AddCommandWithExpect(entries + put,
571 BufferSyncInterface::PARSE_NO_ERROR, 571 BufferSyncInterface::kParseNoError,
572 0, 572 0,
573 0, 573 0,
574 NULL); 574 NULL);
575 575
576 CommandBufferEntry args1[2]; 576 CommandBufferEntry args1[2];
577 args1[0].value_uint32 = 3; 577 args1[0].value_uint32 = 3;
578 args1[1].value_float = 4.f; 578 args1[1].value_float = 4.f;
579 put += AddCommandWithExpect(entries + put, 579 put += AddCommandWithExpect(entries + put,
580 BufferSyncInterface::PARSE_NO_ERROR, 580 BufferSyncInterface::kParseNoError,
581 1, 581 1,
582 2, 582 2,
583 args1); 583 args1);
584 584
585 CommandBufferEntry args2[2]; 585 CommandBufferEntry args2[2];
586 args2[0].value_uint32 = 5; 586 args2[0].value_uint32 = 5;
587 args2[1].value_float = 6.f; 587 args2[1].value_float = 6.f;
588 put += AddCommandWithExpect(entries + put, 588 put += AddCommandWithExpect(entries + put,
589 BufferSyncInterface::PARSE_NO_ERROR, 589 BufferSyncInterface::kParseNoError,
590 2, 590 2,
591 2, 591 2,
592 args2); 592 args2);
593 593
594 EXPECT_FALSE(engine()->HasWork()); // No work yet, until we change put 594 EXPECT_FALSE(engine()->HasWork()); // No work yet, until we change put
595 595
596 engine()->Put(put); 596 engine()->Put(put);
597 EXPECT_TRUE(engine()->HasWork()); 597 EXPECT_TRUE(engine()->HasWork());
598 598
599 EXPECT_CALL(*process_mock(), ProcessMessage()).Times(0); 599 EXPECT_CALL(*process_mock(), ProcessMessage()).Times(0);
600 while (engine()->HasWork()) { 600 while (engine()->HasWork()) {
601 EXPECT_TRUE(engine()->DoWork()); 601 EXPECT_TRUE(engine()->DoWork());
602 } 602 }
603 EXPECT_FALSE(process_mock()->would_have_blocked()); 603 EXPECT_FALSE(process_mock()->would_have_blocked());
604 get = engine()->Get(); 604 get = engine()->Get();
605 EXPECT_EQ(put, get); // once we're done, we should have executed everything. 605 EXPECT_EQ(put, get); // once we're done, we should have executed everything.
606 ASSERT_EQ(BufferSyncInterface::PARSING, engine()->GetStatus()); 606 ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
607 EXPECT_EQ(BufferSyncInterface::PARSE_NO_ERROR, engine()->GetParseError()); 607 EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
608 Mock::VerifyAndClearExpectations(process_mock()); 608 Mock::VerifyAndClearExpectations(process_mock());
609 Mock::VerifyAndClearExpectations(api_mock()); 609 Mock::VerifyAndClearExpectations(api_mock());
610 610
611 // Test that the engine stops if we send it a "kill" message. 611 // Test that the engine stops if we send it a "kill" message.
612 process_mock()->Reset(); 612 process_mock()->Reset();
613 EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber()); 613 EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
614 process_mock()->set_message_count(1); 614 process_mock()->set_message_count(1);
615 EXPECT_TRUE(engine()->HasWork()); 615 EXPECT_TRUE(engine()->HasWork());
616 616
617 EXPECT_CALL(*process_mock(), ProcessMessage()).WillOnce(Return(false)); 617 EXPECT_CALL(*process_mock(), ProcessMessage()).WillOnce(Return(false));
618 EXPECT_FALSE(engine()->DoWork()); 618 EXPECT_FALSE(engine()->DoWork());
619 Mock::VerifyAndClearExpectations(process_mock()); 619 Mock::VerifyAndClearExpectations(process_mock());
620 620
621 engine()->CloseConnection(); 621 engine()->CloseConnection();
622 DestroyCommandBuffer(); 622 DestroyCommandBuffer();
623 } 623 }
624 624
625 } // namespace command_buffer 625 } // namespace command_buffer
626 } // namespace o3d 626 } // namespace o3d
OLDNEW
« no previous file with comments | « command_buffer/service/cross/cmd_buffer_engine.cc ('k') | command_buffer/service/cross/cmd_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698