Chromium Code Reviews

Side by Side Diff: gpu/command_buffer/service/shader_manager.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.
Jump to:
View unified diff | | 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/shader_manager.h" 5 #include "gpu/command_buffer/service/shader_manager.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 7
8 namespace gpu { 8 namespace gpu {
9 namespace gles2 { 9 namespace gles2 {
10 10
(...skipping 50 matching lines...)
61 shader_infos_.insert(std::make_pair( 61 shader_infos_.insert(std::make_pair(
62 client_id, ShaderInfo::Ref(new ShaderInfo(service_id, shader_type)))); 62 client_id, ShaderInfo::Ref(new ShaderInfo(service_id, shader_type))));
63 DCHECK(result.second); 63 DCHECK(result.second);
64 } 64 }
65 65
66 ShaderManager::ShaderInfo* ShaderManager::GetShaderInfo(GLuint client_id) { 66 ShaderManager::ShaderInfo* ShaderManager::GetShaderInfo(GLuint client_id) {
67 ShaderInfoMap::iterator it = shader_infos_.find(client_id); 67 ShaderInfoMap::iterator it = shader_infos_.find(client_id);
68 return it != shader_infos_.end() ? it->second : NULL; 68 return it != shader_infos_.end() ? it->second : NULL;
69 } 69 }
70 70
71 void ShaderManager::RemoveShaderInfo(GLuint client_id) {
72 ShaderInfoMap::iterator it = shader_infos_.find(client_id);
73 if (it != shader_infos_.end()) {
74 it->second->MarkAsDeleted();
75 shader_infos_.erase(it);
76 }
77 }
78
79 bool ShaderManager::GetClientId(GLuint service_id, GLuint* client_id) const { 71 bool ShaderManager::GetClientId(GLuint service_id, GLuint* client_id) const {
80 // This doesn't need to be fast. It's only used during slow queries. 72 // This doesn't need to be fast. It's only used during slow queries.
81 for (ShaderInfoMap::const_iterator it = shader_infos_.begin(); 73 for (ShaderInfoMap::const_iterator it = shader_infos_.begin();
82 it != shader_infos_.end(); ++it) { 74 it != shader_infos_.end(); ++it) {
83 if (it->second->service_id() == service_id) { 75 if (it->second->service_id() == service_id) {
84 *client_id = it->first; 76 *client_id = it->first;
85 return true; 77 return true;
86 } 78 }
87 } 79 }
88 return false; 80 return false;
89 } 81 }
90 82
83 void ShaderManager::RemoveShaderInfoIfUnused(ShaderManager::ShaderInfo* info) {
84 DCHECK(info);
85 if (info->IsDeleted() && !info->InUse()) {
86 for (ShaderInfoMap::iterator it = shader_infos_.begin();
87 it != shader_infos_.end(); ++it) {
88 if (it->second->service_id() == info->service_id()) {
89 shader_infos_.erase(it);
90 return;
91 }
92 }
93 NOTREACHED();
94 }
95 }
96
97 void ShaderManager::MarkAsDeleted(ShaderManager::ShaderInfo* info) {
98 DCHECK(info);
99 info->MarkAsDeleted();
100 RemoveShaderInfoIfUnused(info);
101 }
102
103 void ShaderManager::UseShader(ShaderManager::ShaderInfo* info) {
104 DCHECK(info);
105 info->IncUseCount();
106 }
107
108 void ShaderManager::UnuseShader(ShaderManager::ShaderInfo* info) {
109 DCHECK(info);
110 info->DecUseCount();
111 RemoveShaderInfoIfUnused(info);
112 }
113
91 } // namespace gles2 114 } // namespace gles2
92 } // namespace gpu 115 } // namespace gpu
93 116
94 117
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/shader_manager.h ('k') | gpu/command_buffer/service/shader_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine