diff options
Diffstat (limited to 'content/plugin/webplugin_accelerated_surface_proxy_mac.cc')
-rw-r--r-- | content/plugin/webplugin_accelerated_surface_proxy_mac.cc | 86 |
1 files changed, 62 insertions, 24 deletions
diff --git a/content/plugin/webplugin_accelerated_surface_proxy_mac.cc b/content/plugin/webplugin_accelerated_surface_proxy_mac.cc index 9573a27..65749f0 100644 --- a/content/plugin/webplugin_accelerated_surface_proxy_mac.cc +++ b/content/plugin/webplugin_accelerated_surface_proxy_mac.cc @@ -7,30 +7,53 @@ #include "content/plugin/webplugin_accelerated_surface_proxy_mac.h" #include "base/bind.h" +#include "base/command_line.h" #include "content/plugin/webplugin_proxy.h" +#include "ui/base/ui_base_switches.h" #include "ui/gfx/surface/accelerated_surface_mac.h" +#include "ui/gfx/surface/io_surface_support_mac.h" #include "ui/gfx/surface/transport_dib.h" -WebPluginAcceleratedSurfaceProxy::WebPluginAcceleratedSurfaceProxy( +WebPluginAcceleratedSurfaceProxy* WebPluginAcceleratedSurfaceProxy::Create( WebPluginProxy* plugin_proxy, - gfx::GpuPreference gpu_preference) - : plugin_proxy_(plugin_proxy), - window_handle_(NULL) { - surface_ = new AcceleratedSurface; - // It's possible for OpenGL to fail to initialze (e.g., if an incompatible + gfx::GpuPreference gpu_preference) { + bool composited = !CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableCompositedCoreAnimationPlugins); + + // Require IOSurface support for drawing Core Animation plugins. + if (composited && !IOSurfaceSupport::Initialize()) + return NULL; + + AcceleratedSurface* surface = new AcceleratedSurface; + // It's possible for OpenGL to fail to initialize (e.g., if an incompatible // mode is forced via flags), so handle that gracefully. - if (!surface_->Initialize(NULL, true, gpu_preference)) { - delete surface_; - surface_ = NULL; - return; + if (!surface->Initialize(NULL, true, gpu_preference)) { + delete surface; + surface = NULL; + if (composited) + return NULL; + } + + if (!composited && surface) { + // Only used for 10.5 support, but harmless on 10.6+. + surface->SetTransportDIBAllocAndFree( + base::Bind(&WebPluginProxy::AllocSurfaceDIB, + base::Unretained(plugin_proxy)), + base::Bind(&WebPluginProxy::FreeSurfaceDIB, + base::Unretained(plugin_proxy))); } - // Only used for 10.5 support, but harmless on 10.6+. - surface_->SetTransportDIBAllocAndFree( - base::Bind(&WebPluginProxy::AllocSurfaceDIB, - base::Unretained(plugin_proxy)), - base::Bind(&WebPluginProxy::FreeSurfaceDIB, - base::Unretained(plugin_proxy))); + return new WebPluginAcceleratedSurfaceProxy( + plugin_proxy, surface, composited); +} + +WebPluginAcceleratedSurfaceProxy::WebPluginAcceleratedSurfaceProxy( + WebPluginProxy* plugin_proxy, + AcceleratedSurface* surface, + bool composited) + : plugin_proxy_(plugin_proxy), + surface_(surface), + composited_(composited) { } WebPluginAcceleratedSurfaceProxy::~WebPluginAcceleratedSurfaceProxy() { @@ -46,17 +69,28 @@ void WebPluginAcceleratedSurfaceProxy::SetWindowHandle( window_handle_ = window; } +bool WebPluginAcceleratedSurfaceProxy::IsComposited() { + return composited_; +} + void WebPluginAcceleratedSurfaceProxy::SetSize(const gfx::Size& size) { if (!surface_) return; - uint64 io_surface_id = surface_->SetSurfaceSize(size); - if (io_surface_id) { - plugin_proxy_->SetAcceleratedSurface(window_handle_, size, io_surface_id); + if (composited_) { + uint32 io_surface_id = surface_->SetSurfaceSize(size); + // If allocation fails for some reason, still inform the plugin proxy. + plugin_proxy_->AcceleratedPluginAllocatedIOSurface( + size.width(), size.height(), io_surface_id); } else { - TransportDIB::Handle transport_dib = surface_->SetTransportDIBSize(size); - if (TransportDIB::is_valid_handle(transport_dib)) { - plugin_proxy_->SetAcceleratedDIB(window_handle_, size, transport_dib); + uint32 io_surface_id = surface_->SetSurfaceSize(size); + if (io_surface_id) { + plugin_proxy_->SetAcceleratedSurface(window_handle_, size, io_surface_id); + } else { + TransportDIB::Handle transport_dib = surface_->SetTransportDIBSize(size); + if (TransportDIB::is_valid_handle(transport_dib)) { + plugin_proxy_->SetAcceleratedDIB(window_handle_, size, transport_dib); + } } } } @@ -78,6 +112,10 @@ void WebPluginAcceleratedSurfaceProxy::EndDrawing() { return; surface_->SwapBuffers(); - plugin_proxy_->AcceleratedFrameBuffersDidSwap( - window_handle_, surface_->GetSurfaceId()); + if (composited_) { + plugin_proxy_->AcceleratedPluginSwappedIOSurface(); + } else { + plugin_proxy_->AcceleratedFrameBuffersDidSwap( + window_handle_, surface_->GetSurfaceId()); + } } |