15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/buffer_manager.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_;
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrictMock;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class BufferManagerTestBase : public GpuServiceTest {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetUpBase(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MemoryTracker* memory_tracker,
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FeatureInfo* feature_info,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const char* extensions) {
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::SetUp();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (feature_info) {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), extensions);
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      feature_info->Initialize();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_state_.reset(new MockErrorState());
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset(new BufferManager(memory_tracker, feature_info));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->Destroy(false);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset();
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_state_.reset();
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::TearDown();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum GetTarget(const Buffer* buffer) const {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return buffer->target();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoBufferData(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data,
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum error) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestHelper::DoBufferData(
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gl_.get(), error_state_.get(), manager_.get(),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buffer, size, usage, data, error);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DoBufferSubData(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Buffer* buffer, GLintptr offset, GLsizeiptr size,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GLvoid* data) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool success = true;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!buffer->CheckRange(offset, size)) {
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_CALL(*error_state_, SetGLError(_, _, GL_INVALID_VALUE, _, _))
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         .Times(1)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)         .RetiresOnSaturation();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      success = false;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (!buffer->IsClientSideArray()) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*gl_, BufferSubData(
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          buffer->target(), offset, size, _))
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Times(1)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .RetiresOnSaturation();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_->DoBufferSubData(
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        error_state_.get(), buffer, offset, size, data);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return success;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BufferManager> manager_;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorState> error_state_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BufferManagerTest : public BufferManagerTestBase {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetUpBase(NULL, NULL, "");
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BufferManagerMemoryTrackerTest : public BufferManagerTestBase {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetUpBase(mock_memory_tracker_.get(), NULL, "");
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BufferManagerClientSideArraysTest : public BufferManagerTestBase {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    feature_info_ = new FeatureInfo();
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    feature_info_->workarounds_.use_client_side_arrays_for_stream_buffers =
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetUpBase(NULL, feature_info_.get(), "");
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool)   \
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_CALL(*mock_memory_tracker_.get(),                          \
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              TrackMemoryAllocatedChange(old_size, new_size, pool)) \
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .Times(1).RetiresOnSaturation()
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, Basic) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBuffer1Id = 1;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBuffer1Id = 11;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizeiptr kBuffer1Size = 123;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBuffer2Id = 2;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create buffer.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check buffer got created.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer1 != NULL);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, GetTarget(buffer1));
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, buffer1->size());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_STATIC_DRAW), buffer1->usage());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer1->IsDeleted());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer1->IsClientSideArray());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kServiceBuffer1Id, buffer1->service_id());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_id = 0;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->GetClientId(buffer1->service_id(), &client_id));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kClientBuffer1Id, client_id);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_ELEMENT_ARRAY_BUFFER), GetTarget(buffer1));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we and set its size.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer1, kBuffer1Size, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kBuffer1Size, buffer1->size());
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_DYNAMIC_DRAW), buffer1->usage());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent buffer.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->GetBuffer(kClientBuffer2Id) == NULL);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check trying to a remove non-existent buffers does not crash.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveBuffer(kClientBuffer2Id);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it gets deleted when the last reference is released.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBuffer1Id)))
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can't get the buffer after we remove it.
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveBuffer(kClientBuffer1Id);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->GetBuffer(kClientBuffer1Id) == NULL);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BufferManagerMemoryTrackerTest, Basic) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLuint kClientBuffer1Id = 1;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLuint kServiceBuffer1Id = 11;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLsizeiptr kBuffer1Size1 = 123;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLsizeiptr kBuffer1Size2 = 456;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check we can create buffer.
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check buffer got created.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id);
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer1 != NULL);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check we and set its size.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size1, MemoryTracker::kManaged);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer1, kBuffer1Size1, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size1, 0, MemoryTracker::kManaged);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size2, MemoryTracker::kManaged);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer1, kBuffer1Size2, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // On delete it will get freed.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size2, 0, MemoryTracker::kManaged);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, Destroy) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create buffer.
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClient1Id, kService1Id);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check buffer got created.
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer1 = manager_->GetBuffer(kClient1Id);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer1 != NULL);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kService1Id)))
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->Destroy(true);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the resources were released.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer1 = manager_->GetBuffer(kClient1Id);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer1 == NULL);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BufferManagerTest, DoBufferSubData) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, sizeof(data), 0, data));
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, sizeof(data), 1, data));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, 0, sizeof(data) + 1, data));
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, -1, sizeof(data), data));
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, 0, -1, data));
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, 1, GL_STATIC_DRAW, NULL, GL_NO_ERROR);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int size = 0x20000;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> temp(new uint8[size]);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, 0 - size, size, temp.get()));
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(DoBufferSubData(buffer, 1, size / 2, temp.get()));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, GetRange) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* buf =
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<const char*>(buffer->GetRange(0, sizeof(data)));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(buf != NULL);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buf1 =
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<const char*>(buffer->GetRange(1, sizeof(data) - 1));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(buf + 1, buf1);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(sizeof(data), 1) == NULL);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(0, sizeof(data) + 1) == NULL);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(-1, sizeof(data)) == NULL);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(-0, -1) == NULL);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int size = 0x20000;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, size / 2, GL_STATIC_DRAW, NULL, GL_NO_ERROR);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(0 - size, size) == NULL);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetRange(1, size / 2) == NULL);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, GetMaxValueForRangeUint8) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 new_data[] = {100, 120, 110};
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint max_value;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check entire range succeeds.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 10, GL_UNSIGNED_BYTE, &max_value));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10u, max_value);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check sub range succeeds.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      4, 3, GL_UNSIGNED_BYTE, &max_value));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, max_value);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing sub range succeeds.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 4, sizeof(new_data), new_data));
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      4, 3, GL_UNSIGNED_BYTE, &max_value));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_value = 0;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 10, GL_UNSIGNED_BYTE, &max_value));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check out of range fails.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->GetMaxValueForRange(
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 11, GL_UNSIGNED_BYTE, &max_value));
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->GetMaxValueForRange(
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      10, 1, GL_UNSIGNED_BYTE, &max_value));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, GetMaxValueForRangeUint16) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint16 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint16 new_data[] = {100, 120, 110};
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint max_value;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check entire range succeeds.
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 10, GL_UNSIGNED_SHORT, &max_value));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10u, max_value);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check odd offset fails for GL_UNSIGNED_SHORT.
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->GetMaxValueForRange(
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      1, 10, GL_UNSIGNED_SHORT, &max_value));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check sub range succeeds.
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      8, 3, GL_UNSIGNED_SHORT, &max_value));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, max_value);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing sub range succeeds.
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 8, sizeof(new_data), new_data));
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      8, 3, GL_UNSIGNED_SHORT, &max_value));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_value = 0;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 10, GL_UNSIGNED_SHORT, &max_value));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check out of range fails.
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->GetMaxValueForRange(
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 11, GL_UNSIGNED_SHORT, &max_value));
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->GetMaxValueForRange(
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      20, 1, GL_UNSIGNED_SHORT, &max_value));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, GetMaxValueForRangeUint32) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 new_data[] = {100, 120, 110};
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint max_value;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check entire range succeeds.
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(10u, max_value);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check non aligned offsets fails for GL_UNSIGNED_INT.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(1, 10, GL_UNSIGNED_INT, &max_value));
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(2, 10, GL_UNSIGNED_INT, &max_value));
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(3, 10, GL_UNSIGNED_INT, &max_value));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check sub range succeeds.
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6u, max_value);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing sub range succeeds.
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DoBufferSubData(buffer, 16, sizeof(new_data), new_data));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  max_value = 0;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(120u, max_value);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check out of range fails.
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(0, 11, GL_UNSIGNED_INT, &max_value));
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      buffer->GetMaxValueForRange(40, 1, GL_UNSIGNED_INT, &max_value));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BufferManagerTest, UseDeletedBuffer) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClientBufferId = 1;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kServiceBufferId = 11;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Buffer> buffer = manager_->GetBuffer(kClientBufferId);
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(buffer.get() != NULL);
359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_->SetTarget(buffer.get(), GL_ARRAY_BUFFER);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove buffer
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->RemoveBuffer(kClientBufferId);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use it after removing
363868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DoBufferData(buffer.get(), sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that it gets deleted when the last reference is released.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId)))
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  buffer = NULL;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test buffers get shadowed when they are supposed to be.
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BufferManagerClientSideArraysTest, StreamBuffersAreShadowed) {
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLuint kClientBufferId = 1;
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GLuint kServiceBufferId = 11;
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ARRAY_BUFFER);
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_STREAM_DRAW, data, GL_NO_ERROR);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(buffer->IsClientSideArray());
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(data, buffer->GetRange(0, sizeof(data)), sizeof(data)));
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DoBufferData(buffer, sizeof(data), GL_DYNAMIC_DRAW, data, GL_NO_ERROR);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(buffer->IsClientSideArray());
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(BufferManagerTest, MaxValueCacheClearedCorrectly) {
388b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const GLuint kClientBufferId = 1;
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const GLuint kServiceBufferId = 11;
390b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const uint32 data1[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
391b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const uint32 data2[] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const uint32 data3[] = {30, 29, 28};
393b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Buffer* buffer = manager_->GetBuffer(kClientBufferId);
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_TRUE(buffer != NULL);
396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  GLuint max_value;
398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Load the buffer with some initial data, and then get the maximum value for
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // a range, which has the side effect of caching it.
400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DoBufferData(buffer, sizeof(data1), GL_STATIC_DRAW, data1, GL_NO_ERROR);
401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(
402b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
403b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(10u, max_value);
404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Check that any cached values are invalidated if the buffer is reloaded
405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // with the same amount of data (but different content)
406b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_EQ(sizeof(data2), sizeof(data1));
407b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DoBufferData(buffer, sizeof(data2), GL_STATIC_DRAW, data2, GL_NO_ERROR);
408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(
409b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
410b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(20u, max_value);
411b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Check that any cached values are invalidated if the buffer is reloaded
412b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // with entirely different content.
413b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ASSERT_NE(sizeof(data3), sizeof(data1));
414b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DoBufferData(buffer, sizeof(data3), GL_STATIC_DRAW, data3, GL_NO_ERROR);
415b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(
416b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      buffer->GetMaxValueForRange(0, 3, GL_UNSIGNED_INT, &max_value));
417b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(30u, max_value);
418b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
419b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424