chromium/ui/gfx/android/achoreographer_compat.h

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GFX_ANDROID_ACHOREOGRAPHER_COMPAT_H_
#define UI_GFX_ANDROID_ACHOREOGRAPHER_COMPAT_H_

#include <sys/types.h>

#include "ui/gfx/gfx_export.h"

extern "C" {
typedef struct AChoreographer AChoreographer;
typedef void (*AChoreographer_frameCallback64)(int64_t, void*);
typedef void (*AChoreographer_refreshRateCallback)(int64_t, void*);

using pAChoreographer_getInstance = AChoreographer* (*)();
using pAChoreographer_postFrameCallback64 =
    void (*)(AChoreographer*, AChoreographer_frameCallback64, void*);
using pAChoreographer_registerRefreshRateCallback =
    void (*)(AChoreographer*, AChoreographer_refreshRateCallback, void*);
using pAChoreographer_unregisterRefreshRateCallback =
    void (*)(AChoreographer*, AChoreographer_refreshRateCallback, void*);

typedef struct AChoreographerFrameCallbackData AChoreographerFrameCallbackData;
typedef void (*AChoreographer_vsyncCallback)(
    const AChoreographerFrameCallbackData*,
    void*);

using pAChoreographer_postVsyncCallback =
    void (*)(AChoreographer* choreographer,
             AChoreographer_vsyncCallback callback,
             void* data);
using pAChoreographerFrameCallbackData_getFrameTimeNanos =
    int64_t (*)(const AChoreographerFrameCallbackData*);
using pAChoreographerFrameCallbackData_getFrameTimelinesLength =
    size_t (*)(const AChoreographerFrameCallbackData*);
using pAChoreographerFrameCallbackData_getPreferredFrameTimelineIndex =
    size_t (*)(const AChoreographerFrameCallbackData*);
using pAChoreographerFrameCallbackData_getFrameTimelineVsyncId =
    int64_t (*)(const AChoreographerFrameCallbackData*, size_t);
using pAChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos =
    int64_t (*)(const AChoreographerFrameCallbackData*, size_t);
using pAChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos =
    int64_t (*)(const AChoreographerFrameCallbackData*, size_t);
}  // extern "C"

namespace gfx {

struct GFX_EXPORT AChoreographerCompat {
  static GFX_EXPORT const AChoreographerCompat& Get();

  bool supported = true;
  pAChoreographer_getInstance AChoreographer_getInstanceFn = nullptr;
  pAChoreographer_postFrameCallback64 AChoreographer_postFrameCallback64Fn =
      nullptr;
  pAChoreographer_registerRefreshRateCallback
      AChoreographer_registerRefreshRateCallbackFn = nullptr;
  pAChoreographer_unregisterRefreshRateCallback
      AChoreographer_unregisterRefreshRateCallbackFn = nullptr;

 private:
  AChoreographerCompat();
};

struct GFX_EXPORT AChoreographerCompat33 {
  static GFX_EXPORT const AChoreographerCompat33& Get();

  bool supported = true;
  pAChoreographer_postVsyncCallback AChoreographer_postVsyncCallbackFn =
      nullptr;
  pAChoreographerFrameCallbackData_getFrameTimeNanos
      AChoreographerFrameCallbackData_getFrameTimeNanosFn = nullptr;
  pAChoreographerFrameCallbackData_getFrameTimelinesLength
      AChoreographerFrameCallbackData_getFrameTimelinesLengthFn = nullptr;
  pAChoreographerFrameCallbackData_getPreferredFrameTimelineIndex
      AChoreographerFrameCallbackData_getPreferredFrameTimelineIndexFn =
          nullptr;
  pAChoreographerFrameCallbackData_getFrameTimelineVsyncId
      AChoreographerFrameCallbackData_getFrameTimelineVsyncIdFn = nullptr;
  pAChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos
      AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanosFn =
          nullptr;
  pAChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos
      AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanosFn = nullptr;

 private:
  AChoreographerCompat33();
};

}  // namespace gfx

#endif  // UI_GFX_ANDROID_ACHOREOGRAPHER_COMPAT_H_