• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 // This file contains the tests for the CommandBufferSharedState class.
6 
7 #include "gpu/command_buffer/common/command_buffer_shared.h"
8 #include "base/bind.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/threading/thread.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace gpu {
14 
15 class CommandBufferSharedTest : public testing::Test {
16  protected:
17 
SetUp()18   virtual void SetUp() {
19     shared_state_.reset(new CommandBufferSharedState());
20     shared_state_->Initialize();
21   }
22 
23   scoped_ptr<CommandBufferSharedState> shared_state_;
24 };
25 
TEST_F(CommandBufferSharedTest,TestBasic)26 TEST_F(CommandBufferSharedTest, TestBasic) {
27   CommandBuffer::State state;
28 
29   shared_state_->Read(&state);
30 
31   EXPECT_LT(state.generation, 0x80000000);
32   EXPECT_EQ(state.get_offset, 0);
33   EXPECT_EQ(state.put_offset, 0);
34   EXPECT_EQ(state.token, -1);
35   EXPECT_EQ(state.error, gpu::error::kNoError);
36   EXPECT_EQ(state.context_lost_reason, gpu::error::kUnknown);
37 }
38 
39 static const int kSize = 100000;
40 
WriteToState(int32 * buffer,CommandBufferSharedState * shared_state)41 void WriteToState(int32 *buffer,
42                   CommandBufferSharedState* shared_state) {
43   CommandBuffer::State state;
44   for (int i = 0; i < kSize; i++) {
45     state.token = i - 1;
46     state.get_offset = i + 1;
47     state.generation = i + 2;
48     state.error = static_cast<gpu::error::Error>(i + 3);
49     // Ensure that the producer doesn't update the buffer until after the
50     // consumer reads from it.
51     EXPECT_EQ(buffer[i], 0);
52 
53     shared_state->Write(state);
54   }
55 }
56 
TEST_F(CommandBufferSharedTest,TestConsistency)57 TEST_F(CommandBufferSharedTest, TestConsistency) {
58   scoped_ptr<int32[]> buffer;
59   buffer.reset(new int32[kSize]);
60   base::Thread consumer("Reader Thread");
61 
62   memset(buffer.get(), 0, kSize * sizeof(int32));
63 
64   consumer.Start();
65   consumer.message_loop()->PostTask(
66       FROM_HERE, base::Bind(&WriteToState, buffer.get(),
67                             shared_state_.get()));
68 
69   CommandBuffer::State last_state;
70   while (1) {
71     CommandBuffer::State state = last_state;
72 
73     shared_state_->Read(&state);
74 
75     if (state.generation < last_state.generation)
76       continue;
77 
78     if (state.get_offset >= 1) {
79       buffer[state.get_offset - 1] = 1;
80       // Check that the state is consistent
81       EXPECT_LE(last_state.token, state.token);
82       EXPECT_LE(last_state.generation, state.generation);
83       last_state = state;
84       EXPECT_EQ(state.token, state.get_offset - 2);
85       EXPECT_EQ(state.generation,
86                 static_cast<unsigned int>(state.get_offset) + 1);
87       EXPECT_EQ(state.error, state.get_offset + 2);
88 
89       if (state.get_offset == kSize)
90         break;
91     }
92   }
93 }
94 
95 }  // namespace gpu
96 
97