| 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 #include <map> | 5 #include <map> |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "../client/program_info_manager.h" | 8 #include "../client/program_info_manager.h" |
| 9 #include "../client/atomicops.h" | 9 #include "../client/atomicops.h" |
| 10 #include "../client/gles2_implementation.h" | 10 #include "../client/gles2_implementation.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 virtual bool GetActiveUniform(GLES2Implementation* gl, | 135 virtual bool GetActiveUniform(GLES2Implementation* gl, |
| 136 GLuint program, | 136 GLuint program, |
| 137 GLuint index, | 137 GLuint index, |
| 138 GLsizei bufsize, | 138 GLsizei bufsize, |
| 139 GLsizei* length, | 139 GLsizei* length, |
| 140 GLint* size, | 140 GLint* size, |
| 141 GLenum* type, | 141 GLenum* type, |
| 142 char* name) OVERRIDE; | 142 char* name) OVERRIDE; |
| 143 | 143 |
| 144 private: | 144 private: |
| 145 class ProgramInfo { | 145 class Program { |
| 146 public: | 146 public: |
| 147 struct UniformInfo { | 147 struct UniformInfo { |
| 148 UniformInfo(GLsizei _size, GLenum _type, const std::string& _name); | 148 UniformInfo(GLsizei _size, GLenum _type, const std::string& _name); |
| 149 | 149 |
| 150 GLsizei size; | 150 GLsizei size; |
| 151 GLenum type; | 151 GLenum type; |
| 152 bool is_array; | 152 bool is_array; |
| 153 std::string name; | 153 std::string name; |
| 154 std::vector<GLint> element_locations; | 154 std::vector<GLint> element_locations; |
| 155 }; | 155 }; |
| 156 struct VertexAttribInfo { | 156 struct VertexAttrib { |
| 157 VertexAttribInfo(GLsizei _size, GLenum _type, const std::string& _name, | 157 VertexAttrib(GLsizei _size, GLenum _type, const std::string& _name, |
| 158 GLint _location) | 158 GLint _location) |
| 159 : size(_size), | 159 : size(_size), |
| 160 type(_type), | 160 type(_type), |
| 161 location(_location), | 161 location(_location), |
| 162 name(_name) { | 162 name(_name) { |
| 163 } | 163 } |
| 164 GLsizei size; | 164 GLsizei size; |
| 165 GLenum type; | 165 GLenum type; |
| 166 GLint location; | 166 GLint location; |
| 167 std::string name; | 167 std::string name; |
| 168 }; | 168 }; |
| 169 | 169 |
| 170 typedef std::vector<UniformInfo> UniformInfoVector; | 170 typedef std::vector<UniformInfo> UniformInfoVector; |
| 171 typedef std::vector<VertexAttribInfo> AttribInfoVector; | 171 typedef std::vector<VertexAttrib> AttribInfoVector; |
| 172 | 172 |
| 173 ProgramInfo(); | 173 Program(); |
| 174 | 174 |
| 175 const AttribInfoVector& GetAttribInfos() const { | 175 const AttribInfoVector& GetAttribInfos() const { |
| 176 return attrib_infos_; | 176 return attrib_infos_; |
| 177 } | 177 } |
| 178 | 178 |
| 179 const VertexAttribInfo* GetAttribInfo(GLint index) const { | 179 const VertexAttrib* GetAttribInfo(GLint index) const { |
| 180 return (static_cast<size_t>(index) < attrib_infos_.size()) ? | 180 return (static_cast<size_t>(index) < attrib_infos_.size()) ? |
| 181 &attrib_infos_[index] : NULL; | 181 &attrib_infos_[index] : NULL; |
| 182 } | 182 } |
| 183 | 183 |
| 184 GLint GetAttribLocation(const std::string& name) const; | 184 GLint GetAttribLocation(const std::string& name) const; |
| 185 | 185 |
| 186 const UniformInfo* GetUniformInfo(GLint index) const { | 186 const UniformInfo* GetUniformInfo(GLint index) const { |
| 187 return (static_cast<size_t>(index) < uniform_infos_.size()) ? | 187 return (static_cast<size_t>(index) < uniform_infos_.size()) ? |
| 188 &uniform_infos_[index] : NULL; | 188 &uniform_infos_[index] : NULL; |
| 189 } | 189 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 206 | 206 |
| 207 GLsizei max_uniform_name_length_; | 207 GLsizei max_uniform_name_length_; |
| 208 | 208 |
| 209 // Uniform info by index. | 209 // Uniform info by index. |
| 210 UniformInfoVector uniform_infos_; | 210 UniformInfoVector uniform_infos_; |
| 211 | 211 |
| 212 // This is true if glLinkProgram was successful last time it was called. | 212 // This is true if glLinkProgram was successful last time it was called. |
| 213 bool link_status_; | 213 bool link_status_; |
| 214 }; | 214 }; |
| 215 | 215 |
| 216 ProgramInfo* GetProgramInfo(GLES2Implementation* gl, GLuint program); | 216 Program* GetProgramInfo(GLES2Implementation* gl, GLuint program); |
| 217 | 217 |
| 218 // TODO(gman): Switch to a faster container. | 218 // TODO(gman): Switch to a faster container. |
| 219 typedef std::map<GLuint, ProgramInfo> ProgramInfoMap; | 219 typedef std::map<GLuint, Program> ProgramInfoMap; |
| 220 | 220 |
| 221 ProgramInfoMap program_infos_; | 221 ProgramInfoMap program_infos_; |
| 222 | 222 |
| 223 mutable Lock lock_; | 223 mutable Lock lock_; |
| 224 }; | 224 }; |
| 225 | 225 |
| 226 CachedProgramInfoManager::ProgramInfo::UniformInfo::UniformInfo( | 226 CachedProgramInfoManager::Program::UniformInfo::UniformInfo( |
| 227 GLsizei _size, GLenum _type, const std::string& _name) | 227 GLsizei _size, GLenum _type, const std::string& _name) |
| 228 : size(_size), | 228 : size(_size), |
| 229 type(_type), | 229 type(_type), |
| 230 name(_name) { | 230 name(_name) { |
| 231 is_array = (!name.empty() && name[name.size() - 1] == ']'); | 231 is_array = (!name.empty() && name[name.size() - 1] == ']'); |
| 232 GPU_DCHECK(!(size > 1 && !is_array)); | 232 GPU_DCHECK(!(size > 1 && !is_array)); |
| 233 } | 233 } |
| 234 | 234 |
| 235 CachedProgramInfoManager::ProgramInfo::ProgramInfo() | 235 CachedProgramInfoManager::Program::Program() |
| 236 : cached_(false), | 236 : cached_(false), |
| 237 max_attrib_name_length_(0), | 237 max_attrib_name_length_(0), |
| 238 max_uniform_name_length_(0), | 238 max_uniform_name_length_(0), |
| 239 link_status_(false) { | 239 link_status_(false) { |
| 240 } | 240 } |
| 241 | 241 |
| 242 // TODO(gman): Add a faster lookup. | 242 // TODO(gman): Add a faster lookup. |
| 243 GLint CachedProgramInfoManager::ProgramInfo::GetAttribLocation( | 243 GLint CachedProgramInfoManager::Program::GetAttribLocation( |
| 244 const std::string& name) const { | 244 const std::string& name) const { |
| 245 for (GLuint ii = 0; ii < attrib_infos_.size(); ++ii) { | 245 for (GLuint ii = 0; ii < attrib_infos_.size(); ++ii) { |
| 246 const VertexAttribInfo& info = attrib_infos_[ii]; | 246 const VertexAttrib& info = attrib_infos_[ii]; |
| 247 if (info.name == name) { | 247 if (info.name == name) { |
| 248 return info.location; | 248 return info.location; |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 return -1; | 251 return -1; |
| 252 } | 252 } |
| 253 | 253 |
| 254 GLint CachedProgramInfoManager::ProgramInfo::GetUniformLocation( | 254 GLint CachedProgramInfoManager::Program::GetUniformLocation( |
| 255 const std::string& name) const { | 255 const std::string& name) const { |
| 256 bool getting_array_location = false; | 256 bool getting_array_location = false; |
| 257 size_t open_pos = std::string::npos; | 257 size_t open_pos = std::string::npos; |
| 258 int index = 0; | 258 int index = 0; |
| 259 if (!GLES2Util::ParseUniformName( | 259 if (!GLES2Util::ParseUniformName( |
| 260 name, &open_pos, &index, &getting_array_location)) { | 260 name, &open_pos, &index, &getting_array_location)) { |
| 261 return -1; | 261 return -1; |
| 262 } | 262 } |
| 263 for (GLuint ii = 0; ii < uniform_infos_.size(); ++ii) { | 263 for (GLuint ii = 0; ii < uniform_infos_.size(); ++ii) { |
| 264 const UniformInfo& info = uniform_infos_[ii]; | 264 const UniformInfo& info = uniform_infos_[ii]; |
| 265 if (info.name == name || | 265 if (info.name == name || |
| 266 (info.is_array && | 266 (info.is_array && |
| 267 info.name.compare(0, info.name.size() - 3, name) == 0)) { | 267 info.name.compare(0, info.name.size() - 3, name) == 0)) { |
| 268 return info.element_locations[0]; | 268 return info.element_locations[0]; |
| 269 } else if (getting_array_location && info.is_array) { | 269 } else if (getting_array_location && info.is_array) { |
| 270 // Look for an array specification. | 270 // Look for an array specification. |
| 271 size_t open_pos_2 = info.name.find_last_of('['); | 271 size_t open_pos_2 = info.name.find_last_of('['); |
| 272 if (open_pos_2 == open_pos && | 272 if (open_pos_2 == open_pos && |
| 273 name.compare(0, open_pos, info.name, 0, open_pos) == 0) { | 273 name.compare(0, open_pos, info.name, 0, open_pos) == 0) { |
| 274 if (index >= 0 && index < info.size) { | 274 if (index >= 0 && index < info.size) { |
| 275 return info.element_locations[index]; | 275 return info.element_locations[index]; |
| 276 } | 276 } |
| 277 } | 277 } |
| 278 } | 278 } |
| 279 } | 279 } |
| 280 return -1; | 280 return -1; |
| 281 } | 281 } |
| 282 | 282 |
| 283 bool CachedProgramInfoManager::ProgramInfo::GetProgramiv( | 283 bool CachedProgramInfoManager::Program::GetProgramiv( |
| 284 GLenum pname, GLint* params) { | 284 GLenum pname, GLint* params) { |
| 285 switch (pname) { | 285 switch (pname) { |
| 286 case GL_LINK_STATUS: | 286 case GL_LINK_STATUS: |
| 287 *params = link_status_; | 287 *params = link_status_; |
| 288 return true; | 288 return true; |
| 289 case GL_ACTIVE_ATTRIBUTES: | 289 case GL_ACTIVE_ATTRIBUTES: |
| 290 *params = attrib_infos_.size(); | 290 *params = attrib_infos_.size(); |
| 291 return true; | 291 return true; |
| 292 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: | 292 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: |
| 293 *params = max_attrib_name_length_; | 293 *params = max_attrib_name_length_; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 307 template<typename T> static T LocalGetAs( | 307 template<typename T> static T LocalGetAs( |
| 308 const std::vector<int8>& data, uint32 offset, size_t size) { | 308 const std::vector<int8>& data, uint32 offset, size_t size) { |
| 309 const int8* p = &data[0] + offset; | 309 const int8* p = &data[0] + offset; |
| 310 if (offset + size > data.size()) { | 310 if (offset + size > data.size()) { |
| 311 GPU_NOTREACHED(); | 311 GPU_NOTREACHED(); |
| 312 return NULL; | 312 return NULL; |
| 313 } | 313 } |
| 314 return static_cast<T>(static_cast<const void*>(p)); | 314 return static_cast<T>(static_cast<const void*>(p)); |
| 315 } | 315 } |
| 316 | 316 |
| 317 void CachedProgramInfoManager::ProgramInfo::Update( | 317 void CachedProgramInfoManager::Program::Update( |
| 318 GLES2Implementation* gl, GLuint program) { | 318 GLES2Implementation* gl, GLuint program) { |
| 319 if (cached_) { | 319 if (cached_) { |
| 320 return; | 320 return; |
| 321 } | 321 } |
| 322 std::vector<int8> result; | 322 std::vector<int8> result; |
| 323 gl->GetProgramInfoCHROMIUMHelper(program, &result); | 323 gl->GetProgramInfoCHROMIUMHelper(program, &result); |
| 324 if (result.empty()) { | 324 if (result.empty()) { |
| 325 // This should only happen on a lost context. | 325 // This should only happen on a lost context. |
| 326 return; | 326 return; |
| 327 } | 327 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 340 result, sizeof(*header), | 340 result, sizeof(*header), |
| 341 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); | 341 sizeof(ProgramInput) * (header->num_attribs + header->num_uniforms)); |
| 342 const ProgramInput* input = inputs; | 342 const ProgramInput* input = inputs; |
| 343 for (uint32 ii = 0; ii < header->num_attribs; ++ii) { | 343 for (uint32 ii = 0; ii < header->num_attribs; ++ii) { |
| 344 const int32* location = LocalGetAs<const int32*>( | 344 const int32* location = LocalGetAs<const int32*>( |
| 345 result, input->location_offset, sizeof(int32)); | 345 result, input->location_offset, sizeof(int32)); |
| 346 const char* name_buf = LocalGetAs<const char*>( | 346 const char* name_buf = LocalGetAs<const char*>( |
| 347 result, input->name_offset, input->name_length); | 347 result, input->name_offset, input->name_length); |
| 348 std::string name(name_buf, input->name_length); | 348 std::string name(name_buf, input->name_length); |
| 349 attrib_infos_.push_back( | 349 attrib_infos_.push_back( |
| 350 VertexAttribInfo(input->size, input->type, name, *location)); | 350 VertexAttrib(input->size, input->type, name, *location)); |
| 351 max_attrib_name_length_ = std::max( | 351 max_attrib_name_length_ = std::max( |
| 352 static_cast<GLsizei>(name.size() + 1), max_attrib_name_length_); | 352 static_cast<GLsizei>(name.size() + 1), max_attrib_name_length_); |
| 353 ++input; | 353 ++input; |
| 354 } | 354 } |
| 355 for (uint32 ii = 0; ii < header->num_uniforms; ++ii) { | 355 for (uint32 ii = 0; ii < header->num_uniforms; ++ii) { |
| 356 const int32* locations = LocalGetAs<const int32*>( | 356 const int32* locations = LocalGetAs<const int32*>( |
| 357 result, input->location_offset, sizeof(int32) * input->size); | 357 result, input->location_offset, sizeof(int32) * input->size); |
| 358 const char* name_buf = LocalGetAs<const char*>( | 358 const char* name_buf = LocalGetAs<const char*>( |
| 359 result, input->name_offset, input->name_length); | 359 result, input->name_offset, input->name_length); |
| 360 std::string name(name_buf, input->name_length); | 360 std::string name(name_buf, input->name_length); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 372 cached_ = true; | 372 cached_ = true; |
| 373 } | 373 } |
| 374 | 374 |
| 375 CachedProgramInfoManager::CachedProgramInfoManager() { | 375 CachedProgramInfoManager::CachedProgramInfoManager() { |
| 376 } | 376 } |
| 377 | 377 |
| 378 CachedProgramInfoManager::~CachedProgramInfoManager() { | 378 CachedProgramInfoManager::~CachedProgramInfoManager() { |
| 379 | 379 |
| 380 } | 380 } |
| 381 | 381 |
| 382 CachedProgramInfoManager::ProgramInfo* | 382 CachedProgramInfoManager::Program* |
| 383 CachedProgramInfoManager::GetProgramInfo( | 383 CachedProgramInfoManager::GetProgramInfo( |
| 384 GLES2Implementation* gl, GLuint program) { | 384 GLES2Implementation* gl, GLuint program) { |
| 385 ProgramInfoMap::iterator it = program_infos_.find(program); | 385 ProgramInfoMap::iterator it = program_infos_.find(program); |
| 386 if (it == program_infos_.end()) { | 386 if (it == program_infos_.end()) { |
| 387 return NULL; | 387 return NULL; |
| 388 } | 388 } |
| 389 ProgramInfo* info = &it->second; | 389 Program* info = &it->second; |
| 390 info->Update(gl, program); | 390 info->Update(gl, program); |
| 391 return info; | 391 return info; |
| 392 } | 392 } |
| 393 | 393 |
| 394 void CachedProgramInfoManager::CreateInfo(GLuint program) { | 394 void CachedProgramInfoManager::CreateInfo(GLuint program) { |
| 395 AutoLock auto_lock(lock_); | 395 AutoLock auto_lock(lock_); |
| 396 DeleteInfo(program); | 396 DeleteInfo(program); |
| 397 std::pair<ProgramInfoMap::iterator, bool> result = | 397 std::pair<ProgramInfoMap::iterator, bool> result = |
| 398 program_infos_.insert(std::make_pair(program, ProgramInfo())); | 398 program_infos_.insert(std::make_pair(program, Program())); |
| 399 | 399 |
| 400 GPU_DCHECK(result.second); | 400 GPU_DCHECK(result.second); |
| 401 } | 401 } |
| 402 | 402 |
| 403 void CachedProgramInfoManager::DeleteInfo(GLuint program) { | 403 void CachedProgramInfoManager::DeleteInfo(GLuint program) { |
| 404 program_infos_.erase(program); | 404 program_infos_.erase(program); |
| 405 } | 405 } |
| 406 | 406 |
| 407 bool CachedProgramInfoManager::GetProgramiv( | 407 bool CachedProgramInfoManager::GetProgramiv( |
| 408 GLES2Implementation* gl, GLuint program, GLenum pname, GLint* params) { | 408 GLES2Implementation* gl, GLuint program, GLenum pname, GLint* params) { |
| 409 AutoLock auto_lock(lock_); | 409 AutoLock auto_lock(lock_); |
| 410 ProgramInfo* info = GetProgramInfo(gl, program); | 410 Program* info = GetProgramInfo(gl, program); |
| 411 if (!info) { | 411 if (!info) { |
| 412 return false; | 412 return false; |
| 413 } | 413 } |
| 414 return info->GetProgramiv(pname, params); | 414 return info->GetProgramiv(pname, params); |
| 415 } | 415 } |
| 416 | 416 |
| 417 GLint CachedProgramInfoManager::GetAttribLocation( | 417 GLint CachedProgramInfoManager::GetAttribLocation( |
| 418 GLES2Implementation* gl, GLuint program, const char* name) { | 418 GLES2Implementation* gl, GLuint program, const char* name) { |
| 419 AutoLock auto_lock(lock_); | 419 AutoLock auto_lock(lock_); |
| 420 ProgramInfo* info = GetProgramInfo(gl, program); | 420 Program* info = GetProgramInfo(gl, program); |
| 421 if (info) { | 421 if (info) { |
| 422 return info->GetAttribLocation(name); | 422 return info->GetAttribLocation(name); |
| 423 } | 423 } |
| 424 return gl->GetAttribLocationHelper(program, name); | 424 return gl->GetAttribLocationHelper(program, name); |
| 425 } | 425 } |
| 426 | 426 |
| 427 GLint CachedProgramInfoManager::GetUniformLocation( | 427 GLint CachedProgramInfoManager::GetUniformLocation( |
| 428 GLES2Implementation* gl, GLuint program, const char* name) { | 428 GLES2Implementation* gl, GLuint program, const char* name) { |
| 429 AutoLock auto_lock(lock_); | 429 AutoLock auto_lock(lock_); |
| 430 ProgramInfo* info = GetProgramInfo(gl, program); | 430 Program* info = GetProgramInfo(gl, program); |
| 431 if (info) { | 431 if (info) { |
| 432 return info->GetUniformLocation(name); | 432 return info->GetUniformLocation(name); |
| 433 } | 433 } |
| 434 return gl->GetUniformLocationHelper(program, name); | 434 return gl->GetUniformLocationHelper(program, name); |
| 435 } | 435 } |
| 436 | 436 |
| 437 bool CachedProgramInfoManager::GetActiveAttrib( | 437 bool CachedProgramInfoManager::GetActiveAttrib( |
| 438 GLES2Implementation* gl, | 438 GLES2Implementation* gl, |
| 439 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, | 439 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
| 440 GLint* size, GLenum* type, char* name) { | 440 GLint* size, GLenum* type, char* name) { |
| 441 AutoLock auto_lock(lock_); | 441 AutoLock auto_lock(lock_); |
| 442 ProgramInfo* info = GetProgramInfo(gl, program); | 442 Program* info = GetProgramInfo(gl, program); |
| 443 if (info) { | 443 if (info) { |
| 444 const ProgramInfo::VertexAttribInfo* attrib_info = | 444 const Program::VertexAttrib* attrib_info = |
| 445 info->GetAttribInfo(index); | 445 info->GetAttribInfo(index); |
| 446 if (attrib_info) { | 446 if (attrib_info) { |
| 447 if (size) { | 447 if (size) { |
| 448 *size = attrib_info->size; | 448 *size = attrib_info->size; |
| 449 } | 449 } |
| 450 if (type) { | 450 if (type) { |
| 451 *type = attrib_info->type; | 451 *type = attrib_info->type; |
| 452 } | 452 } |
| 453 if (length || name) { | 453 if (length || name) { |
| 454 GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1, | 454 GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 467 } | 467 } |
| 468 return gl->GetActiveAttribHelper( | 468 return gl->GetActiveAttribHelper( |
| 469 program, index, bufsize, length, size, type, name); | 469 program, index, bufsize, length, size, type, name); |
| 470 } | 470 } |
| 471 | 471 |
| 472 bool CachedProgramInfoManager::GetActiveUniform( | 472 bool CachedProgramInfoManager::GetActiveUniform( |
| 473 GLES2Implementation* gl, | 473 GLES2Implementation* gl, |
| 474 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, | 474 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, |
| 475 GLint* size, GLenum* type, char* name) { | 475 GLint* size, GLenum* type, char* name) { |
| 476 AutoLock auto_lock(lock_); | 476 AutoLock auto_lock(lock_); |
| 477 ProgramInfo* info = GetProgramInfo(gl, program); | 477 Program* info = GetProgramInfo(gl, program); |
| 478 if (info) { | 478 if (info) { |
| 479 const ProgramInfo::UniformInfo* uniform_info = info->GetUniformInfo(index); | 479 const Program::UniformInfo* uniform_info = info->GetUniformInfo(index); |
| 480 if (uniform_info) { | 480 if (uniform_info) { |
| 481 if (size) { | 481 if (size) { |
| 482 *size = uniform_info->size; | 482 *size = uniform_info->size; |
| 483 } | 483 } |
| 484 if (type) { | 484 if (type) { |
| 485 *type = uniform_info->type; | 485 *type = uniform_info->type; |
| 486 } | 486 } |
| 487 if (length || name) { | 487 if (length || name) { |
| 488 GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1, | 488 GLsizei max_size = std::min(static_cast<size_t>(bufsize) - 1, |
| 489 std::max(static_cast<size_t>(0), | 489 std::max(static_cast<size_t>(0), |
| (...skipping 24 matching lines...) Expand all Loading... |
| 514 if (shared_resources_across_processes) { | 514 if (shared_resources_across_processes) { |
| 515 return new NonCachedProgramInfoManager(); | 515 return new NonCachedProgramInfoManager(); |
| 516 } else { | 516 } else { |
| 517 return new CachedProgramInfoManager(); | 517 return new CachedProgramInfoManager(); |
| 518 } | 518 } |
| 519 } | 519 } |
| 520 | 520 |
| 521 } // namespace gles2 | 521 } // namespace gles2 |
| 522 } // namespace gpu | 522 } // namespace gpu |
| 523 | 523 |
| OLD | NEW |