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