// 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 "ui/gl/gl_share_group.h"

#include "base/logging.h"
#include "ui/gl/gl_context.h"

namespace gfx {

GLShareGroup::GLShareGroup()
    : shared_context_(NULL)
#if defined(OS_MACOSX)
    , renderer_id_(-1)
#endif
    {
}

void GLShareGroup::AddContext(GLContext* context) {
  contexts_.insert(context);
}

void GLShareGroup::RemoveContext(GLContext* context) {
  contexts_.erase(context);
  if (shared_context_ == context)
    shared_context_ = NULL;
}

void* GLShareGroup::GetHandle() {
  GLContext* context = GetContext();
  if (context)
    return context->GetHandle();

  return NULL;
}

GLContext* GLShareGroup::GetContext() {
  for (ContextSet::iterator it = contexts_.begin();
       it != contexts_.end();
       ++it) {
    if ((*it)->GetHandle())
      return *it;
  }

  return NULL;
}

void GLShareGroup::SetSharedContext(GLContext* context) {
  DCHECK(contexts_.find(context) != contexts_.end());
  shared_context_ = context;
}

GLContext* GLShareGroup::GetSharedContext() {
  return shared_context_;
}

#if defined(OS_MACOSX)
void GLShareGroup::SetRendererID(int renderer_id) {
  renderer_id_ = renderer_id;
}

int GLShareGroup::GetRendererID() {
  return renderer_id_;
}
#endif

GLShareGroup::~GLShareGroup() {
}

}  // namespace gfx
