diff options
author | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-07 20:44:33 +0000 |
---|---|---|
committer | jbates@chromium.org <jbates@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-07 20:44:33 +0000 |
commit | 16adff66ea7224ddd91d01160a7bcc54f5d8b5a6 (patch) | |
tree | 89f6964ede070dc3809db976e6528f0f11d993a1 /content/renderer | |
parent | f3d5a44568be26375eac9daa7c1a69e36ea6f1bf (diff) | |
download | chromium_src-16adff66ea7224ddd91d01160a7bcc54f5d8b5a6.zip chromium_src-16adff66ea7224ddd91d01160a7bcc54f5d8b5a6.tar.gz chromium_src-16adff66ea7224ddd91d01160a7bcc54f5d8b5a6.tar.bz2 |
We were synchronously destroying the RendererGlContext transfer buffers while commands may still be pending in the command buffer that use them. This generated spurious kOutOfBounds errors. kOutOfBounds errors cause us to kill the associated GpuChannel. That leads to lots of bad behavior, such as failing to reload certain WebGL demos.
This change simply lets the command buffer destroy the shared memory in its destructor instead of destroying them explicitly. The GPU-side resources are cleaned up when the command buffer is destroyed.
BUG=88115
TEST=Open NVIDIA Command Buffer Object WebGL demo; Refresh; Verify successful refresh.
Review URL: http://codereview.chromium.org/7301010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91747 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
-rw-r--r-- | content/renderer/gpu/renderer_gl_context.cc | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/content/renderer/gpu/renderer_gl_context.cc b/content/renderer/gpu/renderer_gl_context.cc index b245716..5b61c8a 100644 --- a/content/renderer/gpu/renderer_gl_context.cc +++ b/content/renderer/gpu/renderer_gl_context.cc @@ -38,7 +38,6 @@ const int32 kCommandBufferSize = 1024 * 1024; const int32 kTransferBufferSize = 1024 * 1024; const uint32 kMaxLatchesPerRenderer = 2048; -const uint32 kInvalidLatchId = 0xffffffffu; // Singleton used to initialize and terminate the gles2 library. class GLES2Initializer { @@ -381,8 +380,8 @@ RendererGLContext::RendererGLContext(GpuChannelHost* channel) : channel_(channel), parent_(base::WeakPtr<RendererGLContext>()), parent_texture_id_(0), - child_to_parent_latch_(kInvalidLatchId), - parent_to_child_latch_(kInvalidLatchId), + child_to_parent_latch_(gpu::kInvalidLatchId), + parent_to_child_latch_(gpu::kInvalidLatchId), latch_transfer_buffer_id_(-1), command_buffer_(NULL), gles2_helper_(NULL), @@ -539,23 +538,11 @@ void RendererGLContext::Destroy() { delete gles2_implementation_; gles2_implementation_ = NULL; - if (child_to_parent_latch_ != kInvalidLatchId) { - DestroyLatch(child_to_parent_latch_); - child_to_parent_latch_ = kInvalidLatchId; - } - if (parent_to_child_latch_ != kInvalidLatchId) { - DestroyLatch(parent_to_child_latch_); - parent_to_child_latch_ = kInvalidLatchId; - } - if (command_buffer_ && latch_transfer_buffer_id_ != -1) { - command_buffer_->DestroyTransferBuffer(latch_transfer_buffer_id_); - latch_transfer_buffer_id_ = -1; - } - - if (command_buffer_ && transfer_buffer_id_ != -1) { - command_buffer_->DestroyTransferBuffer(transfer_buffer_id_); - transfer_buffer_id_ = -1; - } + // Do not destroy these transfer buffers here, because commands are still + // in flight on the GPU process that may access them. When the command buffer + // is destroyed, the associated shared memory will be cleaned up. + latch_transfer_buffer_id_ = -1; + transfer_buffer_id_ = -1; delete gles2_helper_; gles2_helper_ = NULL; @@ -566,6 +553,17 @@ void RendererGLContext::Destroy() { } channel_ = NULL; + + // Destroy latches here, after the command buffer is destroyed so that no + // commands are still in flight that may access the latch memory. + if (child_to_parent_latch_ != gpu::kInvalidLatchId) { + DestroyLatch(child_to_parent_latch_); + child_to_parent_latch_ = gpu::kInvalidLatchId; + } + if (parent_to_child_latch_ != gpu::kInvalidLatchId) { + DestroyLatch(parent_to_child_latch_); + parent_to_child_latch_ = gpu::kInvalidLatchId; + } } void RendererGLContext::OnSwapBuffers() { |