text: // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "gpu/command_buffer/service/vertex_array_manager.h"
  #include "base/debug/trace_event.h"
  #include "base/logging.h"
  #include "gpu/command_buffer/common/gles2_cmd_utils.h"
  #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
  #include "gpu/command_buffer/service/vertex_attrib_manager.h"
  
  namespace gpu {
  namespace gles2 {
  
  VertexArrayManager::VertexArrayManager()
      : vertex_attrib_manager_count_(0),
        have_context_(true) {
  }
  
  VertexArrayManager::~VertexArrayManager() {
    DCHECK(vertex_attrib_managers_.empty());
    CHECK_EQ(vertex_attrib_manager_count_, 0u);
  }
  
  void VertexArrayManager::Destroy(bool have_context) {
    have_context_ = have_context;
    vertex_attrib_managers_.clear();
  }
  
  void VertexArrayManager::CreateVertexAttribManager(
      GLuint client_id, GLuint service_id, uint32 num_vertex_attribs) {
    VertexAttribManager::Ref vertex_attrib_manager(
      new VertexAttribManager(this, service_id, num_vertex_attribs));
    std::pair<VertexAttribManagerMap::iterator, bool> result =
        vertex_attrib_managers_.insert(
        std::make_pair(client_id, vertex_attrib_manager));
    DCHECK(result.second);
  }
  
  VertexAttribManager* VertexArrayManager::GetVertexAttribManager(
      GLuint client_id) {
    VertexAttribManagerMap::iterator it = vertex_attrib_managers_.find(client_id);
    return it != vertex_attrib_managers_.end() ? it->second : NULL;
  }
  
  void VertexArrayManager::RemoveVertexAttribManager(GLuint client_id) {
    VertexAttribManagerMap::iterator it = vertex_attrib_managers_.find(client_id);
    if (it != vertex_attrib_managers_.end()) {
      VertexAttribManager* vertex_attrib_manager = it->second;
      vertex_attrib_manager->MarkAsDeleted();
      vertex_attrib_managers_.erase(it);
    }
  }
  
  void VertexArrayManager::StartTracking(
      VertexAttribManager* /* vertex_attrib_manager */) {
    ++vertex_attrib_manager_count_;
  }
  
  void VertexArrayManager::StopTracking(
      VertexAttribManager* /* vertex_attrib_manager */) {
    --vertex_attrib_manager_count_;
  }
  
  bool VertexArrayManager::GetClientId(
      GLuint service_id, GLuint* client_id) const {
    // This doesn't need to be fast. It's only used during slow queries.
    for (VertexAttribManagerMap::const_iterator it =
        vertex_attrib_managers_.begin();
        it != vertex_attrib_managers_.end(); ++it) {
      if (it->second->service_id() == service_id) {
        *client_id = it->first;
        return true;
      }
    }
    return false;
  }
  
  }  // namespace gles2
  }  // namespace gpu
  
  
  