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"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/mocks.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#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"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRef;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ShaderManagerTest : public GpuServiceTest {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManagerTest() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ShaderManagerTest() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.Destroy(false);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManager manager_;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, Basic) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* info0 = manager_.CreateShader(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(info0 != NULL);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.GetShader(kClient1Id);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(info0, shader1);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent shader.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetShader(kClient2Id) == NULL);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can't get the shader after we remove it.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetShader(kClient1Id) == NULL);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, Destroy) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteShader(kService1Id))
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.Destroy(true);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that resources got freed.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1 = manager_.GetShader(kClient1Id);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 == NULL);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, DeleteBug) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService2Id = 12;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShaderType = GL_VERTEX_SHADER;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Shader> shader1(
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_.CreateShader(kClient1Id, kService1Id, kShaderType));
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Shader> shader2(
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager_.CreateShader(kClient2Id, kService2Id, kShaderType));
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(shader1.get());
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(shader2.get());
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.UseShader(shader1.get());
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.MarkAsDeleted(shader1.get());
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  manager_.MarkAsDeleted(shader2.get());
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(manager_.IsOwned(shader1.get()));
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(manager_.IsOwned(shader2.get()));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ShaderManagerTest, DoCompile) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kClient1Source = "hello world";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kAttrib1Type = GL_FLOAT_VEC2;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kAttrib1Size = 2;
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kAttrib1Precision = SH_PRECISION_MEDIUMP;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kAttrib1Name = "attr1";
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kAttrib2Type = GL_FLOAT_VEC3;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kAttrib2Size = 4;
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kAttrib2Precision = SH_PRECISION_HIGHP;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kAttrib2Name = "attr2";
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kAttribStaticUse = 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kUniform1Type = GL_FLOAT_MAT2;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kUniform1Size = 3;
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kUniform1Precision = SH_PRECISION_LOWP;
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kUniform1StaticUse = 1;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kUniform1Name = "uni1";
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kUniform2Type = GL_FLOAT_MAT3;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kUniform2Size = 5;
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const int kUniform2Precision = SH_PRECISION_MEDIUMP;
112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int kUniform2StaticUse = 0;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kUniform2Name = "uni2";
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const GLenum kVarying1Type = GL_FLOAT_VEC4;
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const GLsizei kVarying1Size = 1;
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int kVarying1Precision = SH_PRECISION_HIGHP;
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const int kVarying1StaticUse = 0;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char* kVarying1Name = "varying1";
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check we can create shader.
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Shader* shader1 = manager_.CreateShader(
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kClient1Id, kService1Id, kShader1Type);
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check shader got created.
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(shader1 != NULL);
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kService1Id, shader1->service_id());
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check if the shader has correct type.
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kShader1Type, shader1->shader_type());
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shader1->valid());
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shader1->InUse());
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->source().empty());
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->log_info().empty());
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->signature_source().empty());
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->translated_source().empty());
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, shader1->attrib_map().size());
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, shader1->uniform_map().size());
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, shader1->varying_map().size());
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check we can set its source.
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  shader1->set_source(kClient1Source);
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ(kClient1Source, shader1->source().c_str());
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->signature_source().empty());
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check DoCompile() will set compilation states, log, translated source,
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // shader variables, and name mapping.
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string kLog = "foo";
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string kTranslatedSource = "poo";
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderTranslator::VariableMap attrib_map;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrib_map[kAttrib1Name] = ShaderTranslatorInterface::VariableInfo(
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttrib1Type, kAttrib1Size, kAttrib1Precision,
151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttribStaticUse, kAttrib1Name);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  attrib_map[kAttrib2Name] = ShaderTranslatorInterface::VariableInfo(
153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttrib2Type, kAttrib2Size, kAttrib2Precision,
154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kAttribStaticUse, kAttrib2Name);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderTranslator::VariableMap uniform_map;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uniform_map[kUniform1Name] = ShaderTranslatorInterface::VariableInfo(
157424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform1Type, kUniform1Size, kUniform1Precision,
158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform1StaticUse, kUniform1Name);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo(
160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform2Type, kUniform2Size, kUniform2Precision,
161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kUniform2StaticUse, kUniform2Name);
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ShaderTranslator::VariableMap varying_map;
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  varying_map[kVarying1Name] = ShaderTranslatorInterface::VariableInfo(
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kVarying1Type, kVarying1Size, kVarying1Precision,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kVarying1StaticUse, kVarying1Name);
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestHelper::SetShaderStates(
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gl_.get(), shader1, true, &kLog, &kTranslatedSource,
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &attrib_map, &uniform_map, &varying_map, NULL);
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->valid());
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // When compilation succeeds, no log is recorded.
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ("", shader1->log_info().c_str());
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ(kClient1Source, shader1->signature_source().c_str());
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ(kTranslatedSource.c_str(), shader1->translated_source().c_str());
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check varying infos got copied.
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(attrib_map.size(), shader1->attrib_map().size());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != attrib_map.end(); ++it) {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetAttribInfo(it->first);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(variable_info != NULL);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.type, variable_info->type);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.size, variable_info->size);
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(it->second.precision, variable_info->precision);
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_EQ(it->second.static_use, variable_info->static_use);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check uniform infos got copied.
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(uniform_map.size(), shader1->uniform_map().size());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != uniform_map.end(); ++it) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        shader1->GetUniformInfo(it->first);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(variable_info != NULL);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.type, variable_info->type);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(it->second.size, variable_info->size);
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(it->second.precision, variable_info->precision);
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_EQ(it->second.static_use, variable_info->static_use);
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check varying infos got copied.
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(varying_map.size(), shader1->varying_map().size());
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (ShaderTranslator::VariableMap::const_iterator it = varying_map.begin();
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != varying_map.end(); ++it) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const Shader::VariableInfo* variable_info =
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        shader1->GetVaryingInfo(it->first);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(variable_info != NULL);
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(it->second.type, variable_info->type);
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(it->second.size, variable_info->size);
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(it->second.precision, variable_info->precision);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(it->second.static_use, variable_info->static_use);
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_STREQ(it->second.name.c_str(), variable_info->name.c_str());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Compile failure case.
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestHelper::SetShaderStates(
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gl_.get(), shader1, false, &kLog, &kTranslatedSource,
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &attrib_map, &uniform_map, &varying_map, NULL);
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(shader1->valid());
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ(kLog.c_str(), shader1->log_info().c_str());
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_STREQ("", shader1->translated_source().c_str());
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->attrib_map().empty());
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->uniform_map().empty());
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(shader1->varying_map().empty());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShaderManagerTest, ShaderInfoUseCount) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kShader1Type = GL_VERTEX_SHADER;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create shader.
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader1 = manager_.CreateShader(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kClient1Id, kService1Id, kShader1Type);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check shader got created.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->IsDeleted());
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->IsDeleted());
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shader* shader2 = manager_.GetShader(kClient1Id);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shader1, shader2);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);  // this should delete the info.
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader2 == NULL);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader1 = manager_.CreateShader(kClient1Id, kService1Id, kShader1Type);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(shader1 != NULL);
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UseShader(shader1);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader1->InUse());
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.UnuseShader(shader1);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(shader1->InUse());
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(shader1, shader2);
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsDeleted(shader1);  // this should delete the shader.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  shader2 = manager_.GetShader(kClient1Id);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(shader2 == NULL);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
273