summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-27 15:24:25 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-27 15:24:25 +0000
commitd8a58e44578fa646480cec37db3ddb40a5b673b7 (patch)
tree4221925985cab2e659d9b2a22434810361c1958a /chrome/renderer
parent5ba9c9ae342ff20bde44be9dfc538727d3696865 (diff)
downloadchromium_src-d8a58e44578fa646480cec37db3ddb40a5b673b7.zip
chromium_src-d8a58e44578fa646480cec37db3ddb40a5b673b7.tar.gz
chromium_src-d8a58e44578fa646480cec37db3ddb40a5b673b7.tar.bz2
Route IPC through browser when creating a viewable command buffer.
The communications path for creating a viewable command buffer used to be directly from the renderer (gpu_channel.cc) to the gpu process (gpu_channel.cc). This patch makes the browser an intermediary: - renderer (gpu_channel.cc) makes a synchronous request to the browser (picked up in renderer_message_filter.cc and forwarded to gpu_process_host.cc) - browser (gpu_process_host.cc) makes an asynchronous request to the gpu process (picked up in gpu_thread.cc and forwarded to gpu_channel.cc) for the command buffer - gpu process (gpu_thread.cc) sends an ACK with the route_id for the command buffer back to the browser (gpu_process_host.cc) - browser (gpu_process_host.cc) sends a delayed reply back to the renderer (gpu_channel_host.cc), which had blocked There are several motivations for this patch: - creating an onscreen command buffer requires a window to draw into (which is acquired/locked in the browser); by routing through the browser, we can acquire the get the window beforehand (thereby preventing a deadlock in some other work that I'm doing) - we can eliminate several separate synchronous IPC messages for obtaining and releasing the window associated with drawing (I've tried to unify the different code paths for Linux, Windows, and Mac) - in the future, we can have the browser allocate SHM for the command buffer and transfer buffers, allowing us to sandbox the gpu process BUG=none TEST=by hand on all 3 platforms, trybots Review URL: http://codereview.chromium.org/6343006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72798 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/ggl/ggl.cc12
-rw-r--r--chrome/renderer/ggl/ggl.h1
-rw-r--r--chrome/renderer/gpu_channel_host.cc9
-rw-r--r--chrome/renderer/gpu_channel_host.h1
-rw-r--r--chrome/renderer/render_widget_fullscreen_pepper.cc21
-rw-r--r--chrome/renderer/render_widget_fullscreen_pepper.h3
-rw-r--r--chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc26
-rw-r--r--chrome/renderer/webgraphicscontext3d_command_buffer_impl.h4
8 files changed, 10 insertions, 67 deletions
diff --git a/chrome/renderer/ggl/ggl.cc b/chrome/renderer/ggl/ggl.cc
index 8dea509..43b6f67 100644
--- a/chrome/renderer/ggl/ggl.cc
+++ b/chrome/renderer/ggl/ggl.cc
@@ -62,7 +62,7 @@ class Context : public base::SupportsWeakPtr<Context> {
// Initialize a GGL context that can be used in association with a a GPU
// channel acquired from a RenderWidget or RenderView.
- bool Initialize(gfx::NativeViewId view,
+ bool Initialize(bool onscreen,
int render_view_id,
const gfx::Size& size,
const char* allowed_extensions,
@@ -156,7 +156,7 @@ Context::~Context() {
Destroy();
}
-bool Context::Initialize(gfx::NativeViewId view,
+bool Context::Initialize(bool onscreen,
int render_view_id,
const gfx::Size& size,
const char* allowed_extensions,
@@ -207,9 +207,8 @@ bool Context::Initialize(gfx::NativeViewId view,
}
// Create a proxy to a command buffer in the GPU process.
- if (view) {
+ if (onscreen) {
command_buffer_ = channel_->CreateViewCommandBuffer(
- view,
render_view_id,
allowed_extensions,
attribs);
@@ -434,14 +433,13 @@ void Context::OnSwapBuffers() {
#endif // ENABLE_GPU
Context* CreateViewContext(GpuChannelHost* channel,
- gfx::NativeViewId view,
int render_view_id,
const char* allowed_extensions,
const int32* attrib_list) {
#if defined(ENABLE_GPU)
scoped_ptr<Context> context(new Context(channel, NULL));
if (!context->Initialize(
- view, render_view_id, gfx::Size(), allowed_extensions, attrib_list))
+ true, render_view_id, gfx::Size(), allowed_extensions, attrib_list))
return NULL;
return context.release();
@@ -465,7 +463,7 @@ Context* CreateOffscreenContext(GpuChannelHost* channel,
const int32* attrib_list) {
#if defined(ENABLE_GPU)
scoped_ptr<Context> context(new Context(channel, parent));
- if (!context->Initialize(0, 0, size, allowed_extensions, attrib_list))
+ if (!context->Initialize(false, 0, size, allowed_extensions, attrib_list))
return NULL;
return context.release();
diff --git a/chrome/renderer/ggl/ggl.h b/chrome/renderer/ggl/ggl.h
index dcedcc0..c7402a0 100644
--- a/chrome/renderer/ggl/ggl.h
+++ b/chrome/renderer/ggl/ggl.h
@@ -80,7 +80,6 @@ bool Terminate();
// TODO(kbr): clean up the arguments to this function and make them
// more cross-platform.
Context* CreateViewContext(GpuChannelHost* channel,
- gfx::NativeViewId view,
int render_view_id,
const char* allowed_extensions,
const int32* attrib_list);
diff --git a/chrome/renderer/gpu_channel_host.cc b/chrome/renderer/gpu_channel_host.cc
index 719e8bf..10b52ed 100644
--- a/chrome/renderer/gpu_channel_host.cc
+++ b/chrome/renderer/gpu_channel_host.cc
@@ -7,8 +7,10 @@
#include "chrome/common/child_process.h"
#include "chrome/common/gpu_create_command_buffer_config.h"
#include "chrome/common/gpu_messages.h"
+#include "chrome/common/render_messages.h"
#include "chrome/renderer/command_buffer_proxy.h"
#include "chrome/renderer/gpu_video_service_host.h"
+#include "chrome/renderer/render_thread.h"
GpuChannelHost::GpuChannelHost() : state_(kUnconnected) {
}
@@ -90,7 +92,6 @@ bool GpuChannelHost::Send(IPC::Message* message) {
}
CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer(
- gfx::NativeViewId view,
int render_view_id,
const std::string& allowed_extensions,
const std::vector<int32>& attribs) {
@@ -101,10 +102,8 @@ CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer(
GPUCreateCommandBufferConfig init_params(allowed_extensions, attribs);
int32 route_id;
- if (!Send(new GpuChannelMsg_CreateViewCommandBuffer(view,
- render_view_id,
- init_params,
- &route_id))) {
+ if (!RenderThread::current()->Send(new ViewHostMsg_CreateViewCommandBuffer(
+ render_view_id, init_params, &route_id))) {
return NULL;
}
diff --git a/chrome/renderer/gpu_channel_host.h b/chrome/renderer/gpu_channel_host.h
index 8f14841..e7763f1 100644
--- a/chrome/renderer/gpu_channel_host.h
+++ b/chrome/renderer/gpu_channel_host.h
@@ -65,7 +65,6 @@ class GpuChannelHost : public IPC::Channel::Listener,
// Create and connect to a command buffer in the GPU process.
CommandBufferProxy* CreateViewCommandBuffer(
- gfx::NativeViewId view,
int render_view_id,
const std::string& allowed_extensions,
const std::vector<int32>& attribs);
diff --git a/chrome/renderer/render_widget_fullscreen_pepper.cc b/chrome/renderer/render_widget_fullscreen_pepper.cc
index c4b2d50..091a190 100644
--- a/chrome/renderer/render_widget_fullscreen_pepper.cc
+++ b/chrome/renderer/render_widget_fullscreen_pepper.cc
@@ -162,9 +162,6 @@ RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper(
webkit::ppapi::PluginInstance* plugin)
: RenderWidgetFullscreen(render_thread, WebKit::WebPopupTypeSelect),
plugin_(plugin),
-#if defined(OS_MACOSX)
- plugin_handle_(NULL),
-#endif
context_(NULL),
buffer_(0),
program_(0) {
@@ -267,16 +264,6 @@ void RenderWidgetFullscreenPepper::CreateContext() {
GpuChannelHost* host = render_thread->EstablishGpuChannelSync();
if (!host)
return;
- gfx::NativeViewId view_id;
-#if !defined(OS_MACOSX)
- view_id = host_window();
-#else
- Send(new ViewHostMsg_AllocateFakePluginWindowHandle(
- routing_id(), true, true, &plugin_handle_));
- if (!plugin_handle_)
- return;
- view_id = static_cast<gfx::NativeViewId>(plugin_handle_);
-#endif
const int32 attribs[] = {
ggl::GGL_ALPHA_SIZE, 8,
ggl::GGL_DEPTH_SIZE, 0,
@@ -287,7 +274,6 @@ void RenderWidgetFullscreenPepper::CreateContext() {
};
context_ = ggl::CreateViewContext(
host,
- view_id,
routing_id(),
"GL_OES_packed_depth_stencil GL_OES_depth24",
attribs);
@@ -314,13 +300,6 @@ void RenderWidgetFullscreenPepper::DestroyContext() {
ggl::DestroyContext(context_);
context_ = NULL;
}
-#if defined(OS_MACOSX)
- if (plugin_handle_) {
- Send(new ViewHostMsg_DestroyFakePluginWindowHandle(routing_id(),
- plugin_handle_));
- plugin_handle_ = NULL;
- }
-#endif
}
namespace {
diff --git a/chrome/renderer/render_widget_fullscreen_pepper.h b/chrome/renderer/render_widget_fullscreen_pepper.h
index af3c506..9e201da 100644
--- a/chrome/renderer/render_widget_fullscreen_pepper.h
+++ b/chrome/renderer/render_widget_fullscreen_pepper.h
@@ -78,9 +78,6 @@ class RenderWidgetFullscreenPepper : public RenderWidgetFullscreen,
// The plugin instance this widget wraps.
webkit::ppapi::PluginInstance* plugin_;
-#if defined(OS_MACOSX)
- gfx::PluginWindowHandle plugin_handle_;
-#endif
// GL context for compositing.
ggl::Context* context_;
unsigned int buffer_;
diff --git a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc
index 1d8e5d6..0e97b94 100644
--- a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc
+++ b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.cc
@@ -27,9 +27,6 @@
WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl()
: context_(NULL),
web_view_(NULL),
-#if defined(OS_MACOSX)
- plugin_handle_(NULL),
-#endif // defined(OS_MACOSX)
cached_width_(0),
cached_height_(0),
bound_fbo_(0) {
@@ -37,19 +34,6 @@ WebGraphicsContext3DCommandBufferImpl::WebGraphicsContext3DCommandBufferImpl()
WebGraphicsContext3DCommandBufferImpl::
~WebGraphicsContext3DCommandBufferImpl() {
-#if defined(OS_MACOSX)
- if (web_view_) {
- DCHECK(plugin_handle_ != gfx::kNullPluginWindow);
- RenderView* renderview = RenderView::FromWebView(web_view_);
- // The RenderView might already have been freed, but in its
- // destructor it destroys all fake plugin window handles it
- // allocated.
- if (renderview) {
- renderview->DestroyFakePluginWindowHandle(plugin_handle_);
- }
- plugin_handle_ = gfx::kNullPluginWindow;
- }
-#endif
if (context_) {
ggl::DestroyContext(context_);
}
@@ -101,18 +85,10 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize(
RenderView* renderview = RenderView::FromWebView(web_view);
if (!renderview)
return false;
- gfx::NativeViewId view_id;
-#if !defined(OS_MACOSX)
- view_id = renderview->host_window();
-#else
- plugin_handle_ = renderview->AllocateFakePluginWindowHandle(
- /*opaque=*/true, /*root=*/true);
- view_id = static_cast<gfx::NativeViewId>(plugin_handle_);
-#endif
+
web_view_ = web_view;
context_ = ggl::CreateViewContext(
host,
- view_id,
renderview->routing_id(),
kWebGraphicsContext3DPerferredGLExtensions,
attribs);
diff --git a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.h b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.h
index 4d92240..c70c80f 100644
--- a/chrome/renderer/webgraphicscontext3d_command_buffer_impl.h
+++ b/chrome/renderer/webgraphicscontext3d_command_buffer_impl.h
@@ -387,10 +387,6 @@ class WebGraphicsContext3DCommandBufferImpl
ggl::Context* context_;
// If rendering directly to WebView, weak pointer to it.
WebKit::WebView* web_view_;
-#if defined(OS_MACOSX)
- // "Fake" plugin window handle in browser process for the compositor's output.
- gfx::PluginWindowHandle plugin_handle_;
-#endif
WebKit::WebGraphicsContext3D::Attributes attributes_;
int cached_width_, cached_height_;