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/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 ProgramManager::ProgramInfo::UniformInfo::~UniformInfo() {} | 38 ProgramManager::ProgramInfo::UniformInfo::~UniformInfo() {} |
39 | 39 |
40 bool ProgramManager::IsInvalidPrefix(const char* name, size_t length) { | 40 bool ProgramManager::IsInvalidPrefix(const char* name, size_t length) { |
41 static const char kInvalidPrefix[] = { 'g', 'l', '_' }; | 41 static const char kInvalidPrefix[] = { 'g', 'l', '_' }; |
42 return (length >= sizeof(kInvalidPrefix) && | 42 return (length >= sizeof(kInvalidPrefix) && |
43 memcmp(name, kInvalidPrefix, sizeof(kInvalidPrefix)) == 0); | 43 memcmp(name, kInvalidPrefix, sizeof(kInvalidPrefix)) == 0); |
44 } | 44 } |
45 | 45 |
46 ProgramManager::ProgramInfo::ProgramInfo(GLuint service_id) | 46 ProgramManager::ProgramInfo::ProgramInfo(GLuint service_id) |
47 : max_attrib_name_length_(0), | 47 : use_count_(0), |
| 48 max_attrib_name_length_(0), |
48 max_uniform_name_length_(0), | 49 max_uniform_name_length_(0), |
49 service_id_(service_id), | 50 service_id_(service_id), |
50 valid_(false) { | 51 valid_(false) { |
51 } | 52 } |
52 | 53 |
53 void ProgramManager::ProgramInfo::Reset() { | 54 void ProgramManager::ProgramInfo::Reset() { |
54 valid_ = false; | 55 valid_ = false; |
55 max_uniform_name_length_ = 0; | 56 max_uniform_name_length_ = 0; |
56 max_attrib_name_length_ = 0; | 57 max_attrib_name_length_ = 0; |
57 attrib_infos_.clear(); | 58 attrib_infos_.clear(); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 glGetProgramiv(service_id_, pname, params); | 350 glGetProgramiv(service_id_, pname, params); |
350 } | 351 } |
351 break; | 352 break; |
352 default: | 353 default: |
353 glGetProgramiv(service_id_, pname, params); | 354 glGetProgramiv(service_id_, pname, params); |
354 break; | 355 break; |
355 } | 356 } |
356 } | 357 } |
357 | 358 |
358 bool ProgramManager::ProgramInfo::AttachShader( | 359 bool ProgramManager::ProgramInfo::AttachShader( |
| 360 ShaderManager* shader_manager, |
359 ShaderManager::ShaderInfo* info) { | 361 ShaderManager::ShaderInfo* info) { |
| 362 DCHECK(shader_manager); |
| 363 DCHECK(info); |
360 int index = ShaderTypeToIndex(info->shader_type()); | 364 int index = ShaderTypeToIndex(info->shader_type()); |
361 if (attached_shaders_[index] != NULL) { | 365 if (attached_shaders_[index] != NULL) { |
362 return false; | 366 return false; |
363 } | 367 } |
364 attached_shaders_[index] = ShaderManager::ShaderInfo::Ref(info); | 368 attached_shaders_[index] = ShaderManager::ShaderInfo::Ref(info); |
| 369 shader_manager->UseShader(info); |
365 return true; | 370 return true; |
366 } | 371 } |
367 | 372 |
368 void ProgramManager::ProgramInfo::DetachShader( | 373 void ProgramManager::ProgramInfo::DetachShader( |
| 374 ShaderManager* shader_manager, |
369 ShaderManager::ShaderInfo* info) { | 375 ShaderManager::ShaderInfo* info) { |
| 376 DCHECK(shader_manager); |
| 377 DCHECK(info); |
370 attached_shaders_[ShaderTypeToIndex(info->shader_type())] = NULL; | 378 attached_shaders_[ShaderTypeToIndex(info->shader_type())] = NULL; |
| 379 shader_manager->UnuseShader(info); |
| 380 } |
| 381 |
| 382 void ProgramManager::ProgramInfo::DetachShaders(ShaderManager* shader_manager) { |
| 383 DCHECK(shader_manager); |
| 384 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
| 385 if (attached_shaders_[ii]) { |
| 386 DetachShader(shader_manager, attached_shaders_[ii]); |
| 387 } |
| 388 } |
371 } | 389 } |
372 | 390 |
373 bool ProgramManager::ProgramInfo::CanLink() const { | 391 bool ProgramManager::ProgramInfo::CanLink() const { |
374 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { | 392 for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { |
375 if (!attached_shaders_[ii] || !attached_shaders_[ii]->IsValid()) { | 393 if (!attached_shaders_[ii] || !attached_shaders_[ii]->IsValid()) { |
376 return false; | 394 return false; |
377 } | 395 } |
378 } | 396 } |
379 return true; | 397 return true; |
380 } | 398 } |
(...skipping 25 matching lines...) Expand all Loading... |
406 std::make_pair(client_id, | 424 std::make_pair(client_id, |
407 ProgramInfo::Ref(new ProgramInfo(service_id)))); | 425 ProgramInfo::Ref(new ProgramInfo(service_id)))); |
408 DCHECK(result.second); | 426 DCHECK(result.second); |
409 } | 427 } |
410 | 428 |
411 ProgramManager::ProgramInfo* ProgramManager::GetProgramInfo(GLuint client_id) { | 429 ProgramManager::ProgramInfo* ProgramManager::GetProgramInfo(GLuint client_id) { |
412 ProgramInfoMap::iterator it = program_infos_.find(client_id); | 430 ProgramInfoMap::iterator it = program_infos_.find(client_id); |
413 return it != program_infos_.end() ? it->second : NULL; | 431 return it != program_infos_.end() ? it->second : NULL; |
414 } | 432 } |
415 | 433 |
416 void ProgramManager::RemoveProgramInfo(GLuint client_id) { | |
417 ProgramInfoMap::iterator it = program_infos_.find(client_id); | |
418 if (it != program_infos_.end()) { | |
419 it->second->MarkAsDeleted(); | |
420 program_infos_.erase(it); | |
421 } | |
422 } | |
423 | |
424 bool ProgramManager::GetClientId(GLuint service_id, GLuint* client_id) const { | 434 bool ProgramManager::GetClientId(GLuint service_id, GLuint* client_id) const { |
425 // This doesn't need to be fast. It's only used during slow queries. | 435 // This doesn't need to be fast. It's only used during slow queries. |
426 for (ProgramInfoMap::const_iterator it = program_infos_.begin(); | 436 for (ProgramInfoMap::const_iterator it = program_infos_.begin(); |
427 it != program_infos_.end(); ++it) { | 437 it != program_infos_.end(); ++it) { |
428 if (it->second->service_id() == service_id) { | 438 if (it->second->service_id() == service_id) { |
429 *client_id = it->first; | 439 *client_id = it->first; |
430 return true; | 440 return true; |
431 } | 441 } |
432 } | 442 } |
433 return false; | 443 return false; |
434 } | 444 } |
435 | 445 |
| 446 void ProgramManager::RemoveProgramInfoIfUnused( |
| 447 ShaderManager* shader_manager, ProgramInfo* info) { |
| 448 DCHECK(shader_manager); |
| 449 DCHECK(info); |
| 450 if (info->IsDeleted() && !info->InUse()) { |
| 451 info->DetachShaders(shader_manager); |
| 452 for (ProgramInfoMap::iterator it = program_infos_.begin(); |
| 453 it != program_infos_.end(); ++it) { |
| 454 if (it->second->service_id() == info->service_id()) { |
| 455 program_infos_.erase(it); |
| 456 return; |
| 457 } |
| 458 } |
| 459 NOTREACHED(); |
| 460 } |
| 461 } |
| 462 |
| 463 void ProgramManager::MarkAsDeleted( |
| 464 ShaderManager* shader_manager, |
| 465 ProgramManager::ProgramInfo* info) { |
| 466 DCHECK(shader_manager); |
| 467 DCHECK(info); |
| 468 info->MarkAsDeleted(); |
| 469 RemoveProgramInfoIfUnused(shader_manager, info); |
| 470 } |
| 471 |
| 472 void ProgramManager::UseProgram(ProgramManager::ProgramInfo* info) { |
| 473 DCHECK(info); |
| 474 info->IncUseCount(); |
| 475 } |
| 476 |
| 477 void ProgramManager::UnuseProgram( |
| 478 ShaderManager* shader_manager, |
| 479 ProgramManager::ProgramInfo* info) { |
| 480 DCHECK(shader_manager); |
| 481 DCHECK(info); |
| 482 info->DecUseCount(); |
| 483 RemoveProgramInfoIfUnused(shader_manager, info); |
| 484 } |
| 485 |
436 } // namespace gles2 | 486 } // namespace gles2 |
437 } // namespace gpu | 487 } // namespace gpu |
438 | 488 |
439 | 489 |
OLD | NEW |