| Index: chrome/renderer/pepper_plugin_delegate_impl.cc
|
| ===================================================================
|
| --- chrome/renderer/pepper_plugin_delegate_impl.cc (revision 65093)
|
| +++ chrome/renderer/pepper_plugin_delegate_impl.cc (working copy)
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "app/l10n_util.h"
|
| #include "app/surface/transport_dib.h"
|
| +#include "base/callback.h"
|
| #include "base/file_path.h"
|
| #include "base/logging.h"
|
| #include "base/scoped_ptr.h"
|
| @@ -21,9 +22,13 @@
|
| #include "chrome/common/render_messages_params.h"
|
| #include "chrome/renderer/audio_message_filter.h"
|
| #include "chrome/renderer/command_buffer_proxy.h"
|
| +#include "chrome/renderer/ggl/ggl.h"
|
| +#include "chrome/renderer/gpu_channel_host.h"
|
| #include "chrome/renderer/render_thread.h"
|
| #include "chrome/renderer/render_view.h"
|
| +#include "chrome/renderer/webgraphicscontext3d_command_buffer_impl.h"
|
| #include "chrome/renderer/webplugin_delegate_proxy.h"
|
| +#include "gfx/size.h"
|
| #include "grit/locale_settings.h"
|
| #include "ppapi/c/dev/pp_video_dev.h"
|
| #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserCompletion.h"
|
| @@ -80,139 +85,29 @@
|
|
|
| class PlatformContext3DImpl : public pepper::PluginDelegate::PlatformContext3D {
|
| public:
|
| - explicit PlatformContext3DImpl(RenderView* render_view)
|
| - : render_view_(render_view),
|
| - nested_delegate_(NULL),
|
| - command_buffer_(NULL),
|
| - renderview_to_webplugin_adapter_(render_view) {}
|
| + explicit PlatformContext3DImpl(WebKit::WebView* web_view)
|
| + : web_view_(web_view),
|
| + context_(NULL) {
|
| + }
|
|
|
| virtual ~PlatformContext3DImpl() {
|
| - if (nested_delegate_) {
|
| - nested_delegate_->DestroyCommandBuffer(command_buffer_);
|
| - nested_delegate_->PluginDestroyed();
|
| + if (context_) {
|
| + ggl::DestroyContext(context_);
|
| + context_ = NULL;
|
| }
|
| }
|
|
|
| - virtual bool Init(const gfx::Rect& position, const gfx::Rect& clip);
|
| + virtual bool Init();
|
| + virtual bool SwapBuffers();
|
| + virtual unsigned GetError();
|
| + virtual void SetSwapBuffersCallback(Callback0::Type* callback);
|
| + void ResizeBackingTexture(const gfx::Size& size);
|
| + virtual unsigned GetBackingTextureId();
|
| + virtual gpu::gles2::GLES2Implementation* GetGLES2Implementation();
|
|
|
| - virtual gpu::CommandBuffer* GetCommandBuffer() {
|
| - return command_buffer_;
|
| - }
|
| -
|
| - virtual void SetNotifyRepaintTask(Task* task) {
|
| - command_buffer_->SetNotifyRepaintTask(task);
|
| - }
|
| -
|
| private:
|
| -
|
| - class WebPluginAdapter : public webkit_glue::WebPlugin {
|
| - public:
|
| - explicit WebPluginAdapter(RenderView* render_view)
|
| - : render_view_(render_view) {}
|
| -
|
| - virtual void SetWindow(gfx::PluginWindowHandle window) {
|
| - render_view_->CreatedPluginWindow(window);
|
| - }
|
| -
|
| - virtual void WillDestroyWindow(gfx::PluginWindowHandle window) {
|
| - render_view_->WillDestroyPluginWindow(window);
|
| - }
|
| -
|
| - virtual void SetAcceptsInputEvents(bool accepts) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| -#if defined(OS_WIN)
|
| - virtual void SetWindowlessPumpEvent(HANDLE pump_messages_event) {
|
| - NOTREACHED();
|
| - }
|
| -#endif
|
| -
|
| - virtual void CancelResource(unsigned long id) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void Invalidate() {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void InvalidateRect(const gfx::Rect& rect) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual NPObject* GetWindowScriptNPObject() {
|
| - NOTREACHED();
|
| - return NULL;
|
| - }
|
| -
|
| - virtual NPObject* GetPluginElement() {
|
| - NOTREACHED();
|
| - return NULL;
|
| - }
|
| -
|
| - virtual void SetCookie(const GURL& url,
|
| - const GURL& first_party_for_cookies,
|
| - const std::string& cookie) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual std::string GetCookies(const GURL& url,
|
| - const GURL& first_party_for_cookies) {
|
| - NOTREACHED();
|
| - return std::string();
|
| - }
|
| -
|
| - virtual void ShowModalHTMLDialog(const GURL& url, int width, int height,
|
| - const std::string& json_arguments,
|
| - std::string* json_retval) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void OnMissingPluginStatus(int status) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void HandleURLRequest(const char* url,
|
| - const char* method,
|
| - const char* target,
|
| - const char* buf,
|
| - unsigned int len,
|
| - int notify_id,
|
| - bool popups_allowed) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void CancelDocumentLoad() {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual void InitiateHTTPRangeRequest(const char* url,
|
| - const char* range_info,
|
| - int range_request_id) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - virtual bool IsOffTheRecord() {
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| -
|
| - virtual void SetDeferResourceLoading(unsigned long resource_id,
|
| - bool defer) {
|
| - NOTREACHED();
|
| - }
|
| -
|
| - private:
|
| - RenderView* render_view_;
|
| - };
|
| -
|
| - void SendNestedDelegateGeometryToBrowser(const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect);
|
| -
|
| - RenderView* render_view_;
|
| - WebPluginDelegateProxy* nested_delegate_;
|
| - CommandBufferProxy* command_buffer_;
|
| - WebPluginAdapter renderview_to_webplugin_adapter_;
|
| + WebKit::WebView* web_view_;
|
| + ggl::Context* context_;
|
| };
|
|
|
| #endif // ENABLE_GPU
|
| @@ -278,78 +173,85 @@
|
|
|
| #ifdef ENABLE_GPU
|
|
|
| -bool PlatformContext3DImpl::Init(const gfx::Rect& position,
|
| - const gfx::Rect& clip) {
|
| -#if defined(ENABLE_GPU)
|
| +bool PlatformContext3DImpl::Init() {
|
| // Ignore initializing more than once.
|
| - if (nested_delegate_)
|
| + if (context_)
|
| return true;
|
|
|
| - // Create an instance of the GPU plugin that is responsible for 3D
|
| - // rendering.
|
| - nested_delegate_ = new WebPluginDelegateProxy(
|
| - std::string("application/vnd.google.chrome.gpu-plugin"),
|
| - render_view_->AsWeakPtr());
|
| + WebGraphicsContext3DCommandBufferImpl* context =
|
| + static_cast<WebGraphicsContext3DCommandBufferImpl*>(
|
| + web_view_->graphicsContext3D());
|
| + if (!context)
|
| + return false;
|
|
|
| - if (nested_delegate_->Initialize(GURL(), std::vector<std::string>(),
|
| - std::vector<std::string>(),
|
| - &renderview_to_webplugin_adapter_,
|
| - false)) {
|
| - // Ensure the window has the correct size before initializing the
|
| - // command buffer.
|
| - nested_delegate_->UpdateGeometry(position, clip);
|
| + ggl::Context* parent_context = context->context();
|
| + if (!parent_context)
|
| + return false;
|
|
|
| - // Ask the GPU plugin to create a command buffer and return a proxy.
|
| - command_buffer_ = nested_delegate_->CreateCommandBuffer();
|
| - if (command_buffer_) {
|
| - // Initialize the proxy command buffer.
|
| - if (command_buffer_->Initialize(kDefaultCommandBufferSize)) {
|
| -#if defined(OS_MACOSX)
|
| - command_buffer_->SetWindowSize(position.size());
|
| -#endif // OS_MACOSX
|
| + RenderThread* render_thread = RenderThread::current();
|
| + if (!render_thread)
|
| + return false;
|
|
|
| - // Make sure the nested delegate shows up in the right place
|
| - // on the page.
|
| - SendNestedDelegateGeometryToBrowser(position, clip);
|
| + GpuChannelHost* host = render_thread->GetGpuChannel();
|
| + if (!host)
|
| + return false;
|
|
|
| - return true;
|
| - }
|
| - }
|
| + DCHECK(host->state() == GpuChannelHost::CONNECTED);
|
|
|
| - nested_delegate_->DestroyCommandBuffer(command_buffer_);
|
| - command_buffer_ = NULL;
|
| - }
|
| + // TODO(apatrick): Let Pepper plugins configure their back buffer surface.
|
| + static const int32 attribs[] = {
|
| + ggl::GGL_ALPHA_SIZE, 8,
|
| + ggl::GGL_DEPTH_SIZE, 24,
|
| + ggl::GGL_STENCIL_SIZE, 8,
|
| + ggl::GGL_SAMPLES, 0,
|
| + ggl::GGL_SAMPLE_BUFFERS, 0,
|
| + ggl::GGL_NONE,
|
| + };
|
|
|
| - nested_delegate_->PluginDestroyed();
|
| - nested_delegate_ = NULL;
|
| -#endif // ENABLE_GPU
|
| - return false;
|
| + // TODO(apatrick): Decide which extensions to expose to Pepper plugins.
|
| + // Currently they get only core GLES2.
|
| + context_ = ggl::CreateOffscreenContext(host,
|
| + parent_context,
|
| + gfx::Size(1, 1),
|
| + "",
|
| + attribs);
|
| + if (!context_)
|
| + return false;
|
| +
|
| + return true;
|
| }
|
|
|
| -void PlatformContext3DImpl::SendNestedDelegateGeometryToBrowser(
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect) {
|
| - // Inform the browser about the location of the plugin on the page.
|
| - // It appears that initially the plugin does not get laid out correctly --
|
| - // possibly due to lazy creation of the nested delegate.
|
| - if (!nested_delegate_ ||
|
| - !nested_delegate_->GetPluginWindowHandle() ||
|
| - !render_view_) {
|
| - return;
|
| - }
|
| +bool PlatformContext3DImpl::SwapBuffers() {
|
| + DCHECK(context_);
|
| + return ggl::SwapBuffers(context_);
|
| +}
|
|
|
| - webkit_glue::WebPluginGeometry geom;
|
| - geom.window = nested_delegate_->GetPluginWindowHandle();
|
| - geom.window_rect = window_rect;
|
| - geom.clip_rect = clip_rect;
|
| - // Rects_valid must be true for this to work in the Gtk port;
|
| - // hopefully not having the cutout rects will not cause incorrect
|
| - // clipping.
|
| - geom.rects_valid = true;
|
| - geom.visible = true;
|
| - render_view_->DidMovePlugin(geom);
|
| +unsigned PlatformContext3DImpl::GetError() {
|
| + DCHECK(context_);
|
| + return ggl::GetError(context_);
|
| }
|
|
|
| +void PlatformContext3DImpl::ResizeBackingTexture(const gfx::Size& size) {
|
| + DCHECK(context_);
|
| + ggl::ResizeOffscreenContext(context_, size);
|
| +}
|
| +
|
| +void PlatformContext3DImpl::SetSwapBuffersCallback(Callback0::Type* callback) {
|
| + DCHECK(context_);
|
| + ggl::SetSwapBuffersCallback(context_, callback);
|
| +}
|
| +
|
| +unsigned PlatformContext3DImpl::GetBackingTextureId() {
|
| + DCHECK(context_);
|
| + return ggl::GetParentTextureId(context_);
|
| +}
|
| +
|
| +gpu::gles2::GLES2Implementation*
|
| + PlatformContext3DImpl::GetGLES2Implementation() {
|
| + DCHECK(context_);
|
| + return ggl::GetImplementation(context_);
|
| +}
|
| +
|
| #endif // ENABLE_GPU
|
|
|
| bool PlatformAudioImpl::Initialize(
|
| @@ -604,7 +506,7 @@
|
| pepper::PluginDelegate::PlatformContext3D*
|
| PepperPluginDelegateImpl::CreateContext3D() {
|
| #ifdef ENABLE_GPU
|
| - return new PlatformContext3DImpl(render_view_);
|
| + return new PlatformContext3DImpl(render_view_->webview());
|
| #else
|
| return NULL;
|
| #endif
|
|
|