#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 <vector>
#include "base/android/scoped_java_ref.h"
#include "base/files/scoped_file.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/ref_counted.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/gfx_export.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 GFX_EXPORT SurfaceControl {
public:
static bool IsSupported();
static bool SupportsColorSpace(const gfx::ColorSpace& color_space);
static uint64_t RequiredUsage();
static void EnableQualcommUBWC();
static bool SupportsSetFrameRate();
static bool SupportsOnCommit();
static GFX_EXPORT bool SupportsSetFrameTimeline();
static GFX_EXPORT bool SupportsSurfacelessControl();
static GFX_EXPORT bool SupportsSetEnableBackPressure();
static void ApplyTransaction(ASurfaceTransaction* transaction);
static void SetStubImplementationForTesting();
class GFX_EXPORT 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 GFX_EXPORT SurfaceStats {
SurfaceStats();
~SurfaceStats();
SurfaceStats(SurfaceStats&& other);
SurfaceStats& operator=(SurfaceStats&& other);
raw_ptr<ASurfaceControl> surface = nullptr;
base::ScopedFD fence;
};
struct GFX_EXPORT 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 GFX_EXPORT 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 absl::optional<HDRMetadata>& metadata);
void SetFrameRate(const Surface& surface, float 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_EXCLUSION ASurfaceTransaction* transaction_;
OnCommitCb on_commit_cb_;
OnCompleteCb on_complete_cb_;
bool need_to_apply_ = false;
};
};
}
#endif