| 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 |