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/vertex_array_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/vertex_attrib_manager.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Pointee; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class VertexArrayManagerTest : public GpuServiceTest { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kNumVertexAttribs = 8; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VertexArrayManagerTest() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~VertexArrayManagerTest() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GpuServiceTest::SetUp(); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) manager_.reset(new VertexArrayManager()); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) manager_.reset(); 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GpuServiceTest::TearDown(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<VertexArrayManager> manager_; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 VertexArrayManagerTest::kNumVertexAttribs; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VertexArrayManagerTest, Basic) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient2Id = 2; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can create 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->CreateVertexAttribManager( 570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) kClient1Id, kService1Id, kNumVertexAttribs, true); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check creation success 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VertexAttribManager* info1 = manager_->GetVertexAttribManager(kClient1Id); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(info1 != NULL); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kService1Id, info1->service_id()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint client_id = 0; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetClientId(info1->service_id(), &client_id)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kClient1Id, client_id); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we get nothing for a non-existent name. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetVertexAttribManager(kClient2Id) == NULL); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check trying to a remove non-existent name does not crash. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->RemoveVertexAttribManager(kClient2Id); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it gets deleted when the last reference is released. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, ::testing::Pointee(kService1Id))) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can't get the texture after we remove it. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_->RemoveVertexAttribManager(kClient1Id); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetVertexAttribManager(kClient1Id) == NULL); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VertexArrayManagerTest, Destroy) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kClient1Id = 1; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kService1Id = 11; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VertexArrayManager manager; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can create 830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) manager.CreateVertexAttribManager( 840de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) kClient1Id, kService1Id, kNumVertexAttribs, true); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check creation success 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VertexAttribManager* info1 = manager.GetVertexAttribManager(kClient1Id); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(info1 != NULL); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, ::testing::Pointee(kService1Id))) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(1) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .RetiresOnSaturation(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager.Destroy(true); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that resources got freed. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info1 = manager.GetVertexAttribManager(kClient1Id); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(info1 == NULL); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101