| Index: gpu/pgl/pgl.cc
|
| ===================================================================
|
| --- gpu/pgl/pgl.cc (revision 0)
|
| +++ gpu/pgl/pgl.cc (revision 0)
|
| @@ -0,0 +1,161 @@
|
| +// Copyright (c) 2010 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/client/gles2_cmd_helper.h"
|
| +#include "gpu/command_buffer/client/gles2_implementation.h"
|
| +#include "gpu/command_buffer/client/gles2_lib.h"
|
| +#include "gpu/pgl/command_buffer_pepper.h"
|
| +#include "gpu/pgl/pgl.h"
|
| +
|
| +#if defined(_MSC_VER)
|
| +#define THREAD_LOCAL __declspec(thread)
|
| +#else
|
| +#define THREAD_LOCAL __thread
|
| +#endif
|
| +
|
| +namespace {
|
| +const int32 kTransferBufferSize = 512 * 1024;
|
| +
|
| +class PGLContextImpl {
|
| + public:
|
| + PGLContextImpl(NPP npp,
|
| + NPDevice* device,
|
| + NPDeviceContext3D* device_context);
|
| + ~PGLContextImpl();
|
| +
|
| + // Initlaize a PGL context with a transfer buffer of a particular size.
|
| + bool 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);
|
| +
|
| + // Display all content rendered since last call to SwapBuffers.
|
| + bool SwapBuffers();
|
| +
|
| + private:
|
| + PGLContextImpl(const PGLContextImpl&);
|
| + void operator=(const PGLContextImpl&);
|
| +
|
| + NPP npp_;
|
| + NPDevice* device_;
|
| + NPDeviceContext3D* device_context_;
|
| + CommandBufferPepper* command_buffer_;
|
| + gpu::gles2::GLES2CmdHelper* gles2_helper_;
|
| + int32 transfer_buffer_id_;
|
| + gpu::gles2::GLES2Implementation* gles2_implementation_;
|
| +};
|
| +
|
| +THREAD_LOCAL PGLContextImpl* g_current_pgl_context;
|
| +
|
| +PGLContextImpl::PGLContextImpl(NPP npp,
|
| + NPDevice* device,
|
| + NPDeviceContext3D* device_context)
|
| + : npp_(npp),
|
| + device_(device),
|
| + device_context_(device_context),
|
| + command_buffer_(NULL),
|
| + gles2_helper_(NULL),
|
| + transfer_buffer_id_(0),
|
| + gles2_implementation_(NULL) {
|
| +}
|
| +
|
| +PGLContextImpl::~PGLContextImpl() {
|
| + Destroy();
|
| +}
|
| +
|
| +bool PGLContextImpl::Initialize(int32 transfer_buffer_size) {
|
| + // Create and initialize the objects required to issue GLES2 calls.
|
| + command_buffer_ = new CommandBufferPepper(
|
| + npp_, device_, device_context_);
|
| + gles2_helper_ = new gpu::gles2::GLES2CmdHelper(command_buffer_);
|
| + if (gles2_helper_->Initialize()) {
|
| + transfer_buffer_id_ =
|
| + command_buffer_->CreateTransferBuffer(kTransferBufferSize);
|
| + gpu::Buffer transfer_buffer =
|
| + command_buffer_->GetTransferBuffer(transfer_buffer_id_);
|
| + if (transfer_buffer.ptr) {
|
| + gles2_implementation_ = new gpu::gles2::GLES2Implementation(
|
| + gles2_helper_,
|
| + transfer_buffer.size,
|
| + transfer_buffer.ptr,
|
| + transfer_buffer_id_);
|
| + return true;
|
| + }
|
| + }
|
| +
|
| + // Tear everything down if initialization failed.
|
| + Destroy();
|
| + return false;
|
| +}
|
| +
|
| +void PGLContextImpl::Destroy() {
|
| + delete gles2_implementation_;
|
| + gles2_implementation_ = NULL;
|
| +
|
| + if (command_buffer_ && transfer_buffer_id_ != 0) {
|
| + command_buffer_->DestroyTransferBuffer(transfer_buffer_id_);
|
| + transfer_buffer_id_ = 0;
|
| + }
|
| +
|
| + delete gles2_helper_;
|
| + gles2_helper_ = NULL;
|
| +
|
| + delete command_buffer_;
|
| + command_buffer_ = NULL;
|
| +}
|
| +
|
| +bool PGLContextImpl::MakeCurrent(PGLContextImpl* pgl_context) {
|
| + g_current_pgl_context = pgl_context;
|
| + if (pgl_context)
|
| + gles2::g_gl_impl = pgl_context->gles2_implementation_;
|
| + else
|
| + gles2::g_gl_impl = NULL;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool PGLContextImpl::SwapBuffers() {
|
| + gles2_implementation_->SwapBuffers();
|
| + return true;
|
| +}
|
| +} // namespace anonymous
|
| +
|
| +extern "C" {
|
| +
|
| +PGLContext pglCreateContext(NPP npp,
|
| + NPDevice* device,
|
| + NPDeviceContext3D* device_context) {
|
| + PGLContextImpl* pgl_context = new PGLContextImpl(
|
| + npp, device, device_context);
|
| + if (pgl_context->Initialize(kTransferBufferSize)) {
|
| + return pgl_context;
|
| + }
|
| +
|
| + delete pgl_context;
|
| + return NULL;
|
| +}
|
| +
|
| +PGLBoolean pglMakeCurrent(PGLContext pgl_context) {
|
| + return PGLContextImpl::MakeCurrent(static_cast<PGLContextImpl*>(pgl_context));
|
| +}
|
| +
|
| +PGLBoolean pglSwapBuffers() {
|
| + if (!g_current_pgl_context)
|
| + return false;
|
| +
|
| + return g_current_pgl_context->SwapBuffers();
|
| +}
|
| +
|
| +PGLBoolean pglDestroyContext(PGLContext pgl_context) {
|
| + if (!pgl_context)
|
| + return false;
|
| +
|
| + delete pgl_context;
|
| + return true;
|
| +}
|
| +
|
| +} // extern "C"
|
|
|
| Property changes on: gpu\pgl\pgl.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|