Index: ui/ozone/platform/dri/dri_gpu_platform_support.cc |
diff --git a/ui/ozone/platform/dri/dri_gpu_platform_support.cc b/ui/ozone/platform/dri/dri_gpu_platform_support.cc |
index 994589c3cfc42d1a0512e65735ec8b32e76b86ca..fccb54447a1708eea5e1de5277aad1915bd3837d 100644 |
--- a/ui/ozone/platform/dri/dri_gpu_platform_support.cc |
+++ b/ui/ozone/platform/dri/dri_gpu_platform_support.cc |
@@ -5,6 +5,7 @@ |
#include "ui/ozone/platform/dri/dri_gpu_platform_support.h" |
#include "base/bind.h" |
+#include "base/command_line.h" |
#include "base/thread_task_runner_handle.h" |
#include "ipc/ipc_message_macros.h" |
#include "ui/display/types/display_mode.h" |
@@ -12,9 +13,12 @@ |
#include "ui/ozone/common/display_util.h" |
#include "ui/ozone/common/gpu/ozone_gpu_message_params.h" |
#include "ui/ozone/common/gpu/ozone_gpu_messages.h" |
+#include "ui/ozone/platform/dri/dri_helper_thread.h" |
#include "ui/ozone/platform/dri/dri_window_delegate_impl.h" |
#include "ui/ozone/platform/dri/dri_window_delegate_manager.h" |
+#include "ui/ozone/platform/dri/dri_wrapper.h" |
#include "ui/ozone/platform/dri/native_display_delegate_dri.h" |
+#include "ui/ozone/public/ozone_switches.h" |
namespace ui { |
@@ -28,9 +32,12 @@ void MessageProcessedOnMain( |
class DriGpuPlatformSupportMessageFilter : public IPC::MessageFilter { |
public: |
- DriGpuPlatformSupportMessageFilter(DriWindowDelegateManager* window_manager, |
- IPC::Listener* main_thread_listener) |
+ DriGpuPlatformSupportMessageFilter( |
+ DriWindowDelegateManager* window_manager, |
+ const base::Closure& on_filter_added_callback, |
+ IPC::Listener* main_thread_listener) |
: window_manager_(window_manager), |
+ on_filter_added_callback_(on_filter_added_callback), |
main_thread_listener_(main_thread_listener), |
main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
pending_main_thread_operations_(0), |
@@ -38,6 +45,7 @@ class DriGpuPlatformSupportMessageFilter : public IPC::MessageFilter { |
void OnFilterAdded(IPC::Sender* sender) override { |
io_thread_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
+ main_thread_task_runner_->PostTask(FROM_HERE, on_filter_added_callback_); |
} |
// This code is meant to be very temporary and only as a special case to fix |
@@ -146,6 +154,7 @@ class DriGpuPlatformSupportMessageFilter : public IPC::MessageFilter { |
} |
DriWindowDelegateManager* window_manager_; |
+ base::Closure on_filter_added_callback_; |
IPC::Listener* main_thread_listener_; |
scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_; |
scoped_refptr<base::SingleThreadTaskRunner> io_thread_task_runner_; |
@@ -164,7 +173,10 @@ DriGpuPlatformSupport::DriGpuPlatformSupport( |
window_manager_(window_manager), |
screen_manager_(screen_manager), |
ndd_(ndd.Pass()) { |
- filter_ = new DriGpuPlatformSupportMessageFilter(window_manager, this); |
+ filter_ = new DriGpuPlatformSupportMessageFilter( |
+ window_manager, |
+ base::Bind(&DriGpuPlatformSupport::OnFilterAdded, base::Unretained(this)), |
+ this); |
} |
DriGpuPlatformSupport::~DriGpuPlatformSupport() { |
@@ -346,6 +358,17 @@ void DriGpuPlatformSupport::RelinquishGpuResources( |
callback.Run(); |
} |
+void DriGpuPlatformSupport::OnFilterAdded() { |
+ base::CommandLine* cmd = base::CommandLine::ForCurrentProcess(); |
+ // Only surfaceless path supports async page flips. So we only initialize the |
+ // helper thread if we're using async page flips. |
+ if (!helper_thread_.IsRunning() && |
+ cmd->HasSwitch(switches::kOzoneUseSurfaceless)) { |
+ helper_thread_.Initialize(); |
+ drm_->InitializeTaskRunner(helper_thread_.task_runner()); |
+ } |
+} |
+ |
IPC::MessageFilter* DriGpuPlatformSupport::GetMessageFilter() { |
return filter_.get(); |
} |