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