| Index: content/renderer/gpu/renderer_gl_context.cc
|
| diff --git a/content/renderer/gpu/renderer_gl_context.cc b/content/renderer/gpu/renderer_gl_context.cc
|
| index b2457167f149d1ea6c040d41a656f3f3e4e01aab..5b61c8affef8e6f27e169f2b7f2f39f1b239031c 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() {
|
|
|