summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-06 04:38:55 +0000
committerpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-06 04:38:55 +0000
commitbe4f188066196d7bd0a4a7a62254bb603e566f74 (patch)
treea493671ea3e09fec3d20c86a0e452d509e7c9954
parentee3cd175f8592b2b1f2ccd14b071d56ca733a5c6 (diff)
downloadchromium_src-be4f188066196d7bd0a4a7a62254bb603e566f74.zip
chromium_src-be4f188066196d7bd0a4a7a62254bb603e566f74.tar.gz
chromium_src-be4f188066196d7bd0a4a7a62254bb603e566f74.tar.bz2
linux: implement gpu plugin
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=35509 Review URL: http://codereview.chromium.org/500132 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35612 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--build/common.gypi5
-rwxr-xr-xchrome/chrome.gyp8
-rwxr-xr-xchrome/chrome_renderer.gypi10
-rw-r--r--chrome/plugin/command_buffer_stub.cc8
-rw-r--r--chrome/plugin/command_buffer_stub.h4
-rw-r--r--chrome/renderer/command_buffer_proxy.cc10
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.h8
-rw-r--r--gpu/command_buffer/service/gpu_processor.cc21
-rw-r--r--gpu/command_buffer/service/gpu_processor_linux.cc50
-rw-r--r--gpu/command_buffer/service/gpu_processor_win.cc19
-rw-r--r--gpu/gpu.gyp4
-rw-r--r--gpu/gpu_plugin/gpu_plugin.cc9
-rw-r--r--third_party/glew/src/glew.c4
-rw-r--r--webkit/webkit.gyp8
15 files changed, 125 insertions, 48 deletions
diff --git a/build/common.gypi b/build/common.gypi
index b05588b..c3181b3 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -148,9 +148,6 @@
# Whether to add the experimental build define.
'chrome_frame_define%': 0,
- # Whether GPU plugin build is enabled.
- 'enable_gpu%': 0,
-
# Whether usage of OpenMAX is enabled.
'enable_openmax%': 0,
@@ -349,7 +346,7 @@
}],
],
}],
- ['OS=="win"', {
+ ['OS=="win" or (OS=="linux" and target_arch!="arm")', {
'defines': [
'ENABLE_GPU=1',
],
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index ab54446..903c39c 100755
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -451,9 +451,6 @@
# end up using this module as well.
'conditions': [
['OS=="win"', {
- 'dependencies': [
- '../gpu/gpu.gyp:command_buffer_service',
- ],
'defines': [
'__STD_C',
'_CRT_SECURE_NO_DEPRECATE',
@@ -462,6 +459,11 @@
'include_dirs': [
'third_party/wtl/include',
],
+ }],
+ ['OS=="win" or (OS=="linux" and target_arch!="arm")', {
+ 'dependencies': [
+ '../gpu/gpu.gyp:command_buffer_service',
+ ],
'sources': [
'plugin/command_buffer_stub.cc',
'plugin/command_buffer_stub.h',
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index d9cc809..40a066a 100755
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -165,10 +165,6 @@
'include_dirs': [
'third_party/wtl/include',
],
- 'sources': [
- 'renderer/command_buffer_proxy.cc',
- 'renderer/command_buffer_proxy.h',
- ],
'conditions': [
['win_use_allocator_shim==1', {
'dependencies': [
@@ -180,6 +176,12 @@
}],
],
}],
+ ['OS=="win" or (OS=="linux" and target_arch!="arm")', {
+ 'sources': [
+ 'renderer/command_buffer_proxy.cc',
+ 'renderer/command_buffer_proxy.h',
+ ],
+ }],
],
},
],
diff --git a/chrome/plugin/command_buffer_stub.cc b/chrome/plugin/command_buffer_stub.cc
index d7dbf9f..4a9dd5c 100644
--- a/chrome/plugin/command_buffer_stub.cc
+++ b/chrome/plugin/command_buffer_stub.cc
@@ -11,9 +11,9 @@
using gpu::Buffer;
CommandBufferStub::CommandBufferStub(PluginChannel* channel,
- gfx::NativeView view)
+ gfx::PluginWindowHandle window)
: channel_(channel),
- view_(view) {
+ window_(window) {
route_id_ = channel->GenerateRouteID();
channel->AddRoute(route_id_, this, false);
}
@@ -54,7 +54,7 @@ void CommandBufferStub::OnInitialize(int32 size,
Buffer buffer = command_buffer_->GetRingBuffer();
if (buffer.shared_memory) {
processor_ = new gpu::GPUProcessor(command_buffer_.get());
- if (processor_->Initialize(view_)) {
+ if (processor_->Initialize(window_)) {
command_buffer_->SetPutOffsetChangeCallback(
NewCallback(processor_.get(),
&gpu::GPUProcessor::ProcessCommands));
@@ -93,7 +93,7 @@ void CommandBufferStub::OnGetTransferBuffer(
int32 id,
base::SharedMemoryHandle* transfer_buffer,
size_t* size) {
- *transfer_buffer = 0;
+ *transfer_buffer = base::SharedMemoryHandle();
*size = 0;
// Assume service is responsible for duplicating the handle to the calling
diff --git a/chrome/plugin/command_buffer_stub.h b/chrome/plugin/command_buffer_stub.h
index c7d765e..4608d0e 100644
--- a/chrome/plugin/command_buffer_stub.h
+++ b/chrome/plugin/command_buffer_stub.h
@@ -21,7 +21,7 @@ class CommandBufferService;
class CommandBufferStub : public IPC::Channel::Listener,
public IPC::Message::Sender {
public:
- CommandBufferStub(PluginChannel* channel, gfx::NativeView view);
+ CommandBufferStub(PluginChannel* channel, gfx::PluginWindowHandle window);
virtual ~CommandBufferStub();
@@ -50,7 +50,7 @@ class CommandBufferStub : public IPC::Channel::Listener,
void OnGetErrorStatus(bool* error_status);
scoped_refptr<PluginChannel> channel_;
- gfx::NativeView view_;
+ gfx::PluginWindowHandle window_;
int route_id_;
scoped_ptr<gpu::CommandBufferService> command_buffer_;
scoped_refptr<gpu::GPUProcessor> processor_;
diff --git a/chrome/renderer/command_buffer_proxy.cc b/chrome/renderer/command_buffer_proxy.cc
index b78fa84..3b68cc2 100644
--- a/chrome/renderer/command_buffer_proxy.cc
+++ b/chrome/renderer/command_buffer_proxy.cc
@@ -153,12 +153,20 @@ Buffer CommandBufferProxy::GetTransferBuffer(int32 id) {
}
// Cache the transfer buffer shared memory object client side.
+#if defined(OS_WIN)
+ // TODO(piman): Does Windows needs this version of the constructor ? It
+ // duplicates the handle, but I'm not sure why it is necessary - it was
+ // already duped by the CommandBufferStub.
base::SharedMemory* shared_memory =
new base::SharedMemory(handle, false, base::GetCurrentProcessHandle());
+#else
+ base::SharedMemory* shared_memory =
+ new base::SharedMemory(handle, false);
+#endif
// Map the shared memory on demand.
if (!shared_memory->memory()) {
- if (!shared_memory->Map(shared_memory->max_size())) {
+ if (!shared_memory->Map(size)) {
delete shared_memory;
return Buffer();
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index a1ca73b..8b1fcf5 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -14,6 +14,9 @@
#include "gpu/command_buffer/service/cmd_buffer_engine.h"
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/command_buffer/service/gles2_cmd_validation.h"
+#if defined(OS_LINUX)
+#include "gpu/command_buffer/service/x_utils.h"
+#endif
namespace gpu {
namespace gles2 {
@@ -982,7 +985,6 @@ parse_error::ParseError GLES2DecoderImpl::DoCommand(
parse_error::ParseError result = parse_error::kParseNoError;
if (debug()) {
// TODO(gman): Change output to something useful for NaCl.
- const char* f = GetCommandName(command);
printf("cmd: %s\n", GetCommandName(command));
}
unsigned int command_index = command - kStartPoint - 1;
@@ -1757,4 +1759,3 @@ parse_error::ParseError GLES2DecoderImpl::HandleGetActiveAttrib(
} // namespace gles2
} // namespace gpu
-
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 646fbcc..09d00f4 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -8,14 +8,16 @@
#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_H_
#include <build/build_config.h>
-#if defined(OS_LINUX)
-#include "gpu/command_buffer/service/x_utils.h"
-#elif defined(OS_WIN)
+#if defined(OS_WIN)
#include <windows.h>
#endif
#include "gpu/command_buffer/service/common_decoder.h"
namespace gpu {
+// Forward-declared instead of including x_utils.h, because including glx.h
+// causes havok.
+class XWindowWrapper;
+
namespace gles2 {
// This class implements the AsyncAPIInterface interface, decoding GLES2
diff --git a/gpu/command_buffer/service/gpu_processor.cc b/gpu/command_buffer/service/gpu_processor.cc
index 0968215..c095341 100644
--- a/gpu/command_buffer/service/gpu_processor.cc
+++ b/gpu/command_buffer/service/gpu_processor.cc
@@ -9,6 +9,25 @@ using ::base::SharedMemory;
namespace gpu {
+GPUProcessor::GPUProcessor(CommandBuffer* command_buffer)
+ : command_buffer_(command_buffer),
+ commands_per_update_(100) {
+ DCHECK(command_buffer);
+ decoder_.reset(gles2::GLES2Decoder::Create());
+ decoder_->set_engine(this);
+}
+
+GPUProcessor::GPUProcessor(CommandBuffer* command_buffer,
+ gles2::GLES2Decoder* decoder,
+ CommandParser* parser,
+ int commands_per_update)
+ : command_buffer_(command_buffer),
+ commands_per_update_(commands_per_update) {
+ DCHECK(command_buffer);
+ decoder_.reset(decoder);
+ parser_.reset(parser);
+}
+
GPUProcessor::~GPUProcessor() {
}
@@ -32,6 +51,8 @@ void GPUProcessor::ProcessCommands() {
command_buffer_->SetParseError(parse_error);
command_buffer_->RaiseErrorStatus();
return;
+ case gpu::parse_error::kParseNoError:
+ break;
}
++commands_processed;
diff --git a/gpu/command_buffer/service/gpu_processor_linux.cc b/gpu/command_buffer/service/gpu_processor_linux.cc
new file mode 100644
index 0000000..205cceb
--- /dev/null
+++ b/gpu/command_buffer/service/gpu_processor_linux.cc
@@ -0,0 +1,50 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <gdk/gdkx.h>
+#include "gpu/command_buffer/service/gpu_processor.h"
+#include "gpu/command_buffer/service/x_utils.h"
+
+using ::base::SharedMemory;
+
+namespace gpu {
+
+bool GPUProcessor::Initialize(gfx::PluginWindowHandle handle) {
+ DCHECK(handle);
+
+ // Cannot reinitialize.
+ if (decoder_->window() != NULL)
+ return false;
+
+ // Map the ring buffer and create the parser.
+ Buffer ring_buffer = command_buffer_->GetRingBuffer();
+ if (ring_buffer.ptr) {
+ parser_.reset(new CommandParser(ring_buffer.ptr,
+ ring_buffer.size,
+ 0,
+ ring_buffer.size,
+ 0,
+ decoder_.get()));
+ } else {
+ parser_.reset(new CommandParser(NULL, 0, 0, 0, 0,
+ decoder_.get()));
+ }
+
+ // Initialize GAPI immediately if the window handle is valid.
+ XWindowWrapper *window = new XWindowWrapper(GDK_DISPLAY(), handle);
+ decoder_->set_window_wrapper(window);
+ return decoder_->Initialize();
+}
+
+void GPUProcessor::Destroy() {
+ // Destroy GAPI if window handle has not already become invalid.
+ XWindowWrapper *window = decoder_->window();
+ if (window) {
+ decoder_->Destroy();
+ decoder_->set_window_wrapper(NULL);
+ delete window;
+ }
+}
+
+} // namespace gpu
diff --git a/gpu/command_buffer/service/gpu_processor_win.cc b/gpu/command_buffer/service/gpu_processor_win.cc
index 6a05845..bef34d8 100644
--- a/gpu/command_buffer/service/gpu_processor_win.cc
+++ b/gpu/command_buffer/service/gpu_processor_win.cc
@@ -10,25 +10,6 @@ using ::base::SharedMemory;
namespace gpu {
-GPUProcessor::GPUProcessor(CommandBuffer* command_buffer)
- : command_buffer_(command_buffer),
- commands_per_update_(100) {
- DCHECK(command_buffer);
- decoder_.reset(gles2::GLES2Decoder::Create());
- decoder_->set_engine(this);
-}
-
-GPUProcessor::GPUProcessor(CommandBuffer* command_buffer,
- gles2::GLES2Decoder* decoder,
- CommandParser* parser,
- int commands_per_update)
- : command_buffer_(command_buffer),
- commands_per_update_(commands_per_update) {
- DCHECK(command_buffer);
- decoder_.reset(decoder);
- parser_.reset(parser);
-}
-
bool GPUProcessor::Initialize(gfx::PluginWindowHandle handle) {
DCHECK(handle);
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index d056bea..ee00088 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -250,9 +250,13 @@
['OS == "linux"',
{
'sources': [
+ 'command_buffer/service/gpu_processor_linux.cc',
'command_buffer/service/x_utils.cc',
'command_buffer/service/x_utils.h',
],
+ 'dependencies': [
+ '../build/linux/system.gyp:gtk',
+ ]
},
],
['OS == "win"',
diff --git a/gpu/gpu_plugin/gpu_plugin.cc b/gpu/gpu_plugin/gpu_plugin.cc
index 10df734..dc69e61 100644
--- a/gpu/gpu_plugin/gpu_plugin.cc
+++ b/gpu/gpu_plugin/gpu_plugin.cc
@@ -38,8 +38,13 @@ int16 NPP_HandleEvent(NPP instance, void* event) {
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) {
if (!instance)
return NPERR_INVALID_INSTANCE_ERROR;
-
- return NPERR_GENERIC_ERROR;
+ switch (variable) {
+ case NPPVpluginNeedsXEmbed:
+ *static_cast<NPBool *>(value) = 1;
+ return NPERR_NO_ERROR;
+ default:
+ return NPERR_INVALID_PARAM;
+ }
}
NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) {
diff --git a/third_party/glew/src/glew.c b/third_party/glew/src/glew.c
index 17d2565..fb67781 100644
--- a/third_party/glew/src/glew.c
+++ b/third_party/glew/src/glew.c
@@ -9557,7 +9557,7 @@ GLboolean glxewGetExtension (const char* name)
/* if (glXQueryExtensionsString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; */
/* p = (GLubyte*)glXQueryExtensionsString(glXGetCurrentDisplay(), DefaultScreen(glXGetCurrentDisplay())); */
if (__glewXGetClientString == NULL) {
- __glewXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) glewGetProcAddress("glXGetClientString");
+ __glewXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) glewGetProcAddress((const GLubyte *)"glXGetClientString");
}
if (__glewXGetClientString == NULL) return GL_FALSE;
if (glXGetCurrentDisplay == NULL) return GL_FALSE;
@@ -9580,7 +9580,7 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
int major, minor;
static PFNGLXQUERYVERSIONPROC __glewXQueryVersion = NULL;
if (__glewXQueryVersion == NULL) {
- __glewXQueryVersion = (PFNGLXQUERYVERSIONPROC) glewGetProcAddress("glXQueryVersion");
+ __glewXQueryVersion = (PFNGLXQUERYVERSIONPROC) glewGetProcAddress((const GLubyte *)"glXQueryVersion");
}
if (__glewXQueryVersion == NULL) return GL_FALSE;
/* initialize core GLX 1.2 */
diff --git a/webkit/webkit.gyp b/webkit/webkit.gyp
index cf0ff34..c95ad3a 100644
--- a/webkit/webkit.gyp
+++ b/webkit/webkit.gyp
@@ -428,7 +428,12 @@
['exclude', r'/gtk_']],
}],
['OS!="mac"', {
- 'sources/': [['exclude', '_mac\\.(cc|mm)$']]
+ 'sources/': [['exclude', '_mac\\.(cc|mm)$']],
+ }],
+ ['OS=="win" or (OS=="linux" and target_arch!="arm")', {
+ 'dependencies': [
+ '../gpu/gpu.gyp:gpu_plugin',
+ ],
}],
['OS!="win"', {
'sources/': [['exclude', '_win\\.cc$']],
@@ -446,7 +451,6 @@
],
'dependencies': [
'../build/win/system.gyp:cygwin',
- '../gpu/gpu.gyp:gpu_plugin',
'default_plugin/default_plugin.gyp:default_plugin',
],
'sources!': [