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 #ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ |
6 #define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.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/gl_utils.h" | 15 #include "gpu/command_buffer/service/gl_utils.h" |
16 #include "gpu/command_buffer/service/shader_manager.h" | 16 #include "gpu/command_buffer/service/shader_manager.h" |
17 #include "gpu/gpu_export.h" | 17 #include "gpu/gpu_export.h" |
18 | 18 |
19 namespace gpu { | 19 namespace gpu { |
20 namespace gles2 { | 20 namespace gles2 { |
| 21 |
| 22 class FeatureInfo; |
21 class ProgramCache; | 23 class ProgramCache; |
22 class FeatureInfo; | 24 class ProgramManager; |
| 25 |
| 26 // This is used to track which attributes a particular program needs |
| 27 // so we can verify at glDrawXXX time that every attribute is either disabled |
| 28 // or if enabled that it points to a valid source. |
| 29 class GPU_EXPORT Program : public base::RefCounted<Program> { |
| 30 public: |
| 31 static const int kMaxAttachedShaders = 2; |
| 32 |
| 33 struct UniformInfo { |
| 34 UniformInfo(); |
| 35 UniformInfo( |
| 36 GLsizei _size, GLenum _type, GLint _fake_location_base, |
| 37 const std::string& _name); |
| 38 ~UniformInfo(); |
| 39 |
| 40 bool IsValid() const { |
| 41 return size != 0; |
| 42 } |
| 43 |
| 44 bool IsSampler() const { |
| 45 return type == GL_SAMPLER_2D || type == GL_SAMPLER_2D_RECT_ARB || |
| 46 type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES; |
| 47 } |
| 48 |
| 49 GLsizei size; |
| 50 GLenum type; |
| 51 GLint fake_location_base; |
| 52 bool is_array; |
| 53 std::string name; |
| 54 std::vector<GLint> element_locations; |
| 55 std::vector<GLuint> texture_units; |
| 56 }; |
| 57 struct VertexAttrib { |
| 58 VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name, |
| 59 GLint _location) |
| 60 : size(_size), |
| 61 type(_type), |
| 62 location(_location), |
| 63 name(_name) { |
| 64 } |
| 65 GLsizei size; |
| 66 GLenum type; |
| 67 GLint location; |
| 68 std::string name; |
| 69 }; |
| 70 |
| 71 typedef std::vector<UniformInfo> UniformInfoVector; |
| 72 typedef std::vector<VertexAttrib> AttribInfoVector; |
| 73 typedef std::vector<int> SamplerIndices; |
| 74 typedef std::map<std::string, GLint> LocationMap; |
| 75 |
| 76 Program(ProgramManager* manager, GLuint service_id); |
| 77 |
| 78 GLuint service_id() const { |
| 79 return service_id_; |
| 80 } |
| 81 |
| 82 const SamplerIndices& sampler_indices() { |
| 83 return sampler_indices_; |
| 84 } |
| 85 |
| 86 const AttribInfoVector& GetAttribInfos() const { |
| 87 return attrib_infos_; |
| 88 } |
| 89 |
| 90 const VertexAttrib* GetAttribInfo(GLint index) const { |
| 91 return (static_cast<size_t>(index) < attrib_infos_.size()) ? |
| 92 &attrib_infos_[index] : NULL; |
| 93 } |
| 94 |
| 95 GLint GetAttribLocation(const std::string& name) const; |
| 96 |
| 97 const VertexAttrib* GetAttribInfoByLocation(GLuint location) const { |
| 98 if (location < attrib_location_to_index_map_.size()) { |
| 99 GLint index = attrib_location_to_index_map_[location]; |
| 100 if (index >= 0) { |
| 101 return &attrib_infos_[index]; |
| 102 } |
| 103 } |
| 104 return NULL; |
| 105 } |
| 106 |
| 107 const UniformInfo* GetUniformInfo(GLint index) const; |
| 108 |
| 109 // If the original name is not found, return NULL. |
| 110 const std::string* GetAttribMappedName( |
| 111 const std::string& original_name) const; |
| 112 |
| 113 // If the hashed name is not found, return NULL. |
| 114 const std::string* GetOriginalNameFromHashedName( |
| 115 const std::string& hashed_name) const; |
| 116 |
| 117 // Gets the fake location of a uniform by name. |
| 118 GLint GetUniformFakeLocation(const std::string& name) const; |
| 119 |
| 120 // Gets the UniformInfo of a uniform by location. |
| 121 const UniformInfo* GetUniformInfoByFakeLocation( |
| 122 GLint fake_location, GLint* real_location, GLint* array_index) const; |
| 123 |
| 124 // Gets all the program info. |
| 125 void GetProgram( |
| 126 ProgramManager* manager, CommonDecoder::Bucket* bucket) const; |
| 127 |
| 128 // Sets the sampler values for a uniform. |
| 129 // This is safe to call for any location. If the location is not |
| 130 // a sampler uniform nothing will happen. |
| 131 // Returns false if fake_location is a sampler and any value |
| 132 // is >= num_texture_units. Returns true otherwise. |
| 133 bool SetSamplers( |
| 134 GLint num_texture_units, GLint fake_location, |
| 135 GLsizei count, const GLint* value); |
| 136 |
| 137 bool IsDeleted() const { |
| 138 return deleted_; |
| 139 } |
| 140 |
| 141 void GetProgramiv(GLenum pname, GLint* params); |
| 142 |
| 143 bool IsValid() const { |
| 144 return valid_; |
| 145 } |
| 146 |
| 147 bool AttachShader(ShaderManager* manager, Shader* info); |
| 148 bool DetachShader(ShaderManager* manager, Shader* info); |
| 149 |
| 150 bool CanLink() const; |
| 151 |
| 152 // Performs glLinkProgram and related activities. |
| 153 bool Link(ShaderManager* manager, |
| 154 ShaderTranslator* vertex_translator, |
| 155 ShaderTranslator* fragment_shader, |
| 156 FeatureInfo* feature_info); |
| 157 |
| 158 // Performs glValidateProgram and related activities. |
| 159 void Validate(); |
| 160 |
| 161 const std::string* log_info() const { |
| 162 return log_info_.get(); |
| 163 } |
| 164 |
| 165 bool InUse() const { |
| 166 DCHECK_GE(use_count_, 0); |
| 167 return use_count_ != 0; |
| 168 } |
| 169 |
| 170 // Sets attribute-location binding from a glBindAttribLocation() call. |
| 171 void SetAttribLocationBinding(const std::string& attrib, GLint location) { |
| 172 bind_attrib_location_map_[attrib] = location; |
| 173 } |
| 174 |
| 175 // Sets uniform-location binding from a glBindUniformLocationCHROMIUM call. |
| 176 // returns false if error. |
| 177 bool SetUniformLocationBinding(const std::string& name, GLint location); |
| 178 |
| 179 // Detects if there are attribute location conflicts from |
| 180 // glBindAttribLocation() calls. |
| 181 // We only consider the declared attributes in the program. |
| 182 bool DetectAttribLocationBindingConflicts() const; |
| 183 |
| 184 // Visible for testing |
| 185 const LocationMap& bind_attrib_location_map() const { |
| 186 return bind_attrib_location_map_; |
| 187 } |
| 188 |
| 189 private: |
| 190 friend class base::RefCounted<Program>; |
| 191 friend class ProgramManager; |
| 192 |
| 193 ~Program(); |
| 194 |
| 195 void set_log_info(const char* str) { |
| 196 log_info_.reset(str ? new std::string(str) : NULL); |
| 197 } |
| 198 |
| 199 void ClearLinkStatus() { |
| 200 link_status_ = false; |
| 201 } |
| 202 |
| 203 void IncUseCount() { |
| 204 ++use_count_; |
| 205 } |
| 206 |
| 207 void DecUseCount() { |
| 208 --use_count_; |
| 209 DCHECK_GE(use_count_, 0); |
| 210 } |
| 211 |
| 212 void MarkAsDeleted() { |
| 213 DCHECK(!deleted_); |
| 214 deleted_ = true; |
| 215 } |
| 216 |
| 217 // Resets the program. |
| 218 void Reset(); |
| 219 |
| 220 // Updates the program info after a successful link. |
| 221 void Update(); |
| 222 |
| 223 // Process the program log, replacing the hashed names with original names. |
| 224 std::string ProcessLogInfo(const std::string& log); |
| 225 |
| 226 // Updates the program log info from GL |
| 227 void UpdateLogInfo(); |
| 228 |
| 229 // Clears all the uniforms. |
| 230 void ClearUniforms(std::vector<uint8>* zero_buffer); |
| 231 |
| 232 // If long attribate names are mapped during shader translation, call |
| 233 // glBindAttribLocation() again with the mapped names. |
| 234 // This is called right before the glLink() call, but after shaders are |
| 235 // translated. |
| 236 void ExecuteBindAttribLocationCalls(); |
| 237 |
| 238 bool AddUniformInfo( |
| 239 GLsizei size, GLenum type, GLint location, GLint fake_base_location, |
| 240 const std::string& name, const std::string& original_name, |
| 241 size_t* next_available_index); |
| 242 |
| 243 void GetCorrectedVariableInfo( |
| 244 bool use_uniforms, const std::string& name, std::string* corrected_name, |
| 245 std::string* original_name, GLsizei* size, GLenum* type) const; |
| 246 |
| 247 void DetachShaders(ShaderManager* manager); |
| 248 |
| 249 static inline GLint GetUniformInfoIndexFromFakeLocation( |
| 250 GLint fake_location) { |
| 251 return fake_location & 0xFFFF; |
| 252 } |
| 253 |
| 254 static inline GLint GetArrayElementIndexFromFakeLocation( |
| 255 GLint fake_location) { |
| 256 return (fake_location >> 16) & 0xFFFF; |
| 257 } |
| 258 |
| 259 ProgramManager* manager_; |
| 260 |
| 261 int use_count_; |
| 262 |
| 263 GLsizei max_attrib_name_length_; |
| 264 |
| 265 // Attrib by index. |
| 266 AttribInfoVector attrib_infos_; |
| 267 |
| 268 // Attrib by location to index. |
| 269 std::vector<GLint> attrib_location_to_index_map_; |
| 270 |
| 271 GLsizei max_uniform_name_length_; |
| 272 |
| 273 // Uniform info by index. |
| 274 UniformInfoVector uniform_infos_; |
| 275 |
| 276 // The indices of the uniforms that are samplers. |
| 277 SamplerIndices sampler_indices_; |
| 278 |
| 279 // The program this Program is tracking. |
| 280 GLuint service_id_; |
| 281 |
| 282 // Shaders by type of shader. |
| 283 scoped_refptr<Shader> |
| 284 attached_shaders_[kMaxAttachedShaders]; |
| 285 |
| 286 // True if this program is marked as deleted. |
| 287 bool deleted_; |
| 288 |
| 289 // This is true if glLinkProgram was successful at least once. |
| 290 bool valid_; |
| 291 |
| 292 // This is true if glLinkProgram was successful last time it was called. |
| 293 bool link_status_; |
| 294 |
| 295 // True if the uniforms have been cleared. |
| 296 bool uniforms_cleared_; |
| 297 |
| 298 // This is different than uniform_infos_.size() because |
| 299 // that is a sparce array. |
| 300 GLint num_uniforms_; |
| 301 |
| 302 // Log info |
| 303 scoped_ptr<std::string> log_info_; |
| 304 |
| 305 // attribute-location binding map from glBindAttribLocation() calls. |
| 306 LocationMap bind_attrib_location_map_; |
| 307 |
| 308 // uniform-location binding map from glBindUniformLocationCHROMIUM() calls. |
| 309 LocationMap bind_uniform_location_map_; |
| 310 }; |
23 | 311 |
24 // Tracks the Programs. | 312 // Tracks the Programs. |
25 // | 313 // |
26 // NOTE: To support shared resources an instance of this class will | 314 // NOTE: To support shared resources an instance of this class will |
27 // need to be shared by multiple GLES2Decoders. | 315 // need to be shared by multiple GLES2Decoders. |
28 class GPU_EXPORT ProgramManager { | 316 class GPU_EXPORT ProgramManager { |
29 public: | 317 public: |
30 typedef std::map<std::string, GLint> LocationMap; | |
31 | |
32 // This is used to track which attributes a particular program needs | |
33 // so we can verify at glDrawXXX time that every attribute is either disabled | |
34 // or if enabled that it points to a valid source. | |
35 class GPU_EXPORT ProgramInfo : public base::RefCounted<ProgramInfo> { | |
36 public: | |
37 typedef scoped_refptr<ProgramInfo> Ref; | |
38 | |
39 static const int kMaxAttachedShaders = 2; | |
40 | |
41 struct UniformInfo { | |
42 UniformInfo(); | |
43 UniformInfo( | |
44 GLsizei _size, GLenum _type, GLint _fake_location_base, | |
45 const std::string& _name); | |
46 ~UniformInfo(); | |
47 | |
48 bool IsValid() const { | |
49 return size != 0; | |
50 } | |
51 | |
52 bool IsSampler() const { | |
53 return type == GL_SAMPLER_2D || type == GL_SAMPLER_2D_RECT_ARB || | |
54 type == GL_SAMPLER_CUBE || type == GL_SAMPLER_EXTERNAL_OES; | |
55 } | |
56 | |
57 GLsizei size; | |
58 GLenum type; | |
59 GLint fake_location_base; | |
60 bool is_array; | |
61 std::string name; | |
62 std::vector<GLint> element_locations; | |
63 std::vector<GLuint> texture_units; | |
64 }; | |
65 struct VertexAttribInfo { | |
66 VertexAttribInfo(GLsizei _size, GLenum _type, const std::string& _name, | |
67 GLint _location) | |
68 : size(_size), | |
69 type(_type), | |
70 location(_location), | |
71 name(_name) { | |
72 } | |
73 GLsizei size; | |
74 GLenum type; | |
75 GLint location; | |
76 std::string name; | |
77 }; | |
78 | |
79 typedef std::vector<UniformInfo> UniformInfoVector; | |
80 typedef std::vector<VertexAttribInfo> AttribInfoVector; | |
81 typedef std::vector<int> SamplerIndices; | |
82 | |
83 ProgramInfo(ProgramManager* manager, GLuint service_id); | |
84 | |
85 GLuint service_id() const { | |
86 return service_id_; | |
87 } | |
88 | |
89 const SamplerIndices& sampler_indices() { | |
90 return sampler_indices_; | |
91 } | |
92 | |
93 const AttribInfoVector& GetAttribInfos() const { | |
94 return attrib_infos_; | |
95 } | |
96 | |
97 const VertexAttribInfo* GetAttribInfo(GLint index) const { | |
98 return (static_cast<size_t>(index) < attrib_infos_.size()) ? | |
99 &attrib_infos_[index] : NULL; | |
100 } | |
101 | |
102 GLint GetAttribLocation(const std::string& name) const; | |
103 | |
104 const VertexAttribInfo* GetAttribInfoByLocation(GLuint location) const { | |
105 if (location < attrib_location_to_index_map_.size()) { | |
106 GLint index = attrib_location_to_index_map_[location]; | |
107 if (index >= 0) { | |
108 return &attrib_infos_[index]; | |
109 } | |
110 } | |
111 return NULL; | |
112 } | |
113 | |
114 const UniformInfo* GetUniformInfo(GLint index) const; | |
115 | |
116 // If the original name is not found, return NULL. | |
117 const std::string* GetAttribMappedName( | |
118 const std::string& original_name) const; | |
119 | |
120 // If the hashed name is not found, return NULL. | |
121 const std::string* GetOriginalNameFromHashedName( | |
122 const std::string& hashed_name) const; | |
123 | |
124 // Gets the fake location of a uniform by name. | |
125 GLint GetUniformFakeLocation(const std::string& name) const; | |
126 | |
127 // Gets the UniformInfo of a uniform by location. | |
128 const UniformInfo* GetUniformInfoByFakeLocation( | |
129 GLint fake_location, GLint* real_location, GLint* array_index) const; | |
130 | |
131 // Gets all the program info. | |
132 void GetProgramInfo( | |
133 ProgramManager* manager, CommonDecoder::Bucket* bucket) const; | |
134 | |
135 // Sets the sampler values for a uniform. | |
136 // This is safe to call for any location. If the location is not | |
137 // a sampler uniform nothing will happen. | |
138 // Returns false if fake_location is a sampler and any value | |
139 // is >= num_texture_units. Returns true otherwise. | |
140 bool SetSamplers( | |
141 GLint num_texture_units, GLint fake_location, | |
142 GLsizei count, const GLint* value); | |
143 | |
144 bool IsDeleted() const { | |
145 return deleted_; | |
146 } | |
147 | |
148 void GetProgramiv(GLenum pname, GLint* params); | |
149 | |
150 bool IsValid() const { | |
151 return valid_; | |
152 } | |
153 | |
154 bool AttachShader(ShaderManager* manager, ShaderManager::ShaderInfo* info); | |
155 bool DetachShader(ShaderManager* manager, ShaderManager::ShaderInfo* info); | |
156 | |
157 bool CanLink() const; | |
158 | |
159 // Performs glLinkProgram and related activities. | |
160 bool Link(ShaderManager* manager, | |
161 ShaderTranslator* vertex_translator, | |
162 ShaderTranslator* fragment_shader, | |
163 FeatureInfo* feature_info); | |
164 | |
165 // Performs glValidateProgram and related activities. | |
166 void Validate(); | |
167 | |
168 const std::string* log_info() const { | |
169 return log_info_.get(); | |
170 } | |
171 | |
172 bool InUse() const { | |
173 DCHECK_GE(use_count_, 0); | |
174 return use_count_ != 0; | |
175 } | |
176 | |
177 // Sets attribute-location binding from a glBindAttribLocation() call. | |
178 void SetAttribLocationBinding(const std::string& attrib, GLint location) { | |
179 bind_attrib_location_map_[attrib] = location; | |
180 } | |
181 | |
182 // Sets uniform-location binding from a glBindUniformLocationCHROMIUM call. | |
183 // returns false if error. | |
184 bool SetUniformLocationBinding(const std::string& name, GLint location); | |
185 | |
186 // Detects if there are attribute location conflicts from | |
187 // glBindAttribLocation() calls. | |
188 // We only consider the declared attributes in the program. | |
189 bool DetectAttribLocationBindingConflicts() const; | |
190 | |
191 // Visible for testing | |
192 const LocationMap& bind_attrib_location_map() const { | |
193 return bind_attrib_location_map_; | |
194 } | |
195 | |
196 private: | |
197 friend class base::RefCounted<ProgramInfo>; | |
198 friend class ProgramManager; | |
199 | |
200 ~ProgramInfo(); | |
201 | |
202 void set_log_info(const char* str) { | |
203 log_info_.reset(str ? new std::string(str) : NULL); | |
204 } | |
205 | |
206 void ClearLinkStatus() { | |
207 link_status_ = false; | |
208 } | |
209 | |
210 void IncUseCount() { | |
211 ++use_count_; | |
212 } | |
213 | |
214 void DecUseCount() { | |
215 --use_count_; | |
216 DCHECK_GE(use_count_, 0); | |
217 } | |
218 | |
219 void MarkAsDeleted() { | |
220 DCHECK(!deleted_); | |
221 deleted_ = true; | |
222 } | |
223 | |
224 // Resets the program. | |
225 void Reset(); | |
226 | |
227 // Updates the program info after a successful link. | |
228 void Update(); | |
229 | |
230 // Process the program log, replacing the hashed names with original names. | |
231 std::string ProcessLogInfo(const std::string& log); | |
232 | |
233 // Updates the program log info from GL | |
234 void UpdateLogInfo(); | |
235 | |
236 // Clears all the uniforms. | |
237 void ClearUniforms(std::vector<uint8>* zero_buffer); | |
238 | |
239 // If long attribate names are mapped during shader translation, call | |
240 // glBindAttribLocation() again with the mapped names. | |
241 // This is called right before the glLink() call, but after shaders are | |
242 // translated. | |
243 void ExecuteBindAttribLocationCalls(); | |
244 | |
245 bool AddUniformInfo( | |
246 GLsizei size, GLenum type, GLint location, GLint fake_base_location, | |
247 const std::string& name, const std::string& original_name, | |
248 size_t* next_available_index); | |
249 | |
250 void GetCorrectedVariableInfo( | |
251 bool use_uniforms, const std::string& name, std::string* corrected_name, | |
252 std::string* original_name, GLsizei* size, GLenum* type) const; | |
253 | |
254 void DetachShaders(ShaderManager* manager); | |
255 | |
256 static inline GLint GetUniformInfoIndexFromFakeLocation( | |
257 GLint fake_location) { | |
258 return fake_location & 0xFFFF; | |
259 } | |
260 | |
261 static inline GLint GetArrayElementIndexFromFakeLocation( | |
262 GLint fake_location) { | |
263 return (fake_location >> 16) & 0xFFFF; | |
264 } | |
265 | |
266 ProgramManager* manager_; | |
267 | |
268 int use_count_; | |
269 | |
270 GLsizei max_attrib_name_length_; | |
271 | |
272 // Attrib by index. | |
273 AttribInfoVector attrib_infos_; | |
274 | |
275 // Attrib by location to index. | |
276 std::vector<GLint> attrib_location_to_index_map_; | |
277 | |
278 GLsizei max_uniform_name_length_; | |
279 | |
280 // Uniform info by index. | |
281 UniformInfoVector uniform_infos_; | |
282 | |
283 // The indices of the uniforms that are samplers. | |
284 SamplerIndices sampler_indices_; | |
285 | |
286 // The program this ProgramInfo is tracking. | |
287 GLuint service_id_; | |
288 | |
289 // Shaders by type of shader. | |
290 ShaderManager::ShaderInfo::Ref attached_shaders_[kMaxAttachedShaders]; | |
291 | |
292 // True if this program is marked as deleted. | |
293 bool deleted_; | |
294 | |
295 // This is true if glLinkProgram was successful at least once. | |
296 bool valid_; | |
297 | |
298 // This is true if glLinkProgram was successful last time it was called. | |
299 bool link_status_; | |
300 | |
301 // True if the uniforms have been cleared. | |
302 bool uniforms_cleared_; | |
303 | |
304 // This is different than uniform_infos_.size() because | |
305 // that is a sparce array. | |
306 GLint num_uniforms_; | |
307 | |
308 // Log info | |
309 scoped_ptr<std::string> log_info_; | |
310 | |
311 // attribute-location binding map from glBindAttribLocation() calls. | |
312 LocationMap bind_attrib_location_map_; | |
313 | |
314 // uniform-location binding map from glBindUniformLocationCHROMIUM() calls. | |
315 LocationMap bind_uniform_location_map_; | |
316 }; | |
317 | |
318 explicit ProgramManager(ProgramCache* program_cache); | 318 explicit ProgramManager(ProgramCache* program_cache); |
319 ~ProgramManager(); | 319 ~ProgramManager(); |
320 | 320 |
321 // Must call before destruction. | 321 // Must call before destruction. |
322 void Destroy(bool have_context); | 322 void Destroy(bool have_context); |
323 | 323 |
324 // Creates a new program info. | 324 // Creates a new program info. |
325 ProgramInfo* CreateProgramInfo(GLuint client_id, GLuint service_id); | 325 Program* CreateProgram(GLuint client_id, GLuint service_id); |
326 | 326 |
327 // Gets a program info | 327 // Gets a program info |
328 ProgramInfo* GetProgramInfo(GLuint client_id); | 328 Program* GetProgram(GLuint client_id); |
329 | 329 |
330 // Gets a client id for a given service id. | 330 // Gets a client id for a given service id. |
331 bool GetClientId(GLuint service_id, GLuint* client_id) const; | 331 bool GetClientId(GLuint service_id, GLuint* client_id) const; |
332 | 332 |
333 // Gets the shader cache | 333 // Gets the shader cache |
334 ProgramCache* program_cache() const; | 334 ProgramCache* program_cache() const; |
335 | 335 |
336 // Marks a program as deleted. If it is not used the info will be deleted. | 336 // Marks a program as deleted. If it is not used the info will be deleted. |
337 void MarkAsDeleted(ShaderManager* shader_manager, ProgramInfo* info); | 337 void MarkAsDeleted(ShaderManager* shader_manager, Program* info); |
338 | 338 |
339 // Marks a program as used. | 339 // Marks a program as used. |
340 void UseProgram(ProgramInfo* info); | 340 void UseProgram(Program* info); |
341 | 341 |
342 // Makes a program as unused. If deleted the program info will be removed. | 342 // Makes a program as unused. If deleted the program info will be removed. |
343 void UnuseProgram(ShaderManager* shader_manager, ProgramInfo* info); | 343 void UnuseProgram(ShaderManager* shader_manager, Program* info); |
344 | 344 |
345 // Clears the uniforms for this program. | 345 // Clears the uniforms for this program. |
346 void ClearUniforms(ProgramInfo* info); | 346 void ClearUniforms(Program* info); |
347 | 347 |
348 // Returns true if prefix is invalid for gl. | 348 // Returns true if prefix is invalid for gl. |
349 static bool IsInvalidPrefix(const char* name, size_t length); | 349 static bool IsInvalidPrefix(const char* name, size_t length); |
350 | 350 |
351 // Check if a ProgramInfo is owned by this ProgramManager. | 351 // Check if a Program is owned by this ProgramManager. |
352 bool IsOwned(ProgramInfo* info); | 352 bool IsOwned(Program* info); |
353 | 353 |
354 static int32 MakeFakeLocation(int32 index, int32 element); | 354 static int32 MakeFakeLocation(int32 index, int32 element); |
355 | 355 |
356 // Cache-aware shader compiling. If no cache or if the shader wasn't | 356 // Cache-aware shader compiling. If no cache or if the shader wasn't |
357 // previously compiled, ForceCompileShader is called | 357 // previously compiled, ForceCompileShader is called |
358 void DoCompileShader(ShaderManager::ShaderInfo* info, | 358 void DoCompileShader(Shader* info, |
359 ShaderTranslator* translator, | 359 ShaderTranslator* translator, |
360 FeatureInfo* feature_info); | 360 FeatureInfo* feature_info); |
361 | 361 |
362 // Actually compiles the shader | 362 // Actually compiles the shader |
363 void ForceCompileShader(const std::string* source, | 363 void ForceCompileShader(const std::string* source, |
364 ShaderManager::ShaderInfo* info, | 364 Shader* info, |
365 ShaderTranslator* translator, | 365 ShaderTranslator* translator, |
366 FeatureInfo* feature_info); | 366 FeatureInfo* feature_info); |
367 | 367 |
368 private: | 368 private: |
369 void StartTracking(ProgramInfo* info); | 369 friend class Program; |
370 void StopTracking(ProgramInfo* info); | 370 |
| 371 void StartTracking(Program* info); |
| 372 void StopTracking(Program* info); |
371 | 373 |
372 // Info for each "successfully linked" program by service side program Id. | 374 // Info for each "successfully linked" program by service side program Id. |
373 // TODO(gman): Choose a faster container. | 375 // TODO(gman): Choose a faster container. |
374 typedef std::map<GLuint, ProgramInfo::Ref> ProgramInfoMap; | 376 typedef std::map<GLuint, scoped_refptr<Program> > ProgramInfoMap; |
375 ProgramInfoMap program_infos_; | 377 ProgramInfoMap program_infos_; |
376 | 378 |
377 // Counts the number of ProgramInfo allocated with 'this' as its manager. | 379 // Counts the number of Program allocated with 'this' as its manager. |
378 // Allows to check no ProgramInfo will outlive this. | 380 // Allows to check no Program will outlive this. |
379 unsigned int program_info_count_; | 381 unsigned int program_info_count_; |
380 | 382 |
381 bool have_context_; | 383 bool have_context_; |
382 | 384 |
383 bool disable_workarounds_; | 385 bool disable_workarounds_; |
384 | 386 |
385 // Used to clear uniforms. | 387 // Used to clear uniforms. |
386 std::vector<uint8> zero_; | 388 std::vector<uint8> zero_; |
387 | 389 |
388 ProgramCache* program_cache_; | 390 ProgramCache* program_cache_; |
389 | 391 |
390 void RemoveProgramInfoIfUnused( | 392 void RemoveProgramInfoIfUnused( |
391 ShaderManager* shader_manager, ProgramInfo* info); | 393 ShaderManager* shader_manager, Program* info); |
392 | 394 |
393 DISALLOW_COPY_AND_ASSIGN(ProgramManager); | 395 DISALLOW_COPY_AND_ASSIGN(ProgramManager); |
394 }; | 396 }; |
395 | 397 |
396 } // namespace gles2 | 398 } // namespace gles2 |
397 } // namespace gpu | 399 } // namespace gpu |
398 | 400 |
399 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ | 401 #endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_MANAGER_H_ |
OLD | NEW |