Index: webkit/glue/plugins/pepper_graphics_3d.cc |
=================================================================== |
--- webkit/glue/plugins/pepper_graphics_3d.cc (revision 69381) |
+++ webkit/glue/plugins/pepper_graphics_3d.cc (working copy) |
@@ -1,258 +0,0 @@ |
-// 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 "webkit/glue/plugins/pepper_graphics_3d.h" |
- |
-#include "gpu/command_buffer/common/command_buffer.h" |
-#include "base/lazy_instance.h" |
-#include "base/thread_local.h" |
-#include "ppapi/c/dev/ppb_graphics_3d_dev.h" |
-#include "webkit/glue/plugins/pepper_common.h" |
-#include "webkit/glue/plugins/pepper_plugin_instance.h" |
- |
-namespace pepper { |
- |
-namespace { |
- |
-static base::LazyInstance<base::ThreadLocalPointer<Graphics3D> > |
- g_current_context_key(base::LINKER_INITIALIZED); |
- |
-// Size of the transfer buffer. |
-enum { kTransferBufferSize = 512 * 1024 }; |
- |
-PP_Bool IsGraphics3D(PP_Resource resource) { |
- return BoolToPPBool(!!Resource::GetAs<Graphics3D>(resource)); |
-} |
- |
-PP_Bool GetConfigs(int32_t* configs, int32_t config_size, int32_t* num_config) { |
- // TODO(neb): Implement me! |
- return PP_FALSE; |
-} |
- |
-PP_Bool ChooseConfig(const int32_t* attrib_list, int32_t* configs, |
- int32_t config_size, int32_t* num_config) { |
- // TODO(neb): Implement me! |
- return PP_FALSE; |
-} |
- |
-PP_Bool GetConfigAttrib(int32_t config, int32_t attribute, int32_t* value) { |
- // TODO(neb): Implement me! |
- return PP_FALSE; |
-} |
- |
-const char* QueryString(int32_t name) { |
- switch (name) { |
- case EGL_CLIENT_APIS: |
- return "OpenGL_ES"; |
- case EGL_EXTENSIONS: |
- return ""; |
- case EGL_VENDOR: |
- return "Google"; |
- case EGL_VERSION: |
- return "1.0 Google"; |
- default: |
- return NULL; |
- } |
-} |
- |
-PP_Resource CreateContext(PP_Instance instance_id, int32_t config, |
- int32_t share_context, |
- const int32_t* attrib_list) { |
- DCHECK_EQ(0, share_context); |
- |
- PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
- if (!instance) { |
- return 0; |
- } |
- |
- scoped_refptr<Graphics3D> context(new Graphics3D(instance->module())); |
- if (!context->Init(instance_id, config, attrib_list)) { |
- return 0; |
- } |
- |
- return context->GetReference(); |
-} |
- |
-void* GetProcAddress(const char* name) { |
- // TODO(neb): Implement me! |
- return NULL; |
-} |
- |
-PP_Bool MakeCurrent(PP_Resource graphics3d) { |
- if (!graphics3d) { |
- Graphics3D::ResetCurrent(); |
- return PP_TRUE; |
- } else { |
- scoped_refptr<Graphics3D> context(Resource::GetAs<Graphics3D>(graphics3d)); |
- return BoolToPPBool(context.get() && context->MakeCurrent()); |
- } |
-} |
- |
-PP_Resource GetCurrentContext() { |
- Graphics3D* current_context = Graphics3D::GetCurrent(); |
- return current_context ? current_context->GetReference() : 0; |
-} |
- |
-PP_Bool SwapBuffers(PP_Resource graphics3d) { |
- scoped_refptr<Graphics3D> context(Resource::GetAs<Graphics3D>(graphics3d)); |
- return BoolToPPBool(context && context->SwapBuffers()); |
-} |
- |
-uint32_t GetError() { |
- // Technically, this should return the last error that occurred on the current |
- // thread, rather than an error associated with a particular context. |
- // TODO(apatrick): Fix this. |
- Graphics3D* current_context = Graphics3D::GetCurrent(); |
- if (!current_context) |
- return 0; |
- |
- return current_context->GetError(); |
-} |
- |
-const PPB_Graphics3D_Dev ppb_graphics3d = { |
- &IsGraphics3D, |
- &GetConfigs, |
- &ChooseConfig, |
- &GetConfigAttrib, |
- &QueryString, |
- &CreateContext, |
- &GetProcAddress, |
- &MakeCurrent, |
- &GetCurrentContext, |
- &SwapBuffers, |
- &GetError |
-}; |
- |
-} // namespace |
- |
-Graphics3D::Graphics3D(PluginModule* module) |
- : Resource(module), |
- bound_instance_(NULL) { |
-} |
- |
-const PPB_Graphics3D_Dev* Graphics3D::GetInterface() { |
- return &ppb_graphics3d; |
-} |
- |
-Graphics3D* Graphics3D::GetCurrent() { |
- return g_current_context_key.Get().Get(); |
-} |
- |
-void Graphics3D::ResetCurrent() { |
- g_current_context_key.Get().Set(NULL); |
-} |
- |
-Graphics3D* Graphics3D::AsGraphics3D() { |
- return this; |
-} |
- |
-Graphics3D::~Graphics3D() { |
- Destroy(); |
-} |
- |
-bool Graphics3D::Init(PP_Instance instance_id, int32_t config, |
- const int32_t* attrib_list) { |
- PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); |
- if (!instance) { |
- return false; |
- } |
- |
- // Create and initialize the objects required to issue GLES2 calls. |
- platform_context_.reset(instance->delegate()->CreateContext3D()); |
- if (!platform_context_.get()) { |
- Destroy(); |
- return false; |
- } |
- |
- if (!platform_context_->Init()) { |
- Destroy(); |
- return false; |
- } |
- |
- gles2_implementation_ = platform_context_->GetGLES2Implementation(); |
- DCHECK(gles2_implementation_); |
- |
- return true; |
-} |
- |
-bool Graphics3D::BindToInstance(PluginInstance* new_instance) { |
- if (bound_instance_ == new_instance) |
- return true; // Rebinding the same device, nothing to do. |
- if (bound_instance_ && new_instance) |
- return false; // Can't change a bound device. |
- |
- if (new_instance) { |
- // Resize the backing texture to the size of the instance when it is bound. |
- platform_context_->ResizeBackingTexture(new_instance->position().size()); |
- |
- // This is a temporary hack. The SwapBuffers is issued to force the resize |
- // to take place before any subsequent rendering. This might lead to a |
- // partially rendered frame being displayed. It is also not thread safe |
- // since the SwapBuffers is written to the command buffer and that command |
- // buffer might be written to by another thread. |
- // TODO(apatrick): Figure out the semantics of binding and resizing. |
- platform_context_->SwapBuffers(); |
- } |
- |
- bound_instance_ = new_instance; |
- return true; |
-} |
- |
-bool Graphics3D::MakeCurrent() { |
- if (!platform_context_.get()) |
- return false; |
- |
- g_current_context_key.Get().Set(this); |
- |
- // TODO(apatrick): Return false on context lost. |
- return true; |
-} |
- |
-bool Graphics3D::SwapBuffers() { |
- if (!platform_context_.get()) |
- return false; |
- |
- return platform_context_->SwapBuffers(); |
-} |
- |
-unsigned Graphics3D::GetError() { |
- if (!platform_context_.get()) |
- return 0; |
- |
- return platform_context_->GetError(); |
-} |
- |
-void Graphics3D::ResizeBackingTexture(const gfx::Size& size) { |
- if (!platform_context_.get()) |
- return; |
- |
- platform_context_->ResizeBackingTexture(size); |
-} |
- |
-void Graphics3D::SetSwapBuffersCallback(Callback0::Type* callback) { |
- if (!platform_context_.get()) |
- return; |
- |
- platform_context_->SetSwapBuffersCallback(callback); |
-} |
- |
-unsigned Graphics3D::GetBackingTextureId() { |
- if (!platform_context_.get()) |
- return 0; |
- |
- return platform_context_->GetBackingTextureId(); |
-} |
- |
-void Graphics3D::Destroy() { |
- if (GetCurrent() == this) { |
- ResetCurrent(); |
- } |
- |
- gles2_implementation_ = NULL; |
- |
- platform_context_.reset(); |
-} |
- |
-} // namespace pepper |
- |