| Flutter Impeller |

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

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

`#include <surface_transaction.h>`

## Public Types
using | OnCompleteCallback = std::function< void(ASurfaceTransactionStats *)>

## Public Member Functions
| SurfaceTransaction ()
| ~SurfaceTransaction ()
| SurfaceTransaction (const SurfaceTransaction &)=delete
SurfaceTransaction & | operator= (const SurfaceTransaction &)=delete
bool | IsValid () const
bool | SetContents (const SurfaceControl *control, const HardwareBuffer *buffer, fml::UniqueFD acquire_fence={})
| Encodes that the updated contents of a surface control are specified by the given hardware buffer. The update will not be committed till the call to `Apply` however. More...
bool | SetBackgroundColor (const SurfaceControl &control, const Color &color)
| Encodes the updated background color of the surface control. The update will not be committed till the call to `Apply` however. More...
bool | Apply (OnCompleteCallback callback=nullptr)
| Applies the updated encoded in the transaction and invokes the callback when the updated are complete. More...
bool | SetParent (const SurfaceControl &control, const SurfaceControl *new_parent=nullptr)
| Set the new parent control of the given control. If the new parent is null, it is removed from the control hierarchy. More...

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

## Detailed Description

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

A surface transaction is a collection of updates to the hierarchy of surfaces (represented by `ASurfaceControl` instances) that are applied atomically in the compositor.

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

Note
  Transactions should be short lived objects (create, apply, collect). But, if these are used on multiple threads, they must be externally synchronized.

Definition at line 35 of file surface_transaction.h.

## Member Typedef Documentation

## ◆ OnCompleteCallback

using impeller::android::SurfaceTransaction::OnCompleteCallback = std::function<void(ASurfaceTransactionStats*)>

Definition at line 87 of file surface_transaction.h.

## Constructor & Destructor Documentation

## ◆ SurfaceTransaction() [1/2]

impeller::android::SurfaceTransaction::SurfaceTransaction | ( |  | ) |

Definition at line 13 of file surface_transaction.cc.

14 : transaction_(GetProcTable().ASurfaceTransaction_create()) {}

## ◆ ~SurfaceTransaction()

impeller::android::SurfaceTransaction::~SurfaceTransaction | ( |  | ) |
| default

## ◆ SurfaceTransaction() [2/2]

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

## Member Function Documentation

## ◆ Apply()

bool impeller::android::SurfaceTransaction::Apply | ( | OnCompleteCallback | callback = `nullptr` | ) |

Applies the updated encoded in the transaction and invokes the callback when the updated are complete.

Warning
  The callback will be invoked on a system managed thread.

Note
  It is fine to immediately destroy the transaction after the call to apply. It is not necessary to wait for transaction completion to collect the transaction handle.

Parameters

  [in] | callback | The callback

Returns
  `true` if the surface transaction was applied. `true` does not indicate the application was completed however. Only the invocation of the callback denotes transaction completion.

Definition at line 26 of file surface_transaction.cc.

26 {
27 if (!IsValid()) {
28 return false;
29 }
30
31 if (!callback) {
32 callback = [](auto) {};
33 }
34
35 const auto& proc_table = GetProcTable();
36
37 auto data = std::make_unique<TransactionInFlightData>();
38 data->callback = callback;
39 proc_table.ASurfaceTransaction_setOnComplete(
40 transaction_.get(), //
41 data.release(), //
42 [](void* context, ASurfaceTransactionStats* stats) -> void {
43 auto data = reinterpret_cast<TransactionInFlightData*>(context);
44 data->callback(stats);
45 delete data;
46 });
47 proc_table.ASurfaceTransaction_apply(transaction_.get());
48
49 // Transactions may not be applied over and over.
50 transaction_.reset();
51 return true;
52 }

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

Referenced by impeller::android::SurfaceControl::RemoveFromParent(), and impeller::android::testing::TEST().

## ◆ IsAvailableOnPlatform()

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

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

Definition at line 108 of file surface_transaction.cc.

108 {
109 return GetProcTable().IsValid() &&
110 GetProcTable().ASurfaceTransaction_create.IsAvailable();
111 }

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

Referenced by impeller::android::testing::TEST().

## ◆ IsValid()

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

Definition at line 18 of file surface_transaction.cc.

18 {
19 return transaction_.is_valid();
20 }

Referenced by Apply(), SetBackgroundColor(), SetParent(), and impeller::android::testing::TEST().

## ◆ operator=()

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

## ◆ SetBackgroundColor()

bool impeller::android::SurfaceTransaction::SetBackgroundColor | ( | const SurfaceControl & | control,
|  | const Color & | color
| ) |  |

Encodes the updated background color of the surface control. The update will not be committed till the call to `Apply` however.

See also
  `SurfaceTransaction::Apply`.

Parameters

  [in] | control | The control
  [in] | color | The color

Returns
  `true` if the background control will be set when transaction is applied.

Definition at line 76 of file surface_transaction.cc.

77 {
78 if (!IsValid() || !control.IsValid()) {
79 return false;
80 }
81 GetProcTable().ASurfaceTransaction_setColor(transaction_.get(), //
82 control.GetHandle(), //
83 color.red, //
84 color.green, //
85 color.blue, //
86 color.alpha, //
87 ADATASPACE_SRGB_LINEAR //
88 );
89 return true;
90 }

References color, impeller::android::SurfaceControl::GetHandle(), impeller::android::GetProcTable(), IsValid(), and impeller::android::SurfaceControl::IsValid().

## ◆ SetContents()

bool impeller::android::SurfaceTransaction::SetContents | ( | const SurfaceControl * | control,
|  | const HardwareBuffer * | buffer,
|  | fml::UniqueFD | acquire_fence = `{}`
| ) |  |

Encodes that the updated contents of a surface control are specified by the given hardware buffer. The update will not be committed till the call to `Apply` however.

See also
  `SurfaceTransaction::Apply`.

Parameters

  [in] | control | The control.
  [in] | buffer | The hardware buffer.
  [in] | acquire_fence | The fence to wait on before setting the contents.

Returns
  If the update was encoded in the transaction.

Definition at line 54 of file surface_transaction.cc.

56 {
57 if (control == nullptr || buffer == nullptr) {
58 VALIDATION_LOG << "Invalid control or buffer.";
59 return false;
60 }
61
62 const auto& proc_table = GetProcTable();
63
64 proc_table.ASurfaceTransaction_setEnableBackPressure(
65 transaction_.get(), control->GetHandle(), true);
66
67 proc_table.ASurfaceTransaction_setBuffer(
68 transaction_.get(), //
69 control->GetHandle(), //
70 buffer->GetHandle(), //
71 acquire_fence.is_valid() ? acquire_fence.release() : -1 //
72 );
73 return true;
74 }

References impeller::android::SurfaceControl::GetHandle(), impeller::android::HardwareBuffer::GetHandle(), impeller::android::GetProcTable(), and VALIDATION_LOG.

## ◆ SetParent()

bool impeller::android::SurfaceTransaction::SetParent | ( | const SurfaceControl & | control,
|  | const SurfaceControl * | new_parent = `nullptr`
| ) |  |

Set the new parent control of the given control. If the new parent is null, it is removed from the control hierarchy.

Parameters

  [in] | control | The control
  [in] | new_parent | The new parent

Returns
  `true` if the control will be re-parented when the transaction is applied.

Definition at line 92 of file surface_transaction.cc.

93 {
94 if (!IsValid() || !control.IsValid()) {
95 return false;
96 }
97 if (new_parent && !new_parent->IsValid()) {
98 return false;
99 }
100 GetProcTable().ASurfaceTransaction_reparent(
101 transaction_.get(), //
102 control.GetHandle(), //
103 new_parent == nullptr ? nullptr : new_parent->GetHandle() //
104 );
105 return true;
106 }

References impeller::android::SurfaceControl::GetHandle(), impeller::android::GetProcTable(), IsValid(), and impeller::android::SurfaceControl::IsValid().

Referenced by impeller::android::SurfaceControl::RemoveFromParent().

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

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

data
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:63
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
impeller::android::SurfaceTransaction::IsValid
bool IsValid() const
Definition: surface_transaction.cc:18
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:73
impeller::android::GetProcTable
const ProcTable & GetProcTable()
Definition: proc_table.cc:12
color
DlColor color
Definition: dl_golden_blur_unittests.cc:23