#ifndef UI_DISPLAY_MAC_DISPLAY_LINK_MAC_H_
#define UI_DISPLAY_MAC_DISPLAY_LINK_MAC_H_
#include <QuartzCore/CVDisplayLink.h>
#include <memory>
#include <set>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/mac/scoped_typeref.h"
#include "base/memory/ref_counted.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "ui/display/display_export.h"
namespace ui {
class DisplayLinkMac;
struct DISPLAY_EXPORT VSyncParamsMac {
bool callback_times_valid = false;
base::TimeTicks callback_timebase;
base::TimeDelta callback_interval;
bool display_times_valid = false;
base::TimeTicks display_timebase;
base::TimeDelta display_interval;
};
class DISPLAY_EXPORT VSyncCallbackMac {
public:
using Callback = base::RepeatingCallback<void(VSyncParamsMac)>;
~VSyncCallbackMac();
private:
friend class DisplayLinkMac;
VSyncCallbackMac(scoped_refptr<DisplayLinkMac> display_link,
Callback callback);
scoped_refptr<DisplayLinkMac> display_link_;
Callback callback_;
};
class DISPLAY_EXPORT DisplayLinkMac
: public base::RefCountedThreadSafe<DisplayLinkMac> {
public:
static scoped_refptr<DisplayLinkMac> GetForDisplay(
CGDirectDisplayID display_id);
std::unique_ptr<VSyncCallbackMac> RegisterCallback(
VSyncCallbackMac::Callback callback);
double GetRefreshRate();
private:
friend class base::RefCountedThreadSafe<DisplayLinkMac>;
friend class VSyncCallbackMac;
DisplayLinkMac(CGDirectDisplayID display_id,
base::ScopedTypeRef<CVDisplayLinkRef> display_link);
virtual ~DisplayLinkMac();
void OnDisplayLinkCallback(VSyncParamsMac params);
void UnregisterCallback(VSyncCallbackMac* callback);
static CVReturn DisplayLinkCallback(CVDisplayLinkRef display_link,
const CVTimeStamp* now,
const CVTimeStamp* output_time,
CVOptionFlags flags_in,
CVOptionFlags* flags_out,
void* context);
static void DisplayLinkCallbackOnMainThread(CGDirectDisplayID display,
VSyncParamsMac params);
CGDirectDisplayID display_id_;
base::ScopedTypeRef<CVDisplayLinkRef> display_link_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
std::set<VSyncCallbackMac*> callbacks_;
};
}
#endif