| Index: gpu/command_buffer/client/gles2_implementation_unittest.cc
 | 
| diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
 | 
| index 5ce2a8b52a9603273cc1bd7bc1bf9fa57b50cea2..4c6013d6fe66c5f9ded9c92a3817444877c4468e 100644
 | 
| --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
 | 
| +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
 | 
| @@ -15,34 +15,30 @@
 | 
|  #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
 | 
|  #endif
 | 
|  
 | 
| +using testing::_;
 | 
| +using testing::DoAll;
 | 
| +using testing::InSequence;
 | 
| +using testing::Invoke;
 | 
| +using testing::Mock;
 | 
| +using testing::Sequence;
 | 
| +using testing::Truly;
 | 
| +using testing::Return;
 | 
| +
 | 
|  namespace gpu {
 | 
|  
 | 
|  class GLES2MockCommandBufferHelper : public CommandBuffer {
 | 
|   public:
 | 
| -  static const int32 kTransferBufferId = 0x123;
 | 
| +  static const int32 kTransferBufferBaseId = 0x123;
 | 
| +  static const int32 kMaxTransferBuffers = 6;
 | 
|  
 | 
|    GLES2MockCommandBufferHelper() { }
 | 
|    virtual ~GLES2MockCommandBufferHelper() { }
 | 
|  
 | 
|    // CommandBuffer implementation:
 | 
| -  virtual bool Initialize(int32 size) {
 | 
| -    ring_buffer_.reset(new CommandBufferEntry[size]);
 | 
| -    ring_buffer_buffer_.ptr = ring_buffer_.get();
 | 
| -    ring_buffer_buffer_.size = size;
 | 
| -    state_.num_entries = size / sizeof(ring_buffer_[0]);
 | 
| -    state_.token = 10000;  // All token checks in the tests should pass.
 | 
| +  virtual bool Initialize() {
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| -  virtual bool Initialize(base::SharedMemory* buffer, int32 size) {
 | 
| -    GPU_NOTREACHED();
 | 
| -    return false;
 | 
| -  }
 | 
| -
 | 
| -  virtual Buffer GetRingBuffer() {
 | 
| -    return ring_buffer_buffer_;
 | 
| -  }
 | 
| -
 | 
|    virtual State GetState() {
 | 
|      return state_;
 | 
|    }
 | 
| @@ -58,28 +54,57 @@ class GLES2MockCommandBufferHelper : public CommandBuffer {
 | 
|    virtual State FlushSync(int32 put_offset, int32 last_known_get) {
 | 
|      state_.put_offset = put_offset;
 | 
|      state_.get_offset = put_offset;
 | 
| -    OnFlush(transfer_buffer_buffer_.ptr);
 | 
| +    // Warning: This is a hack. We just happen to know that the default
 | 
| +    // transfer buffer will be the first transfer buffer.
 | 
| +    OnFlush(transfer_buffer_buffers_[0].ptr);
 | 
|      return state_;
 | 
|    }
 | 
|  
 | 
| +  virtual void SetGetBuffer(int transfer_buffer_id) {
 | 
| +    ring_buffer_buffer_ = GetTransferBuffer(transfer_buffer_id);
 | 
| +    ring_buffer_ = static_cast<CommandBufferEntry*>(ring_buffer_buffer_.ptr);
 | 
| +    state_.num_entries = ring_buffer_buffer_.size / sizeof(ring_buffer_[0]);
 | 
| +    state_.token = 10000;  // All token checks in the tests should pass.
 | 
| +  }
 | 
| +
 | 
|    virtual void SetGetOffset(int32 get_offset) {
 | 
|      state_.get_offset = get_offset;
 | 
|    }
 | 
|  
 | 
| +  // Get's the Id of the next transfer buffer that will be returned
 | 
| +  // by CreateTransferBuffer. This is useful for testing expected ids.
 | 
| +  int32 GetNextFreeTransferBufferId() {
 | 
| +    for (size_t ii = 0; ii < arraysize(transfer_buffers_); ++ii) {
 | 
| +      if (!transfer_buffers_[ii].get()) {
 | 
| +        return kTransferBufferBaseId + ii;
 | 
| +      }
 | 
| +    }
 | 
| +    return -1;
 | 
| +  }
 | 
| +
 | 
|    virtual int32 CreateTransferBuffer(size_t size, int32 id_request) {
 | 
| -    transfer_buffer_.reset(new int8[size]);
 | 
| -    transfer_buffer_buffer_.ptr = transfer_buffer_.get();
 | 
| -    transfer_buffer_buffer_.size = size;
 | 
| -    return kTransferBufferId;
 | 
| +    int32 id = GetNextFreeTransferBufferId();
 | 
| +    if (id >= 0) {
 | 
| +      int32 ndx = id - kTransferBufferBaseId;
 | 
| +      transfer_buffers_[ndx].reset(new int8[size]);
 | 
| +      transfer_buffer_buffers_[ndx].ptr = transfer_buffers_[ndx].get();
 | 
| +      transfer_buffer_buffers_[ndx].size = size;
 | 
| +    }
 | 
| +    return id;
 | 
|    }
 | 
|  
 | 
| -  virtual void DestroyTransferBuffer(int32 /* id */) {
 | 
| -    GPU_NOTREACHED();
 | 
| +  void DestroyTransferBufferHelper(int32 id) {
 | 
| +    GPU_DCHECK_GE(id, kTransferBufferBaseId);
 | 
| +    GPU_DCHECK_LT(id, kTransferBufferBaseId + kMaxTransferBuffers);
 | 
| +    id -= kTransferBufferBaseId;
 | 
| +    transfer_buffers_[id].reset();
 | 
| +    transfer_buffer_buffers_[id] = Buffer();
 | 
|    }
 | 
|  
 | 
|    virtual Buffer GetTransferBuffer(int32 id) {
 | 
| -    GPU_DCHECK_EQ(id, kTransferBufferId);
 | 
| -    return transfer_buffer_buffer_;
 | 
| +    GPU_DCHECK_GE(id, kTransferBufferBaseId);
 | 
| +    GPU_DCHECK_LT(id, kTransferBufferBaseId + kMaxTransferBuffers);
 | 
| +    return transfer_buffer_buffers_[id - kTransferBufferBaseId];
 | 
|    }
 | 
|  
 | 
|    virtual int32 RegisterTransferBuffer(base::SharedMemory* shared_memory,
 | 
| @@ -107,39 +132,41 @@ class GLES2MockCommandBufferHelper : public CommandBuffer {
 | 
|    virtual void OnFlush(void* transfer_buffer) = 0;
 | 
|  
 | 
|   private:
 | 
| -  scoped_array<int8> transfer_buffer_;
 | 
| -  Buffer transfer_buffer_buffer_;
 | 
| -  scoped_array<CommandBufferEntry> ring_buffer_;
 | 
| +  scoped_array<int8> transfer_buffers_[kMaxTransferBuffers];
 | 
| +  Buffer transfer_buffer_buffers_[kMaxTransferBuffers];
 | 
| +  CommandBufferEntry* ring_buffer_;
 | 
|    Buffer ring_buffer_buffer_;
 | 
|    State state_;
 | 
|  };
 | 
|  
 | 
|  class MockGLES2CommandBuffer : public GLES2MockCommandBufferHelper {
 | 
|   public:
 | 
| +  MockGLES2CommandBuffer() {
 | 
| +    DelegateToFake();
 | 
| +  }
 | 
| +
 | 
|    virtual ~MockGLES2CommandBuffer() {
 | 
|    }
 | 
|  
 | 
|    // This is so we can use all the gmock functions when Flush is called.
 | 
|    MOCK_METHOD1(OnFlush, void(void* result));
 | 
|    MOCK_METHOD1(DestroyTransferBuffer, void(int32 id));
 | 
| +
 | 
| +  void DelegateToFake() {
 | 
| +    ON_CALL(*this, DestroyTransferBuffer(_))
 | 
| +        .WillByDefault(Invoke(
 | 
| +            this, &GLES2MockCommandBufferHelper::DestroyTransferBufferHelper));
 | 
| +  }
 | 
|  };
 | 
|  
 | 
|  // GCC requires these declarations, but MSVC requires they not be present
 | 
|  #ifndef _MSC_VER
 | 
| -const int32 GLES2MockCommandBufferHelper::kTransferBufferId;
 | 
| +const int32 GLES2MockCommandBufferHelper::kTransferBufferBaseId;
 | 
| +const int32 GLES2MockCommandBufferHelper::kMaxTransferBuffers;
 | 
|  #endif
 | 
|  
 | 
|  namespace gles2 {
 | 
|  
 | 
| -using testing::_;
 | 
| -using testing::DoAll;
 | 
| -using testing::InSequence;
 | 
| -using testing::Invoke;
 | 
| -using testing::Mock;
 | 
| -using testing::Sequence;
 | 
| -using testing::Truly;
 | 
| -using testing::Return;
 | 
| -
 | 
|  ACTION_P(SetMemory, obj) {
 | 
|    memcpy(arg0, &obj, sizeof(obj));
 | 
|  }
 | 
| @@ -194,8 +221,6 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|    static const int32 kCommandBufferSizeBytes =
 | 
|        kNumCommandEntries * sizeof(CommandBufferEntry);
 | 
|    static const size_t kTransferBufferSize = 256;
 | 
| -  static const int32 kTransferBufferId =
 | 
| -      GLES2MockCommandBufferHelper::kTransferBufferId;
 | 
|    static const uint8 kInitialValue = 0xBD;
 | 
|  
 | 
|    GLES2CommandBufferTestBase()
 | 
| @@ -203,7 +228,8 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|          token_(0),
 | 
|          offset_(0),
 | 
|          initial_offset_(0),
 | 
| -        alignment_(0) {
 | 
| +        alignment_(0),
 | 
| +        transfer_buffer_id_(-1) {
 | 
|    }
 | 
|  
 | 
|    void SetupCommandBuffer(unsigned int offset, unsigned alignment) {
 | 
| @@ -212,11 +238,11 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|      alignment_ = alignment;
 | 
|  
 | 
|      command_buffer_.reset(new MockGLES2CommandBuffer());
 | 
| -    command_buffer_->Initialize(kCommandBufferSizeBytes);
 | 
| +    command_buffer_->Initialize();
 | 
|  
 | 
| -    EXPECT_EQ(kTransferBufferId,
 | 
| -              command_buffer_->CreateTransferBuffer(kTransferBufferSize, -1));
 | 
| -    transfer_buffer_ = command_buffer_->GetTransferBuffer(kTransferBufferId);
 | 
| +    transfer_buffer_id_ =
 | 
| +        command_buffer_->CreateTransferBuffer(kTransferBufferSize, -1);
 | 
| +    transfer_buffer_ = command_buffer_->GetTransferBuffer(transfer_buffer_id_);
 | 
|      ClearTransferBuffer();
 | 
|  
 | 
|      helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
 | 
| @@ -232,7 +258,7 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void ClearCommands() {
 | 
| -    Buffer ring_buffer = command_buffer_->GetRingBuffer();
 | 
| +    Buffer ring_buffer = helper_->get_ring_buffer();
 | 
|      memset(ring_buffer.ptr, kInitialValue, ring_buffer.size);
 | 
|    }
 | 
|  
 | 
| @@ -253,6 +279,10 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|      return ++token_;
 | 
|    }
 | 
|  
 | 
| +  int32 GetNextFreeTransferBufferId() {
 | 
| +    return command_buffer_->GetNextFreeTransferBufferId();
 | 
| +  }
 | 
| +
 | 
|    uint32 AllocateTransferBuffer(size_t size) {
 | 
|      if (offset_ + size > kTransferBufferSize) {
 | 
|        offset_ = initial_offset_;
 | 
| @@ -280,6 +310,7 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|    uint32 offset_;
 | 
|    uint32 initial_offset_;
 | 
|    uint32 alignment_;
 | 
| +  int32 transfer_buffer_id_;
 | 
|  };
 | 
|  
 | 
|  // GCC requires these declarations, but MSVC requires they not be present
 | 
| @@ -287,7 +318,6 @@ class GLES2CommandBufferTestBase : public testing::Test {
 | 
|  const int32 GLES2CommandBufferTestBase::kNumCommandEntries;
 | 
|  const int32 GLES2CommandBufferTestBase::kCommandBufferSizeBytes;
 | 
|  const size_t GLES2CommandBufferTestBase::kTransferBufferSize;
 | 
| -const int32 GLES2CommandBufferTestBase::kTransferBufferId;
 | 
|  const uint8 GLES2CommandBufferTestBase::kInitialValue;
 | 
|  #endif
 | 
|  
 | 
| @@ -303,9 +333,12 @@ class TransferBufferTest : public GLES2CommandBufferTestBase {
 | 
|          GLES2Implementation::kStartingOffset,
 | 
|          GLES2Implementation::kAlignment);
 | 
|  
 | 
| +    transfer_buffer_id_ =
 | 
| +        command_buffer_->CreateTransferBuffer(kTransferBufferSize, -1);
 | 
| +
 | 
|      transfer_buffer_.reset(new TransferBuffer(
 | 
|          helper_.get(),
 | 
| -        kTransferBufferId,
 | 
| +        transfer_buffer_id_,
 | 
|          GetTransferAddressFromOffset(0, 0),
 | 
|          kTransferBufferSize,
 | 
|          kStartingOffset,
 | 
| @@ -327,7 +360,7 @@ const unsigned int TransferBufferTest::kAlignment;
 | 
|  
 | 
|  TEST_F(TransferBufferTest, Basic) {
 | 
|    EXPECT_TRUE(transfer_buffer_->HaveBuffer());
 | 
| -  EXPECT_EQ(kTransferBufferId, transfer_buffer_->GetShmId());
 | 
| +  EXPECT_EQ(transfer_buffer_id_, transfer_buffer_->GetShmId());
 | 
|  }
 | 
|  
 | 
|  TEST_F(TransferBufferTest, Free) {
 | 
| @@ -341,7 +374,7 @@ TEST_F(TransferBufferTest, Free) {
 | 
|    // See it's freed.
 | 
|    EXPECT_FALSE(transfer_buffer_->HaveBuffer());
 | 
|    // See that it gets reallocated.
 | 
| -  EXPECT_EQ(kTransferBufferId, transfer_buffer_->GetShmId());
 | 
| +  EXPECT_EQ(transfer_buffer_id_, transfer_buffer_->GetShmId());
 | 
|    EXPECT_TRUE(transfer_buffer_->HaveBuffer());
 | 
|  
 | 
|    // Free buffer.
 | 
| @@ -473,7 +506,7 @@ class GLES2ImplementationTest : public GLES2CommandBufferTestBase {
 | 
|            helper_.get(),
 | 
|            kTransferBufferSize,
 | 
|            transfer_buffer_.ptr,
 | 
| -          kTransferBufferId,
 | 
| +          transfer_buffer_id_,
 | 
|            shared_resources,
 | 
|            bind_generates_resource));
 | 
|      }
 | 
| @@ -482,7 +515,7 @@ class GLES2ImplementationTest : public GLES2CommandBufferTestBase {
 | 
|          .Times(1)
 | 
|          .RetiresOnSaturation();
 | 
|      helper_->CommandBufferHelper::Finish();
 | 
| -    Buffer ring_buffer = command_buffer_->GetRingBuffer();
 | 
| +    Buffer ring_buffer = helper_->get_ring_buffer();
 | 
|      commands_ = static_cast<CommandBufferEntry*>(ring_buffer.ptr) +
 | 
|                  command_buffer_->GetState().put_offset;
 | 
|      ClearCommands();
 | 
| @@ -525,16 +558,16 @@ TEST_F(GLES2ImplementationTest, ShaderSource) {
 | 
|    Cmds expected;
 | 
|    expected.set_bucket_size.Init(kBucketId, kSourceSize);
 | 
|    expected.set_bucket_data1.Init(
 | 
| -      kBucketId, 0, kString1Size, kTransferBufferId,
 | 
| +      kBucketId, 0, kString1Size, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kPaddedString1Size));
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_bucket_data2.Init(
 | 
| -      kBucketId, kString1Size, kString2Size, kTransferBufferId,
 | 
| +      kBucketId, kString1Size, kString2Size, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kPaddedString2Size));
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.set_bucket_data3.Init(
 | 
|        kBucketId, kString1Size + kString2Size,
 | 
| -      kString3Size, kTransferBufferId,
 | 
| +      kString3Size, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kPaddedString3Size));
 | 
|    expected.set_token3.Init(GetNextToken());
 | 
|    expected.shader_source_bucket.Init(kShaderId, kBucketId);
 | 
| @@ -564,9 +597,9 @@ TEST_F(GLES2ImplementationTest, GetShaderSource) {
 | 
|    Cmds expected;
 | 
|    expected.set_bucket_size1.Init(kBucketId, 0);
 | 
|    expected.get_shader_source.Init(kShaderId, kBucketId);
 | 
| -  expected.get_bucket_size.Init(kBucketId, kTransferBufferId, 0);
 | 
| +  expected.get_bucket_size.Init(kBucketId, transfer_buffer_id_, 0);
 | 
|    expected.get_bucket_data.Init(
 | 
| -      kBucketId, 0, sizeof(kString), kTransferBufferId, offset);
 | 
| +      kBucketId, 0, sizeof(kString), transfer_buffer_id_, offset);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_bucket_size2.Init(kBucketId, 0);
 | 
|    char buf[sizeof(kString) + 1];
 | 
| @@ -628,13 +661,13 @@ TEST_F(GLES2ImplementationTest, DrawArraysClientSideBuffers) {
 | 
|    expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
 | 
|    expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
 | 
|    expected.copy_data1.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize1));
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_pointer1.Init(kAttribIndex1, kNumComponents1,
 | 
|                               GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
 | 
|    expected.copy_data2.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize2));
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
 | 
| @@ -704,19 +737,19 @@ TEST_F(GLES2ImplementationTest, DrawElementsClientSideBuffers) {
 | 
|    expected.set_index_size.Init(
 | 
|        GL_ELEMENT_ARRAY_BUFFER, kIndexSize, 0, 0, GL_DYNAMIC_DRAW);
 | 
|    expected.copy_data0.Init(
 | 
| -      GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, kTransferBufferId,
 | 
| +      GL_ELEMENT_ARRAY_BUFFER, 0, kIndexSize, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kIndexSize));
 | 
|    expected.set_token0.Init(GetNextToken());
 | 
|    expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
 | 
|    expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
 | 
|    expected.copy_data1.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize1));
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_pointer1.Init(kAttribIndex1, kNumComponents1,
 | 
|                               GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
 | 
|    expected.copy_data2.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize2));
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
 | 
| @@ -780,17 +813,17 @@ TEST_F(GLES2ImplementationTest,
 | 
|    expected.enable2.Init(kAttribIndex2);
 | 
|    expected.bind_to_index.Init(GL_ELEMENT_ARRAY_BUFFER, kClientIndexBufferId);
 | 
|    expected.get_max.Init(kClientIndexBufferId, kCount, GL_UNSIGNED_SHORT,
 | 
| -                        kIndexOffset, kTransferBufferId, 0);
 | 
| +                        kIndexOffset, transfer_buffer_id_, 0);
 | 
|    expected.bind_to_emu.Init(GL_ARRAY_BUFFER, kEmuBufferId);
 | 
|    expected.set_size.Init(GL_ARRAY_BUFFER, kTotalSize, 0, 0, GL_DYNAMIC_DRAW);
 | 
|    expected.copy_data1.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset1, kSize1, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize1));
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_pointer1.Init(kAttribIndex1, kNumComponents1,
 | 
|                               GL_FLOAT, GL_FALSE, 0, kEmuOffset1);
 | 
|    expected.copy_data2.Init(
 | 
| -      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, kTransferBufferId,
 | 
| +      GL_ARRAY_BUFFER, kEmuOffset2, kSize2, transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kSize2));
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.set_pointer2.Init(kAttribIndex2, kNumComponents2,
 | 
| @@ -837,7 +870,7 @@ TEST_F(GLES2ImplementationTest, GetVertexBufferPointerv) {
 | 
|    expected.set_pointer.Init(kAttribIndex2, kNumComponents2, GL_FLOAT, GL_FALSE,
 | 
|                              kStride2, kOffset2);
 | 
|    expected.get_pointer.Init(kAttribIndex2, GL_VERTEX_ATTRIB_ARRAY_POINTER,
 | 
| -                            kTransferBufferId, 0);
 | 
| +                            transfer_buffer_id_, 0);
 | 
|  
 | 
|    // One call to flush to way for GetVertexAttribPointerv
 | 
|    EXPECT_CALL(*command_buffer_, OnFlush(_))
 | 
| @@ -894,10 +927,10 @@ TEST_F(GLES2ImplementationTest, GetVertexAttrib) {
 | 
|                              kStride2, kOffset2);
 | 
|    expected.get1.Init(kAttribIndex2,
 | 
|                       GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,
 | 
| -                     kTransferBufferId, 0);
 | 
| +                     transfer_buffer_id_, 0);
 | 
|    expected.get2.Init(kAttribIndex1,
 | 
|                       GL_CURRENT_VERTEX_ATTRIB,
 | 
| -                     kTransferBufferId, 0);
 | 
| +                     transfer_buffer_id_, 0);
 | 
|  
 | 
|    FourFloats current_attrib(1.2f, 3.4f, 5.6f, 7.8f);
 | 
|  
 | 
| @@ -960,7 +993,7 @@ TEST_F(GLES2ImplementationTest, ReservedIds) {
 | 
|      GetError get;
 | 
|    };
 | 
|    Cmds expected;
 | 
| -  expected.get.Init(kTransferBufferId, 0);
 | 
| +  expected.get.Init(transfer_buffer_id_, 0);
 | 
|  
 | 
|    // One call to flush to wait for GetError
 | 
|    EXPECT_CALL(*command_buffer_, OnFlush(_))
 | 
| @@ -998,15 +1031,15 @@ TEST_F(GLES2ImplementationTest, ReadPixels2Reads) {
 | 
|    Cmds expected;
 | 
|    expected.read1.Init(
 | 
|        0, 0, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId,
 | 
| +      transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kWidth * kHeight / 2 * kBytesPerPixel),
 | 
| -      kTransferBufferId, 0);
 | 
| +      transfer_buffer_id_, 0);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.read2.Init(
 | 
|        0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId,
 | 
| +      transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kWidth * kHeight / 2 * kBytesPerPixel),
 | 
| -      kTransferBufferId, 0);
 | 
| +      transfer_buffer_id_, 0);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    scoped_array<int8> buffer(new int8[kWidth * kHeight * kBytesPerPixel]);
 | 
|  
 | 
| @@ -1033,9 +1066,9 @@ TEST_F(GLES2ImplementationTest, ReadPixelsBadFormatType) {
 | 
|    Cmds expected;
 | 
|    expected.read.Init(
 | 
|        0, 0, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId,
 | 
| +      transfer_buffer_id_,
 | 
|        AllocateTransferBuffer(kWidth * kHeight * kBytesPerPixel),
 | 
| -      kTransferBufferId, 0);
 | 
| +      transfer_buffer_id_, 0);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|    scoped_array<int8> buffer(new int8[kWidth * kHeight * kBytesPerPixel]);
 | 
|  
 | 
| @@ -1058,7 +1091,7 @@ TEST_F(GLES2ImplementationTest, FreeUnusedSharedMemory) {
 | 
|    uint32 offset = 0;
 | 
|    Cmds expected;
 | 
|    expected.buf.Init(
 | 
| -    kTarget, kOffset, kSize, kTransferBufferId, offset);
 | 
| +    kTarget, kOffset, kSize, transfer_buffer_id_, offset);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|  
 | 
|    void* mem = gl_->MapBufferSubDataCHROMIUM(
 | 
| @@ -1083,7 +1116,7 @@ TEST_F(GLES2ImplementationTest, MapUnmapBufferSubDataCHROMIUM) {
 | 
|    uint32 offset = 0;
 | 
|    Cmds expected;
 | 
|    expected.buf.Init(
 | 
| -    kTarget, kOffset, kSize, kTransferBufferId, offset);
 | 
| +      kTarget, kOffset, kSize, GetNextFreeTransferBufferId(), offset);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|  
 | 
|    void* mem = gl_->MapBufferSubDataCHROMIUM(
 | 
| @@ -1138,7 +1171,7 @@ TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUM) {
 | 
|    Cmds expected;
 | 
|    expected.tex.Init(
 | 
|        GL_TEXTURE_2D, kLevel, kXOffset, kYOffset, kWidth, kHeight, kFormat,
 | 
| -      kType, kTransferBufferId, offset, GL_FALSE);
 | 
| +      kType, GetNextFreeTransferBufferId(), offset, GL_FALSE);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|  
 | 
|    void* mem = gl_->MapTexSubImage2DCHROMIUM(
 | 
| @@ -1273,8 +1306,8 @@ TEST_F(GLES2ImplementationTest, GetMultipleIntegervCHROMIUMValidArgs) {
 | 
|    const uint32 kResultsOffset = AllocateTransferBuffer(kResultsSize);
 | 
|    Cmds expected;
 | 
|    expected.get_multiple.Init(
 | 
| -      kTransferBufferId, kPnamesOffset, kNumPnames,
 | 
| -      kTransferBufferId, kResultsOffset, kResultsSize);
 | 
| +      transfer_buffer_id_, kPnamesOffset, kNumPnames,
 | 
| +      transfer_buffer_id_, kResultsOffset, kResultsSize);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|  
 | 
|    const GLint kSentinel = 0x12345678;
 | 
| @@ -1383,9 +1416,9 @@ TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMGoodArgs) {
 | 
|    Cmds expected;
 | 
|    expected.set_bucket_size1.Init(kBucketId, 0);
 | 
|    expected.get_program_info.Init(kProgramId, kBucketId);
 | 
| -  expected.get_bucket_size.Init(kBucketId, kTransferBufferId, 0);
 | 
| +  expected.get_bucket_size.Init(kBucketId, transfer_buffer_id_, 0);
 | 
|    expected.get_bucket_data.Init(
 | 
| -      kBucketId, 0, sizeof(kString), kTransferBufferId, offset);
 | 
| +      kBucketId, 0, sizeof(kString), transfer_buffer_id_, offset);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_bucket_size2.Init(kBucketId, 0);
 | 
|    gl_->GetProgramInfoCHROMIUM(kProgramId, sizeof(buf), &size, &buf);
 | 
| @@ -1424,9 +1457,9 @@ TEST_F(GLES2ImplementationTest, GetProgramInfoCHROMIUMBadArgs) {
 | 
|    Cmds expected;
 | 
|    expected.set_bucket_size1.Init(kBucketId, 0);
 | 
|    expected.get_program_info.Init(kProgramId, kBucketId);
 | 
| -  expected.get_bucket_size.Init(kBucketId, kTransferBufferId, 0);
 | 
| +  expected.get_bucket_size.Init(kBucketId, transfer_buffer_id_, 0);
 | 
|    expected.get_bucket_data.Init(
 | 
| -      kBucketId, 0, sizeof(kString), kTransferBufferId, offset);
 | 
| +      kBucketId, 0, sizeof(kString), transfer_buffer_id_, offset);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.set_bucket_size2.Init(kBucketId, 0);
 | 
|    gl_->GetProgramInfoCHROMIUM(kProgramId, 6, &size, &buf);
 | 
| @@ -1602,7 +1635,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D) {
 | 
|    Cmds expected;
 | 
|    expected.tex_image_2d.Init(
 | 
|        kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
 | 
| -      kTransferBufferId, offset);
 | 
| +      transfer_buffer_id_, offset);
 | 
|    expected.set_token.Init(GetNextToken());
 | 
|    gl_->TexImage2D(
 | 
|        kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
 | 
| @@ -1617,7 +1650,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D) {
 | 
|    Cmds2 expected2;
 | 
|    expected2.tex_image_2d.Init(
 | 
|        kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType,
 | 
| -      kTransferBufferId, offset2);
 | 
| +      transfer_buffer_id_, offset2);
 | 
|    expected2.set_token.Init(GetNextToken());
 | 
|    const void* commands2 = GetPut();
 | 
|    gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
 | 
| @@ -1674,11 +1707,11 @@ TEST_F(GLES2ImplementationTest, TexImage2D2Writes) {
 | 
|        0, 0);
 | 
|    expected.tex_sub_image_2d1.Init(
 | 
|        kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId, offset1, true);
 | 
| +      transfer_buffer_id_, offset1, true);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d2.Init(
 | 
|        kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId, offset2, true);
 | 
| +      transfer_buffer_id_, offset2, true);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|  
 | 
|    // TODO(gman): Make it possible to run this test
 | 
| @@ -1707,11 +1740,11 @@ TEST_F(GLES2ImplementationTest, TexImage2D2Writes) {
 | 
|        0, 0);
 | 
|    expected.tex_sub_image_2d1.Init(
 | 
|        kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId, offset3, true);
 | 
| +      transfer_buffer_id_, offset3, true);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d2.Init(
 | 
|        kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType,
 | 
| -      kTransferBufferId, offset4, true);
 | 
| +      transfer_buffer_id_, offset4, true);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|  
 | 
|    // TODO(gman): Make it possible to run this test
 | 
| @@ -1777,19 +1810,19 @@ TEST_F(GLES2ImplementationTest, TexImage2DSubRows) {
 | 
|        0, 0);
 | 
|    expected.tex_sub_image_2d1.Init(
 | 
|        kTarget, kLevel, 0, 0, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset1, true);
 | 
| +      transfer_buffer_id_, offset1, true);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d2.Init(
 | 
|        kTarget, kLevel, kWidth / 2, 0, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset2, true);
 | 
| +      transfer_buffer_id_, offset2, true);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d3.Init(
 | 
|        kTarget, kLevel, 0, 1, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset3, true);
 | 
| +      transfer_buffer_id_, offset3, true);
 | 
|    expected.set_token3.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d4.Init(
 | 
|        kTarget, kLevel, kWidth / 2, 1, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset4, true);
 | 
| +      transfer_buffer_id_, offset4, true);
 | 
|    expected.set_token4.Init(GetNextToken());
 | 
|  
 | 
|    // TODO(gman): Make it possible to run this test
 | 
| @@ -1828,19 +1861,19 @@ TEST_F(GLES2ImplementationTest, TexImage2DSubRows) {
 | 
|        0, 0);
 | 
|    expected.tex_sub_image_2d1.Init(
 | 
|        kTarget, kLevel, 0, 1, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset1, true);
 | 
| +      transfer_buffer_id_, offset1, true);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d2.Init(
 | 
|        kTarget, kLevel, kWidth / 2, 1, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset2, true);
 | 
| +      transfer_buffer_id_, offset2, true);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d3.Init(
 | 
|        kTarget, kLevel, 0, 0, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset3, true);
 | 
| +      transfer_buffer_id_, offset3, true);
 | 
|    expected.set_token3.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d4.Init(
 | 
|        kTarget, kLevel, kWidth / 2, 0, kWidth / 2, 1, kFormat, kType,
 | 
| -      kTransferBufferId, offset4, true);
 | 
| +      transfer_buffer_id_, offset4, true);
 | 
|    expected.set_token4.Init(GetNextToken());
 | 
|  
 | 
|    // TODO(gman): Make it possible to run this test
 | 
| @@ -1908,10 +1941,10 @@ TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) {
 | 
|        kType, 0, NULL);
 | 
|    expected.tex_sub_image_2d1.Init(kTarget, kLevel, kSubImageXOffset,
 | 
|        kSubImageYOffset + 2, kSubImageWidth, 2, kFormat, kType,
 | 
| -      kTransferBufferId, offset1, false);
 | 
| +      transfer_buffer_id_, offset1, false);
 | 
|    expected.set_token1.Init(GetNextToken());
 | 
|    expected.tex_sub_image_2d2.Init(kTarget, kLevel, kSubImageXOffset,
 | 
| -      kSubImageYOffset, kSubImageWidth , 2, kFormat, kType, kTransferBufferId,
 | 
| +      kSubImageYOffset, kSubImageWidth , 2, kFormat, kType, transfer_buffer_id_,
 | 
|        offset2, false);
 | 
|    expected.set_token2.Init(GetNextToken());
 | 
|  
 | 
| @@ -2020,7 +2053,7 @@ TEST_F(GLES2ImplementationTest, CreateStreamTextureCHROMIUM) {
 | 
|    };
 | 
|  
 | 
|    Cmds expected;
 | 
| -  expected.create_stream.Init(kTextureId, kTransferBufferId, kResultOffset);
 | 
| +  expected.create_stream.Init(kTextureId, transfer_buffer_id_, kResultOffset);
 | 
|  
 | 
|    EXPECT_CALL(*command_buffer_, OnFlush(_))
 | 
|        .WillOnce(SetMemoryAtOffset(kResultOffset, kResult))
 | 
| 
 |