| Index: gpu/pgl/pgl.cc
|
| ===================================================================
|
| --- gpu/pgl/pgl.cc (revision 37846)
|
| +++ gpu/pgl/pgl.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #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/constants.h"
|
| #include "gpu/command_buffer/common/thread_local.h"
|
| #include "gpu/pgl/command_buffer_pepper.h"
|
| #include "gpu/pgl/pgl.h"
|
| @@ -22,17 +23,20 @@
|
| ~PGLContextImpl();
|
|
|
| // Initlaize a PGL context with a transfer buffer of a particular size.
|
| - bool Initialize(int32 transfer_buffer_size);
|
| + PGLBoolean Initialize(int32 transfer_buffer_size);
|
|
|
| // Destroy all resources associated with the PGL context.
|
| void Destroy();
|
|
|
| // Make a PGL context current for the calling thread.
|
| - static bool MakeCurrent(PGLContextImpl* pgl_context);
|
| + static PGLBoolean MakeCurrent(PGLContextImpl* pgl_context);
|
|
|
| // Display all content rendered since last call to SwapBuffers.
|
| - bool SwapBuffers();
|
| + PGLBoolean SwapBuffers();
|
|
|
| + // Get the current error code.
|
| + PGLInt GetError();
|
| +
|
| private:
|
| PGLContextImpl(const PGLContextImpl&);
|
| void operator=(const PGLContextImpl&);
|
| @@ -64,7 +68,7 @@
|
| Destroy();
|
| }
|
|
|
| -bool PGLContextImpl::Initialize(int32 transfer_buffer_size) {
|
| +PGLBoolean PGLContextImpl::Initialize(int32 transfer_buffer_size) {
|
| // Create and initialize the objects required to issue GLES2 calls.
|
| command_buffer_ = new CommandBufferPepper(
|
| npp_, device_, device_context_);
|
| @@ -80,13 +84,13 @@
|
| transfer_buffer.size,
|
| transfer_buffer.ptr,
|
| transfer_buffer_id_);
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
| }
|
|
|
| // Tear everything down if initialization failed.
|
| Destroy();
|
| - return false;
|
| + return PGL_FALSE;
|
| }
|
|
|
| void PGLContextImpl::Destroy() {
|
| @@ -105,43 +109,71 @@
|
| command_buffer_ = NULL;
|
| }
|
|
|
| -bool PGLContextImpl::MakeCurrent(PGLContextImpl* pgl_context) {
|
| +PGLBoolean PGLContextImpl::MakeCurrent(PGLContextImpl* pgl_context) {
|
| if (!g_pgl_context_key)
|
| - return false;
|
| + return PGL_FALSE;
|
|
|
| gpu::ThreadLocalSetValue(g_pgl_context_key, pgl_context);
|
| - if (pgl_context)
|
| + if (pgl_context) {
|
| gles2::SetGLContext(pgl_context->gles2_implementation_);
|
| - else
|
| +
|
| + // Don't request latest error status from service. Just use the locally
|
| + // cached information from the last flush.
|
| + // TODO(apatrick): I'm not sure if this should actually change the
|
| + // current context if it fails. For now it gets changed even if it fails
|
| + // becuase making GL calls with a NULL context crashes.
|
| + if (pgl_context->device_context_->error != NPDeviceContext3DError_NoError)
|
| + return PGL_FALSE;
|
| + }
|
| + else {
|
| gles2::SetGLContext(NULL);
|
| + }
|
|
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
|
|
| -bool PGLContextImpl::SwapBuffers() {
|
| +PGLBoolean PGLContextImpl::SwapBuffers() {
|
| + // Don't request latest error status from service. Just use the locally cached
|
| + // information from the last flush.
|
| + if (device_context_->error != NPDeviceContext3DError_NoError)
|
| + return PGL_FALSE;
|
| +
|
| gles2_implementation_->SwapBuffers();
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
| +
|
| +PGLInt PGLContextImpl::GetError() {
|
| + gpu::CommandBuffer::State state = command_buffer_->GetState();
|
| + if (state.error == gpu::error::kNoError) {
|
| + return PGL_SUCCESS;
|
| + } else {
|
| + // All command buffer errors are unrecoverable. The error is treated as a
|
| + // lost context: destroy the context and create another one.
|
| + return PGL_CONTEXT_LOST;
|
| + }
|
| +}
|
| } // namespace anonymous
|
|
|
| extern "C" {
|
|
|
| PGLBoolean pglInitialize() {
|
| if (g_pgl_context_key)
|
| - return true;
|
| + return PGL_TRUE;
|
|
|
| gles2::Initialize();
|
| g_pgl_context_key = gpu::ThreadLocalAlloc();
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
|
|
| PGLBoolean pglTerminate() {
|
| if (!g_pgl_context_key)
|
| - return true;
|
| + return PGL_TRUE;
|
|
|
| gpu::ThreadLocalFree(g_pgl_context_key);
|
| + g_pgl_context_key = 0;
|
| +
|
| gles2::Terminate();
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
|
|
| PGLContext pglCreateContext(NPP npp,
|
| @@ -175,23 +207,34 @@
|
| PGLContextImpl* context = static_cast<PGLContextImpl*>(
|
| pglGetCurrentContext());
|
| if (!context)
|
| - return false;
|
| + return PGL_FALSE;
|
|
|
| return context->SwapBuffers();
|
| }
|
|
|
| PGLBoolean pglDestroyContext(PGLContext pgl_context) {
|
| if (!g_pgl_context_key)
|
| - return NULL;
|
| + return PGL_FALSE;
|
|
|
| if (!pgl_context)
|
| - return false;
|
| + return PGL_FALSE;
|
|
|
| if (pgl_context == pglGetCurrentContext())
|
| pglMakeCurrent(NULL);
|
|
|
| delete static_cast<PGLContextImpl*>(pgl_context);
|
| - return true;
|
| + return PGL_TRUE;
|
| }
|
|
|
| +PGLInt pglGetError() {
|
| + if (!g_pgl_context_key)
|
| + return PGL_NOT_INITIALIZED;
|
| +
|
| + PGLContextImpl* context = static_cast<PGLContextImpl*>(
|
| + pglGetCurrentContext());
|
| + if (!context)
|
| + return PGL_BAD_CONTEXT;
|
| +
|
| + return context->GetError();
|
| +}
|
| } // extern "C"
|
|
|