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 |