From 4049046a39cb364577a1ac8a2aac47a86afc5b7b Mon Sep 17 00:00:00 2001 From: "piman@chromium.org" Date: Tue, 5 Jan 2010 03:07:07 +0000 Subject: 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 --- gpu/command_buffer/service/gles2_cmd_decoder.cc | 7 ++-- gpu/command_buffer/service/gles2_cmd_decoder.h | 8 ++-- gpu/command_buffer/service/gpu_processor.cc | 21 ++++++++++ gpu/command_buffer/service/gpu_processor_linux.cc | 50 +++++++++++++++++++++++ gpu/command_buffer/service/gpu_processor_win.cc | 19 --------- gpu/gpu.gyp | 4 ++ gpu/gpu_plugin/gpu_plugin.cc | 9 +++- 7 files changed, 91 insertions(+), 27 deletions(-) create mode 100644 gpu/command_buffer/service/gpu_processor_linux.cc (limited to 'gpu') 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 -#if defined(OS_LINUX) -#include "gpu/command_buffer/service/x_utils.h" -#elif defined(OS_WIN) +#if defined(OS_WIN) #include #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 +#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(value) = 1; + return NPERR_NO_ERROR; + default: + return NPERR_INVALID_PARAM; + } } NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) { -- cgit v1.1