summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordspringer@google.com <dspringer@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-23 18:00:07 +0000
committerdspringer@google.com <dspringer@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-23 18:00:07 +0000
commit1aef9813f6edaead72c9dfe24ccd07ec525c75b3 (patch)
tree9cd13cab509d4e9d32d63b043a0c8132b7033cce /chrome
parentbcc3a0cb7f900dda0b4065055f3539c01f901df2 (diff)
downloadchromium_src-1aef9813f6edaead72c9dfe24ccd07ec525c75b3.zip
chromium_src-1aef9813f6edaead72c9dfe24ccd07ec525c75b3.tar.gz
chromium_src-1aef9813f6edaead72c9dfe24ccd07ec525c75b3.tar.bz2
Add 3D support for the Mac on Leopard (OS X 10.5) and earlier. This CL uses
FBO rendering with glGetTexImage() into a TransportDIB that is then used as a texture for rendering the final image in the render view in the browser. While not optimal, it works and can be optimized later, after the new GPU process work is completed. This CL also enables stencil buffer support on the Mac. All the Pepper3D demos run on the Mac with these changes. BUG=none TEST=3D rendering unit tests. Review URL: http://codereview.chromium.org/647043 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39744 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/renderer_host/render_widget_host.cc12
-rw-r--r--chrome/browser/renderer_host/render_widget_host.h4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view.h5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm19
-rw-r--r--chrome/browser/renderer_host/test/test_render_view_host.cc7
-rw-r--r--chrome/browser/renderer_host/test/test_render_view_host.h4
-rw-r--r--chrome/common/plugin_messages_internal.h34
-rw-r--r--chrome/common/render_messages_internal.h13
-rw-r--r--chrome/plugin/command_buffer_stub.cc31
-rw-r--r--chrome/plugin/command_buffer_stub.h3
-rw-r--r--chrome/renderer/render_view.cc21
-rw-r--r--chrome/renderer/render_view.h7
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.cc41
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.h7
15 files changed, 194 insertions, 18 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host.cc b/chrome/browser/renderer_host/render_widget_host.cc
index c8ac130..dcb348c 100644
--- a/chrome/browser/renderer_host/render_widget_host.cc
+++ b/chrome/browser/renderer_host/render_widget_host.cc
@@ -150,6 +150,8 @@ void RenderWidgetHost::OnMessageReceived(const IPC::Message &msg) {
OnDestroyFakePluginWindowHandle)
IPC_MESSAGE_HANDLER(ViewHostMsg_GPUPluginSetIOSurface,
OnGPUPluginSetIOSurface)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_GPUPluginSetTransportDIB,
+ OnGPUPluginSetTransportDIB)
IPC_MESSAGE_HANDLER(ViewHostMsg_GPUPluginBuffersSwapped,
OnGPUPluginBuffersSwapped)
#endif
@@ -914,6 +916,16 @@ void RenderWidgetHost::OnGPUPluginSetIOSurface(gfx::PluginWindowHandle window,
}
}
+void RenderWidgetHost::OnGPUPluginSetTransportDIB(
+ gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) {
+ if (view_) {
+ view_->GPUPluginSetTransportDIB(window, width, height, transport_dib);
+ }
+}
+
void RenderWidgetHost::OnGPUPluginBuffersSwapped(
gfx::PluginWindowHandle window) {
if (view_) {
diff --git a/chrome/browser/renderer_host/render_widget_host.h b/chrome/browser/renderer_host/render_widget_host.h
index 146be7f..e96eae7 100644
--- a/chrome/browser/renderer_host/render_widget_host.h
+++ b/chrome/browser/renderer_host/render_widget_host.h
@@ -452,6 +452,10 @@ class RenderWidgetHost : public IPC::Channel::Listener,
int32 width,
int32 height,
uint64 mach_port);
+ void OnGPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
void OnGPUPluginBuffersSwapped(gfx::PluginWindowHandle window);
#endif
diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h
index 8febbb0..f6f8788 100644
--- a/chrome/browser/renderer_host/render_widget_host_view.h
+++ b/chrome/browser/renderer_host/render_widget_host_view.h
@@ -11,6 +11,7 @@
#include "app/gfx/native_widget_types.h"
#include "base/shared_memory.h"
+#include "chrome/common/transport_dib.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "webkit/glue/webplugin.h"
@@ -187,6 +188,10 @@ class RenderWidgetHostView {
int32 width,
int32 height,
uint64 io_surface_identifier) = 0;
+ virtual void GPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) = 0;
virtual void GPUPluginBuffersSwapped(gfx::PluginWindowHandle window) = 0;
// Draws the current GPU plugin instances into the given context.
virtual void DrawGPUPluginInstances(CGLContextObj context) = 0;
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h
index 332263e..db0c381 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h
@@ -124,6 +124,10 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
int32 width,
int32 height,
uint64 io_surface_identifier);
+ virtual void GPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
virtual void GPUPluginBuffersSwapped(gfx::PluginWindowHandle window);
// Draws the current GPU plugin instances into the given context.
virtual void DrawGPUPluginInstances(CGLContextObj context);
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
index d9cb616a..b413c54 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
@@ -503,10 +503,6 @@ void RenderWidgetHostViewMac::KillSelf() {
gfx::PluginWindowHandle
RenderWidgetHostViewMac::AllocateFakePluginWindowHandle() {
- // We currently only support the GPU plugin on 10.6 and later.
- if (!IOSurfaceSupport::Initialize())
- return 0;
-
// If we don't already have a GPUPluginLayer allocated for our view,
// set one up now.
if (gpu_plugin_layer_.get() == nil) {
@@ -544,10 +540,21 @@ void RenderWidgetHostViewMac::GPUPluginSetIOSurface(
int32 width,
int32 height,
uint64 io_surface_identifier) {
- plugin_container_manager_.SetSizeAndBackingStore(window,
+ plugin_container_manager_.SetSizeAndIOSurface(window,
+ width,
+ height,
+ io_surface_identifier);
+}
+
+void RenderWidgetHostViewMac::GPUPluginSetTransportDIB(
+ gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) {
+ plugin_container_manager_.SetSizeAndTransportDIB(window,
width,
height,
- io_surface_identifier);
+ transport_dib);
}
void RenderWidgetHostViewMac::GPUPluginBuffersSwapped(
diff --git a/chrome/browser/renderer_host/test/test_render_view_host.cc b/chrome/browser/renderer_host/test/test_render_view_host.cc
index 1c71d05..91b7b914 100644
--- a/chrome/browser/renderer_host/test/test_render_view_host.cc
+++ b/chrome/browser/renderer_host/test/test_render_view_host.cc
@@ -108,6 +108,13 @@ void TestRenderWidgetHostView::GPUPluginSetIOSurface(
uint64 io_surface_identifier) {
}
+void TestRenderWidgetHostView::GPUPluginSetTransportDIB(
+ gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) {
+}
+
void TestRenderWidgetHostView::GPUPluginBuffersSwapped(
gfx::PluginWindowHandle window) {
}
diff --git a/chrome/browser/renderer_host/test/test_render_view_host.h b/chrome/browser/renderer_host/test/test_render_view_host.h
index 063b7dd..fbeb388 100644
--- a/chrome/browser/renderer_host/test/test_render_view_host.h
+++ b/chrome/browser/renderer_host/test/test_render_view_host.h
@@ -85,6 +85,10 @@ class TestRenderWidgetHostView : public RenderWidgetHostView {
int32 width,
int32 height,
uint64 io_surface_identifier);
+ virtual void GPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
virtual void GPUPluginBuffersSwapped(gfx::PluginWindowHandle window);
virtual void DrawGPUPluginInstances(CGLContextObj context);
#endif
diff --git a/chrome/common/plugin_messages_internal.h b/chrome/common/plugin_messages_internal.h
index 66df30b..f83bfca 100644
--- a/chrome/common/plugin_messages_internal.h
+++ b/chrome/common/plugin_messages_internal.h
@@ -403,6 +403,17 @@ IPC_BEGIN_MESSAGES(PluginHost)
IPC_MESSAGE_ROUTED1(PluginHostMsg_UpdateGeometry_ACK,
int /* ack_key */)
+ // This message, used in Mac OS X 10.5 and earlier, is sent from the
+ // plug-in process to the renderer process to indicate that the GPU
+ // plug-in allocated a new TransportDIB that holds the GPU's rendered
+ // image. This information is then forwarded to the browser process via
+ // a similar message.
+ IPC_MESSAGE_ROUTED4(PluginHostMsg_GPUPluginSetTransportDIB,
+ gfx::PluginWindowHandle /* window */,
+ int32 /* width */,
+ int32 /* height */,
+ TransportDIB::Handle /* handle to the TransportDIB */)
+
// This message, used only on 10.6 and later, is sent from the
// plug-in process to the renderer process to indicate that the GPU
// plugin allocated a new IOSurface object of the given width and
@@ -418,11 +429,24 @@ IPC_BEGIN_MESSAGES(PluginHost)
int32 /* height */,
uint64 /* identifier for IOSurface */)
- // This message, currently used only on 10.6 and later, notifies the
- // renderer process (and from there the browser process) that the
- // GPU plugin swapped the buffers associated with the given
- // "window", which should cause the browser to redraw the various
- // GPU plugins' contents.
+
+ // On the Mac, shared memory can't be allocated in the sandbox, so
+ // the TransportDIB used by the GPU process for rendering has to be allocated
+ // and managed by the browser. This is a synchronous message, use with care.
+ IPC_SYNC_MESSAGE_ROUTED1_1(PluginHostMsg_AllocTransportDIB,
+ size_t /* requested memory size */,
+ TransportDIB::Handle /* output: DIB handle */)
+
+ // Since the browser keeps handles to the allocated transport DIBs, this
+ // message is sent to tell the browser that it may release them when the
+ // renderer is finished with them.
+ IPC_MESSAGE_ROUTED1(PluginHostMsg_FreeTransportDIB,
+ TransportDIB::Id /* DIB id */)
+
+ // This message notifies the renderer process (and from there the
+ // browser process) that the GPU plugin swapped the buffers associated
+ // with the given "window", which should cause the browser to redraw
+ // the various GPU plugins' contents.
IPC_MESSAGE_ROUTED1(PluginHostMsg_GPUPluginBuffersSwapped,
gfx::PluginWindowHandle /* window */)
#endif
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 490989f..8b4020b 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -1859,7 +1859,18 @@ IPC_BEGIN_MESSAGES(ViewHost)
IPC_MESSAGE_ROUTED1(ViewHostMsg_DestroyFakePluginWindowHandle,
gfx::PluginWindowHandle /* id */)
- // This message is sent from the renderer to the browser on behalf
+ // This message, used on Mac OS X 10.5 and earlier (no IOSurface support),
+ // is sent from the renderer to the browser on behalf of the GPU plugin
+ // to indicate that a new backing store was allocated for that GPU plugin
+ // instance.
+ IPC_MESSAGE_ROUTED4(ViewHostMsg_GPUPluginSetTransportDIB,
+ gfx::PluginWindowHandle /* window */,
+ int32 /* width */,
+ int32 /* height */,
+ TransportDIB::Handle /* handle for the DIB */)
+
+ // This message, used on Mac OS X 10.6 and later (where IOSurface is
+ // supported), is sent from the renderer to the browser on behalf
// of the GPU plugin to indicate that a new backing store was
// allocated for that GPU plugin instance.
//
diff --git a/chrome/plugin/command_buffer_stub.cc b/chrome/plugin/command_buffer_stub.cc
index e6f4b76..103bde3 100644
--- a/chrome/plugin/command_buffer_stub.cc
+++ b/chrome/plugin/command_buffer_stub.cc
@@ -86,6 +86,9 @@ void CommandBufferStub::OnInitialize(int32 size,
processor_->SetSwapBuffersCallback(
NewCallback(this,
&CommandBufferStub::SwapBuffersCallback));
+ processor_->SetTransportDIBAllocAndFree(
+ NewCallback(this, &CommandBufferStub::AllocTransportDIB),
+ NewCallback(this, &CommandBufferStub::FreeTransportDIB));
#endif
buffer.shared_memory->ShareToProcess(peer_handle, ring_buffer);
} else {
@@ -149,13 +152,27 @@ void CommandBufferStub::OnGetTransferBuffer(
#if defined(OS_MACOSX)
void CommandBufferStub::OnSetWindowSize(int32 width, int32 height) {
- uint64 new_backing_store = processor_->SetWindowSize(width, height);
+ // Try using the IOSurface version first.
+ uint64 new_backing_store = processor_->SetWindowSizeForIOSurface(width,
+ height);
if (new_backing_store) {
Send(new PluginHostMsg_GPUPluginSetIOSurface(plugin_host_route_id_,
window_,
width,
height,
new_backing_store));
+ } else {
+ // If |new_backing_store| is 0, it might mean that the IOSurface APIs are
+ // not available. In this case, see if TransportDIBs are supported.
+ TransportDIB::Handle transport_dib =
+ processor_->SetWindowSizeForTransportDIB(width, height);
+ if (TransportDIB::is_valid(transport_dib)) {
+ Send(new PluginHostMsg_GPUPluginSetTransportDIB(plugin_host_route_id_,
+ window_,
+ width,
+ height,
+ transport_dib));
+ }
}
}
@@ -163,4 +180,16 @@ void CommandBufferStub::SwapBuffersCallback() {
Send(new PluginHostMsg_GPUPluginBuffersSwapped(plugin_host_route_id_,
window_));
}
+
+void CommandBufferStub::AllocTransportDIB(const size_t size,
+ TransportDIB::Handle* dib_handle) {
+ Send(new PluginHostMsg_AllocTransportDIB(plugin_host_route_id_,
+ size,
+ dib_handle));
+}
+
+void CommandBufferStub::FreeTransportDIB(TransportDIB::Id dib_id) {
+ Send(new PluginHostMsg_FreeTransportDIB(plugin_host_route_id_,
+ dib_id));
+}
#endif
diff --git a/chrome/plugin/command_buffer_stub.h b/chrome/plugin/command_buffer_stub.h
index f0d8ac0..219aadb 100644
--- a/chrome/plugin/command_buffer_stub.h
+++ b/chrome/plugin/command_buffer_stub.h
@@ -9,6 +9,7 @@
#include "app/gfx/native_widget_types.h"
#include "base/ref_counted.h"
+#include "chrome/common/transport_dib.h"
#include "gpu/command_buffer/common/command_buffer.h"
#include "gpu/command_buffer/service/command_buffer_service.h"
#include "gpu/command_buffer/service/gpu_processor.h"
@@ -52,6 +53,8 @@ class CommandBufferStub : public IPC::Channel::Listener,
#if defined(OS_MACOSX)
void OnSetWindowSize(int32 width, int32 height);
void SwapBuffersCallback();
+ void AllocTransportDIB(const size_t size, TransportDIB::Handle* dib_handle);
+ void FreeTransportDIB(TransportDIB::Id dib_id);
#endif
scoped_refptr<PluginChannel> channel_;
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 2398d4c..17161e9 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -4531,6 +4531,27 @@ void RenderView::GPUPluginSetIOSurface(gfx::PluginWindowHandle window,
routing_id(), window, width, height, io_surface_identifier));
}
+void RenderView::GPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) {
+ Send(new ViewHostMsg_GPUPluginSetTransportDIB(
+ routing_id(), window, width, height, transport_dib));
+}
+
+TransportDIB::Handle RenderView::GPUPluginAllocTransportDIB(size_t size) {
+ TransportDIB::Handle dib_handle;
+ // Assume this is a synchronous RPC.
+ if (Send(new ViewHostMsg_AllocTransportDIB(size, &dib_handle)))
+ return dib_handle;
+ // Return an invalid handle if Send() fails.
+ return TransportDIB::DefaultHandleValue();
+}
+
+void RenderView::GPUPluginFreeTransportDIB(TransportDIB::Id dib_id) {
+ Send(new ViewHostMsg_FreeTransportDIB(dib_id));
+}
+
void RenderView::GPUPluginBuffersSwapped(gfx::PluginWindowHandle window) {
Send(new ViewHostMsg_GPUPluginBuffersSwapped(routing_id(), window));
}
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index b6be66c..85cd503 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -29,6 +29,7 @@
#include "chrome/common/page_zoom.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/renderer_preferences.h"
+#include "chrome/common/transport_dib.h"
#include "chrome/common/view_types.h"
#include "chrome/renderer/automation/dom_automation_controller.h"
#include "chrome/renderer/dom_ui_bindings.h"
@@ -472,6 +473,12 @@ class RenderView : public RenderWidget,
int32 width,
int32 height,
uint64 io_surface_identifier);
+ TransportDIB::Handle GPUPluginAllocTransportDIB(size_t size);
+ void GPUPluginFreeTransportDIB(TransportDIB::Id dib_id);
+ void GPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
void GPUPluginBuffersSwapped(gfx::PluginWindowHandle window);
#endif
diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc
index 178f07f..a743a3f 100644
--- a/chrome/renderer/webplugin_delegate_proxy.cc
+++ b/chrome/renderer/webplugin_delegate_proxy.cc
@@ -4,12 +4,12 @@
#include "chrome/renderer/webplugin_delegate_proxy.h"
-#include <algorithm>
-
#if defined(OS_LINUX)
#include <gtk/gtk.h>
#endif
+#include <algorithm>
+
#include "app/gfx/blit.h"
#include "app/gfx/canvas.h"
#include "app/gfx/native_widget_types.h"
@@ -398,9 +398,16 @@ void WebPluginDelegateProxy::OnMessageReceived(const IPC::Message& msg) {
#if defined(OS_MACOSX)
IPC_MESSAGE_HANDLER(PluginHostMsg_UpdateGeometry_ACK,
OnUpdateGeometry_ACK)
- // Used only on 10.6 and later
+ // Used only on 10.6 and later.
IPC_MESSAGE_HANDLER(PluginHostMsg_GPUPluginSetIOSurface,
OnGPUPluginSetIOSurface)
+ // Used on 10.5 and earlier.
+ IPC_MESSAGE_HANDLER(PluginHostMsg_GPUPluginSetTransportDIB,
+ OnGPUPluginSetTransportDIB)
+ IPC_MESSAGE_HANDLER(PluginHostMsg_AllocTransportDIB,
+ OnGPUPluginAllocTransportDIB)
+ IPC_MESSAGE_HANDLER(PluginHostMsg_FreeTransportDIB,
+ OnGPUPluginFreeTransportDIB)
IPC_MESSAGE_HANDLER(PluginHostMsg_GPUPluginBuffersSwapped,
OnGPUPluginBuffersSwapped)
#endif
@@ -503,8 +510,7 @@ void WebPluginDelegateProxy::UpdateGeometry(const gfx::Rect& window_rect,
// scripts the plugin to start playing while it's in the middle of handling
// an update geometry message, videos don't play. See urls in bug 20260.
msg = new PluginMsg_UpdateGeometrySync(instance_id_, param);
- }
- else
+ } else // NO_LINT
#endif
{
msg = new PluginMsg_UpdateGeometry(instance_id_, param);
@@ -1325,6 +1331,31 @@ void WebPluginDelegateProxy::OnGPUPluginSetIOSurface(
io_surface_identifier);
}
+void WebPluginDelegateProxy::OnGPUPluginSetTransportDIB(
+ gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib) {
+ if (render_view_)
+ render_view_->GPUPluginSetTransportDIB(window, width, height,
+ transport_dib);
+}
+
+void WebPluginDelegateProxy::OnGPUPluginAllocTransportDIB(
+ size_t size,
+ TransportDIB::Handle* dib_handle) {
+ if (render_view_)
+ *dib_handle = render_view_->GPUPluginAllocTransportDIB(size);
+ else
+ *dib_handle = TransportDIB::DefaultHandleValue();
+}
+
+void WebPluginDelegateProxy::OnGPUPluginFreeTransportDIB(
+ TransportDIB::Id dib_id) {
+ if (render_view_)
+ render_view_->GPUPluginFreeTransportDIB(dib_id);
+}
+
void WebPluginDelegateProxy::OnGPUPluginBuffersSwapped(
gfx::PluginWindowHandle window) {
if (render_view_)
diff --git a/chrome/renderer/webplugin_delegate_proxy.h b/chrome/renderer/webplugin_delegate_proxy.h
index 98eb1ee..18d2704 100644
--- a/chrome/renderer/webplugin_delegate_proxy.h
+++ b/chrome/renderer/webplugin_delegate_proxy.h
@@ -152,6 +152,13 @@ class WebPluginDelegateProxy
int32 width,
int32 height,
uint64 io_surface_identifier);
+ void OnGPUPluginSetTransportDIB(gfx::PluginWindowHandle window,
+ int32 width,
+ int32 height,
+ TransportDIB::Handle transport_dib);
+ void OnGPUPluginAllocTransportDIB(size_t size,
+ TransportDIB::Handle* dib_handle);
+ void OnGPUPluginFreeTransportDIB(TransportDIB::Id dib_id);
void OnGPUPluginBuffersSwapped(gfx::PluginWindowHandle window);
#endif