15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/command_buffer_mock.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "gpu/command_buffer/service/gpu_scheduler.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Invoke;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::NiceMock;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::StrictMock;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kRingBufferSize = 1024;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kRingBufferEntries = kRingBufferSize / sizeof(CommandBufferEntry);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuSchedulerTest : public testing::Test {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int32 kTransferBufferId = 123;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::SharedMemory> shared_memory(new ::base::SharedMemory);
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    shared_memory->CreateAndMapAnonymous(kRingBufferSize);
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    buffer_ = static_cast<int32*>(shared_memory->memory());
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    shared_memory_buffer_ =
40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        MakeBufferFromSharedMemory(shared_memory.Pass(), kRingBufferSize);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(buffer_, 0, kRingBufferSize);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_buffer_.reset(new MockCommandBuffer);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandBuffer::State default_state;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default_state.num_entries = kRingBufferEntries;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ON_CALL(*command_buffer_.get(), GetLastState())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillByDefault(Return(default_state));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_.reset(new gles2::MockGLES2Decoder());
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Install FakeDoCommands handler so we can use individual DoCommand()
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // expectations.
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_CALL(*decoder_, DoCommands(_, _, _, _)).WillRepeatedly(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        Invoke(decoder_.get(), &gles2::MockGLES2Decoder::FakeDoCommands));
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           decoder_.get(),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           decoder_.get()));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*command_buffer_, GetTransferBuffer(kTransferBufferId))
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       .WillOnce(Return(shared_memory_buffer_));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*command_buffer_, SetGetOffset(0));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(scheduler_->SetGetBuffer(kTransferBufferId));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that any unexpected tasks posted by the GPU scheduler are executed
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in order to fail the test.
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error::Error GetError() {
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return command_buffer_->GetLastState().error;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::ScopedNSAutoreleasePool autorelease_pool_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MockCommandBuffer> command_buffer_;
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<Buffer> shared_memory_buffer_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32* buffer_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gles2::MockGLES2Decoder> decoder_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GpuScheduler> scheduler_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, SchedulerDoesNothingIfRingBufferIsEmpty) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state.put_offset = 0;
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*command_buffer_, GetLastState())
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillRepeatedly(Return(state));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetParseError(_))
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .Times(0);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->PutChanged();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, GetSetBuffer) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the get offset to something not 0.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetGetOffset(2));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->SetGetOffset(2);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, scheduler_->GetGetOffset());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the buffer.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, GetTransferBuffer(kTransferBufferId))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .WillOnce(Return(shared_memory_buffer_));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetGetOffset(0));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(scheduler_->SetGetBuffer(kTransferBufferId));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the get offset was reset.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, scheduler_->GetGetOffset());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, ProcessesOneCommand) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].command = 7;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].size = 2;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_[1] = 123;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state.put_offset = 2;
1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*command_buffer_, GetLastState())
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillRepeatedly(Return(state));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetGetOffset(2));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*decoder_, DoCommand(7, 1, &buffer_[0]))
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(error::kNoError));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetParseError(_))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .Times(0);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->PutChanged();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, ProcessesTwoCommands) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].command = 7;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].size = 2;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_[1] = 123;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[2].command = 8;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[2].size = 1;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state.put_offset = 3;
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*command_buffer_, GetLastState())
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillRepeatedly(Return(state));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*decoder_, DoCommand(7, 1, &buffer_[0]))
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(error::kNoError));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*decoder_, DoCommand(8, 0, &buffer_[2]))
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(error::kNoError));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetGetOffset(3));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->PutChanged();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, SetsErrorCodeOnCommandBuffer) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandHeader* header = reinterpret_cast<CommandHeader*>(&buffer_[0]);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].command = 7;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  header[0].size = 1;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state.put_offset = 1;
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*command_buffer_, GetLastState())
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillRepeatedly(Return(state));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*decoder_, DoCommand(7, 0, &buffer_[0]))
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        error::kUnknownCommand));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetGetOffset(1));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetContextLostReason(_));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*decoder_, GetContextLostReason())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(error::kUnknown));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetParseError(error::kUnknownCommand));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->PutChanged();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, ProcessCommandsDoesNothingAfterError) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBuffer::State state;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state.error = error::kGenericError;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(*command_buffer_, GetLastState())
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillRepeatedly(Return(state));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->PutChanged();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, CanGetAddressOfSharedMemory) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7))
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(shared_memory_buffer_));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(&buffer_[0], scheduler_->GetSharedMemoryBuffer(7)->memory());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P2(SetPointee, address, value) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *address = value;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, CanGetSizeOfSharedMemory) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7))
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    .WillOnce(Return(shared_memory_buffer_));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kRingBufferSize, scheduler_->GetSharedMemoryBuffer(7)->size());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GpuSchedulerTest, SetTokenForwardsToCommandBuffer) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer_, SetToken(7));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scheduler_->set_token(7);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
222