OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/shader_manager.h" | 5 #include "gpu/command_buffer/service/shader_manager.h" |
6 | 6 |
7 #include "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "gpu/command_buffer/common/gl_mock.h" | 8 #include "gpu/command_buffer/common/gl_mock.h" |
9 #include "gpu/command_buffer/service/mocks.h" | 9 #include "gpu/command_buffer/service/mocks.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 // Use StrictMock to make 100% sure we know how GL will be called. | 38 // Use StrictMock to make 100% sure we know how GL will be called. |
39 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 39 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
40 ShaderManager manager_; | 40 ShaderManager manager_; |
41 }; | 41 }; |
42 | 42 |
43 TEST_F(ShaderManagerTest, Basic) { | 43 TEST_F(ShaderManagerTest, Basic) { |
44 const GLuint kClient1Id = 1; | 44 const GLuint kClient1Id = 1; |
45 const GLuint kService1Id = 11; | 45 const GLuint kService1Id = 11; |
46 const GLenum kShader1Type = GL_VERTEX_SHADER; | 46 const GLenum kShader1Type = GL_VERTEX_SHADER; |
47 const std::string kClient1Source("hello world"); | |
48 const GLuint kClient2Id = 2; | 47 const GLuint kClient2Id = 2; |
49 // Check we can create shader. | 48 // Check we can create shader. |
50 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); | 49 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); |
51 // Check shader got created. | 50 // Check shader got created. |
52 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); | 51 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); |
53 ASSERT_TRUE(info1 != NULL); | 52 ASSERT_TRUE(info1 != NULL); |
54 EXPECT_EQ(kService1Id, info1->service_id()); | |
55 // Check if the shader has correct type. | |
56 EXPECT_EQ(kShader1Type, info1->shader_type()); | |
57 EXPECT_FALSE(info1->IsValid()); | |
58 EXPECT_STREQ("", info1->log_info().c_str()); | |
59 const char* kLog = "foo"; | |
60 info1->SetStatus(true, kLog, NULL); | |
61 EXPECT_TRUE(info1->IsValid()); | |
62 EXPECT_STREQ(kLog, info1->log_info().c_str()); | |
63 // Check we can set its source. | |
64 info1->Update(kClient1Source); | |
65 EXPECT_STREQ(kClient1Source.c_str(), info1->source().c_str()); | |
66 // Check we get nothing for a non-existent shader. | 53 // Check we get nothing for a non-existent shader. |
67 EXPECT_TRUE(manager_.GetShaderInfo(kClient2Id) == NULL); | 54 EXPECT_TRUE(manager_.GetShaderInfo(kClient2Id) == NULL); |
68 // Check trying to a remove non-existent shaders does not crash. | |
69 manager_.RemoveShaderInfo(kClient2Id); | |
70 // Check we can't get the shader after we remove it. | 55 // Check we can't get the shader after we remove it. |
71 manager_.RemoveShaderInfo(kClient1Id); | 56 manager_.MarkAsDeleted(info1); |
72 EXPECT_TRUE(manager_.GetShaderInfo(kClient1Id) == NULL); | 57 EXPECT_TRUE(manager_.GetShaderInfo(kClient1Id) == NULL); |
73 } | 58 } |
74 | 59 |
75 TEST_F(ShaderManagerTest, Destroy) { | 60 TEST_F(ShaderManagerTest, Destroy) { |
76 const GLuint kClient1Id = 1; | 61 const GLuint kClient1Id = 1; |
77 const GLuint kService1Id = 11; | 62 const GLuint kService1Id = 11; |
78 const GLenum kShader1Type = GL_VERTEX_SHADER; | 63 const GLenum kShader1Type = GL_VERTEX_SHADER; |
79 // Check we can create shader. | 64 // Check we can create shader. |
80 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); | 65 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); |
81 // Check shader got created. | 66 // Check shader got created. |
82 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); | 67 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); |
83 ASSERT_TRUE(info1 != NULL); | 68 ASSERT_TRUE(info1 != NULL); |
84 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) | 69 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) |
85 .Times(1) | 70 .Times(1) |
86 .RetiresOnSaturation(); | 71 .RetiresOnSaturation(); |
87 manager_.Destroy(true); | 72 manager_.Destroy(true); |
88 // Check that resources got freed. | 73 // Check that resources got freed. |
89 info1 = manager_.GetShaderInfo(kClient1Id); | 74 info1 = manager_.GetShaderInfo(kClient1Id); |
90 ASSERT_TRUE(info1 == NULL); | 75 ASSERT_TRUE(info1 == NULL); |
91 } | 76 } |
92 | 77 |
| 78 TEST_F(ShaderManagerTest, ShaderInfo) { |
| 79 const GLuint kClient1Id = 1; |
| 80 const GLuint kService1Id = 11; |
| 81 const GLenum kShader1Type = GL_VERTEX_SHADER; |
| 82 const std::string kClient1Source("hello world"); |
| 83 // Check we can create shader. |
| 84 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); |
| 85 // Check shader got created. |
| 86 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); |
| 87 ASSERT_TRUE(info1 != NULL); |
| 88 EXPECT_EQ(kService1Id, info1->service_id()); |
| 89 // Check if the shader has correct type. |
| 90 EXPECT_EQ(kShader1Type, info1->shader_type()); |
| 91 EXPECT_FALSE(info1->IsValid()); |
| 92 EXPECT_FALSE(info1->InUse()); |
| 93 EXPECT_STREQ("", info1->log_info().c_str()); |
| 94 const char* kLog = "foo"; |
| 95 info1->SetStatus(true, kLog, NULL); |
| 96 EXPECT_TRUE(info1->IsValid()); |
| 97 EXPECT_STREQ(kLog, info1->log_info().c_str()); |
| 98 // Check we can set its source. |
| 99 info1->Update(kClient1Source); |
| 100 EXPECT_STREQ(kClient1Source.c_str(), info1->source().c_str()); |
| 101 } |
| 102 |
93 TEST_F(ShaderManagerTest, GetInfo) { | 103 TEST_F(ShaderManagerTest, GetInfo) { |
94 const GLuint kClient1Id = 1; | 104 const GLuint kClient1Id = 1; |
95 const GLuint kService1Id = 11; | 105 const GLuint kService1Id = 11; |
96 const GLenum kShader1Type = GL_VERTEX_SHADER; | 106 const GLenum kShader1Type = GL_VERTEX_SHADER; |
97 const GLenum kAttrib1Type = GL_FLOAT_VEC2; | 107 const GLenum kAttrib1Type = GL_FLOAT_VEC2; |
98 const GLsizei kAttrib1Size = 2; | 108 const GLsizei kAttrib1Size = 2; |
99 const char* kAttrib1Name = "attr1"; | 109 const char* kAttrib1Name = "attr1"; |
100 const GLenum kAttrib2Type = GL_FLOAT_VEC3; | 110 const GLenum kAttrib2Type = GL_FLOAT_VEC3; |
101 const GLsizei kAttrib2Size = 4; | 111 const GLsizei kAttrib2Size = 4; |
102 const char* kAttrib2Name = "attr2"; | 112 const char* kAttrib2Name = "attr2"; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 EXPECT_TRUE(variable_info == NULL); | 163 EXPECT_TRUE(variable_info == NULL); |
154 } | 164 } |
155 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); | 165 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); |
156 it != uniform_map.end(); ++it) { | 166 it != uniform_map.end(); ++it) { |
157 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 167 const ShaderManager::ShaderInfo::VariableInfo* variable_info = |
158 info1->GetUniformInfo(it->first); | 168 info1->GetUniformInfo(it->first); |
159 ASSERT_TRUE(variable_info == NULL); | 169 ASSERT_TRUE(variable_info == NULL); |
160 } | 170 } |
161 } | 171 } |
162 | 172 |
| 173 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { |
| 174 const GLuint kClient1Id = 1; |
| 175 const GLuint kService1Id = 11; |
| 176 const GLenum kShader1Type = GL_VERTEX_SHADER; |
| 177 // Check we can create shader. |
| 178 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); |
| 179 // Check shader got created. |
| 180 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); |
| 181 ASSERT_TRUE(info1 != NULL); |
| 182 EXPECT_FALSE(info1->InUse()); |
| 183 EXPECT_FALSE(info1->IsDeleted()); |
| 184 manager_.UseShader(info1); |
| 185 EXPECT_TRUE(info1->InUse()); |
| 186 manager_.UseShader(info1); |
| 187 EXPECT_TRUE(info1->InUse()); |
| 188 manager_.MarkAsDeleted(info1); |
| 189 EXPECT_TRUE(info1->IsDeleted()); |
| 190 ShaderManager::ShaderInfo* info2 = manager_.GetShaderInfo(kClient1Id); |
| 191 EXPECT_EQ(info1, info2); |
| 192 manager_.UnuseShader(info1); |
| 193 EXPECT_TRUE(info1->InUse()); |
| 194 manager_.UnuseShader(info1); // this should delete the info. |
| 195 info2 = manager_.GetShaderInfo(kClient1Id); |
| 196 EXPECT_TRUE(info2 == NULL); |
| 197 |
| 198 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); |
| 199 info1 = manager_.GetShaderInfo(kClient1Id); |
| 200 ASSERT_TRUE(info1 != NULL); |
| 201 EXPECT_FALSE(info1->InUse()); |
| 202 manager_.UseShader(info1); |
| 203 EXPECT_TRUE(info1->InUse()); |
| 204 manager_.UseShader(info1); |
| 205 EXPECT_TRUE(info1->InUse()); |
| 206 manager_.UnuseShader(info1); |
| 207 EXPECT_TRUE(info1->InUse()); |
| 208 manager_.UnuseShader(info1); |
| 209 EXPECT_FALSE(info1->InUse()); |
| 210 info2 = manager_.GetShaderInfo(kClient1Id); |
| 211 EXPECT_EQ(info1, info2); |
| 212 manager_.MarkAsDeleted(info1); // this should delete the shader. |
| 213 info2 = manager_.GetShaderInfo(kClient1Id); |
| 214 EXPECT_TRUE(info2 == NULL); |
| 215 } |
| 216 |
163 } // namespace gles2 | 217 } // namespace gles2 |
164 } // namespace gpu | 218 } // namespace gpu |
165 | 219 |
166 | 220 |
OLD | NEW |