Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(210)

Side by Side Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 5676003: Make shader and program object lifetimes match OpenGL ES spec.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/shader_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698