Use MailboxManagerSync on android.
Egl fences seem to be required for proper cross-context synchronization
on android/qualcomm.
Fixes flickering seen when using surfaces composition on various
android devices (domokit/sky_engine#36).
R=jamesr@chromium.org
Review URL: https://codereview.chromium.org/1348283004 .
diff --git a/services/gles2/BUILD.gn b/services/gles2/BUILD.gn
index 43e8cc0..e8244d1 100644
--- a/services/gles2/BUILD.gn
+++ b/services/gles2/BUILD.gn
@@ -19,6 +19,8 @@
"gpu_impl.h",
"gpu_state.cc",
"gpu_state.h",
+ "mailbox_manager_factory.cc",
+ "mailbox_manager_factory.h",
]
public_deps = [
diff --git a/services/gles2/command_buffer_driver.cc b/services/gles2/command_buffer_driver.cc
index 4720bf6..1c3f9f6 100644
--- a/services/gles2/command_buffer_driver.cc
+++ b/services/gles2/command_buffer_driver.cc
@@ -236,6 +236,8 @@
bool CommandBufferDriver::OnWaitSyncPoint(uint32_t sync_point) {
if (!sync_point)
return true;
+ if (mailbox_manager_->UsesSync())
+ mailbox_manager_->PullTextureUpdates(sync_point);
if (sync_point_manager_->IsSyncPointRetired(sync_point))
return true;
scheduler_->SetScheduled(false);
@@ -249,6 +251,12 @@
scheduler_->SetScheduled(true);
}
+void CommandBufferDriver::RetireSyncPointOnGpuThread(uint32 sync_point) {
+ if (mailbox_manager_->UsesSync())
+ mailbox_manager_->PushTextureUpdates(sync_point);
+ sync_point_manager_->RetireSyncPoint(sync_point);
+}
+
void CommandBufferDriver::OnContextLost(uint32_t reason) {
loss_observer_->DidLoseContext(reason);
client_->DidLoseContext();
diff --git a/services/gles2/command_buffer_driver.h b/services/gles2/command_buffer_driver.h
index c3d6501..7775d7b 100644
--- a/services/gles2/command_buffer_driver.h
+++ b/services/gles2/command_buffer_driver.h
@@ -69,6 +69,7 @@
uint32_t size);
void DestroyTransferBuffer(int32_t id);
void Echo(const mojo::Callback<void()>& callback);
+ void RetireSyncPointOnGpuThread(uint32_t sync_point);
private:
bool DoInitialize(mojo::ScopedSharedBufferHandle shared_state);
diff --git a/services/gles2/command_buffer_impl.cc b/services/gles2/command_buffer_impl.cc
index 72a27d0..f999c8e 100644
--- a/services/gles2/command_buffer_impl.cc
+++ b/services/gles2/command_buffer_impl.cc
@@ -124,15 +124,15 @@
sync_point_client_->DidInsertSyncPoint(sync_point);
if (retire) {
driver_task_runner_->PostTask(
- FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint,
- sync_point_manager_, sync_point));
+ FROM_HERE, base::Bind(&CommandBufferDriver::RetireSyncPointOnGpuThread,
+ base::Unretained(driver_.get()), sync_point));
}
}
void CommandBufferImpl::RetireSyncPoint(uint32_t sync_point) {
driver_task_runner_->PostTask(
- FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint,
- sync_point_manager_, sync_point));
+ FROM_HERE, base::Bind(&CommandBufferDriver::RetireSyncPointOnGpuThread,
+ base::Unretained(driver_.get()), sync_point));
}
void CommandBufferImpl::Echo(const mojo::Callback<void()>& callback) {
diff --git a/services/gles2/gpu_state.cc b/services/gles2/gpu_state.cc
index 47439fe..9114771 100644
--- a/services/gles2/gpu_state.cc
+++ b/services/gles2/gpu_state.cc
@@ -5,13 +5,15 @@
#include "services/gles2/gpu_state.h"
+#include "services/gles2/mailbox_manager_factory.h"
+
namespace gles2 {
GpuState::GpuState()
: control_thread_("gpu_command_buffer_control"),
sync_point_manager_(gpu::SyncPointManager::Create(true)),
share_group_(new gfx::GLShareGroup),
- mailbox_manager_(new gpu::gles2::MailboxManagerImpl) {
+ mailbox_manager_(MailboxManagerFactory::Create()) {
control_thread_.Start();
}
diff --git a/services/gles2/gpu_state.h b/services/gles2/gpu_state.h
index 1d75318..29a04f9 100644
--- a/services/gles2/gpu_state.h
+++ b/services/gles2/gpu_state.h
@@ -8,7 +8,7 @@
#include "base/memory/ref_counted.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread.h"
-#include "gpu/command_buffer/service/mailbox_manager_impl.h"
+#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/sync_point_manager.h"
#include "ui/gl/gl_share_group.h"
diff --git a/services/gles2/mailbox_manager_factory.cc b/services/gles2/mailbox_manager_factory.cc
new file mode 100644
index 0000000..1e8fe34
--- /dev/null
+++ b/services/gles2/mailbox_manager_factory.cc
@@ -0,0 +1,24 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+#include "services/gles2/mailbox_manager_factory.h"
+
+#include "gpu/command_buffer/service/mailbox_manager_impl.h"
+#include "gpu/command_buffer/service/mailbox_manager_sync.h"
+
+namespace gles2 {
+
+gpu::gles2::MailboxManager* MailboxManagerFactory::Create() {
+#if defined(OS_ANDROID)
+ // Use egl fences for synchronization of textures across contexts on android.
+ // TODO(cstout): see if enabling context virtualization removes the need for
+ // fences.
+ return new gpu::gles2::MailboxManagerSync;
+#else
+ return new gpu::gles2::MailboxManagerImpl;
+#endif
+}
+
+} // namespace gles2
diff --git a/services/gles2/mailbox_manager_factory.h b/services/gles2/mailbox_manager_factory.h
new file mode 100644
index 0000000..0411eef
--- /dev/null
+++ b/services/gles2/mailbox_manager_factory.h
@@ -0,0 +1,19 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_GLES2_MAILBOX_MANAGER_FACTORY_H_
+#define SERVICES_GLES2_MAILBOX_MANAGER_FACTORY_H_
+
+#include "gpu/command_buffer/service/mailbox_manager.h"
+
+namespace gles2 {
+
+class MailboxManagerFactory {
+ public:
+ static gpu::gles2::MailboxManager* Create();
+};
+
+} // namespace gles2
+
+#endif // SERVICES_GLES2_MAILBOX_MANAGER_FACTORY_H_