| Flutter Impeller |

Classes | Public Member Functions | Static Public Member Functions | List of all members
impeller::android::SurfaceControl Class Reference

A wrapper for ASurfaceControl. https://developer.android.com/ndk/reference/group/native-activity#asurfacecontrol. More...

`#include <surface_control.h>`

## Public Member Functions
| SurfaceControl (ANativeWindow *window, const char *debug_name=nullptr)
| Creates a new surface control and adds it as a child of the given window. More...
| ~SurfaceControl ()
| Removes the surface control from the presentation hierarchy managed by the system compositor and release the client side reference to the control. At this point, it may be collected when the compositor is also done using it. More...
| SurfaceControl (const SurfaceControl &)=delete
SurfaceControl & | operator= (const SurfaceControl &)=delete
bool | IsValid () const
ASurfaceControl * | GetHandle () const
bool | RemoveFromParent () const
| Remove the surface control from the hierarchy of nodes presented by the system compositor. More...

## Static Public Member Functions
static bool | IsAvailableOnPlatform ()

## Detailed Description

A wrapper for ASurfaceControl. https://developer.android.com/ndk/reference/group/native-activity#asurfacecontrol.

Instances of this class represent a node in the hierarchy of surfaces sent to the system compositor for final composition.

This wrapper is only available on Android API 29 and above.

Definition at line 22 of file surface_control.h.

## Constructor & Destructor Documentation

## ◆ SurfaceControl() [1/2]

impeller::android::SurfaceControl::SurfaceControl | ( | ANativeWindow * | window,
|  | const char * | debug_name = `nullptr`
| ) |  |
| explicit

Creates a new surface control and adds it as a child of the given window.

Parameters

  | window | The window
  [in] | debug_name | A debug name. See it using `adb shell dumpsys SurfaceFlinger` along with other control properties. If no debug name is specified, the value "Impeller Layer" is used.

Definition at line 12 of file surface_control.cc.

12 {
13 if (window == nullptr) {
14 VALIDATION_LOG << "Parent window of surface was null.";
15 return;
16 }
17 if (debug_name == nullptr) {
18 debug_name = "Impeller Layer";
19 }
20 control_.reset(
21 GetProcTable().ASurfaceControl_createFromWindow(window, debug_name));
22 }

References impeller::android::GetProcTable(), and VALIDATION_LOG.

## ◆ ~SurfaceControl()

impeller::android::SurfaceControl::~SurfaceControl | ( |  | ) |

Removes the surface control from the presentation hierarchy managed by the system compositor and release the client side reference to the control. At this point, it may be collected when the compositor is also done using it.

Definition at line 24 of file surface_control.cc.

24 {
25 if (IsValid() && !RemoveFromParent()) {
26 VALIDATION_LOG << "Surface control could not be removed from its parent. "
27 "Expect a leak.";
28 }
29 }

References IsValid(), RemoveFromParent(), and VALIDATION_LOG.

## ◆ SurfaceControl() [2/2]

impeller::android::SurfaceControl::SurfaceControl | ( | const SurfaceControl & |  | ) |
| delete

## Member Function Documentation

## ◆ GetHandle()

ASurfaceControl * impeller::android::SurfaceControl::GetHandle | ( |  | ) | const

Definition at line 35 of file surface_control.cc.

35 {
36 return control_.get();
37 }

Referenced by impeller::android::CreatePreviousReleaseFence(), impeller::android::SurfaceTransaction::SetBackgroundColor(), impeller::android::SurfaceTransaction::SetContents(), and impeller::android::SurfaceTransaction::SetParent().

## ◆ IsAvailableOnPlatform()

bool impeller::android::SurfaceControl::IsAvailableOnPlatform | ( |  | ) |
| static

Returns
  `true` if any surface controls can be created on this platform.

Definition at line 50 of file surface_control.cc.

50 {
51 auto api_level = android_get_device_api_level();
52
53 // Technically SurfaceControl is supported on API 29 but I've observed
54 // enough reported bugs that I'm bumping the constraint to 30. If
55 // we had more time to test all of these older devices maybe we could
56 // figure out what the problem is.
57 // https://github.com/flutter/flutter/issues/155877
58 return api_level >= 30 && GetProcTable().IsValid() &&
59 GetProcTable().ASurfaceControl_createFromWindow.IsAvailable();
60 }

References impeller::android::GetProcTable(), and impeller::android::ProcTable::IsValid().

Referenced by impeller::AHBSwapchainVK::IsAvailableOnPlatform(), and impeller::android::testing::TEST().

## ◆ IsValid()

bool impeller::android::SurfaceControl::IsValid | ( |  | ) | const

Definition at line 31 of file surface_control.cc.

31 {
32 return control_.is_valid();
33 }

Referenced by RemoveFromParent(), impeller::android::SurfaceTransaction::SetBackgroundColor(), impeller::android::SurfaceTransaction::SetParent(), and ~SurfaceControl().

## ◆ operator=()

SurfaceControl& impeller::android::SurfaceControl::operator= | ( | const SurfaceControl & |  | ) |
| delete

## ◆ RemoveFromParent()

bool impeller::android::SurfaceControl::RemoveFromParent | ( |  | ) | const

Remove the surface control from the hierarchy of nodes presented by the system compositor.

This is called implicitly when the surface control is collected.

Returns
  `true` If the control will be removed from the hierarchy of nodes presented by the system compositor.

Definition at line 39 of file surface_control.cc.

39 {
40 if (!IsValid()) {
41 return false;
42 }
43 SurfaceTransaction transaction;
44 if (!transaction.SetParent(*this, nullptr)) {
45 return false;
46 }
47 return transaction.Apply();
48 }

References impeller::android::SurfaceTransaction::Apply(), IsValid(), and impeller::android::SurfaceTransaction::SetParent().

Referenced by ~SurfaceControl().

The documentation for this class was generated from the following files:

- impeller/toolkit/android/surface_control.h
- impeller/toolkit/android/surface_control.cc

impeller::android::SurfaceControl::IsValid
bool IsValid() const
Definition: surface_control.cc:31
impeller::android::SurfaceControl::RemoveFromParent
bool RemoveFromParent() const
Remove the surface control from the hierarchy of nodes presented by the system compositor.
Definition: surface_control.cc:39
impeller::android::ProcTable::IsValid
bool IsValid() const
If a valid proc table could be setup. This may fail in case of setup on non-Android platforms.
Definition: proc_table.cc:65
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:91
impeller::android::GetProcTable
const ProcTable & GetProcTable()
Definition: proc_table.cc:12