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