| Index: experimental/c_salt/opengl_context.cc
|
| diff --git a/experimental/c_salt/opengl_context.cc b/experimental/c_salt/opengl_context.cc
|
| deleted file mode 100644
|
| index 6ca40c3a62066eaafd15e9d4bdd24943a9286ec2..0000000000000000000000000000000000000000
|
| --- a/experimental/c_salt/opengl_context.cc
|
| +++ /dev/null
|
| @@ -1,159 +0,0 @@
|
| -// Copyright 2010 The Ginsu 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 "c_salt/opengl_context.h"
|
| -
|
| -#include <pthread.h>
|
| -
|
| -#include <cassert>
|
| -#include <cstring>
|
| -#include <map>
|
| -#include <sstream>
|
| -
|
| -#include "c_salt/browser_3d_device.h"
|
| -#include "c_salt/instance.h"
|
| -#include "c_salt/module.h"
|
| -#include "c_salt/notification_center.h"
|
| -
|
| -namespace c_salt {
|
| -
|
| -// Map the platform-specific context handle to an instance of OpenGLContext.
|
| -// This map is lazily allocated on the heap.
|
| -typedef std::map<PGLContext, SharedOpenGLContext> ContextDictionary;
|
| -static ContextDictionary* g_context_dictionary = NULL;
|
| -static pthread_mutex_t g_context_dict_lock = PTHREAD_MUTEX_INITIALIZER;
|
| -
|
| -const char* const OpenGLContext::kInitializeOpenGLContextNotification =
|
| - "kInitializeOpenGLContext.OpenGLContext.c_salt";
|
| -const char* const OpenGLContext::kDeleteOpenGLContextNotification =
|
| - "kDeleteOpenGLContext.OpenGLContext.c_salt";
|
| -const char* const OpenGLContext::kRenderOpenGLContextNotification =
|
| - "kRenderOpenGLContext.OpenGLContext.c_salt";
|
| -
|
| -OpenGLContext::OpenGLContext(const Instance& instance)
|
| - : instance_(instance),
|
| - pgl_context_(PGL_NO_CONTEXT),
|
| - browser_device_(CreateBrowser3DDevice(instance)) {
|
| - std::stringstream instance_name;
|
| - instance_name << this << ".OpenGLContext.c_salt";
|
| - instance_name_ = instance_name.str();
|
| -}
|
| -
|
| -OpenGLContext::~OpenGLContext() {
|
| - DeleteContext();
|
| -}
|
| -
|
| -void OpenGLContext::DeleteContext() {
|
| - if (!is_valid())
|
| - return;
|
| - // Make this context current before posting the "will destroy context"
|
| - // notification. This means that any context tear-down code in observers
|
| - // will operate on this context.
|
| - MakeContextCurrent();
|
| - PostNotification(kDeleteOpenGLContextNotification);
|
| - pglMakeCurrent(PGL_NO_CONTEXT);
|
| - DestroyPGLContext();
|
| -}
|
| -
|
| -SharedOpenGLContext OpenGLContext::CurrentContext() {
|
| - SharedOpenGLContext current_context;
|
| - PGLContext current_pgl_context = pglGetCurrentContext();
|
| - if (g_context_dictionary != NULL &&
|
| - current_pgl_context != PGL_NO_CONTEXT) {
|
| - pthread_mutex_lock(&g_context_dict_lock);
|
| - ContextDictionary::const_iterator iter =
|
| - g_context_dictionary->find(current_pgl_context);
|
| - if (iter != g_context_dictionary->end())
|
| - current_context = iter->second;
|
| - pthread_mutex_unlock(&g_context_dict_lock);
|
| - }
|
| - return current_context;
|
| -}
|
| -
|
| -bool OpenGLContext::MakeContextCurrent() {
|
| - bool new_context_created = false;
|
| - if (!is_valid()) {
|
| - // If this is the first attempt at making the context current, perform all
|
| - // the 3D device initialization.
|
| - browser_device_->AcquireBrowser3DDevice();
|
| - // Create an OpenGL device in the instance.
|
| - c_salt::Module& module = c_salt::Module::GetModuleSingleton();
|
| - if (module.InitializeOpenGL()) {
|
| - new_context_created = CreatePGLContext();
|
| - }
|
| - if (!is_valid()) {
|
| - return false;
|
| - }
|
| - }
|
| - bool success = pglMakeCurrent(pgl_context_) == PGL_TRUE;
|
| - if (!success && pglGetError() == PGL_CONTEXT_LOST) {
|
| - // If the browser context was lost, attempt to create a new one. Note that
|
| - // CreatePGLContext() will set |new_context_created| to |true|, so that
|
| - // observers can have a chance to re-initialize OpenGL resources if needed.
|
| - DestroyPGLContext();
|
| - new_context_created = CreatePGLContext();
|
| - success = pglMakeCurrent(pgl_context_) == PGL_TRUE;
|
| - }
|
| - if (new_context_created && success) {
|
| - PostNotification(kInitializeOpenGLContextNotification);
|
| - }
|
| - return success;
|
| -}
|
| -
|
| -void OpenGLContext::FlushContext() const {
|
| - pglSwapBuffers();
|
| -}
|
| -
|
| -void OpenGLContext::RenderContext() {
|
| - if (!MakeContextCurrent())
|
| - return;
|
| - PostNotification(kRenderOpenGLContextNotification);
|
| - FlushContext();
|
| -}
|
| -
|
| -bool OpenGLContext::CreatePGLContext() {
|
| - if (is_valid())
|
| - return true; // Nothing to do here.
|
| - // Create a PGL context.
|
| - pgl_context_ = browser_device_->CreateBrowser3DContext(this);
|
| - if (pgl_context_ == PGL_NO_CONTEXT)
|
| - return false;
|
| - pthread_mutex_lock(&g_context_dict_lock);
|
| - if (!g_context_dictionary) {
|
| - g_context_dictionary = new ContextDictionary();
|
| - }
|
| - SharedOpenGLContext shared_context(this);
|
| - g_context_dictionary->insert(
|
| - ContextDictionary::value_type(pgl_context_, shared_context));
|
| - pthread_mutex_unlock(&g_context_dict_lock);
|
| - return true;
|
| -}
|
| -
|
| -void OpenGLContext::DestroyPGLContext() {
|
| - assert(is_valid());
|
| - assert(g_context_dictionary);
|
| - if (g_context_dictionary) {
|
| - pthread_mutex_lock(&g_context_dict_lock);
|
| - ContextDictionary::iterator iter =
|
| - g_context_dictionary->find(pgl_context_);
|
| - if (iter != g_context_dictionary->end())
|
| - g_context_dictionary->erase(iter);
|
| - pthread_mutex_unlock(&g_context_dict_lock);
|
| - }
|
| - pglDestroyContext(pgl_context_);
|
| - pgl_context_ = PGL_NO_CONTEXT;
|
| - browser_device_->DeleteBrowser3DContext();
|
| -}
|
| -
|
| -void OpenGLContext::PostNotification(const char* const notification_name)
|
| - const {
|
| - NotificationCenter* default_center =
|
| - NotificationCenter::DefaultCenter(instance());
|
| - if (default_center == NULL)
|
| - return;
|
| - default_center->PublishNotification(notification_name,
|
| - Notification(notification_name),
|
| - instance_name_);
|
| -}
|
| -} // namespace c_salt
|
|
|