| Index: gpu/command_buffer/common/command_buffer_shared_test.cc
|
| diff --git a/gpu/command_buffer/common/command_buffer_shared_test.cc b/gpu/command_buffer/common/command_buffer_shared_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..327533a40d5f9b9c91ffd8652c2a56f0ef6b40ad
|
| --- /dev/null
|
| +++ b/gpu/command_buffer/common/command_buffer_shared_test.cc
|
| @@ -0,0 +1,97 @@
|
| +
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// This file contains the tests for the CommandBufferSharedState class.
|
| +
|
| +#include "gpu/command_buffer/common/command_buffer_shared.h"
|
| +#include "base/bind.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/threading/thread.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace gpu {
|
| +
|
| +class CommandBufferSharedTest : public testing::Test {
|
| + protected:
|
| +
|
| + virtual void SetUp() {
|
| + shared_state_.reset(new CommandBufferSharedState());
|
| + shared_state_->Initialize();
|
| + }
|
| +
|
| + scoped_ptr<CommandBufferSharedState> shared_state_;
|
| +};
|
| +
|
| +TEST_F(CommandBufferSharedTest, TestBasic) {
|
| + CommandBuffer::State state;
|
| +
|
| + shared_state_->Read(&state);
|
| +
|
| + EXPECT_LT(state.generation, 0x80000000);
|
| + EXPECT_EQ(state.get_offset, 0);
|
| + EXPECT_EQ(state.put_offset, 0);
|
| + EXPECT_EQ(state.token, -1);
|
| + EXPECT_EQ(state.error, gpu::error::kNoError);
|
| + EXPECT_EQ(state.context_lost_reason, gpu::error::kUnknown);
|
| +}
|
| +
|
| +static const int kSize = 100000;
|
| +
|
| +void WriteToState(int32 *buffer,
|
| + CommandBufferSharedState* shared_state) {
|
| + CommandBuffer::State state;
|
| + for (int i = 0; i < kSize; i++) {
|
| + state.token = i - 1;
|
| + state.get_offset = i + 1;
|
| + state.generation = i + 2;
|
| + state.error = static_cast<gpu::error::Error>(i + 3);
|
| + // Ensure that the producer doesn't update the buffer until after the
|
| + // consumer reads from it.
|
| + EXPECT_EQ(buffer[i], 0);
|
| +
|
| + shared_state->Write(state);
|
| + }
|
| +}
|
| +
|
| +TEST_F(CommandBufferSharedTest, TestConsistency) {
|
| + scoped_array<int32> buffer;
|
| + buffer.reset(new int32[kSize]);
|
| + base::Thread consumer("Reader Thread");
|
| +
|
| + memset(buffer.get(), 0, kSize * sizeof(int32));
|
| +
|
| + consumer.Start();
|
| + consumer.message_loop()->PostTask(
|
| + FROM_HERE, base::Bind(&WriteToState, buffer.get(),
|
| + shared_state_.get()));
|
| +
|
| + CommandBuffer::State last_state;
|
| + while (1) {
|
| + CommandBuffer::State state = last_state;
|
| +
|
| + shared_state_->Read(&state);
|
| +
|
| + if (state.generation < last_state.generation)
|
| + continue;
|
| +
|
| + if (state.get_offset >= 1) {
|
| + buffer[state.get_offset - 1] = 1;
|
| + // Check that the state is consistent
|
| + EXPECT_LE(last_state.token, state.token);
|
| + EXPECT_LE(last_state.generation, state.generation);
|
| + last_state = state;
|
| + EXPECT_EQ(state.token, state.get_offset - 2);
|
| + EXPECT_EQ(state.generation,
|
| + static_cast<unsigned int>(state.get_offset) + 1);
|
| + EXPECT_EQ(state.error, state.get_offset + 2);
|
| +
|
| + if (state.get_offset == kSize)
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace gpu
|
| +
|
|
|