#ifndef UI_GFX_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
#define UI_GFX_ANDROID_ANDROID_SURFACE_CONTROL_COMPAT_H_
#include <android/hardware_buffer.h>
#include <android/native_window.h>
#include <memory>
#include <optional>
#include <vector>
#include "base/android/scoped_java_ref.h"
#include "base/component_export.h"
#include "base/files/scoped_file.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "ui/gfx/android/surface_control_frame_rate.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/hdr_metadata.h"
#include "ui/gfx/overlay_transform.h"
extern "C" {
typedef struct ASurfaceControl ASurfaceControl;
typedef struct ASurfaceTransaction ASurfaceTransaction;
}
namespace gfx {
class ColorSpace;
class COMPONENT_EXPORT(GFX) SurfaceControl {
public:
static bool IsSupported();
static bool SupportsColorSpace(const gfx::ColorSpace& color_space);
static bool ColorSpaceToADataSpace(
const gfx::ColorSpace& color_space,
float desired_brightness_ratio,
ADataSpace& out_dataspace,
float& out_extended_range_brightness_ratio);
static uint64_t RequiredUsage();
static void EnableQualcommUBWC();
static bool SupportsSetFrameRate();
static bool SupportsOnCommit();
static bool SupportsFrameRateCompatAtLeast();
static COMPONENT_EXPORT(GFX) bool SupportsSetFrameTimeline();
static COMPONENT_EXPORT(GFX) bool SupportsSurfacelessControl();
static COMPONENT_EXPORT(GFX) bool SupportsSetEnableBackPressure();
static void ApplyTransaction(ASurfaceTransaction* transaction);
static void SetStubImplementationForTesting();
class COMPONENT_EXPORT(GFX) Surface : public base::RefCounted<Surface> {
public:
static scoped_refptr<Surface> WrapUnowned(ASurfaceControl* surface);
Surface();
Surface(const Surface& parent, const char* name);
Surface(ANativeWindow* parent, const char* name);
Surface(JNIEnv* env,
const base::android::JavaRef<jobject>& j_surface_control);
Surface(const Surface&) = delete;
Surface& operator=(const Surface&) = delete;
ASurfaceControl* surface() const { return surface_; }
private:
friend class base::RefCounted<Surface>;
~Surface();
raw_ptr<ASurfaceControl> surface_ = nullptr;
raw_ptr<ASurfaceControl> owned_surface_ = nullptr;
};
struct COMPONENT_EXPORT(GFX) SurfaceStats {
SurfaceStats();
~SurfaceStats();
SurfaceStats(SurfaceStats&& other);
SurfaceStats& operator=(SurfaceStats&& other);
raw_ptr<ASurfaceControl> surface = nullptr;
base::ScopedFD fence;
};
struct COMPONENT_EXPORT(GFX) TransactionStats {
public:
TransactionStats();
TransactionStats(const TransactionStats&) = delete;
TransactionStats& operator=(const TransactionStats&) = delete;
~TransactionStats();
TransactionStats(TransactionStats&& other);
TransactionStats& operator=(TransactionStats&& other);
base::ScopedFD present_fence;
std::vector<SurfaceStats> surface_stats;
base::TimeTicks latch_time;
};
class COMPONENT_EXPORT(GFX) Transaction {
public:
Transaction();
Transaction(const Transaction&) = delete;
Transaction& operator=(const Transaction&) = delete;
~Transaction();
Transaction(Transaction&& other);
Transaction& operator=(Transaction&& other);
void SetVisibility(const Surface& surface, bool show);
void SetZOrder(const Surface& surface, int32_t z);
void SetBuffer(const Surface& surface,
AHardwareBuffer* buffer,
base::ScopedFD fence_fd);
void SetGeometry(const Surface& surface,
const gfx::Rect& src,
const gfx::Rect& dst,
gfx::OverlayTransform transform);
void SetOpaque(const Surface& surface, bool opaque);
void SetDamageRect(const Surface& surface, const gfx::Rect& rect);
void SetColorSpace(const Surface& surface,
const gfx::ColorSpace& color_space,
const std::optional<HDRMetadata>& metadata);
void SetFrameRate(const Surface& surface,
SurfaceControlFrameRate frame_rate);
void SetParent(const Surface& surface, Surface* new_parent);
void SetPosition(const Surface& surface, const gfx::Point& position);
void SetScale(const Surface& surface, float sx, float sy);
void SetCrop(const Surface& surface, const gfx::Rect& rect);
void SetFrameTimelineId(int64_t vsync_id);
void SetEnableBackPressure(const Surface& surface, bool enable);
using OnCompleteCb = base::OnceCallback<void(TransactionStats stats)>;
void SetOnCompleteCb(
OnCompleteCb cb,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
using OnCommitCb = base::OnceClosure;
void SetOnCommitCb(OnCommitCb cb,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
void Apply();
ASurfaceTransaction* GetTransaction();
private:
void PrepareCallbacks();
void DestroyIfNeeded();
int id_;
raw_ptr<ASurfaceTransaction> transaction_;
OnCommitCb on_commit_cb_;
OnCompleteCb on_complete_cb_;
bool need_to_apply_ = false;
};
};
}
#endif