| Index: webkit/plugins/ppapi/ppb_graphics_3d_impl.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/ppb_graphics_3d_impl.cc (revision 213561)
|
| +++ webkit/plugins/ppapi/ppb_graphics_3d_impl.cc (working copy)
|
| @@ -1,328 +0,0 @@
|
| -// Copyright (c) 2012 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/plugins/ppapi/ppb_graphics_3d_impl.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "gpu/command_buffer/client/gles2_implementation.h"
|
| -#include "ppapi/c/ppp_graphics_3d.h"
|
| -#include "ppapi/thunk/enter.h"
|
| -#include "third_party/WebKit/public/platform/WebString.h"
|
| -#include "third_party/WebKit/public/web/WebConsoleMessage.h"
|
| -#include "third_party/WebKit/public/web/WebDocument.h"
|
| -#include "third_party/WebKit/public/web/WebElement.h"
|
| -#include "third_party/WebKit/public/web/WebFrame.h"
|
| -#include "third_party/WebKit/public/web/WebPluginContainer.h"
|
| -#include "webkit/plugins/plugin_switches.h"
|
| -#include "webkit/plugins/ppapi/plugin_module.h"
|
| -#include "webkit/plugins/ppapi/ppapi_plugin_instance_impl.h"
|
| -#include "webkit/plugins/ppapi/resource_helper.h"
|
| -
|
| -using ppapi::thunk::EnterResourceNoLock;
|
| -using ppapi::thunk::PPB_Graphics3D_API;
|
| -using WebKit::WebConsoleMessage;
|
| -using WebKit::WebFrame;
|
| -using WebKit::WebPluginContainer;
|
| -using WebKit::WebString;
|
| -
|
| -namespace webkit {
|
| -namespace ppapi {
|
| -
|
| -namespace {
|
| -const int32 kCommandBufferSize = 1024 * 1024;
|
| -const int32 kTransferBufferSize = 1024 * 1024;
|
| -
|
| -PP_Bool ShmToHandle(base::SharedMemory* shm,
|
| - size_t size,
|
| - int* shm_handle,
|
| - uint32_t* shm_size) {
|
| - if (!shm || !shm_handle || !shm_size)
|
| - return PP_FALSE;
|
| -#if defined(OS_POSIX)
|
| - *shm_handle = shm->handle().fd;
|
| -#elif defined(OS_WIN)
|
| - *shm_handle = reinterpret_cast<int>(shm->handle());
|
| -#else
|
| - #error "Platform not supported."
|
| -#endif
|
| - *shm_size = size;
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -} // namespace.
|
| -
|
| -PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PP_Instance instance)
|
| - : PPB_Graphics3D_Shared(instance),
|
| - bound_to_instance_(false),
|
| - commit_pending_(false),
|
| - weak_ptr_factory_(this) {
|
| -}
|
| -
|
| -PPB_Graphics3D_Impl::~PPB_Graphics3D_Impl() {
|
| - DestroyGLES2Impl();
|
| -}
|
| -
|
| -// static
|
| -PP_Bool PPB_Graphics3D_Impl::IsGpuBlacklisted() {
|
| - CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| - if (command_line)
|
| - return PP_FromBool(
|
| - command_line->HasSwitch(switches::kDisablePepper3d));
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -// static
|
| -PP_Resource PPB_Graphics3D_Impl::Create(PP_Instance instance,
|
| - PP_Resource share_context,
|
| - const int32_t* attrib_list) {
|
| - PPB_Graphics3D_API* share_api = NULL;
|
| - if (IsGpuBlacklisted())
|
| - return 0;
|
| - if (share_context) {
|
| - EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true);
|
| - if (enter.failed())
|
| - return 0;
|
| - share_api = enter.object();
|
| - }
|
| - scoped_refptr<PPB_Graphics3D_Impl> graphics_3d(
|
| - new PPB_Graphics3D_Impl(instance));
|
| - if (!graphics_3d->Init(share_api, attrib_list))
|
| - return 0;
|
| - return graphics_3d->GetReference();
|
| -}
|
| -
|
| -// static
|
| -PP_Resource PPB_Graphics3D_Impl::CreateRaw(PP_Instance instance,
|
| - PP_Resource share_context,
|
| - const int32_t* attrib_list) {
|
| - PPB_Graphics3D_API* share_api = NULL;
|
| - if (IsGpuBlacklisted())
|
| - return 0;
|
| - if (share_context) {
|
| - EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true);
|
| - if (enter.failed())
|
| - return 0;
|
| - share_api = enter.object();
|
| - }
|
| - scoped_refptr<PPB_Graphics3D_Impl> graphics_3d(
|
| - new PPB_Graphics3D_Impl(instance));
|
| - if (!graphics_3d->InitRaw(share_api, attrib_list))
|
| - return 0;
|
| - return graphics_3d->GetReference();
|
| -}
|
| -
|
| -PP_Bool PPB_Graphics3D_Impl::SetGetBuffer(int32_t transfer_buffer_id) {
|
| - GetCommandBuffer()->SetGetBuffer(transfer_buffer_id);
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -gpu::CommandBuffer::State PPB_Graphics3D_Impl::GetState() {
|
| - return GetCommandBuffer()->GetState();
|
| -}
|
| -
|
| -int32_t PPB_Graphics3D_Impl::CreateTransferBuffer(uint32_t size) {
|
| - int32_t id = -1;
|
| - GetCommandBuffer()->CreateTransferBuffer(size, &id);
|
| - return id;
|
| -}
|
| -
|
| -PP_Bool PPB_Graphics3D_Impl::DestroyTransferBuffer(int32_t id) {
|
| - GetCommandBuffer()->DestroyTransferBuffer(id);
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -PP_Bool PPB_Graphics3D_Impl::GetTransferBuffer(int32_t id,
|
| - int* shm_handle,
|
| - uint32_t* shm_size) {
|
| - gpu::Buffer buffer = GetCommandBuffer()->GetTransferBuffer(id);
|
| - return ShmToHandle(buffer.shared_memory, buffer.size, shm_handle, shm_size);
|
| -}
|
| -
|
| -PP_Bool PPB_Graphics3D_Impl::Flush(int32_t put_offset) {
|
| - GetCommandBuffer()->Flush(put_offset);
|
| - return PP_TRUE;
|
| -}
|
| -
|
| -gpu::CommandBuffer::State PPB_Graphics3D_Impl::FlushSync(int32_t put_offset) {
|
| - gpu::CommandBuffer::State state = GetCommandBuffer()->GetState();
|
| - return GetCommandBuffer()->FlushSync(put_offset, state.get_offset);
|
| -}
|
| -
|
| -gpu::CommandBuffer::State PPB_Graphics3D_Impl::FlushSyncFast(
|
| - int32_t put_offset,
|
| - int32_t last_known_get) {
|
| - return GetCommandBuffer()->FlushSync(put_offset, last_known_get);
|
| -}
|
| -
|
| -uint32_t PPB_Graphics3D_Impl::InsertSyncPoint() {
|
| - return GetCommandBuffer()->InsertSyncPoint();
|
| -}
|
| -
|
| -bool PPB_Graphics3D_Impl::BindToInstance(bool bind) {
|
| - bound_to_instance_ = bind;
|
| - return true;
|
| -}
|
| -
|
| -bool PPB_Graphics3D_Impl::IsOpaque() {
|
| - return platform_context_->IsOpaque();
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::ViewWillInitiatePaint() {
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::ViewInitiatedPaint() {
|
| - commit_pending_ = false;
|
| -
|
| - if (HasPendingSwap())
|
| - SwapBuffersACK(PP_OK);
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::ViewFlushedPaint() {
|
| -}
|
| -
|
| -gpu::CommandBuffer* PPB_Graphics3D_Impl::GetCommandBuffer() {
|
| - return platform_context_->GetCommandBuffer();
|
| -}
|
| -
|
| -int32 PPB_Graphics3D_Impl::DoSwapBuffers() {
|
| - // We do not have a GLES2 implementation when using an OOP proxy.
|
| - // The plugin-side proxy is responsible for adding the SwapBuffers command
|
| - // to the command buffer in that case.
|
| - if (gles2_impl())
|
| - gles2_impl()->SwapBuffers();
|
| -
|
| - if (bound_to_instance_) {
|
| - // If we are bound to the instance, we need to ask the compositor
|
| - // to commit our backing texture so that the graphics appears on the page.
|
| - // When the backing texture will be committed we get notified via
|
| - // ViewFlushedPaint().
|
| - //
|
| - // Don't need to check for NULL from GetPluginInstance since when we're
|
| - // bound, we know our instance is valid.
|
| - ResourceHelper::GetPluginInstance(this)->CommitBackingTexture();
|
| - commit_pending_ = true;
|
| - } else {
|
| - // Wait for the command to complete on the GPU to allow for throttling.
|
| - platform_context_->Echo(base::Bind(&PPB_Graphics3D_Impl::OnSwapBuffers,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| -
|
| - return PP_OK_COMPLETIONPENDING;
|
| -}
|
| -
|
| -bool PPB_Graphics3D_Impl::Init(PPB_Graphics3D_API* share_context,
|
| - const int32_t* attrib_list) {
|
| - if (!InitRaw(share_context, attrib_list))
|
| - return false;
|
| -
|
| - gpu::CommandBuffer* command_buffer = GetCommandBuffer();
|
| - if (!command_buffer->Initialize())
|
| - return false;
|
| -
|
| - gpu::gles2::GLES2Implementation* share_gles2 = NULL;
|
| - if (share_context) {
|
| - share_gles2 =
|
| - static_cast<PPB_Graphics3D_Shared*>(share_context)->gles2_impl();
|
| - }
|
| -
|
| - return CreateGLES2Impl(kCommandBufferSize, kTransferBufferSize,
|
| - share_gles2);
|
| -}
|
| -
|
| -bool PPB_Graphics3D_Impl::InitRaw(PPB_Graphics3D_API* share_context,
|
| - const int32_t* attrib_list) {
|
| - PluginInstanceImpl* plugin_instance = ResourceHelper::GetPluginInstance(this);
|
| - if (!plugin_instance)
|
| - return false;
|
| -
|
| - PluginDelegate::PlatformContext3D* share_platform_context = NULL;
|
| - if (share_context) {
|
| - PPB_Graphics3D_Impl* share_graphics =
|
| - static_cast<PPB_Graphics3D_Impl*>(share_context);
|
| - share_platform_context = share_graphics->platform_context();
|
| - }
|
| -
|
| - platform_context_.reset(plugin_instance->CreateContext3D());
|
| - if (!platform_context_)
|
| - return false;
|
| -
|
| - if (!platform_context_->Init(attrib_list, share_platform_context))
|
| - return false;
|
| -
|
| - platform_context_->SetContextLostCallback(
|
| - base::Bind(&PPB_Graphics3D_Impl::OnContextLost,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -
|
| - platform_context_->SetOnConsoleMessageCallback(
|
| - base::Bind(&PPB_Graphics3D_Impl::OnConsoleMessage,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - return true;
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::OnConsoleMessage(const std::string& message,
|
| - int id) {
|
| - if (!bound_to_instance_)
|
| - return;
|
| - WebPluginContainer* container =
|
| - ResourceHelper::GetPluginInstance(this)->container();
|
| - if (!container)
|
| - return;
|
| - WebFrame* frame = container->element().document().frame();
|
| - if (!frame)
|
| - return;
|
| - WebConsoleMessage console_message = WebConsoleMessage(
|
| - WebConsoleMessage::LevelError, WebString(UTF8ToUTF16(message)));
|
| - frame->addMessageToConsole(console_message);
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::OnSwapBuffers() {
|
| - if (HasPendingSwap()) {
|
| - // If we're off-screen, no need to trigger and wait for compositing.
|
| - // Just send the swap-buffers ACK to the plugin immediately.
|
| - commit_pending_ = false;
|
| - SwapBuffersACK(PP_OK);
|
| - }
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::OnContextLost() {
|
| - // Don't need to check for NULL from GetPluginInstance since when we're
|
| - // bound, we know our instance is valid.
|
| - if (bound_to_instance_)
|
| - ResourceHelper::GetPluginInstance(this)->BindGraphics(pp_instance(), 0);
|
| -
|
| - // Send context lost to plugin. This may have been caused by a PPAPI call, so
|
| - // avoid re-entering.
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&PPB_Graphics3D_Impl::SendContextLost,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void PPB_Graphics3D_Impl::SendContextLost() {
|
| - // By the time we run this, the instance may have been deleted, or in the
|
| - // process of being deleted. Even in the latter case, we don't want to send a
|
| - // callback after DidDestroy.
|
| - PluginInstanceImpl* instance = ResourceHelper::GetPluginInstance(this);
|
| - if (!instance || !instance->container())
|
| - return;
|
| -
|
| - // This PPB_Graphics3D_Impl could be deleted during the call to
|
| - // GetPluginInterface (which sends a sync message in some cases). We still
|
| - // send the Graphics3DContextLost to the plugin; the instance may care about
|
| - // that event even though this context has been destroyed.
|
| - PP_Instance this_pp_instance = pp_instance();
|
| - const PPP_Graphics3D* ppp_graphics_3d =
|
| - static_cast<const PPP_Graphics3D*>(
|
| - instance->module()->GetPluginInterface(
|
| - PPP_GRAPHICS_3D_INTERFACE));
|
| - if (ppp_graphics_3d)
|
| - ppp_graphics_3d->Graphics3DContextLost(this_pp_instance);
|
| -}
|
| -
|
| -} // namespace ppapi
|
| -} // namespace webkit
|
|
|