summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/renderer/gpu/renderer_gl_context.cc38
-rw-r--r--gpu/command_buffer/common/constants.h2
2 files changed, 19 insertions, 21 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() {
diff --git a/gpu/command_buffer/common/constants.h b/gpu/command_buffer/common/constants.h
index 3b06cad..873dfa0 100644
--- a/gpu/command_buffer/common/constants.h
+++ b/gpu/command_buffer/common/constants.h
@@ -57,7 +57,7 @@ const int32 kCommandBufferSharedMemoryId = 4;
const int32 kLatchSharedMemoryId = 5;
// Invalid latch ID.
-const int32 kInvalidLatchId = 0xffffffffu;
+const uint32 kInvalidLatchId = 0xffffffffu;
} // namespace gpu