Index: content/common/gpu/gpu_command_buffer_stub.cc |
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc |
index 3890e81feea245637c17c36d56b2ee1963ea3572..b86750a61fcb21facee28c332dc56a93fd45b417 100644 |
--- a/content/common/gpu/gpu_command_buffer_stub.cc |
+++ b/content/common/gpu/gpu_command_buffer_stub.cc |
@@ -22,6 +22,8 @@ |
#if defined(OS_WIN) |
#include "base/win/wrapped_window_proc.h" |
+#elif defined(TOUCH_UI) |
+#include "content/common/gpu/image_transport_surface_linux.h" |
#endif |
using gpu::Buffer; |
@@ -115,14 +117,19 @@ bool GpuCommandBufferStub::IsScheduled() { |
return !scheduler_.get() || scheduler_->IsScheduled(); |
} |
+void GpuCommandBufferStub::OnInitializeFailed(IPC::Message* reply_message) { |
+ scheduler_.reset(); |
+ command_buffer_.reset(); |
+ GpuCommandBufferMsg_Initialize::WriteReplyParams(reply_message, false); |
+ Send(reply_message); |
+} |
+ |
void GpuCommandBufferStub::OnInitialize( |
base::SharedMemoryHandle ring_buffer, |
int32 size, |
IPC::Message* reply_message) { |
DCHECK(!command_buffer_.get()); |
- bool result = false; |
- |
command_buffer_.reset(new gpu::CommandBufferService); |
#if defined(OS_WIN) |
@@ -142,6 +149,41 @@ void GpuCommandBufferStub::OnInitialize( |
scheduler_.reset(gpu::GpuScheduler::Create(command_buffer_.get(), |
channel_, |
NULL)); |
+#if defined(TOUCH_UI) |
+ if (software_) { |
+ OnInitializeFailed(reply_message); |
+ return; |
+ } |
+ |
+ scoped_refptr<gfx::GLSurface> surface; |
+ if (handle_) |
+ surface = ImageTransportSurface::CreateSurface(this); |
+ else |
+ surface = gfx::GLSurface::CreateOffscreenGLSurface(software_, |
+ gfx::Size(1, 1)); |
+ if (!surface.get()) { |
+ LOG(ERROR) << "GpuCommandBufferStub: failed to create surface."; |
+ OnInitializeFailed(reply_message); |
+ return; |
+ } |
+ |
+ scoped_refptr<gfx::GLContext> context( |
+ gfx::GLContext::CreateGLContext(channel_->share_group(), |
+ surface.get())); |
+ if (!context.get()) { |
+ LOG(ERROR) << "GpuCommandBufferStub: failed to create context."; |
+ OnInitializeFailed(reply_message); |
+ return; |
+ } |
+ |
+ if (scheduler_->InitializeCommon( |
+ surface, |
+ context, |
+ initial_size_, |
+ disallowed_extensions_, |
+ allowed_extensions_.c_str(), |
+ requested_attribs_)) { |
+#else |
if (scheduler_->Initialize( |
handle_, |
initial_size_, |
@@ -150,6 +192,7 @@ void GpuCommandBufferStub::OnInitialize( |
allowed_extensions_.c_str(), |
requested_attribs_, |
channel_->share_group())) { |
+#endif |
command_buffer_->SetPutOffsetChangeCallback( |
NewCallback(scheduler_.get(), |
&gpu::GpuScheduler::PutChanged)); |
@@ -165,7 +208,7 @@ void GpuCommandBufferStub::OnInitialize( |
scheduler_->SetCommandProcessedCallback( |
NewCallback(this, &GpuCommandBufferStub::OnCommandProcessed)); |
-#if defined(OS_MACOSX) || defined(TOUCH_UI) |
+#if defined(OS_MACOSX) |
if (handle_) { |
// This context conceptually puts its output directly on the |
// screen, rendered by the accelerated plugin layer in |
@@ -175,12 +218,19 @@ void GpuCommandBufferStub::OnInitialize( |
NewCallback(this, |
&GpuCommandBufferStub::SwapBuffersCallback)); |
} |
-#endif // defined(OS_MACOSX) || defined(TOUCH_UI) |
+#endif // defined(OS_MACOSX) |
// Set up a pathway for resizing the output window or framebuffer at the |
// right time relative to other GL commands. |
+#if defined(TOUCH_UI) |
+ if (handle_ == gfx::kNullPluginWindow) { |
+ scheduler_->SetResizeCallback( |
+ NewCallback(this, &GpuCommandBufferStub::ResizeCallback)); |
+ } |
+#else |
scheduler_->SetResizeCallback( |
NewCallback(this, &GpuCommandBufferStub::ResizeCallback)); |
+#endif |
if (parent_stub_for_initialization_) { |
scheduler_->SetParent(parent_stub_for_initialization_->scheduler_.get(), |
@@ -189,14 +239,13 @@ void GpuCommandBufferStub::OnInitialize( |
parent_texture_for_initialization_ = 0; |
} |
- result = true; |
} else { |
- scheduler_.reset(); |
- command_buffer_.reset(); |
+ OnInitializeFailed(reply_message); |
+ return; |
} |
} |
- GpuCommandBufferMsg_Initialize::WriteReplyParams(reply_message, result); |
+ GpuCommandBufferMsg_Initialize::WriteReplyParams(reply_message, true); |
Send(reply_message); |
} |
@@ -438,34 +487,7 @@ void GpuCommandBufferStub::SwapBuffersCallback() { |
scheduler_->SetScheduled(false); |
} |
-#endif // defined(OS_MACOSX) |
-#if defined(TOUCH_UI) |
-void GpuCommandBufferStub::SwapBuffersCallback() { |
- TRACE_EVENT0("gpu", "GpuCommandBufferStub::SwapBuffersCallback"); |
- GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); |
- GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
- params.renderer_id = renderer_id_; |
- params.render_view_id = render_view_id_; |
- params.surface_id = scheduler_->GetFrontSurfaceId(); |
- params.route_id = route_id(); |
- params.swap_buffers_count = scheduler_->swap_buffers_count(); |
- gpu_channel_manager->Send( |
- new GpuHostMsg_AcceleratedSurfaceBuffersSwapped(params)); |
- |
- scheduler_->SetScheduled(false); |
-} |
- |
-void GpuCommandBufferStub::AcceleratedSurfaceIOSurfaceSet(uint64 surface_id) { |
- scheduler_->SetScheduled(true); |
-} |
- |
-void GpuCommandBufferStub::AcceleratedSurfaceReleased(uint64 surface_id) { |
- scheduler_->ReleaseSurface(surface_id); |
-} |
-#endif // defined(TOUCH_UI) |
- |
-#if defined(OS_MACOSX) || defined(TOUCH_UI) |
void GpuCommandBufferStub::AcceleratedSurfaceBuffersSwapped( |
uint64 swap_buffers_count) { |
TRACE_EVENT1("gpu", |
@@ -485,7 +507,7 @@ void GpuCommandBufferStub::AcceleratedSurfaceBuffersSwapped( |
scheduler_->SetScheduled(true); |
} |
} |
-#endif // defined(OS_MACOSX) || defined(TOUCH_UI) |
+#endif // defined(OS_MACOSX) |
void GpuCommandBufferStub::AddSetTokenCallback( |
const base::Callback<void(int32)>& callback) { |
@@ -511,31 +533,6 @@ void GpuCommandBufferStub::ResizeCallback(gfx::Size size) { |
size)); |
scheduler_->SetScheduled(false); |
-#elif defined(TOUCH_UI) |
- if (scheduler_->GetBackSurfaceId()) { |
- GpuHostMsg_AcceleratedSurfaceRelease_Params params; |
- params.renderer_id = renderer_id_; |
- params.render_view_id = render_view_id_; |
- params.identifier = scheduler_->GetBackSurfaceId(); |
- params.route_id = route_id(); |
- |
- GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); |
- gpu_channel_manager->Send( |
- new GpuHostMsg_AcceleratedSurfaceRelease(params)); |
- } |
- scheduler_->CreateBackSurface(size); |
- GpuHostMsg_AcceleratedSurfaceSetIOSurface_Params params; |
- params.renderer_id = renderer_id_; |
- params.render_view_id = render_view_id_; |
- params.width = size.width(); |
- params.height = size.height(); |
- params.identifier = scheduler_->GetBackSurfaceId(); |
- params.route_id = route_id(); |
- |
- GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); |
- gpu_channel_manager->Send( |
- new GpuHostMsg_AcceleratedSurfaceSetIOSurface(params)); |
- scheduler_->SetScheduled(false); |
#endif |
} |
} |