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/program_manager.h" | 5 #include "gpu/command_buffer/service/program_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/string_util.h" | 11 #include "base/strings/string_util.h" |
12 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 12 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
13 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 13 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
14 #include "gpu/command_buffer/service/common_decoder.h" | 14 #include "gpu/command_buffer/service/common_decoder.h" |
15 #include "gpu/command_buffer/service/feature_info.h" | 15 #include "gpu/command_buffer/service/feature_info.h" |
16 #include "gpu/command_buffer/service/gpu_service_test.h" | |
17 #include "gpu/command_buffer/service/mocks.h" | 16 #include "gpu/command_buffer/service/mocks.h" |
18 #include "gpu/command_buffer/service/shader_manager.h" | 17 #include "gpu/command_buffer/service/shader_manager.h" |
19 #include "gpu/command_buffer/service/test_helper.h" | 18 #include "gpu/command_buffer/service/test_helper.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
21 #include "ui/gl/gl_mock.h" | 20 #include "ui/gl/gl_mock.h" |
22 | 21 |
| 22 using ::gfx::MockGLInterface; |
23 using ::testing::_; | 23 using ::testing::_; |
24 using ::testing::DoAll; | 24 using ::testing::DoAll; |
25 using ::testing::InSequence; | 25 using ::testing::InSequence; |
26 using ::testing::MatcherCast; | 26 using ::testing::MatcherCast; |
27 using ::testing::Pointee; | 27 using ::testing::Pointee; |
28 using ::testing::Return; | 28 using ::testing::Return; |
29 using ::testing::ReturnRef; | 29 using ::testing::ReturnRef; |
30 using ::testing::SetArrayArgument; | 30 using ::testing::SetArrayArgument; |
31 using ::testing::SetArgumentPointee; | 31 using ::testing::SetArgumentPointee; |
32 using ::testing::StrEq; | 32 using ::testing::StrEq; |
| 33 using ::testing::StrictMock; |
33 | 34 |
34 namespace gpu { | 35 namespace gpu { |
35 namespace gles2 { | 36 namespace gles2 { |
36 | 37 |
37 namespace { | 38 namespace { |
38 const uint32 kMaxVaryingVectors = 8; | 39 const uint32 kMaxVaryingVectors = 8; |
39 | 40 |
40 void ShaderCacheCb(const std::string& key, const std::string& shader) {} | 41 void ShaderCacheCb(const std::string& key, const std::string& shader) {} |
41 } // namespace anonymous | 42 } // namespace anonymous |
42 | 43 |
43 class ProgramManagerTest : public GpuServiceTest { | 44 class ProgramManagerTest : public testing::Test { |
44 public: | 45 public: |
45 ProgramManagerTest() : manager_(NULL, kMaxVaryingVectors) { } | 46 ProgramManagerTest() : manager_(NULL, kMaxVaryingVectors) { } |
46 virtual ~ProgramManagerTest() { | 47 virtual ~ProgramManagerTest() { |
47 manager_.Destroy(false); | 48 manager_.Destroy(false); |
48 } | 49 } |
49 | 50 |
50 protected: | 51 protected: |
| 52 virtual void SetUp() { |
| 53 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
| 54 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); |
| 55 } |
| 56 |
| 57 virtual void TearDown() { |
| 58 ::gfx::MockGLInterface::SetGLInterface(NULL); |
| 59 gl_.reset(); |
| 60 } |
| 61 |
| 62 // Use StrictMock to make 100% sure we know how GL will be called. |
| 63 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
51 ProgramManager manager_; | 64 ProgramManager manager_; |
52 }; | 65 }; |
53 | 66 |
54 TEST_F(ProgramManagerTest, Basic) { | 67 TEST_F(ProgramManagerTest, Basic) { |
55 const GLuint kClient1Id = 1; | 68 const GLuint kClient1Id = 1; |
56 const GLuint kService1Id = 11; | 69 const GLuint kService1Id = 11; |
57 const GLuint kClient2Id = 2; | 70 const GLuint kClient2Id = 2; |
58 // Check we can create program. | 71 // Check we can create program. |
59 manager_.CreateProgram(kClient1Id, kService1Id); | 72 manager_.CreateProgram(kClient1Id, kService1Id); |
60 // Check program got created. | 73 // Check program got created. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 kClient1Id, kService1Id); | 131 kClient1Id, kService1Id); |
119 ASSERT_TRUE(program1); | 132 ASSERT_TRUE(program1); |
120 EXPECT_EQ(kService1Id, program1->service_id()); | 133 EXPECT_EQ(kService1Id, program1->service_id()); |
121 EXPECT_FALSE(program1->InUse()); | 134 EXPECT_FALSE(program1->InUse()); |
122 EXPECT_FALSE(program1->IsValid()); | 135 EXPECT_FALSE(program1->IsValid()); |
123 EXPECT_FALSE(program1->IsDeleted()); | 136 EXPECT_FALSE(program1->IsDeleted()); |
124 EXPECT_FALSE(program1->CanLink()); | 137 EXPECT_FALSE(program1->CanLink()); |
125 EXPECT_TRUE(program1->log_info() == NULL); | 138 EXPECT_TRUE(program1->log_info() == NULL); |
126 } | 139 } |
127 | 140 |
128 class ProgramManagerWithShaderTest : public GpuServiceTest { | 141 class ProgramManagerWithShaderTest : public testing::Test { |
129 public: | 142 public: |
130 ProgramManagerWithShaderTest() | 143 ProgramManagerWithShaderTest() |
131 : manager_(NULL, kMaxVaryingVectors), program_(NULL) { | 144 : manager_(NULL, kMaxVaryingVectors), program_(NULL) { |
132 } | 145 } |
133 | 146 |
134 virtual ~ProgramManagerWithShaderTest() { | 147 virtual ~ProgramManagerWithShaderTest() { |
135 manager_.Destroy(false); | 148 manager_.Destroy(false); |
136 shader_manager_.Destroy(false); | 149 shader_manager_.Destroy(false); |
137 } | 150 } |
138 | 151 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 typedef struct { | 221 typedef struct { |
209 int type; | 222 int type; |
210 int size; | 223 int size; |
211 int precision; | 224 int precision; |
212 int static_use; | 225 int static_use; |
213 std::string name; | 226 std::string name; |
214 VarCategory category; | 227 VarCategory category; |
215 } VarInfo; | 228 } VarInfo; |
216 | 229 |
217 virtual void SetUp() { | 230 virtual void SetUp() { |
218 GpuServiceTest::SetUp(); | 231 gl_.reset(new StrictMock<gfx::MockGLInterface>()); |
| 232 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); |
219 | 233 |
220 SetupDefaultShaderExpectations(); | 234 SetupDefaultShaderExpectations(); |
221 | 235 |
222 Shader* vertex_shader = shader_manager_.CreateShader( | 236 Shader* vertex_shader = shader_manager_.CreateShader( |
223 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 237 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
224 Shader* fragment_shader = | 238 Shader* fragment_shader = |
225 shader_manager_.CreateShader( | 239 shader_manager_.CreateShader( |
226 kFragmentShaderClientId, kFragmentShaderServiceId, | 240 kFragmentShaderClientId, kFragmentShaderServiceId, |
227 GL_FRAGMENT_SHADER); | 241 GL_FRAGMENT_SHADER); |
228 ASSERT_TRUE(vertex_shader != NULL); | 242 ASSERT_TRUE(vertex_shader != NULL); |
(...skipping 22 matching lines...) Expand all Loading... |
251 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 265 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
252 kServiceProgramId); | 266 kServiceProgramId); |
253 } | 267 } |
254 | 268 |
255 void SetupExpectationsForClearingUniforms( | 269 void SetupExpectationsForClearingUniforms( |
256 UniformInfo* uniforms, size_t num_uniforms) { | 270 UniformInfo* uniforms, size_t num_uniforms) { |
257 TestHelper::SetupExpectationsForClearingUniforms( | 271 TestHelper::SetupExpectationsForClearingUniforms( |
258 gl_.get(), uniforms, num_uniforms); | 272 gl_.get(), uniforms, num_uniforms); |
259 } | 273 } |
260 | 274 |
| 275 virtual void TearDown() { |
| 276 ::gfx::MockGLInterface::SetGLInterface(NULL); |
| 277 } |
| 278 |
261 // Return true if link status matches expected_link_status | 279 // Return true if link status matches expected_link_status |
262 bool LinkAsExpected(Program* program, | 280 bool LinkAsExpected(Program* program, |
263 bool expected_link_status) { | 281 bool expected_link_status) { |
264 GLuint service_id = program->service_id(); | 282 GLuint service_id = program->service_id(); |
265 if (expected_link_status) { | 283 if (expected_link_status) { |
266 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 284 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
267 service_id); | 285 service_id); |
268 } | 286 } |
269 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, | 287 program->Link(NULL, NULL, NULL, Program::kCountOnlyStaticallyUsed, |
270 base::Bind(&ShaderCacheCb)); | 288 base::Bind(&ShaderCacheCb)); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 manager_.CreateProgram(kClientProgramId, kServiceProgramId); | 391 manager_.CreateProgram(kClientProgramId, kServiceProgramId); |
374 EXPECT_TRUE(program != NULL); | 392 EXPECT_TRUE(program != NULL); |
375 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); | 393 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); |
376 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); | 394 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); |
377 return program; | 395 return program; |
378 } | 396 } |
379 | 397 |
380 static AttribInfo kAttribs[]; | 398 static AttribInfo kAttribs[]; |
381 static UniformInfo kUniforms[]; | 399 static UniformInfo kUniforms[]; |
382 | 400 |
| 401 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; |
| 402 |
383 ProgramManager manager_; | 403 ProgramManager manager_; |
384 Program* program_; | 404 Program* program_; |
385 ShaderManager shader_manager_; | 405 ShaderManager shader_manager_; |
386 }; | 406 }; |
387 | 407 |
388 ProgramManagerWithShaderTest::AttribInfo | 408 ProgramManagerWithShaderTest::AttribInfo |
389 ProgramManagerWithShaderTest::kAttribs[] = { | 409 ProgramManagerWithShaderTest::kAttribs[] = { |
390 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, | 410 { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, |
391 { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, }, | 411 { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, }, |
392 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, | 412 { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, |
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1542 base::Bind(&ShaderCacheCb)); | 1562 base::Bind(&ShaderCacheCb)); |
1543 | 1563 |
1544 EXPECT_EQ(kUniform1DesiredLocation, | 1564 EXPECT_EQ(kUniform1DesiredLocation, |
1545 program->GetUniformFakeLocation(kUniform1Name)); | 1565 program->GetUniformFakeLocation(kUniform1Name)); |
1546 EXPECT_EQ(kUniform3DesiredLocation, | 1566 EXPECT_EQ(kUniform3DesiredLocation, |
1547 program->GetUniformFakeLocation(kUniform3BadName)); | 1567 program->GetUniformFakeLocation(kUniform3BadName)); |
1548 EXPECT_EQ(kUniform3DesiredLocation, | 1568 EXPECT_EQ(kUniform3DesiredLocation, |
1549 program->GetUniformFakeLocation(kUniform3GoodName)); | 1569 program->GetUniformFakeLocation(kUniform3GoodName)); |
1550 } | 1570 } |
1551 | 1571 |
1552 class ProgramManagerWithCacheTest : public GpuServiceTest { | 1572 class ProgramManagerWithCacheTest : public testing::Test { |
1553 public: | 1573 public: |
1554 static const GLuint kClientProgramId = 1; | 1574 static const GLuint kClientProgramId = 1; |
1555 static const GLuint kServiceProgramId = 10; | 1575 static const GLuint kServiceProgramId = 10; |
1556 static const GLuint kVertexShaderClientId = 2; | 1576 static const GLuint kVertexShaderClientId = 2; |
1557 static const GLuint kFragmentShaderClientId = 20; | 1577 static const GLuint kFragmentShaderClientId = 20; |
1558 static const GLuint kVertexShaderServiceId = 3; | 1578 static const GLuint kVertexShaderServiceId = 3; |
1559 static const GLuint kFragmentShaderServiceId = 30; | 1579 static const GLuint kFragmentShaderServiceId = 30; |
1560 | 1580 |
1561 ProgramManagerWithCacheTest() | 1581 ProgramManagerWithCacheTest() |
1562 : cache_(new MockProgramCache()), | 1582 : cache_(new MockProgramCache()), |
1563 manager_(cache_.get(), kMaxVaryingVectors), | 1583 manager_(cache_.get(), kMaxVaryingVectors), |
1564 vertex_shader_(NULL), | 1584 vertex_shader_(NULL), |
1565 fragment_shader_(NULL), | 1585 fragment_shader_(NULL), |
1566 program_(NULL) { | 1586 program_(NULL) { |
1567 } | 1587 } |
1568 virtual ~ProgramManagerWithCacheTest() { | 1588 virtual ~ProgramManagerWithCacheTest() { |
1569 manager_.Destroy(false); | 1589 manager_.Destroy(false); |
1570 shader_manager_.Destroy(false); | 1590 shader_manager_.Destroy(false); |
1571 } | 1591 } |
1572 | 1592 |
1573 protected: | 1593 protected: |
1574 virtual void SetUp() { | 1594 virtual void SetUp() { |
1575 GpuServiceTest::SetUp(); | 1595 gl_.reset(new StrictMock<gfx::MockGLInterface>()); |
| 1596 ::gfx::MockGLInterface::SetGLInterface(gl_.get()); |
1576 | 1597 |
1577 vertex_shader_ = shader_manager_.CreateShader( | 1598 vertex_shader_ = shader_manager_.CreateShader( |
1578 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); | 1599 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); |
1579 fragment_shader_ = shader_manager_.CreateShader( | 1600 fragment_shader_ = shader_manager_.CreateShader( |
1580 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); | 1601 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER); |
1581 ASSERT_TRUE(vertex_shader_ != NULL); | 1602 ASSERT_TRUE(vertex_shader_ != NULL); |
1582 ASSERT_TRUE(fragment_shader_ != NULL); | 1603 ASSERT_TRUE(fragment_shader_ != NULL); |
1583 vertex_shader_->UpdateSource("lka asjf bjajsdfj"); | 1604 vertex_shader_->UpdateSource("lka asjf bjajsdfj"); |
1584 fragment_shader_->UpdateSource("lka asjf a fasgag 3rdsf3 bjajsdfj"); | 1605 fragment_shader_->UpdateSource("lka asjf a fasgag 3rdsf3 bjajsdfj"); |
1585 | 1606 |
1586 program_ = manager_.CreateProgram( | 1607 program_ = manager_.CreateProgram( |
1587 kClientProgramId, kServiceProgramId); | 1608 kClientProgramId, kServiceProgramId); |
1588 ASSERT_TRUE(program_ != NULL); | 1609 ASSERT_TRUE(program_ != NULL); |
1589 | 1610 |
1590 program_->AttachShader(&shader_manager_, vertex_shader_); | 1611 program_->AttachShader(&shader_manager_, vertex_shader_); |
1591 program_->AttachShader(&shader_manager_, fragment_shader_); | 1612 program_->AttachShader(&shader_manager_, fragment_shader_); |
1592 } | 1613 } |
1593 | 1614 |
| 1615 virtual void TearDown() { |
| 1616 ::gfx::MockGLInterface::SetGLInterface(NULL); |
| 1617 } |
| 1618 |
1594 void SetShadersCompiled() { | 1619 void SetShadersCompiled() { |
1595 vertex_shader_->SetStatus(true, NULL, NULL); | 1620 vertex_shader_->SetStatus(true, NULL, NULL); |
1596 fragment_shader_->SetStatus(true, NULL, NULL); | 1621 fragment_shader_->SetStatus(true, NULL, NULL); |
1597 } | 1622 } |
1598 | 1623 |
1599 void SetProgramCached() { | 1624 void SetProgramCached() { |
1600 cache_->LinkedProgramCacheSuccess( | 1625 cache_->LinkedProgramCacheSuccess( |
1601 vertex_shader_->source()->c_str(), | 1626 vertex_shader_->source()->c_str(), |
1602 NULL, | 1627 NULL, |
1603 fragment_shader_->source()->c_str(), | 1628 fragment_shader_->source()->c_str(), |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1725 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1); | 1750 ShaderSource(shader_id, 1, Pointee(src), NULL)).Times(1); |
1726 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1); | 1751 EXPECT_CALL(*gl_.get(), CompileShader(shader_id)).Times(1); |
1727 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _)) | 1752 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_COMPILE_STATUS, _)) |
1728 .WillOnce(SetArgumentPointee<2>(GL_FALSE)); | 1753 .WillOnce(SetArgumentPointee<2>(GL_FALSE)); |
1729 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_INFO_LOG_LENGTH, _)) | 1754 EXPECT_CALL(*gl_.get(), GetShaderiv(shader_id, GL_INFO_LOG_LENGTH, _)) |
1730 .WillOnce(SetArgumentPointee<2>(0)); | 1755 .WillOnce(SetArgumentPointee<2>(0)); |
1731 EXPECT_CALL(*gl_.get(), GetShaderInfoLog(shader_id, 0, _, _)) | 1756 EXPECT_CALL(*gl_.get(), GetShaderInfoLog(shader_id, 0, _, _)) |
1732 .Times(1); | 1757 .Times(1); |
1733 } | 1758 } |
1734 | 1759 |
| 1760 scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; |
| 1761 |
1735 scoped_ptr<MockProgramCache> cache_; | 1762 scoped_ptr<MockProgramCache> cache_; |
1736 ProgramManager manager_; | 1763 ProgramManager manager_; |
1737 | 1764 |
1738 Shader* vertex_shader_; | 1765 Shader* vertex_shader_; |
1739 Shader* fragment_shader_; | 1766 Shader* fragment_shader_; |
1740 Program* program_; | 1767 Program* program_; |
1741 ShaderManager shader_manager_; | 1768 ShaderManager shader_manager_; |
1742 }; | 1769 }; |
1743 | 1770 |
1744 // GCC requires these declarations, but MSVC requires they not be present | 1771 // GCC requires these declarations, but MSVC requires they not be present |
(...skipping 23 matching lines...) Expand all Loading... |
1768 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); | 1795 SetExpectationsForProgramLoad(ProgramCache::PROGRAM_LOAD_SUCCESS); |
1769 SetExpectationsForNotCachingProgram(); | 1796 SetExpectationsForNotCachingProgram(); |
1770 SetExpectationsForProgramLoadSuccess(); | 1797 SetExpectationsForProgramLoadSuccess(); |
1771 | 1798 |
1772 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, | 1799 EXPECT_TRUE(program_->Link(NULL, NULL, NULL, |
1773 Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb))); | 1800 Program::kCountOnlyStaticallyUsed, base::Bind(&ShaderCacheCb))); |
1774 } | 1801 } |
1775 | 1802 |
1776 } // namespace gles2 | 1803 } // namespace gles2 |
1777 } // namespace gpu | 1804 } // namespace gpu |
OLD | NEW |