summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
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/renderer
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/renderer')
-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
4 files changed, 71 insertions, 5 deletions
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