summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/gpu/gpu_channel.cc15
-rw-r--r--content/common/gpu/gpu_channel.h4
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.cc31
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.h7
-rw-r--r--content/common/gpu/gpu_messages.h16
-rw-r--r--content/renderer/gpu/command_buffer_proxy.cc27
-rw-r--r--content/renderer/gpu/command_buffer_proxy.h7
-rw-r--r--content/renderer/gpu/gpu_channel_host.cc7
-rw-r--r--content/renderer/gpu/gpu_channel_host.h2
-rw-r--r--content/renderer/gpu/renderer_gl_context.cc76
-rw-r--r--content/renderer/gpu/renderer_gl_context.h8
-rw-r--r--content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc6
-rw-r--r--content/renderer/pepper_platform_context_3d_impl.cc6
-rw-r--r--gpu/command_buffer/client/gles2_demo.cc2
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc75
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.h11
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_mock.h7
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc2
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.cc17
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.h8
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_linux.cc13
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_mac.cc13
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_win.cc13
-rw-r--r--gpu/demos/framework/window.cc2
-rw-r--r--gpu/gles2_conform_support/egl/display.cc2
-rw-r--r--webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc7
26 files changed, 202 insertions, 182 deletions
diff --git a/content/common/gpu/gpu_channel.cc b/content/common/gpu/gpu_channel.cc
index 0031602..571ca0f 100644
--- a/content/common/gpu/gpu_channel.cc
+++ b/content/common/gpu/gpu_channel.cc
@@ -151,9 +151,9 @@ void GpuChannel::CreateViewCommandBuffer(
#if defined(ENABLE_GPU)
*route_id = GenerateRouteID();
scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub(
- this, window, NULL, gfx::Size(), disallowed_extensions_,
+ this, window, gfx::Size(), disallowed_extensions_,
init_params.allowed_extensions,
- init_params.attribs, 0, *route_id, renderer_id_, render_view_id,
+ init_params.attribs, *route_id, renderer_id_, render_view_id,
watchdog_));
router_.AddRoute(*route_id, stub.get());
stubs_.AddWithID(stub.release(), *route_id);
@@ -168,6 +168,10 @@ void GpuChannel::ViewResized(int32 command_buffer_route_id) {
stub->ViewResized();
}
+GpuCommandBufferStub* GpuChannel::LookupCommandBuffer(int32 route_id) {
+ return stubs_.Lookup(route_id);
+}
+
#if defined(OS_MACOSX)
void GpuChannel::AcceleratedSurfaceBuffersSwapped(
int32 route_id, uint64 swap_buffers_count) {
@@ -231,27 +235,20 @@ void GpuChannel::OnInitialize(base::ProcessHandle renderer_process) {
}
void GpuChannel::OnCreateOffscreenCommandBuffer(
- int32 parent_route_id,
const gfx::Size& size,
const GPUCreateCommandBufferConfig& init_params,
- uint32 parent_texture_id,
int32* route_id) {
content::GetContentClient()->SetActiveURL(init_params.active_url);
#if defined(ENABLE_GPU)
*route_id = GenerateRouteID();
- GpuCommandBufferStub* parent_stub = NULL;
- if (parent_route_id != 0)
- parent_stub = stubs_.Lookup(parent_route_id);
scoped_ptr<GpuCommandBufferStub> stub(new GpuCommandBufferStub(
this,
gfx::kNullPluginWindow,
- parent_stub,
size,
disallowed_extensions_,
init_params.allowed_extensions,
init_params.attribs,
- parent_texture_id,
*route_id,
0, 0, watchdog_));
router_.AddRoute(*route_id, stub.get());
diff --git a/content/common/gpu/gpu_channel.h b/content/common/gpu/gpu_channel.h
index 10b2315..acf63dc 100644
--- a/content/common/gpu/gpu_channel.h
+++ b/content/common/gpu/gpu_channel.h
@@ -88,6 +88,8 @@ class GpuChannel : public IPC::Channel::Listener,
gfx::GLShareGroup* share_group() const { return share_group_.get(); }
+ GpuCommandBufferStub* LookupCommandBuffer(int32 route_id);
+
#if defined(OS_MACOSX)
virtual void AcceleratedSurfaceBuffersSwapped(
int32 route_id, uint64 swap_buffers_count);
@@ -119,10 +121,8 @@ class GpuChannel : public IPC::Channel::Listener,
// Message handlers.
void OnInitialize(base::ProcessHandle renderer_process);
void OnCreateOffscreenCommandBuffer(
- int32 parent_route_id,
const gfx::Size& size,
const GPUCreateCommandBufferConfig& init_params,
- uint32 parent_texture_id,
int32* route_id);
void OnDestroyCommandBuffer(int32 route_id);
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc
index a88161d..52c2074 100644
--- a/content/common/gpu/gpu_command_buffer_stub.cc
+++ b/content/common/gpu/gpu_command_buffer_stub.cc
@@ -28,25 +28,20 @@ using gpu::Buffer;
GpuCommandBufferStub::GpuCommandBufferStub(
GpuChannel* channel,
gfx::PluginWindowHandle handle,
- GpuCommandBufferStub* parent,
const gfx::Size& size,
const gpu::gles2::DisallowedExtensions& disallowed_extensions,
const std::string& allowed_extensions,
const std::vector<int32>& attribs,
- uint32 parent_texture_id,
int32 route_id,
int32 renderer_id,
int32 render_view_id,
GpuWatchdog* watchdog)
: channel_(channel),
handle_(handle),
- parent_(
- parent ? parent->AsWeakPtr() : base::WeakPtr<GpuCommandBufferStub>()),
initial_size_(size),
disallowed_extensions_(disallowed_extensions),
allowed_extensions_(allowed_extensions),
requested_attribs_(attribs),
- parent_texture_id_(parent_texture_id),
route_id_(route_id),
last_flush_count_(0),
renderer_id_(renderer_id),
@@ -82,6 +77,8 @@ bool GpuCommandBufferStub::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(GpuCommandBufferStub, message)
IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Initialize,
OnInitialize);
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_SetParent,
+ OnSetParent);
IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_GetState, OnGetState);
IPC_MESSAGE_HANDLER_DELAY_REPLY(GpuCommandBufferMsg_Flush, OnFlush);
IPC_MESSAGE_HANDLER(GpuCommandBufferMsg_AsyncFlush, OnAsyncFlush);
@@ -132,8 +129,6 @@ void GpuCommandBufferStub::OnInitialize(
// Initialize the CommandBufferService and GpuScheduler.
if (command_buffer_->Initialize(&shared_memory, size)) {
- gpu::GpuScheduler* parent_processor =
- parent_ ? parent_->scheduler_.get() : NULL;
scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(),
channel_,
NULL));
@@ -143,8 +138,6 @@ void GpuCommandBufferStub::OnInitialize(
disallowed_extensions_,
allowed_extensions_.c_str(),
requested_attribs_,
- parent_processor,
- parent_texture_id_,
channel_->share_group())) {
command_buffer_->SetPutOffsetChangeCallback(
NewCallback(scheduler_.get(),
@@ -189,6 +182,26 @@ void GpuCommandBufferStub::OnInitialize(
Send(reply_message);
}
+void GpuCommandBufferStub::OnSetParent(int32 parent_route_id,
+ uint32 parent_texture_id,
+ IPC::Message* reply_message) {
+ bool result = false;
+
+ if (parent_route_id == MSG_ROUTING_NONE) {
+ result = scheduler_->SetParent(NULL, 0);
+ } else {
+ GpuCommandBufferStub* parent_stub = channel_->LookupCommandBuffer(
+ parent_route_id);
+ if (parent_stub) {
+ result = scheduler_->SetParent(parent_stub->scheduler_.get(),
+ parent_texture_id);
+ }
+ }
+
+ GpuCommandBufferMsg_SetParent::WriteReplyParams(reply_message, result);
+ Send(reply_message);
+}
+
void GpuCommandBufferStub::OnGetState(IPC::Message* reply_message) {
gpu::CommandBuffer::State state = command_buffer_->GetState();
if (state.error == gpu::error::kLostContext &&
diff --git a/content/common/gpu/gpu_command_buffer_stub.h b/content/common/gpu/gpu_command_buffer_stub.h
index 99c2464..1b8e3c4 100644
--- a/content/common/gpu/gpu_command_buffer_stub.h
+++ b/content/common/gpu/gpu_command_buffer_stub.h
@@ -33,12 +33,10 @@ class GpuCommandBufferStub
GpuCommandBufferStub(
GpuChannel* channel,
gfx::PluginWindowHandle handle,
- GpuCommandBufferStub* parent,
const gfx::Size& size,
const gpu::gles2::DisallowedExtensions& disallowed_extensions,
const std::string& allowed_extensions,
const std::vector<int32>& attribs,
- uint32 parent_texture_id,
int32 route_id,
int32 renderer_id,
int32 render_view_id,
@@ -86,6 +84,9 @@ class GpuCommandBufferStub
void OnInitialize(base::SharedMemoryHandle ring_buffer,
int32 size,
IPC::Message* reply_message);
+ void OnSetParent(int32 parent_route_id,
+ uint32 parent_texture_id,
+ IPC::Message* reply_message);
void OnGetState(IPC::Message* reply_message);
void OnFlush(int32 put_offset,
int32 last_known_get,
@@ -123,12 +124,10 @@ class GpuCommandBufferStub
GpuChannel* channel_;
gfx::PluginWindowHandle handle_;
- base::WeakPtr<GpuCommandBufferStub> parent_;
gfx::Size initial_size_;
gpu::gles2::DisallowedExtensions disallowed_extensions_;
std::string allowed_extensions_;
std::vector<int32> requested_attribs_;
- uint32 parent_texture_id_;
int32 route_id_;
uint32 last_flush_count_;
diff --git a/content/common/gpu/gpu_messages.h b/content/common/gpu/gpu_messages.h
index bd390c2..ab0fb23 100644
--- a/content/common/gpu/gpu_messages.h
+++ b/content/common/gpu/gpu_messages.h
@@ -231,15 +231,10 @@ IPC_MESSAGE_CONTROL1(GpuChannelMsg_Initialize,
base::ProcessHandle /* renderer_process_for_gpu */)
// Tells the GPU process to create a new command buffer that renders to an
-// offscreen frame buffer. If parent_route_id is not zero, the texture backing
-// the frame buffer is mapped into the corresponding parent command buffer's
-// namespace, with the name of parent_texture_id. This ID is in the parent's
-// namespace.
-IPC_SYNC_MESSAGE_CONTROL4_1(GpuChannelMsg_CreateOffscreenCommandBuffer,
- int32, /* parent_route_id */
+// offscreen frame buffer.
+IPC_SYNC_MESSAGE_CONTROL2_1(GpuChannelMsg_CreateOffscreenCommandBuffer,
gfx::Size, /* size */
GPUCreateCommandBufferConfig, /* init_params */
- uint32, /* parent_texture_id */
int32 /* route_id */)
// The CommandBufferProxy sends this to the GpuCommandBufferStub in its
@@ -296,6 +291,13 @@ IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_Initialize,
int32 /* size */,
bool /* result */)
+// Sets the parent command buffer. This allows the parent and child to share
+// textures.
+IPC_SYNC_MESSAGE_ROUTED2_1(GpuCommandBufferMsg_SetParent,
+ int32 /* parent_route_id */,
+ uint32 /* parent_texture_id */,
+ bool /* result */)
+
// Get the current state of the command buffer.
IPC_SYNC_MESSAGE_ROUTED0_1(GpuCommandBufferMsg_GetState,
gpu::CommandBuffer::State /* state */)
diff --git a/content/renderer/gpu/command_buffer_proxy.cc b/content/renderer/gpu/command_buffer_proxy.cc
index 71762ff..5177ba4 100644
--- a/content/renderer/gpu/command_buffer_proxy.cc
+++ b/content/renderer/gpu/command_buffer_proxy.cc
@@ -332,6 +332,33 @@ void CommandBufferProxy::OnSwapBuffers() {
swap_buffers_callback_->Run();
}
+bool CommandBufferProxy::SetParent(CommandBufferProxy* parent_command_buffer,
+ uint32 parent_texture_id) {
+ if (last_state_.error != gpu::error::kNoError)
+ return false;
+
+ bool result;
+ if (parent_command_buffer) {
+ if (!Send(new GpuCommandBufferMsg_SetParent(
+ route_id_,
+ parent_command_buffer->route_id_,
+ parent_texture_id,
+ &result))) {
+ return false;
+ }
+ } else {
+ if (!Send(new GpuCommandBufferMsg_SetParent(
+ route_id_,
+ MSG_ROUTING_NONE,
+ 0,
+ &result))) {
+ return false;
+ }
+ }
+
+ return result;
+}
+
void CommandBufferProxy::SetSwapBuffersCallback(Callback0::Type* callback) {
swap_buffers_callback_.reset(callback);
}
diff --git a/content/renderer/gpu/command_buffer_proxy.h b/content/renderer/gpu/command_buffer_proxy.h
index d86b417..ab5d22d 100644
--- a/content/renderer/gpu/command_buffer_proxy.h
+++ b/content/renderer/gpu/command_buffer_proxy.h
@@ -61,6 +61,13 @@ class CommandBufferProxy : public gpu::CommandBuffer,
virtual void SetParseError(gpu::error::Error error);
virtual void OnSwapBuffers();
+ // Reparent a command buffer. TODO(apatrick): going forward, the notion of
+ // the parent / child relationship between command buffers is going away in
+ // favor of the notion of surfaces that can be drawn to in one command buffer
+ // and bound as a texture in any other.
+ virtual bool SetParent(CommandBufferProxy* parent_command_buffer,
+ uint32 parent_texture_id);
+
// Set a callback that will be invoked when the SwapBuffers call has been
// issued.
void SetSwapBuffersCallback(Callback0::Type* callback);
diff --git a/content/renderer/gpu/gpu_channel_host.cc b/content/renderer/gpu/gpu_channel_host.cc
index 70b8870..90d5b73 100644
--- a/content/renderer/gpu/gpu_channel_host.cc
+++ b/content/renderer/gpu/gpu_channel_host.cc
@@ -139,11 +139,9 @@ CommandBufferProxy* GpuChannelHost::CreateViewCommandBuffer(
}
CommandBufferProxy* GpuChannelHost::CreateOffscreenCommandBuffer(
- CommandBufferProxy* parent,
const gfx::Size& size,
const std::string& allowed_extensions,
const std::vector<int32>& attribs,
- uint32 parent_texture_id,
const GURL& active_url) {
#if defined(ENABLE_GPU)
// An error occurred. Need to get the host again to reinitialize it.
@@ -154,12 +152,9 @@ CommandBufferProxy* GpuChannelHost::CreateOffscreenCommandBuffer(
init_params.allowed_extensions = allowed_extensions;
init_params.attribs = attribs;
init_params.active_url = active_url;
- int32 parent_route_id = parent ? parent->route_id() : 0;
int32 route_id;
- if (!Send(new GpuChannelMsg_CreateOffscreenCommandBuffer(parent_route_id,
- size,
+ if (!Send(new GpuChannelMsg_CreateOffscreenCommandBuffer(size,
init_params,
- parent_texture_id,
&route_id))) {
return NULL;
}
diff --git a/content/renderer/gpu/gpu_channel_host.h b/content/renderer/gpu/gpu_channel_host.h
index 111f696..affd128 100644
--- a/content/renderer/gpu/gpu_channel_host.h
+++ b/content/renderer/gpu/gpu_channel_host.h
@@ -76,11 +76,9 @@ class GpuChannelHost : public IPC::Channel::Listener,
// Create and connect to a command buffer in the GPU process.
CommandBufferProxy* CreateOffscreenCommandBuffer(
- CommandBufferProxy* parent,
const gfx::Size& size,
const std::string& allowed_extensions,
const std::vector<int32>& attribs,
- uint32 parent_texture_id,
const GURL& active_url);
// Destroy a command buffer created by this channel.
diff --git a/content/renderer/gpu/renderer_gl_context.cc b/content/renderer/gpu/renderer_gl_context.cc
index 260b9d5..d5ec2b9 100644
--- a/content/renderer/gpu/renderer_gl_context.cc
+++ b/content/renderer/gpu/renderer_gl_context.cc
@@ -161,7 +161,7 @@ RendererGLContext* RendererGLContext::CreateViewContext(
const int32* attrib_list,
const GURL& active_url) {
#if defined(ENABLE_GPU)
- scoped_ptr<RendererGLContext> context(new RendererGLContext(channel, NULL));
+ scoped_ptr<RendererGLContext> context(new RendererGLContext(channel));
if (!context->Initialize(
true,
render_surface,
@@ -188,13 +188,12 @@ void RendererGLContext::ResizeOnscreen(const gfx::Size& size) {
RendererGLContext* RendererGLContext::CreateOffscreenContext(
GpuChannelHost* channel,
- RendererGLContext* parent,
const gfx::Size& size,
const char* allowed_extensions,
const int32* attrib_list,
const GURL& active_url) {
#if defined(ENABLE_GPU)
- scoped_ptr<RendererGLContext> context(new RendererGLContext(channel, parent));
+ scoped_ptr<RendererGLContext> context(new RendererGLContext(channel));
if (!context->Initialize(
false,
gfx::kNullPluginWindow,
@@ -211,6 +210,42 @@ RendererGLContext* RendererGLContext::CreateOffscreenContext(
#endif
}
+bool RendererGLContext::SetParent(RendererGLContext* new_parent) {
+ // Allocate a texture ID with respect to the parent and change the parent.
+ uint32 new_parent_texture_id = 0;
+ if (new_parent) {
+ TRACE_EVENT0("gpu", "RendererGLContext::SetParent::flushParent");
+ // Flush any remaining commands in the parent context to make sure the
+ // texture id accounting stays consistent.
+ int32 token = new_parent->gles2_helper_->InsertToken();
+ new_parent->gles2_helper_->WaitForToken(token);
+ new_parent_texture_id = new_parent->gles2_implementation_->MakeTextureId();
+
+ if (!command_buffer_->SetParent(new_parent->command_buffer_,
+ new_parent_texture_id)) {
+ new_parent->gles2_implementation_->FreeTextureId(parent_texture_id_);
+ return false;
+ }
+ } else {
+ if (!command_buffer_->SetParent(NULL, 0))
+ return false;
+ }
+
+ // Free the previous parent's texture ID.
+ if (parent_.get() && parent_texture_id_ != 0)
+ parent_->gles2_implementation_->FreeTextureId(parent_texture_id_);
+
+ if (new_parent) {
+ parent_ = new_parent->AsWeakPtr();
+ parent_texture_id_ = new_parent_texture_id;
+ } else {
+ parent_.reset();
+ parent_texture_id_ = 0;
+ }
+
+ return true;
+}
+
void RendererGLContext::ResizeOffscreen(const gfx::Size& size) {
DCHECK(size.width() > 0 && size.height() > 0);
if (size_ != size) {
@@ -342,11 +377,9 @@ gpu::gles2::GLES2Implementation* RendererGLContext::GetImplementation() {
return gles2_implementation_;
}
-RendererGLContext::RendererGLContext(GpuChannelHost* channel,
- RendererGLContext* parent)
+RendererGLContext::RendererGLContext(GpuChannelHost* channel)
: channel_(channel),
- parent_(parent ?
- parent->AsWeakPtr() : base::WeakPtr<RendererGLContext>()),
+ parent_(base::WeakPtr<RendererGLContext>()),
parent_texture_id_(0),
child_to_parent_latch_(kInvalidLatchId),
parent_to_child_latch_(kInvalidLatchId),
@@ -377,16 +410,6 @@ bool RendererGLContext::Initialize(bool onscreen,
// Ensure the gles2 library is initialized first in a thread safe way.
g_gles2_initializer.Get();
- // Allocate a frame buffer ID with respect to the parent.
- if (parent_.get()) {
- TRACE_EVENT0("gpu", "RendererGLContext::Initialize::flushParent");
- // Flush any remaining commands in the parent context to make sure the
- // texture id accounting stays consistent.
- int32 token = parent_->gles2_helper_->InsertToken();
- parent_->gles2_helper_->WaitForToken(token);
- parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId();
- }
-
std::vector<int32> attribs;
while (attrib_list) {
int32 attrib = *attrib_list++;
@@ -431,14 +454,10 @@ bool RendererGLContext::Initialize(bool onscreen,
active_url);
}
} else {
- CommandBufferProxy* parent_command_buffer =
- parent_.get() ? parent_->command_buffer_ : NULL;
command_buffer_ = channel_->CreateOffscreenCommandBuffer(
- parent_command_buffer,
size,
allowed_extensions,
attribs,
- parent_texture_id_,
active_url);
}
if (!command_buffer_) {
@@ -501,12 +520,10 @@ bool RendererGLContext::Initialize(bool onscreen,
// If this is a child context, setup latches for synchronization between child
// and parent.
- if (parent_.get()) {
- if (!CreateLatch(&child_to_parent_latch_) ||
- !CreateLatch(&parent_to_child_latch_)) {
- Destroy();
- return false;
- }
+ if (!CreateLatch(&child_to_parent_latch_) ||
+ !CreateLatch(&parent_to_child_latch_)) {
+ Destroy();
+ return false;
}
// Create the object exposing the OpenGL API.
@@ -523,10 +540,7 @@ bool RendererGLContext::Initialize(bool onscreen,
}
void RendererGLContext::Destroy() {
- if (parent_.get() && parent_texture_id_ != 0) {
- parent_->gles2_implementation_->FreeTextureId(parent_texture_id_);
- parent_texture_id_ = 0;
- }
+ SetParent(NULL);
delete gles2_implementation_;
gles2_implementation_ = NULL;
diff --git a/content/renderer/gpu/renderer_gl_context.h b/content/renderer/gpu/renderer_gl_context.h
index 3798892..49cf83f 100644
--- a/content/renderer/gpu/renderer_gl_context.h
+++ b/content/renderer/gpu/renderer_gl_context.h
@@ -108,12 +108,15 @@ class RendererGLContext : public base::SupportsWeakPtr<RendererGLContext> {
// attribute/value pairs.
static RendererGLContext* CreateOffscreenContext(
GpuChannelHost* channel,
- RendererGLContext* parent,
const gfx::Size& size,
const char* allowed_extensions,
const int32* attrib_list,
const GURL& active_url);
+ // Sets the parent context. If any parent textures have been created for
+ // another parent, it is important to delete them before changing the parent.
+ bool SetParent(RendererGLContext* parent);
+
// Resize an offscreen frame buffer. The resize occurs on the next call to
// SwapBuffers. This is to avoid waiting until all pending GL calls have been
// executed by the GPU process. Everything rendered up to the call to
@@ -183,8 +186,7 @@ class RendererGLContext : public base::SupportsWeakPtr<RendererGLContext> {
bool GetChildToParentLatch(uint32* child_to_parent_latch);
private:
- RendererGLContext(GpuChannelHost* channel,
- RendererGLContext* parent);
+ explicit RendererGLContext(GpuChannelHost* channel);
bool Initialize(bool onscreen,
gfx::PluginWindowHandle render_surface,
diff --git a/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc b/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc
index 69ab6db..10e8f4a 100644
--- a/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc
+++ b/content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.cc
@@ -104,6 +104,7 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize(
if (web_view && web_view->mainFrame())
active_url = GURL(web_view->mainFrame()->url());
+ RendererGLContext* parent_context = NULL;
if (render_directly_to_web_view) {
RenderView* renderview = RenderView::FromWebView(web_view);
if (!renderview)
@@ -125,7 +126,6 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize(
} else {
bool compositing_enabled = !CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableAcceleratedCompositing);
- RendererGLContext* parent_context = NULL;
// If GPU compositing is enabled we need to create a GL context that shares
// resources with the compositor's context.
if (compositing_enabled) {
@@ -142,7 +142,6 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize(
}
context_ = RendererGLContext::CreateOffscreenContext(
host,
- parent_context,
gfx::Size(1, 1),
preferred_extensions,
attribs,
@@ -152,6 +151,9 @@ bool WebGraphicsContext3DCommandBufferImpl::initialize(
if (!context_)
return false;
+ if (!context_->SetParent(parent_context))
+ return false;
+
gl_ = context_->GetImplementation();
context_->SetContextLostCallback(
NewCallback(this,
diff --git a/content/renderer/pepper_platform_context_3d_impl.cc b/content/renderer/pepper_platform_context_3d_impl.cc
index acd19f6..3556db7 100644
--- a/content/renderer/pepper_platform_context_3d_impl.cc
+++ b/content/renderer/pepper_platform_context_3d_impl.cc
@@ -75,14 +75,16 @@ bool PlatformContext3DImpl::Init() {
CommandBufferProxy* parent_command_buffer =
parent_context_->GetCommandBufferProxy();
command_buffer_ = channel_->CreateOffscreenCommandBuffer(
- parent_command_buffer,
gfx::Size(1, 1),
"*",
attribs,
- parent_texture_id_,
GURL::EmptyGURL());
if (!command_buffer_)
return false;
+
+ if (!command_buffer_->SetParent(parent_command_buffer, parent_texture_id_))
+ return false;
+
command_buffer_->SetChannelErrorCallback(callback_factory_.NewCallback(
&PlatformContext3DImpl::OnContextLost));
diff --git a/gpu/command_buffer/client/gles2_demo.cc b/gpu/command_buffer/client/gles2_demo.cc
index b95a2c2..c9595df 100644
--- a/gpu/command_buffer/client/gles2_demo.cc
+++ b/gpu/command_buffer/client/gles2_demo.cc
@@ -64,8 +64,6 @@ bool GLES2Demo::Setup(void* hwnd, int32 size) {
gpu::gles2::DisallowedExtensions(),
NULL,
std::vector<int32>(),
- NULL,
- 0,
NULL)) {
return NULL;
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 28d6557..3207c70 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -712,10 +712,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- GLES2Decoder* parent,
- uint32 parent_client_texture_id);
+ const std::vector<int32>& attribs);
virtual void Destroy();
+ virtual bool SetParent(GLES2Decoder* parent_decoder,
+ uint32 parent_texture_id);
virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size);
virtual bool UpdateOffscreenFrameBufferSize();
virtual bool MakeCurrent();
@@ -1890,9 +1890,7 @@ bool GLES2DecoderImpl::Initialize(
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- GLES2Decoder* parent,
- uint32 parent_client_texture_id) {
+ const std::vector<int32>& attribs) {
DCHECK(context);
DCHECK(!context_.get());
@@ -1906,11 +1904,6 @@ bool GLES2DecoderImpl::Initialize(
// Take ownership of the GLContext.
context_ = context;
- // Keep only a weak pointer to the parent so we don't unmap its client
- // frame buffer after it has been destroyed.
- if (parent)
- parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr();
-
if (!MakeCurrent()) {
LOG(ERROR) << "GLES2DecoderImpl::Initialize failed because "
<< "MakeCurrent failed.";
@@ -2068,16 +2061,6 @@ bool GLES2DecoderImpl::Initialize(
offscreen_saved_color_texture_.reset(new Texture(this));
offscreen_saved_color_texture_->Create();
- // Map the ID of the saved offscreen texture into the parent so that
- // it can reference it.
- if (parent_) {
- GLuint service_id = offscreen_saved_color_texture_->id();
- TextureManager::TextureInfo* info =
- parent_->CreateTextureInfo(parent_client_texture_id, service_id);
- info->SetNotOwned();
- parent_->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D);
- }
-
// Allocate the render buffers at their initial size and check the status
// of the frame buffers is okay.
pending_offscreen_size_ = size;
@@ -2558,6 +2541,8 @@ void GLES2DecoderImpl::Destroy() {
if (group_.get())
group_->set_have_context(have_context);
+ SetParent(NULL, 0);
+
if (have_context) {
if (current_program_) {
program_manager()->UnuseProgram(shader_manager(), current_program_);
@@ -2571,20 +2556,8 @@ void GLES2DecoderImpl::Destroy() {
glDeleteBuffersARB(1, &fixed_attrib_buffer_id_);
}
- // Remove the saved frame buffer mapping from the parent decoder. The
- // parent pointer is a weak pointer so it will be null if the parent has
- // already been destroyed.
- if (parent_) {
- // First check the texture has been mapped into the parent. This might not
- // be the case if initialization failed midway through.
- GLuint service_id = offscreen_saved_color_texture_->id();
- GLuint client_id = 0;
- if (parent_->texture_manager()->GetClientId(service_id, &client_id)) {
- parent_->texture_manager()->RemoveTextureInfo(feature_info_, client_id);
- }
-
+ if (copy_texture_to_parent_texture_fb_)
glDeleteFramebuffersEXT(1, &copy_texture_to_parent_texture_fb_);
- }
if (offscreen_target_frame_buffer_.get())
offscreen_target_frame_buffer_->Destroy();
@@ -2636,6 +2609,40 @@ void GLES2DecoderImpl::Destroy() {
offscreen_saved_color_texture_.reset();
}
+bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent,
+ uint32 new_parent_texture_id) {
+ // Remove the saved frame buffer mapping from the parent decoder. The
+ // parent pointer is a weak pointer so it will be null if the parent has
+ // already been destroyed.
+ if (parent_) {
+ // First check the texture has been mapped into the parent. This might not
+ // be the case if initialization failed midway through.
+ GLuint service_id = offscreen_saved_color_texture_->id();
+ GLuint client_id = 0;
+ if (parent_->texture_manager()->GetClientId(service_id, &client_id)) {
+ parent_->texture_manager()->RemoveTextureInfo(feature_info_, client_id);
+ }
+ }
+
+ GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>(
+ new_parent);
+ if (new_parent_impl) {
+ // Map the ID of the saved offscreen texture into the parent so that
+ // it can reference it.
+ GLuint service_id = offscreen_saved_color_texture_->id();
+ TextureManager::TextureInfo* info =
+ new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id);
+ info->SetNotOwned();
+ new_parent_impl->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D);
+
+ parent_ = new_parent_impl->AsWeakPtr();
+ } else {
+ parent_.reset();
+ }
+
+ return true;
+}
+
void GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) {
// We can't resize the render buffers immediately because there might be a
// partial frame rendered into them and we don't want the tail end of that
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 699f85e..0551e5a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -65,10 +65,6 @@ class GLES2Decoder : public CommonDecoder {
// allowed_extensions: A string in the same format as
// glGetString(GL_EXTENSIONS) that lists the extensions this context
// should allow. Passing NULL or "*" means allow all extensions.
- // parent: the GLES2 decoder that can access this decoder's front buffer
- // through a texture ID in its namespace.
- // parent_client_texture_id: the texture ID of the front buffer in the
- // parent's namespace.
// Returns:
// true if successful.
virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
@@ -76,13 +72,14 @@ class GLES2Decoder : public CommonDecoder {
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- GLES2Decoder* parent,
- uint32 parent_client_texture_id) = 0;
+ const std::vector<int32>& attribs) = 0;
// Destroys the graphics context.
virtual void Destroy() = 0;
+ virtual bool SetParent(GLES2Decoder* parent_decoder,
+ uint32 parent_texture_id) = 0;
+
// Resize an offscreen frame buffer.
virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size) = 0;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index f775625..0a44ecf 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -29,16 +29,15 @@ class MockGLES2Decoder : public GLES2Decoder {
MockGLES2Decoder();
virtual ~MockGLES2Decoder();
- MOCK_METHOD8(Initialize,
+ MOCK_METHOD6(Initialize,
bool(const scoped_refptr<gfx::GLSurface>& surface,
const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- GLES2Decoder* parent,
- uint32 parent_texture_id));
+ const std::vector<int32>& attribs));
MOCK_METHOD0(Destroy, void());
+ MOCK_METHOD2(SetParent, bool(GLES2Decoder* parent, uint32 parent_texture_id));
MOCK_METHOD1(ResizeOffscreenFrameBuffer, void(const gfx::Size& size));
MOCK_METHOD0(UpdateOffscreenFrameBufferSize, bool());
MOCK_METHOD0(MakeCurrent, bool());
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
index 9470d08..0f20e67 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -137,7 +137,7 @@ void GLES2DecoderTestBase::InitDecoder(
decoder_.reset(GLES2Decoder::Create(surface_manager_.get(), group_.get()));
decoder_->Initialize(
surface_, context_, surface_->GetSize(), DisallowedExtensions(),
- NULL, std::vector<int32>(), NULL, 0);
+ NULL, std::vector<int32>());
decoder_->set_engine(engine_.get());
EXPECT_CALL(*gl_, GenBuffersARB(_, _))
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc
index b3711aa..d4ac593 100644
--- a/gpu/command_buffer/service/gpu_scheduler.cc
+++ b/gpu/command_buffer/service/gpu_scheduler.cc
@@ -66,9 +66,7 @@ bool GpuScheduler::InitializeCommon(
const gfx::Size& size,
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- gles2::GLES2Decoder* parent_decoder,
- uint32 parent_texture_id) {
+ const std::vector<int32>& attribs) {
DCHECK(context);
if (!context->MakeCurrent(surface))
@@ -111,9 +109,7 @@ bool GpuScheduler::InitializeCommon(
size,
disallowed_extensions,
allowed_extensions,
- attribs,
- parent_decoder,
- parent_texture_id)) {
+ attribs)) {
LOG(ERROR) << "GpuScheduler::InitializeCommon failed because decoder "
<< "failed to initialize.";
Destroy();
@@ -134,6 +130,15 @@ void GpuScheduler::DestroyCommon() {
parser_.reset();
}
+bool GpuScheduler::SetParent(GpuScheduler* parent_scheduler,
+ uint32 parent_texture_id) {
+ if (parent_scheduler)
+ return decoder_->SetParent(parent_scheduler->decoder_.get(),
+ parent_texture_id);
+ else
+ return decoder_->SetParent(NULL, 0);
+}
+
#if defined(OS_MACOSX)
namespace {
const unsigned int kMaxOutstandingSwapBuffersCallsPerOnscreenContext = 1;
diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h
index 78845df..31b6a95 100644
--- a/gpu/command_buffer/service/gpu_scheduler.h
+++ b/gpu/command_buffer/service/gpu_scheduler.h
@@ -63,13 +63,13 @@ class GpuScheduler : public CommandBufferEngine {
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
const std::vector<int32>& attribs,
- GpuScheduler* parent,
- uint32 parent_texture_id,
gfx::GLShareGroup* share_group);
void Destroy();
void DestroyCommon();
+ bool SetParent(GpuScheduler* parent_scheduler, uint32 parent_texture_id);
+
void PutChanged(bool sync);
// Sets whether commands should be processed by this scheduler. Setting to
@@ -152,9 +152,7 @@ class GpuScheduler : public CommandBufferEngine {
const gfx::Size& size,
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
- const std::vector<int32>& attribs,
- gles2::GLES2Decoder* parent_decoder,
- uint32 parent_texture_id);
+ const std::vector<int32>& attribs);
private:
diff --git a/gpu/command_buffer/service/gpu_scheduler_linux.cc b/gpu/command_buffer/service/gpu_scheduler_linux.cc
index 84d821e..6adaba6 100644
--- a/gpu/command_buffer/service/gpu_scheduler_linux.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_linux.cc
@@ -17,16 +17,7 @@ bool GpuScheduler::Initialize(
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
const std::vector<int32>& attribs,
- GpuScheduler* parent,
- uint32 parent_texture_id,
gfx::GLShareGroup* share_group) {
- // Get the parent decoder.
- gles2::GLES2Decoder* parent_decoder = NULL;
- if (parent) {
- parent_decoder = parent->decoder_.get();
- DCHECK(parent_decoder);
- }
-
// Create either a view or pbuffer based GLSurface.
scoped_refptr<gfx::GLSurface> surface;
if (window)
@@ -54,9 +45,7 @@ bool GpuScheduler::Initialize(
size,
disallowed_extensions,
allowed_extensions,
- attribs,
- parent_decoder,
- parent_texture_id);
+ attribs);
}
void GpuScheduler::Destroy() {
diff --git a/gpu/command_buffer/service/gpu_scheduler_mac.cc b/gpu/command_buffer/service/gpu_scheduler_mac.cc
index 0e4d8d6..2835088 100644
--- a/gpu/command_buffer/service/gpu_scheduler_mac.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_mac.cc
@@ -17,16 +17,7 @@ bool GpuScheduler::Initialize(
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
const std::vector<int32>& attribs,
- GpuScheduler* parent,
- uint32 parent_texture_id,
gfx::GLShareGroup* share_group) {
- // Get the parent decoder.
- gles2::GLES2Decoder* parent_decoder = NULL;
- if (parent) {
- parent_decoder = parent->decoder_.get();
- DCHECK(parent_decoder);
- }
-
scoped_refptr<gfx::GLSurface> surface(
gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
if (!surface.get()) {
@@ -69,9 +60,7 @@ bool GpuScheduler::Initialize(
size,
disallowed_extensions,
allowed_extensions,
- attribs,
- parent_decoder,
- parent_texture_id);
+ attribs);
}
void GpuScheduler::Destroy() {
diff --git a/gpu/command_buffer/service/gpu_scheduler_win.cc b/gpu/command_buffer/service/gpu_scheduler_win.cc
index a92d225..20e5382 100644
--- a/gpu/command_buffer/service/gpu_scheduler_win.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_win.cc
@@ -19,16 +19,7 @@ bool GpuScheduler::Initialize(
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
const std::vector<int32>& attribs,
- GpuScheduler* parent,
- uint32 parent_texture_id,
gfx::GLShareGroup* share_group) {
- // Get the parent decoder.
- gles2::GLES2Decoder* parent_decoder = NULL;
- if (parent) {
- parent_decoder = parent->decoder_.get();
- DCHECK(parent_decoder);
- }
-
// Create either a view or pbuffer based GLSurface.
scoped_refptr<gfx::GLSurface> surface;
if (window) {
@@ -57,9 +48,7 @@ bool GpuScheduler::Initialize(
size,
disallowed_extensions,
allowed_extensions,
- attribs,
- parent_decoder,
- parent_texture_id);
+ attribs);
}
void GpuScheduler::Destroy() {
diff --git a/gpu/demos/framework/window.cc b/gpu/demos/framework/window.cc
index 01ce0d8..30ba86c 100644
--- a/gpu/demos/framework/window.cc
+++ b/gpu/demos/framework/window.cc
@@ -64,8 +64,6 @@ bool Window::CreateRenderContext(gfx::PluginWindowHandle hwnd) {
if (!gpu_scheduler->Initialize(hwnd, gfx::Size(),
gpu::gles2::DisallowedExtensions(),
NULL, std::vector<int32>(),
- NULL,
- 0,
NULL)) {
return false;
}
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index 3f18c7e..cfadf0f 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -112,7 +112,7 @@ EGLSurface Display::CreateWindowSurface(EGLConfig config,
new GpuScheduler(command_buffer_.get(), NULL, NULL));
if (!gpu_scheduler->Initialize(
win, gfx::Size(), gpu::gles2::DisallowedExtensions(), NULL,
- attribs, NULL, 0, NULL))
+ attribs, NULL))
return EGL_NO_SURFACE;
command_buffer_->SetPutOffsetChangeCallback(
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
index 1f7e672..68a3486 100644
--- a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
+++ b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
@@ -588,24 +588,17 @@ bool GLInProcessContext::Initialize(bool onscreen,
::gpu::gles2::DisallowedExtensions(),
allowed_extensions,
attribs,
- NULL,
- 0,
share_group.get())) {
LOG(ERROR) << "Could not initialize GpuScheduler.";
command_buffer_.reset();
}
}
} else {
- GpuScheduler* parent_scheduler =
- parent_.get() ? parent_->gpu_scheduler_ : NULL;
-
if (!gpu_scheduler_->Initialize(render_surface,
size,
::gpu::gles2::DisallowedExtensions(),
allowed_extensions,
attribs,
- parent_scheduler,
- parent_texture_id_,
share_group.get())) {
LOG(ERROR) << "Could not initialize offscreen GpuScheduler.";
command_buffer_.reset();