| 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/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/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 54 |
| 55 TEST_F(ProgramManagerTest, Basic) { | 55 TEST_F(ProgramManagerTest, Basic) { |
| 56 const GLuint kClient1Id = 1; | 56 const GLuint kClient1Id = 1; |
| 57 const GLuint kService1Id = 11; | 57 const GLuint kService1Id = 11; |
| 58 const GLuint kClient2Id = 2; | 58 const GLuint kClient2Id = 2; |
| 59 // Check we can create program. | 59 // Check we can create program. |
| 60 manager_.CreateProgramInfo(kClient1Id, kService1Id); | 60 manager_.CreateProgramInfo(kClient1Id, kService1Id); |
| 61 // Check program got created. | 61 // Check program got created. |
| 62 ProgramManager::ProgramInfo* info1 = manager_.GetProgramInfo(kClient1Id); | 62 ProgramManager::ProgramInfo* info1 = manager_.GetProgramInfo(kClient1Id); |
| 63 ASSERT_TRUE(info1 != NULL); | 63 ASSERT_TRUE(info1 != NULL); |
| 64 EXPECT_EQ(kService1Id, info1->service_id()); | |
| 65 EXPECT_FALSE(info1->CanLink()); | |
| 66 EXPECT_STREQ("", info1->log_info().c_str()); | |
| 67 GLuint client_id = 0; | 64 GLuint client_id = 0; |
| 68 EXPECT_TRUE(manager_.GetClientId(info1->service_id(), &client_id)); | 65 EXPECT_TRUE(manager_.GetClientId(info1->service_id(), &client_id)); |
| 69 EXPECT_EQ(kClient1Id, client_id); | 66 EXPECT_EQ(kClient1Id, client_id); |
| 70 // Check we get nothing for a non-existent program. | 67 // Check we get nothing for a non-existent program. |
| 71 EXPECT_TRUE(manager_.GetProgramInfo(kClient2Id) == NULL); | 68 EXPECT_TRUE(manager_.GetProgramInfo(kClient2Id) == NULL); |
| 72 // Check trying to a remove non-existent programs does not crash. | |
| 73 manager_.RemoveProgramInfo(kClient2Id); | |
| 74 // Check we can't get the program after we remove it. | |
| 75 manager_.RemoveProgramInfo(kClient1Id); | |
| 76 EXPECT_TRUE(manager_.GetProgramInfo(kClient1Id) == NULL); | |
| 77 } | 69 } |
| 78 | 70 |
| 79 TEST_F(ProgramManagerTest, Destroy) { | 71 TEST_F(ProgramManagerTest, Destroy) { |
| 80 const GLuint kClient1Id = 1; | 72 const GLuint kClient1Id = 1; |
| 81 const GLuint kService1Id = 11; | 73 const GLuint kService1Id = 11; |
| 82 // Check we can create program. | 74 // Check we can create program. |
| 83 manager_.CreateProgramInfo(kClient1Id, kService1Id); | 75 manager_.CreateProgramInfo(kClient1Id, kService1Id); |
| 84 // Check program got created. | 76 // Check program got created. |
| 85 ProgramManager::ProgramInfo* info1 = | 77 ProgramManager::ProgramInfo* info1 = |
| 86 manager_.GetProgramInfo(kClient1Id); | 78 manager_.GetProgramInfo(kClient1Id); |
| 87 ASSERT_TRUE(info1 != NULL); | 79 ASSERT_TRUE(info1 != NULL); |
| 88 EXPECT_CALL(*gl_, DeleteProgram(kService1Id)) | 80 EXPECT_CALL(*gl_, DeleteProgram(kService1Id)) |
| 89 .Times(1) | 81 .Times(1) |
| 90 .RetiresOnSaturation(); | 82 .RetiresOnSaturation(); |
| 91 manager_.Destroy(true); | 83 manager_.Destroy(true); |
| 92 // Check the resources were released. | 84 // Check the resources were released. |
| 93 info1 = manager_.GetProgramInfo(kClient1Id); | 85 info1 = manager_.GetProgramInfo(kClient1Id); |
| 94 ASSERT_TRUE(info1 == NULL); | 86 ASSERT_TRUE(info1 == NULL); |
| 95 } | 87 } |
| 96 | 88 |
| 89 TEST_F(ProgramManagerTest, ProgramInfo) { |
| 90 const GLuint kClient1Id = 1; |
| 91 const GLuint kService1Id = 11; |
| 92 // Check we can create program. |
| 93 manager_.CreateProgramInfo(kClient1Id, kService1Id); |
| 94 // Check program got created. |
| 95 ProgramManager::ProgramInfo* info1 = manager_.GetProgramInfo(kClient1Id); |
| 96 ASSERT_TRUE(info1 != NULL); |
| 97 EXPECT_EQ(kService1Id, info1->service_id()); |
| 98 EXPECT_FALSE(info1->InUse()); |
| 99 EXPECT_FALSE(info1->IsValid()); |
| 100 EXPECT_FALSE(info1->IsDeleted()); |
| 101 EXPECT_FALSE(info1->CanLink()); |
| 102 EXPECT_STREQ("", info1->log_info().c_str()); |
| 103 } |
| 104 |
| 97 class ProgramManagerWithShaderTest : public testing::Test { | 105 class ProgramManagerWithShaderTest : public testing::Test { |
| 98 public: | 106 public: |
| 99 ProgramManagerWithShaderTest() | 107 ProgramManagerWithShaderTest() |
| 100 : program_info_(NULL) { | 108 : program_info_(NULL) { |
| 101 } | 109 } |
| 102 | 110 |
| 103 ~ProgramManagerWithShaderTest() { | 111 ~ProgramManagerWithShaderTest() { |
| 104 manager_.Destroy(false); | 112 manager_.Destroy(false); |
| 105 } | 113 } |
| 106 | 114 |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 shader_manager.CreateShaderInfo( | 432 shader_manager.CreateShaderInfo( |
| 425 kVShaderClientId, kVShaderServiceId, GL_VERTEX_SHADER); | 433 kVShaderClientId, kVShaderServiceId, GL_VERTEX_SHADER); |
| 426 ShaderManager::ShaderInfo* vshader = shader_manager.GetShaderInfo( | 434 ShaderManager::ShaderInfo* vshader = shader_manager.GetShaderInfo( |
| 427 kVShaderClientId); | 435 kVShaderClientId); |
| 428 vshader->SetStatus(true, "", NULL); | 436 vshader->SetStatus(true, "", NULL); |
| 429 shader_manager.CreateShaderInfo( | 437 shader_manager.CreateShaderInfo( |
| 430 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); | 438 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 431 ShaderManager::ShaderInfo* fshader = shader_manager.GetShaderInfo( | 439 ShaderManager::ShaderInfo* fshader = shader_manager.GetShaderInfo( |
| 432 kFShaderClientId); | 440 kFShaderClientId); |
| 433 fshader->SetStatus(true, "", NULL); | 441 fshader->SetStatus(true, "", NULL); |
| 434 EXPECT_TRUE(program_info->AttachShader(vshader)); | 442 EXPECT_TRUE(program_info->AttachShader(&shader_manager, vshader)); |
| 435 EXPECT_FALSE(program_info->CanLink()); | 443 EXPECT_FALSE(program_info->CanLink()); |
| 436 EXPECT_TRUE(program_info->AttachShader(fshader)); | 444 EXPECT_TRUE(program_info->AttachShader(&shader_manager, fshader)); |
| 437 EXPECT_TRUE(program_info->CanLink()); | 445 EXPECT_TRUE(program_info->CanLink()); |
| 438 program_info->DetachShader(vshader); | 446 program_info->DetachShader(&shader_manager, vshader); |
| 439 EXPECT_FALSE(program_info->CanLink()); | 447 EXPECT_FALSE(program_info->CanLink()); |
| 440 EXPECT_TRUE(program_info->AttachShader(vshader)); | 448 EXPECT_TRUE(program_info->AttachShader(&shader_manager, vshader)); |
| 441 EXPECT_TRUE(program_info->CanLink()); | 449 EXPECT_TRUE(program_info->CanLink()); |
| 442 program_info->DetachShader(fshader); | 450 program_info->DetachShader(&shader_manager, fshader); |
| 443 EXPECT_FALSE(program_info->CanLink()); | 451 EXPECT_FALSE(program_info->CanLink()); |
| 444 EXPECT_FALSE(program_info->AttachShader(vshader)); | 452 EXPECT_FALSE(program_info->AttachShader(&shader_manager, vshader)); |
| 445 EXPECT_FALSE(program_info->CanLink()); | 453 EXPECT_FALSE(program_info->CanLink()); |
| 446 EXPECT_TRUE(program_info->AttachShader(fshader)); | 454 EXPECT_TRUE(program_info->AttachShader(&shader_manager, fshader)); |
| 447 EXPECT_TRUE(program_info->CanLink()); | 455 EXPECT_TRUE(program_info->CanLink()); |
| 448 vshader->SetStatus(false, "", NULL); | 456 vshader->SetStatus(false, "", NULL); |
| 449 EXPECT_FALSE(program_info->CanLink()); | 457 EXPECT_FALSE(program_info->CanLink()); |
| 450 vshader->SetStatus(true, "", NULL); | 458 vshader->SetStatus(true, "", NULL); |
| 451 EXPECT_TRUE(program_info->CanLink()); | 459 EXPECT_TRUE(program_info->CanLink()); |
| 452 fshader->SetStatus(false, "", NULL); | 460 fshader->SetStatus(false, "", NULL); |
| 453 EXPECT_FALSE(program_info->CanLink()); | 461 EXPECT_FALSE(program_info->CanLink()); |
| 454 fshader->SetStatus(true, "", NULL); | 462 fshader->SetStatus(true, "", NULL); |
| 455 EXPECT_TRUE(program_info->CanLink()); | 463 EXPECT_TRUE(program_info->CanLink()); |
| 456 shader_manager.Destroy(false); | 464 shader_manager.Destroy(false); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 const size_t kNumAttribs= arraysize(kAttribs); | 586 const size_t kNumAttribs= arraysize(kAttribs); |
| 579 const size_t kNumUniforms = arraysize(kUniforms); | 587 const size_t kNumUniforms = arraysize(kUniforms); |
| 580 static const GLuint kClientProgramId = 1234; | 588 static const GLuint kClientProgramId = 1234; |
| 581 static const GLuint kServiceProgramId = 5679; | 589 static const GLuint kServiceProgramId = 5679; |
| 582 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, | 590 SetupShader(kAttribs, kNumAttribs, kUniforms, kNumUniforms, |
| 583 kServiceProgramId); | 591 kServiceProgramId); |
| 584 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); | 592 manager_.CreateProgramInfo(kClientProgramId, kServiceProgramId); |
| 585 ProgramManager::ProgramInfo* program_info = | 593 ProgramManager::ProgramInfo* program_info = |
| 586 manager_.GetProgramInfo(kClientProgramId); | 594 manager_.GetProgramInfo(kClientProgramId); |
| 587 ASSERT_TRUE(program_info != NULL); | 595 ASSERT_TRUE(program_info != NULL); |
| 588 EXPECT_TRUE(program_info->AttachShader(shader_info)); | 596 EXPECT_TRUE(program_info->AttachShader(&shader_manager, shader_info)); |
| 589 program_info->Update(); | 597 program_info->Update(); |
| 590 // Check that we got the good type, not the bad. | 598 // Check that we got the good type, not the bad. |
| 591 // Check Attribs | 599 // Check Attribs |
| 592 for (unsigned index = 0; index < kNumAttribs; ++index) { | 600 for (unsigned index = 0; index < kNumAttribs; ++index) { |
| 593 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = | 601 const ProgramManager::ProgramInfo::VertexAttribInfo* attrib_info = |
| 594 program_info->GetAttribInfo(index); | 602 program_info->GetAttribInfo(index); |
| 595 ASSERT_TRUE(attrib_info != NULL); | 603 ASSERT_TRUE(attrib_info != NULL); |
| 596 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( | 604 ShaderTranslator::VariableMap::const_iterator it = attrib_map.find( |
| 597 attrib_info->name); | 605 attrib_info->name); |
| 598 ASSERT_TRUE(it != attrib_map.end()); | 606 ASSERT_TRUE(it != attrib_map.end()); |
| 599 EXPECT_EQ(it->first, attrib_info->name); | 607 EXPECT_EQ(it->first, attrib_info->name); |
| 600 EXPECT_EQ(static_cast<GLenum>(it->second.type), attrib_info->type); | 608 EXPECT_EQ(static_cast<GLenum>(it->second.type), attrib_info->type); |
| 601 EXPECT_EQ(it->second.size, attrib_info->size); | 609 EXPECT_EQ(it->second.size, attrib_info->size); |
| 602 } | 610 } |
| 603 // Check Uniforms | 611 // Check Uniforms |
| 604 for (unsigned index = 0; index < kNumUniforms; ++index) { | 612 for (unsigned index = 0; index < kNumUniforms; ++index) { |
| 605 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = | 613 const ProgramManager::ProgramInfo::UniformInfo* uniform_info = |
| 606 program_info->GetUniformInfo(index); | 614 program_info->GetUniformInfo(index); |
| 607 ASSERT_TRUE(uniform_info != NULL); | 615 ASSERT_TRUE(uniform_info != NULL); |
| 608 ShaderTranslator::VariableMap::const_iterator it = uniform_map.find( | 616 ShaderTranslator::VariableMap::const_iterator it = uniform_map.find( |
| 609 uniform_info->name); | 617 uniform_info->name); |
| 610 ASSERT_TRUE(it != uniform_map.end()); | 618 ASSERT_TRUE(it != uniform_map.end()); |
| 611 EXPECT_EQ(it->first, uniform_info->name); | 619 EXPECT_EQ(it->first, uniform_info->name); |
| 612 EXPECT_EQ(static_cast<GLenum>(it->second.type), uniform_info->type); | 620 EXPECT_EQ(static_cast<GLenum>(it->second.type), uniform_info->type); |
| 613 EXPECT_EQ(it->second.size, uniform_info->size); | 621 EXPECT_EQ(it->second.size, uniform_info->size); |
| 614 } | 622 } |
| 615 shader_manager.Destroy(false); | 623 shader_manager.Destroy(false); |
| 616 } | 624 } |
| 617 | 625 |
| 626 TEST_F(ProgramManagerWithShaderTest, ProgramInfoUseCount) { |
| 627 ShaderManager shader_manager; |
| 628 ProgramManager::ProgramInfo* program_info = |
| 629 manager_.GetProgramInfo(kClientProgramId); |
| 630 ASSERT_TRUE(program_info != NULL); |
| 631 EXPECT_FALSE(program_info->CanLink()); |
| 632 const GLuint kVShaderClientId = 2001; |
| 633 const GLuint kFShaderClientId = 2002; |
| 634 const GLuint kVShaderServiceId = 3001; |
| 635 const GLuint kFShaderServiceId = 3002; |
| 636 shader_manager.CreateShaderInfo( |
| 637 kVShaderClientId, kVShaderServiceId, GL_VERTEX_SHADER); |
| 638 ShaderManager::ShaderInfo* vshader = shader_manager.GetShaderInfo( |
| 639 kVShaderClientId); |
| 640 ASSERT_TRUE(vshader != NULL); |
| 641 vshader->SetStatus(true, "", NULL); |
| 642 shader_manager.CreateShaderInfo( |
| 643 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 644 ShaderManager::ShaderInfo* fshader = shader_manager.GetShaderInfo( |
| 645 kFShaderClientId); |
| 646 ASSERT_TRUE(fshader != NULL); |
| 647 fshader->SetStatus(true, "", NULL); |
| 648 EXPECT_FALSE(vshader->InUse()); |
| 649 EXPECT_FALSE(fshader->InUse()); |
| 650 EXPECT_TRUE(program_info->AttachShader(&shader_manager, vshader)); |
| 651 EXPECT_TRUE(vshader->InUse()); |
| 652 EXPECT_TRUE(program_info->AttachShader(&shader_manager, fshader)); |
| 653 EXPECT_TRUE(fshader->InUse()); |
| 654 EXPECT_TRUE(program_info->CanLink()); |
| 655 EXPECT_FALSE(program_info->InUse()); |
| 656 EXPECT_FALSE(program_info->IsDeleted()); |
| 657 manager_.UseProgram(program_info); |
| 658 EXPECT_TRUE(program_info->InUse()); |
| 659 manager_.UseProgram(program_info); |
| 660 EXPECT_TRUE(program_info->InUse()); |
| 661 manager_.MarkAsDeleted(&shader_manager, program_info); |
| 662 EXPECT_TRUE(program_info->IsDeleted()); |
| 663 ProgramManager::ProgramInfo* info2 = |
| 664 manager_.GetProgramInfo(kClientProgramId); |
| 665 EXPECT_EQ(program_info, info2); |
| 666 manager_.UnuseProgram(&shader_manager, program_info); |
| 667 EXPECT_TRUE(program_info->InUse()); |
| 668 // this should delete the info. |
| 669 manager_.UnuseProgram(&shader_manager, program_info); |
| 670 info2 = manager_.GetProgramInfo(kClientProgramId); |
| 671 EXPECT_TRUE(info2 == NULL); |
| 672 EXPECT_FALSE(vshader->InUse()); |
| 673 EXPECT_FALSE(fshader->InUse()); |
| 674 shader_manager.Destroy(false); |
| 675 } |
| 676 |
| 677 TEST_F(ProgramManagerWithShaderTest, ProgramInfoUseCount2) { |
| 678 ShaderManager shader_manager; |
| 679 ProgramManager::ProgramInfo* program_info = |
| 680 manager_.GetProgramInfo(kClientProgramId); |
| 681 ASSERT_TRUE(program_info != NULL); |
| 682 EXPECT_FALSE(program_info->CanLink()); |
| 683 const GLuint kVShaderClientId = 2001; |
| 684 const GLuint kFShaderClientId = 2002; |
| 685 const GLuint kVShaderServiceId = 3001; |
| 686 const GLuint kFShaderServiceId = 3002; |
| 687 shader_manager.CreateShaderInfo( |
| 688 kVShaderClientId, kVShaderServiceId, GL_VERTEX_SHADER); |
| 689 ShaderManager::ShaderInfo* vshader = shader_manager.GetShaderInfo( |
| 690 kVShaderClientId); |
| 691 ASSERT_TRUE(vshader != NULL); |
| 692 vshader->SetStatus(true, "", NULL); |
| 693 shader_manager.CreateShaderInfo( |
| 694 kFShaderClientId, kFShaderServiceId, GL_FRAGMENT_SHADER); |
| 695 ShaderManager::ShaderInfo* fshader = shader_manager.GetShaderInfo( |
| 696 kFShaderClientId); |
| 697 ASSERT_TRUE(fshader != NULL); |
| 698 fshader->SetStatus(true, "", NULL); |
| 699 EXPECT_FALSE(vshader->InUse()); |
| 700 EXPECT_FALSE(fshader->InUse()); |
| 701 EXPECT_TRUE(program_info->AttachShader(&shader_manager, vshader)); |
| 702 EXPECT_TRUE(vshader->InUse()); |
| 703 EXPECT_TRUE(program_info->AttachShader(&shader_manager, fshader)); |
| 704 EXPECT_TRUE(fshader->InUse()); |
| 705 EXPECT_TRUE(program_info->CanLink()); |
| 706 EXPECT_FALSE(program_info->InUse()); |
| 707 EXPECT_FALSE(program_info->IsDeleted()); |
| 708 manager_.UseProgram(program_info); |
| 709 EXPECT_TRUE(program_info->InUse()); |
| 710 manager_.UseProgram(program_info); |
| 711 EXPECT_TRUE(program_info->InUse()); |
| 712 manager_.UnuseProgram(&shader_manager, program_info); |
| 713 EXPECT_TRUE(program_info->InUse()); |
| 714 manager_.UnuseProgram(&shader_manager, program_info); |
| 715 EXPECT_FALSE(program_info->InUse()); |
| 716 ProgramManager::ProgramInfo* info2 = |
| 717 manager_.GetProgramInfo(kClientProgramId); |
| 718 EXPECT_EQ(program_info, info2); |
| 719 // this should delete the program. |
| 720 manager_.MarkAsDeleted(&shader_manager, program_info); |
| 721 info2 = manager_.GetProgramInfo(kClientProgramId); |
| 722 EXPECT_TRUE(info2 == NULL); |
| 723 EXPECT_FALSE(vshader->InUse()); |
| 724 EXPECT_FALSE(fshader->InUse()); |
| 725 shader_manager.Destroy(false); |
| 726 } |
| 727 |
| 618 } // namespace gles2 | 728 } // namespace gles2 |
| 619 } // namespace gpu | 729 } // namespace gpu |
| 620 | 730 |
| 621 | 731 |
| OLD | NEW |