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