summaryrefslogtreecommitdiffstats
path: root/gpu/pgl/pgl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/pgl/pgl.cc')
-rw-r--r--gpu/pgl/pgl.cc48
1 files changed, 43 insertions, 5 deletions
diff --git a/gpu/pgl/pgl.cc b/gpu/pgl/pgl.cc
index 2fd3d8b..41903e1 100644
--- a/gpu/pgl/pgl.cc
+++ b/gpu/pgl/pgl.cc
@@ -2,9 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <build/build_config.h>
+
#include "gpu/command_buffer/client/gles2_cmd_helper.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/client/gles2_lib.h"
+#include "gpu/command_buffer/common/thread_local.h"
#include "gpu/pgl/command_buffer_pepper.h"
#include "gpu/pgl/pgl.h"
@@ -43,7 +46,7 @@ class PGLContextImpl {
gpu::gles2::GLES2Implementation* gles2_implementation_;
};
-THREAD_LOCAL PGLContextImpl* g_current_pgl_context;
+gpu::ThreadLocalKey g_pgl_context_key;
PGLContextImpl::PGLContextImpl(NPP npp,
NPDevice* device,
@@ -103,7 +106,10 @@ void PGLContextImpl::Destroy() {
}
bool PGLContextImpl::MakeCurrent(PGLContextImpl* pgl_context) {
- g_current_pgl_context = pgl_context;
+ if (!g_pgl_context_key)
+ return false;
+
+ gpu::ThreadLocalSetValue(g_pgl_context_key, pgl_context);
if (pgl_context)
gles2::SetGLContext(pgl_context->gles2_implementation_);
else
@@ -120,9 +126,30 @@ bool PGLContextImpl::SwapBuffers() {
extern "C" {
+PGLBoolean pglInitialize() {
+ if (g_pgl_context_key)
+ return true;
+
+ gles2::Initialize();
+ g_pgl_context_key = gpu::ThreadLocalAlloc();
+ return true;
+}
+
+PGLBoolean pglTerminate() {
+ if (!g_pgl_context_key)
+ return true;
+
+ gpu::ThreadLocalFree(g_pgl_context_key);
+ gles2::Terminate();
+ return true;
+}
+
PGLContext pglCreateContext(NPP npp,
NPDevice* device,
NPDeviceContext3D* device_context) {
+ if (!g_pgl_context_key)
+ return NULL;
+
PGLContextImpl* pgl_context = new PGLContextImpl(
npp, device, device_context);
if (pgl_context->Initialize(kTransferBufferSize)) {
@@ -138,20 +165,31 @@ PGLBoolean pglMakeCurrent(PGLContext pgl_context) {
}
PGLContext pglGetCurrentContext(void) {
- return g_current_pgl_context;
+ if (!g_pgl_context_key)
+ return NULL;
+
+ return static_cast<PGLContext>(gpu::ThreadLocalGetValue(g_pgl_context_key));
}
PGLBoolean pglSwapBuffers(void) {
- if (!g_current_pgl_context)
+ PGLContextImpl* context = static_cast<PGLContextImpl*>(
+ pglGetCurrentContext());
+ if (!context)
return false;
- return g_current_pgl_context->SwapBuffers();
+ return context->SwapBuffers();
}
PGLBoolean pglDestroyContext(PGLContext pgl_context) {
+ if (!g_pgl_context_key)
+ return NULL;
+
if (!pgl_context)
return false;
+ if (pgl_context == pglGetCurrentContext())
+ pglMakeCurrent(NULL);
+
delete static_cast<PGLContextImpl*>(pgl_context);
return true;
}