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/shader_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRef;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShaderManagerTest : public testing::Test {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManagerTest() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ShaderManagerTest() {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.Destroy(false);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(gl_.get());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ::gfx::GLInterface::SetGLInterface(NULL);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use StrictMock to make 100% sure we know how GL will be called.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManager manager_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, Basic) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* info0 = manager_.CreateShader(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(info0 != NULL);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.GetShader(kClient1Id);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(info0, shader1);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent shader.
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetShader(kClient2Id) == NULL);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can't get the shader after we remove it.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetShader(kClient1Id) == NULL);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, Destroy) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteShader(kService1Id))
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.Destroy(true);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that resources got freed.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1 = manager_.GetShader(kClient1Id);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 == NULL);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, DeleteBug) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService2Id = 12;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShaderType = GL_VERTEX_SHADER;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Shader> shader1(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_.CreateShader(kClient1Id, kService1Id, kShaderType));
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Shader> shader2(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_.CreateShader(kClient2Id, kService2Id, kShaderType));
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(shader1.get());
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(shader2.get());
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.UseShader(shader1.get());
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.MarkAsDeleted(shader1.get());
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.MarkAsDeleted(shader2.get());
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_.IsOwned(shader1.get()));
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_.IsOwned(shader2.get()));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ShaderManagerTest, Shader) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kClient1Source = "hello world";
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kService1Id, shader1->service_id());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if the shader has correct type.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kShader1Type, shader1->shader_type());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->IsValid());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->source() == NULL);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->log_info() == NULL);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kLog = "foo";
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1->SetStatus(true, kLog, NULL);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->IsValid());
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_STREQ(kLog, shader1->log_info()->c_str());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set its source.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1->UpdateSource(kClient1Source);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_STREQ(kClient1Source, shader1->source()->c_str());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(NULL, shader1->translated_source());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can set its translated source.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1->UpdateTranslatedSource(kClient1Source);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(kClient1Source,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               shader1->translated_source()->c_str());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, GetInfo) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kAttrib1Type = GL_FLOAT_VEC2;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kAttrib1Size = 2;
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kAttrib1Precision = SH_PRECISION_MEDIUMP;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kAttrib1Name = "attr1";
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kAttrib2Type = GL_FLOAT_VEC3;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kAttrib2Size = 4;
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kAttrib2Precision = SH_PRECISION_HIGHP;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kAttrib2Name = "attr2";
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kAttribStaticUse = 0;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kUniform1Type = GL_FLOAT_MAT2;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kUniform1Size = 3;
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kUniform1Precision = SH_PRECISION_LOWP;
147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kUniform1StaticUse = 1;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kUniform1Name = "uni1";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kUniform2Type = GL_FLOAT_MAT3;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kUniform2Size = 5;
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kUniform2Precision = SH_PRECISION_MEDIUMP;
152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kUniform2StaticUse = 0;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kUniform2Name = "uni2";
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockShaderTranslator shader_translator;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderTranslator::VariableMap attrib_map;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrib_map[kAttrib1Name] = ShaderTranslatorInterface::VariableInfo(
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttrib1Type, kAttrib1Size, kAttrib1Precision,
159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttribStaticUse, kAttrib1Name);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrib_map[kAttrib2Name] = ShaderTranslatorInterface::VariableInfo(
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttrib2Type, kAttrib2Size, kAttrib2Precision,
162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttribStaticUse, kAttrib2Name);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderTranslator::VariableMap uniform_map;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uniform_map[kUniform1Name] = ShaderTranslatorInterface::VariableInfo(
165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform1Type, kUniform1Size, kUniform1Precision,
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform1StaticUse, kUniform1Name);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo(
168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform2Type, kUniform2Size, kUniform2Precision,
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform2StaticUse, kUniform2Name);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(shader_translator, attrib_map())
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(ReturnRef(attrib_map));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(shader_translator, uniform_map())
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillRepeatedly(ReturnRef(uniform_map));
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ShaderTranslator::VariableMap varying_map;
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_CALL(shader_translator, varying_map())
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      .WillRepeatedly(ReturnRef(varying_map));
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShaderTranslator::NameMap name_map;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(shader_translator, name_map())
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(ReturnRef(name_map));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Status
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1->SetStatus(true, "", &shader_translator);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check attrib and uniform infos got copied.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != attrib_map.end(); ++it) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetAttribInfo(it->first);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(variable_info != NULL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.type, variable_info->type);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.size, variable_info->size);
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(it->second.precision, variable_info->precision);
196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_EQ(it->second.static_use, variable_info->static_use);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.name, variable_info->name);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != uniform_map.end(); ++it) {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetUniformInfo(it->first);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(variable_info != NULL);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.type, variable_info->type);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.size, variable_info->size);
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(it->second.precision, variable_info->precision);
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_EQ(it->second.static_use, variable_info->static_use);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.name, variable_info->name);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check attrib and uniform get cleared.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1->SetStatus(true, NULL, NULL);
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->log_info() == NULL);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != attrib_map.end(); ++it) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetAttribInfo(it->first);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(variable_info == NULL);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != uniform_map.end(); ++it) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetUniformInfo(it->first);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(variable_info == NULL);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, ShaderInfoUseCount) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->IsDeleted());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->IsDeleted());
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader2 = manager_.GetShader(kClient1Id);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shader1, shader2);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);  // this should delete the info.
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader2 == NULL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1 = manager_.CreateShader(kClient1Id, kService1Id, kShader1Type);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shader1, shader2);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);  // this should delete the shader.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader2 == NULL);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
272