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