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

Side by Side Diff: gpu/command_buffer/service/program_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. 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/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 26 matching lines...) Expand all
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.h ('k') | gpu/command_buffer/service/program_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698