blob: af398fd396bf96d9c471ea7ba5fed2659882b375 [file] [log] [blame]
// Copyright 2013 The Flutter 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 FLUTTER_IMPELLER_TOOLKIT_ANDROID_PROC_TABLE_H_
#define FLUTTER_IMPELLER_TOOLKIT_ANDROID_PROC_TABLE_H_
#include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
#include <android/api-level.h>
#include <android/hardware_buffer.h>
#include <android/hardware_buffer_jni.h>
#include <android/surface_control.h>
#include <android/trace.h>
#include <functional>
#include "flutter/fml/logging.h"
#include "flutter/fml/native_library.h"
namespace impeller::android {
//------------------------------------------------------------------------------
/// @brief The Android procs along with the device API level on which these
/// will be available. There is no checking of the actual API level
/// however (because getting the API level is itself only possible
/// on API levels 29 and above).
///
/// Take care to explicitly check for the availability of these APIs
/// at runtime before invoking them.
///
/// Typically, you'll never have to deal with the proc. table
/// directly. Instead, rely on the handle wrappers (`Choreographer`,
/// `HardwareBuffer`, etc..).
///
#define FOR_EACH_ANDROID_PROC(INVOKE) \
INVOKE(AChoreographer_getInstance, 24) \
INVOKE(AChoreographer_postFrameCallback, 24) \
INVOKE(AChoreographer_postFrameCallback64, 29) \
INVOKE(AHardwareBuffer_acquire, 26) \
INVOKE(AHardwareBuffer_allocate, 26) \
INVOKE(AHardwareBuffer_describe, 26) \
INVOKE(AHardwareBuffer_fromHardwareBuffer, 26) \
INVOKE(AHardwareBuffer_getId, 31) \
INVOKE(AHardwareBuffer_isSupported, 29) \
INVOKE(AHardwareBuffer_release, 26) \
INVOKE(ANativeWindow_acquire, 0) \
INVOKE(ANativeWindow_getHeight, 0) \
INVOKE(ANativeWindow_getWidth, 0) \
INVOKE(ANativeWindow_release, 0) \
INVOKE(ASurfaceControl_createFromWindow, 29) \
INVOKE(ASurfaceControl_release, 29) \
INVOKE(ASurfaceTransaction_apply, 29) \
INVOKE(ASurfaceTransaction_create, 29) \
INVOKE(ASurfaceTransaction_delete, 29) \
INVOKE(ASurfaceTransaction_reparent, 29) \
INVOKE(ASurfaceTransaction_setBuffer, 29) \
INVOKE(ASurfaceTransaction_setColor, 29) \
INVOKE(ASurfaceTransaction_setOnComplete, 29) \
INVOKE(ATrace_isEnabled, 23) \
INVOKE(eglGetNativeClientBufferANDROID, 0)
template <class T>
struct AndroidProc {
using AndroidProcType = T;
const char* proc_name = nullptr;
AndroidProcType* proc = nullptr;
constexpr bool IsAvailable() const { return proc != nullptr; }
explicit constexpr operator bool() const { return IsAvailable(); }
template <class... Args>
auto operator()(Args&&... args) const {
FML_DCHECK(IsAvailable())
<< "Android method " << proc_name
<< " is not available on this device. Missing check.";
return proc(std::forward<Args>(args)...);
}
void Reset() { proc = nullptr; }
};
//------------------------------------------------------------------------------
/// @brief The table of Android procs that are resolved dynamically.
///
struct ProcTable {
ProcTable();
~ProcTable();
ProcTable(const ProcTable&) = delete;
ProcTable& operator=(const ProcTable&) = delete;
//----------------------------------------------------------------------------
/// @brief If a valid proc table could be setup. This may fail in case of
/// setup on non-Android platforms.
///
/// @return `true` if valid.
///
bool IsValid() const;
//----------------------------------------------------------------------------
/// @brief Check if tracing in enabled in the process. This call can be
/// made at any API level.
///
/// @return If tracing is enabled.
///
bool TraceIsEnabled() const;
#define DEFINE_PROC(name, api) \
AndroidProc<decltype(name)> name = {.proc_name = #name};
FOR_EACH_ANDROID_PROC(DEFINE_PROC);
#undef DEFINE_PROC
private:
std::vector<fml::RefPtr<fml::NativeLibrary>> libraries_;
bool is_valid_ = false;
};
const ProcTable& GetProcTable();
#ifdef TESTING
ProcTable& GetMutableProcTable();
#endif
} // namespace impeller::android
#endif // FLUTTER_IMPELLER_TOOLKIT_ANDROID_PROC_TABLE_H_