summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-05 03:07:07 +0000
committerpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-05 03:07:07 +0000
commit4049046a39cb364577a1ac8a2aac47a86afc5b7b (patch)
treee670e88f432ee925b7b89994eff756052739af60 /gpu
parent07a174f4c159a347c6d7e10a5f3da2d5966c92d1 (diff)
downloadchromium_src-4049046a39cb364577a1ac8a2aac47a86afc5b7b.zip
chromium_src-4049046a39cb364577a1ac8a2aac47a86afc5b7b.tar.gz
chromium_src-4049046a39cb364577a1ac8a2aac47a86afc5b7b.tar.bz2
linux: implement gpu plugin
Review URL: http://codereview.chromium.org/500132 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35509 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc7
-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
7 files changed, 91 insertions, 27 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 0345580..72f2785 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;
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;
@@ -1217,7 +1219,7 @@ void GLES2DecoderImpl::UpdateProgramInfo(GLuint program) {
program, ii, max_len + 1, &length, &size, &type, name_buffer.get());
// TODO(gman): Should we check for error?
GLint location = glGetAttribLocation(program, name_buffer.get());
- info->SetAttributeLocation(ii, num_attribs);
+ info->SetAttributeLocation(ii, location);
}
}
@@ -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) {