| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "gpu/command_buffer/service/mocks.h" | 8 #include "gpu/command_buffer/service/mocks.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 #include "ui/gl/gl_mock.h" | 10 #include "ui/gl/gl_mock.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 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 GLuint kClient2Id = 2; | 47 const GLuint kClient2Id = 2; |
| 48 // Check we can create shader. | 48 // Check we can create shader. |
| 49 ShaderManager::ShaderInfo* info0 = manager_.CreateShaderInfo( | 49 Shader* info0 = manager_.CreateShader( |
| 50 kClient1Id, kService1Id, kShader1Type); | 50 kClient1Id, kService1Id, kShader1Type); |
| 51 // Check shader got created. | 51 // Check shader got created. |
| 52 ASSERT_TRUE(info0 != NULL); | 52 ASSERT_TRUE(info0 != NULL); |
| 53 ShaderManager::ShaderInfo* info1 = manager_.GetShaderInfo(kClient1Id); | 53 Shader* info1 = manager_.GetShader(kClient1Id); |
| 54 ASSERT_EQ(info0, info1); | 54 ASSERT_EQ(info0, info1); |
| 55 // Check we get nothing for a non-existent shader. | 55 // Check we get nothing for a non-existent shader. |
| 56 EXPECT_TRUE(manager_.GetShaderInfo(kClient2Id) == NULL); | 56 EXPECT_TRUE(manager_.GetShader(kClient2Id) == NULL); |
| 57 // Check we can't get the shader after we remove it. | 57 // Check we can't get the shader after we remove it. |
| 58 manager_.MarkAsDeleted(info1); | 58 manager_.MarkAsDeleted(info1); |
| 59 EXPECT_TRUE(manager_.GetShaderInfo(kClient1Id) == NULL); | 59 EXPECT_TRUE(manager_.GetShader(kClient1Id) == NULL); |
| 60 } | 60 } |
| 61 | 61 |
| 62 TEST_F(ShaderManagerTest, Destroy) { | 62 TEST_F(ShaderManagerTest, Destroy) { |
| 63 const GLuint kClient1Id = 1; | 63 const GLuint kClient1Id = 1; |
| 64 const GLuint kService1Id = 11; | 64 const GLuint kService1Id = 11; |
| 65 const GLenum kShader1Type = GL_VERTEX_SHADER; | 65 const GLenum kShader1Type = GL_VERTEX_SHADER; |
| 66 // Check we can create shader. | 66 // Check we can create shader. |
| 67 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 67 Shader* info1 = manager_.CreateShader( |
| 68 kClient1Id, kService1Id, kShader1Type); | 68 kClient1Id, kService1Id, kShader1Type); |
| 69 // Check shader got created. | 69 // Check shader got created. |
| 70 ASSERT_TRUE(info1 != NULL); | 70 ASSERT_TRUE(info1 != NULL); |
| 71 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) | 71 EXPECT_CALL(*gl_, DeleteShader(kService1Id)) |
| 72 .Times(1) | 72 .Times(1) |
| 73 .RetiresOnSaturation(); | 73 .RetiresOnSaturation(); |
| 74 manager_.Destroy(true); | 74 manager_.Destroy(true); |
| 75 // Check that resources got freed. | 75 // Check that resources got freed. |
| 76 info1 = manager_.GetShaderInfo(kClient1Id); | 76 info1 = manager_.GetShader(kClient1Id); |
| 77 ASSERT_TRUE(info1 == NULL); | 77 ASSERT_TRUE(info1 == NULL); |
| 78 } | 78 } |
| 79 | 79 |
| 80 TEST_F(ShaderManagerTest, DeleteBug) { | 80 TEST_F(ShaderManagerTest, DeleteBug) { |
| 81 const GLuint kClient1Id = 1; | 81 const GLuint kClient1Id = 1; |
| 82 const GLuint kClient2Id = 2; | 82 const GLuint kClient2Id = 2; |
| 83 const GLuint kService1Id = 11; | 83 const GLuint kService1Id = 11; |
| 84 const GLuint kService2Id = 12; | 84 const GLuint kService2Id = 12; |
| 85 const GLenum kShaderType = GL_VERTEX_SHADER; | 85 const GLenum kShaderType = GL_VERTEX_SHADER; |
| 86 // Check we can create shader. | 86 // Check we can create shader. |
| 87 ShaderManager::ShaderInfo::Ref info1( | 87 scoped_refptr<Shader> info1( |
| 88 manager_.CreateShaderInfo(kClient1Id, kService1Id, kShaderType)); | 88 manager_.CreateShader(kClient1Id, kService1Id, kShaderType)); |
| 89 ShaderManager::ShaderInfo::Ref info2( | 89 scoped_refptr<Shader> info2( |
| 90 manager_.CreateShaderInfo(kClient2Id, kService2Id, kShaderType)); | 90 manager_.CreateShader(kClient2Id, kService2Id, kShaderType)); |
| 91 ASSERT_TRUE(info1); | 91 ASSERT_TRUE(info1); |
| 92 ASSERT_TRUE(info2); | 92 ASSERT_TRUE(info2); |
| 93 manager_.UseShader(info1); | 93 manager_.UseShader(info1); |
| 94 manager_.MarkAsDeleted(info1); | 94 manager_.MarkAsDeleted(info1); |
| 95 manager_.MarkAsDeleted(info2); | 95 manager_.MarkAsDeleted(info2); |
| 96 EXPECT_TRUE(manager_.IsOwned(info1)); | 96 EXPECT_TRUE(manager_.IsOwned(info1)); |
| 97 EXPECT_FALSE(manager_.IsOwned(info2)); | 97 EXPECT_FALSE(manager_.IsOwned(info2)); |
| 98 } | 98 } |
| 99 | 99 |
| 100 TEST_F(ShaderManagerTest, ShaderInfo) { | 100 TEST_F(ShaderManagerTest, Shader) { |
| 101 const GLuint kClient1Id = 1; | 101 const GLuint kClient1Id = 1; |
| 102 const GLuint kService1Id = 11; | 102 const GLuint kService1Id = 11; |
| 103 const GLenum kShader1Type = GL_VERTEX_SHADER; | 103 const GLenum kShader1Type = GL_VERTEX_SHADER; |
| 104 const char* kClient1Source = "hello world"; | 104 const char* kClient1Source = "hello world"; |
| 105 // Check we can create shader. | 105 // Check we can create shader. |
| 106 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 106 Shader* info1 = manager_.CreateShader( |
| 107 kClient1Id, kService1Id, kShader1Type); | 107 kClient1Id, kService1Id, kShader1Type); |
| 108 // Check shader got created. | 108 // Check shader got created. |
| 109 ASSERT_TRUE(info1 != NULL); | 109 ASSERT_TRUE(info1 != NULL); |
| 110 EXPECT_EQ(kService1Id, info1->service_id()); | 110 EXPECT_EQ(kService1Id, info1->service_id()); |
| 111 // Check if the shader has correct type. | 111 // Check if the shader has correct type. |
| 112 EXPECT_EQ(kShader1Type, info1->shader_type()); | 112 EXPECT_EQ(kShader1Type, info1->shader_type()); |
| 113 EXPECT_FALSE(info1->IsValid()); | 113 EXPECT_FALSE(info1->IsValid()); |
| 114 EXPECT_FALSE(info1->InUse()); | 114 EXPECT_FALSE(info1->InUse()); |
| 115 EXPECT_TRUE(info1->source() == NULL); | 115 EXPECT_TRUE(info1->source() == NULL); |
| 116 EXPECT_TRUE(info1->log_info() == NULL); | 116 EXPECT_TRUE(info1->log_info() == NULL); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo( | 156 uniform_map[kUniform2Name] = ShaderTranslatorInterface::VariableInfo( |
| 157 kUniform2Type, kUniform2Size, kUniform2Name); | 157 kUniform2Type, kUniform2Size, kUniform2Name); |
| 158 EXPECT_CALL(shader_translator, attrib_map()) | 158 EXPECT_CALL(shader_translator, attrib_map()) |
| 159 .WillRepeatedly(ReturnRef(attrib_map)); | 159 .WillRepeatedly(ReturnRef(attrib_map)); |
| 160 EXPECT_CALL(shader_translator, uniform_map()) | 160 EXPECT_CALL(shader_translator, uniform_map()) |
| 161 .WillRepeatedly(ReturnRef(uniform_map)); | 161 .WillRepeatedly(ReturnRef(uniform_map)); |
| 162 ShaderTranslator::NameMap name_map; | 162 ShaderTranslator::NameMap name_map; |
| 163 EXPECT_CALL(shader_translator, name_map()) | 163 EXPECT_CALL(shader_translator, name_map()) |
| 164 .WillRepeatedly(ReturnRef(name_map)); | 164 .WillRepeatedly(ReturnRef(name_map)); |
| 165 // Check we can create shader. | 165 // Check we can create shader. |
| 166 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 166 Shader* info1 = manager_.CreateShader( |
| 167 kClient1Id, kService1Id, kShader1Type); | 167 kClient1Id, kService1Id, kShader1Type); |
| 168 // Check shader got created. | 168 // Check shader got created. |
| 169 ASSERT_TRUE(info1 != NULL); | 169 ASSERT_TRUE(info1 != NULL); |
| 170 // Set Status | 170 // Set Status |
| 171 info1->SetStatus(true, "", &shader_translator); | 171 info1->SetStatus(true, "", &shader_translator); |
| 172 // Check attrib and uniform infos got copied. | 172 // Check attrib and uniform infos got copied. |
| 173 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); | 173 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); |
| 174 it != attrib_map.end(); ++it) { | 174 it != attrib_map.end(); ++it) { |
| 175 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 175 const Shader::VariableInfo* variable_info = |
| 176 info1->GetAttribInfo(it->first); | 176 info1->GetAttribInfo(it->first); |
| 177 ASSERT_TRUE(variable_info != NULL); | 177 ASSERT_TRUE(variable_info != NULL); |
| 178 EXPECT_EQ(it->second.type, variable_info->type); | 178 EXPECT_EQ(it->second.type, variable_info->type); |
| 179 EXPECT_EQ(it->second.size, variable_info->size); | 179 EXPECT_EQ(it->second.size, variable_info->size); |
| 180 EXPECT_EQ(it->second.name, variable_info->name); | 180 EXPECT_EQ(it->second.name, variable_info->name); |
| 181 } | 181 } |
| 182 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); | 182 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); |
| 183 it != uniform_map.end(); ++it) { | 183 it != uniform_map.end(); ++it) { |
| 184 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 184 const Shader::VariableInfo* variable_info = |
| 185 info1->GetUniformInfo(it->first); | 185 info1->GetUniformInfo(it->first); |
| 186 ASSERT_TRUE(variable_info != NULL); | 186 ASSERT_TRUE(variable_info != NULL); |
| 187 EXPECT_EQ(it->second.type, variable_info->type); | 187 EXPECT_EQ(it->second.type, variable_info->type); |
| 188 EXPECT_EQ(it->second.size, variable_info->size); | 188 EXPECT_EQ(it->second.size, variable_info->size); |
| 189 EXPECT_EQ(it->second.name, variable_info->name); | 189 EXPECT_EQ(it->second.name, variable_info->name); |
| 190 } | 190 } |
| 191 // Check attrib and uniform get cleared. | 191 // Check attrib and uniform get cleared. |
| 192 info1->SetStatus(true, NULL, NULL); | 192 info1->SetStatus(true, NULL, NULL); |
| 193 EXPECT_TRUE(info1->log_info() == NULL); | 193 EXPECT_TRUE(info1->log_info() == NULL); |
| 194 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); | 194 for (ShaderTranslator::VariableMap::const_iterator it = attrib_map.begin(); |
| 195 it != attrib_map.end(); ++it) { | 195 it != attrib_map.end(); ++it) { |
| 196 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 196 const Shader::VariableInfo* variable_info = |
| 197 info1->GetAttribInfo(it->first); | 197 info1->GetAttribInfo(it->first); |
| 198 EXPECT_TRUE(variable_info == NULL); | 198 EXPECT_TRUE(variable_info == NULL); |
| 199 } | 199 } |
| 200 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); | 200 for (ShaderTranslator::VariableMap::const_iterator it = uniform_map.begin(); |
| 201 it != uniform_map.end(); ++it) { | 201 it != uniform_map.end(); ++it) { |
| 202 const ShaderManager::ShaderInfo::VariableInfo* variable_info = | 202 const Shader::VariableInfo* variable_info = |
| 203 info1->GetUniformInfo(it->first); | 203 info1->GetUniformInfo(it->first); |
| 204 ASSERT_TRUE(variable_info == NULL); | 204 ASSERT_TRUE(variable_info == NULL); |
| 205 } | 205 } |
| 206 } | 206 } |
| 207 | 207 |
| 208 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { | 208 TEST_F(ShaderManagerTest, ShaderInfoUseCount) { |
| 209 const GLuint kClient1Id = 1; | 209 const GLuint kClient1Id = 1; |
| 210 const GLuint kService1Id = 11; | 210 const GLuint kService1Id = 11; |
| 211 const GLenum kShader1Type = GL_VERTEX_SHADER; | 211 const GLenum kShader1Type = GL_VERTEX_SHADER; |
| 212 // Check we can create shader. | 212 // Check we can create shader. |
| 213 ShaderManager::ShaderInfo* info1 = manager_.CreateShaderInfo( | 213 Shader* info1 = manager_.CreateShader( |
| 214 kClient1Id, kService1Id, kShader1Type); | 214 kClient1Id, kService1Id, kShader1Type); |
| 215 // Check shader got created. | 215 // Check shader got created. |
| 216 ASSERT_TRUE(info1 != NULL); | 216 ASSERT_TRUE(info1 != NULL); |
| 217 EXPECT_FALSE(info1->InUse()); | 217 EXPECT_FALSE(info1->InUse()); |
| 218 EXPECT_FALSE(info1->IsDeleted()); | 218 EXPECT_FALSE(info1->IsDeleted()); |
| 219 manager_.UseShader(info1); | 219 manager_.UseShader(info1); |
| 220 EXPECT_TRUE(info1->InUse()); | 220 EXPECT_TRUE(info1->InUse()); |
| 221 manager_.UseShader(info1); | 221 manager_.UseShader(info1); |
| 222 EXPECT_TRUE(info1->InUse()); | 222 EXPECT_TRUE(info1->InUse()); |
| 223 manager_.MarkAsDeleted(info1); | 223 manager_.MarkAsDeleted(info1); |
| 224 EXPECT_TRUE(info1->IsDeleted()); | 224 EXPECT_TRUE(info1->IsDeleted()); |
| 225 ShaderManager::ShaderInfo* info2 = manager_.GetShaderInfo(kClient1Id); | 225 Shader* info2 = manager_.GetShader(kClient1Id); |
| 226 EXPECT_EQ(info1, info2); | 226 EXPECT_EQ(info1, info2); |
| 227 manager_.UnuseShader(info1); | 227 manager_.UnuseShader(info1); |
| 228 EXPECT_TRUE(info1->InUse()); | 228 EXPECT_TRUE(info1->InUse()); |
| 229 manager_.UnuseShader(info1); // this should delete the info. | 229 manager_.UnuseShader(info1); // this should delete the info. |
| 230 info2 = manager_.GetShaderInfo(kClient1Id); | 230 info2 = manager_.GetShader(kClient1Id); |
| 231 EXPECT_TRUE(info2 == NULL); | 231 EXPECT_TRUE(info2 == NULL); |
| 232 | 232 |
| 233 info1 = manager_.CreateShaderInfo(kClient1Id, kService1Id, kShader1Type); | 233 info1 = manager_.CreateShader(kClient1Id, kService1Id, kShader1Type); |
| 234 ASSERT_TRUE(info1 != NULL); | 234 ASSERT_TRUE(info1 != NULL); |
| 235 EXPECT_FALSE(info1->InUse()); | 235 EXPECT_FALSE(info1->InUse()); |
| 236 manager_.UseShader(info1); | 236 manager_.UseShader(info1); |
| 237 EXPECT_TRUE(info1->InUse()); | 237 EXPECT_TRUE(info1->InUse()); |
| 238 manager_.UseShader(info1); | 238 manager_.UseShader(info1); |
| 239 EXPECT_TRUE(info1->InUse()); | 239 EXPECT_TRUE(info1->InUse()); |
| 240 manager_.UnuseShader(info1); | 240 manager_.UnuseShader(info1); |
| 241 EXPECT_TRUE(info1->InUse()); | 241 EXPECT_TRUE(info1->InUse()); |
| 242 manager_.UnuseShader(info1); | 242 manager_.UnuseShader(info1); |
| 243 EXPECT_FALSE(info1->InUse()); | 243 EXPECT_FALSE(info1->InUse()); |
| 244 info2 = manager_.GetShaderInfo(kClient1Id); | 244 info2 = manager_.GetShader(kClient1Id); |
| 245 EXPECT_EQ(info1, info2); | 245 EXPECT_EQ(info1, info2); |
| 246 manager_.MarkAsDeleted(info1); // this should delete the shader. | 246 manager_.MarkAsDeleted(info1); // this should delete the shader. |
| 247 info2 = manager_.GetShaderInfo(kClient1Id); | 247 info2 = manager_.GetShader(kClient1Id); |
| 248 EXPECT_TRUE(info2 == NULL); | 248 EXPECT_TRUE(info2 == NULL); |
| 249 } | 249 } |
| 250 | 250 |
| 251 TEST_F(ShaderManagerTest, ShaderInfoStoreCompilationStatus) { | 251 TEST_F(ShaderManagerTest, ShaderInfoStoreCompilationStatus) { |
| 252 const GLuint kClientId = 1; | 252 const GLuint kClientId = 1; |
| 253 const GLuint kServiceId = 11; | 253 const GLuint kServiceId = 11; |
| 254 const GLenum kShaderType = GL_VERTEX_SHADER; | 254 const GLenum kShaderType = GL_VERTEX_SHADER; |
| 255 ShaderManager::ShaderInfo* info = manager_.CreateShaderInfo( | 255 Shader* info = manager_.CreateShader( |
| 256 kClientId, kServiceId, kShaderType); | 256 kClientId, kServiceId, kShaderType); |
| 257 ASSERT_TRUE(info != NULL); | 257 ASSERT_TRUE(info != NULL); |
| 258 | 258 |
| 259 EXPECT_EQ(ShaderManager::ShaderInfo::NOT_COMPILED, | 259 EXPECT_EQ(Shader::NOT_COMPILED, |
| 260 info->compilation_status()); | 260 info->compilation_status()); |
| 261 info->UpdateSource("original source"); | 261 info->UpdateSource("original source"); |
| 262 EXPECT_EQ(ShaderManager::ShaderInfo::NOT_COMPILED, | 262 EXPECT_EQ(Shader::NOT_COMPILED, |
| 263 info->compilation_status()); | 263 info->compilation_status()); |
| 264 info->FlagSourceAsCompiled(false); | 264 info->FlagSourceAsCompiled(false); |
| 265 EXPECT_EQ(ShaderManager::ShaderInfo::PENDING_DEFERRED_COMPILE, | 265 EXPECT_EQ(Shader::PENDING_DEFERRED_COMPILE, |
| 266 info->compilation_status()); | 266 info->compilation_status()); |
| 267 info->FlagSourceAsCompiled(true); | 267 info->FlagSourceAsCompiled(true); |
| 268 EXPECT_EQ(ShaderManager::ShaderInfo::COMPILED, | 268 EXPECT_EQ(Shader::COMPILED, |
| 269 info->compilation_status()); | 269 info->compilation_status()); |
| 270 } | 270 } |
| 271 | 271 |
| 272 TEST_F(ShaderManagerTest, ShaderInfoStoreDeferredSource) { | 272 TEST_F(ShaderManagerTest, ShaderInfoStoreDeferredSource) { |
| 273 const GLuint kClientId = 1; | 273 const GLuint kClientId = 1; |
| 274 const GLuint kServiceId = 11; | 274 const GLuint kServiceId = 11; |
| 275 const GLenum kShaderType = GL_VERTEX_SHADER; | 275 const GLenum kShaderType = GL_VERTEX_SHADER; |
| 276 ShaderManager::ShaderInfo* info = manager_.CreateShaderInfo( | 276 Shader* info = manager_.CreateShader( |
| 277 kClientId, kServiceId, kShaderType); | 277 kClientId, kServiceId, kShaderType); |
| 278 ASSERT_TRUE(info != NULL); | 278 ASSERT_TRUE(info != NULL); |
| 279 | 279 |
| 280 info->UpdateSource("original source"); | 280 info->UpdateSource("original source"); |
| 281 info->FlagSourceAsCompiled(false); | 281 info->FlagSourceAsCompiled(false); |
| 282 | 282 |
| 283 EXPECT_EQ("original source", *info->deferred_compilation_source()); | 283 EXPECT_EQ("original source", *info->deferred_compilation_source()); |
| 284 info->UpdateSource("different!"); | 284 info->UpdateSource("different!"); |
| 285 EXPECT_EQ("original source", *info->deferred_compilation_source()); | 285 EXPECT_EQ("original source", *info->deferred_compilation_source()); |
| 286 | 286 |
| 287 info->FlagSourceAsCompiled(true); | 287 info->FlagSourceAsCompiled(true); |
| 288 EXPECT_EQ("different!", *info->deferred_compilation_source()); | 288 EXPECT_EQ("different!", *info->deferred_compilation_source()); |
| 289 } | 289 } |
| 290 | 290 |
| 291 } // namespace gles2 | 291 } // namespace gles2 |
| 292 } // namespace gpu | 292 } // namespace gpu |
| OLD | NEW |