// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/display/mac/display_link_mac.h"
#include "base/feature_list.h"
#include "base/task/bind_post_task.h"
#include "ui/display/mac/ca_display_link_mac.h"
#include "ui/display/mac/cv_display_link_mac.h"
namespace ui {
BASE_FEATURE(kCADisplayLink,
"CADisplayLink",
base::FEATURE_DISABLED_BY_DEFAULT);
////////////////////////////////////////////////////////////////////////////////
// DisplayLinkMac
// static
scoped_refptr<DisplayLinkMac> DisplayLinkMac::GetForDisplay(
int64_t vsync_display_id) {
if (!vsync_display_id) {
return nullptr;
}
CGDirectDisplayID display_id =
base::checked_cast<CGDirectDisplayID>(vsync_display_id);
if (base::FeatureList::IsEnabled(kCADisplayLink)) {
if (@available(macos 14.0, *)) {
// CADisplayLink is available only for MacOS 14.0+.
return CADisplayLinkMac::GetForDisplayOnCurrentThread(display_id);
}
}
// CADisplayLink is available for MacOS 10.4–15.0.
return CVDisplayLinkMac::GetForDisplay(display_id);
}
////////////////////////////////////////////////////////////////////////////////
// VSyncCallbackMac
VSyncCallbackMac::VSyncCallbackMac(UnregisterCallback unregister_callback,
Callback callback,
bool post_callback_to_ctor_thread)
: unregister_callback_(std::move(unregister_callback)) {
if (post_callback_to_ctor_thread) {
auto lambda = [](base::WeakPtr<VSyncCallbackMac> weak_this,
Callback callback, VSyncParamsMac params) {
if (weak_this) {
callback.Run(params);
}
};
auto callback_for_current_thread =
base::BindRepeating(lambda, weak_factory_.GetWeakPtr(), callback);
callback_for_displaylink_thread_ =
base::BindPostTaskToCurrentDefault(callback_for_current_thread);
} else {
callback_for_displaylink_thread_ = std::move(callback);
}
}
VSyncCallbackMac::~VSyncCallbackMac() {
std::move(unregister_callback_).Run(this);
}
} // namespace ui