Flutter Impeller
surface_transaction.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
10 
11 namespace impeller::android {
12 
14  : transaction_(
15  WrappedSurfaceTransaction{GetProcTable().ASurfaceTransaction_create(),
16  /*owned=*/true}) {}
17 
18 SurfaceTransaction::SurfaceTransaction(ASurfaceTransaction* transaction)
19  : transaction_(WrappedSurfaceTransaction{transaction, /*owned=*/false}) {}
20 
22 
24  return transaction_.is_valid();
25 }
26 
29 };
30 
32  if (!IsValid()) {
33  return false;
34  }
35 
36  if (!callback) {
37  callback = [](auto) {};
38  }
39 
40  const auto& proc_table = GetProcTable();
41 
42  auto data = std::make_unique<TransactionInFlightData>();
43  data->callback = callback;
44  proc_table.ASurfaceTransaction_setOnComplete(
45  transaction_.get().tx, //
46  data.release(), //
47  [](void* context, ASurfaceTransactionStats* stats) -> void {
48  auto data = reinterpret_cast<TransactionInFlightData*>(context);
49  data->callback(stats);
50  delete data;
51  });
52  // If the transaction was created in Java, then it must be applied in
53  // the Java PlatformViewController and not as a part of the engine render
54  // loop.
55  if (!transaction_.get().owned) {
56  transaction_.reset();
57  return true;
58  }
59 
60  proc_table.ASurfaceTransaction_apply(transaction_.get().tx);
61 
62  // Transactions may not be applied over and over.
63  transaction_.reset();
64  return true;
65 }
66 
68  const HardwareBuffer* buffer,
69  fml::UniqueFD acquire_fence) {
70  if (control == nullptr || buffer == nullptr) {
71  VALIDATION_LOG << "Invalid control or buffer.";
72  return false;
73  }
74  GetProcTable().ASurfaceTransaction_setBuffer(
75  transaction_.get().tx, //
76  control->GetHandle(), //
77  buffer->GetHandle(), //
78  acquire_fence.is_valid() ? acquire_fence.release() : -1 //
79  );
80  return true;
81 }
82 
84  const Color& color) {
85  if (!IsValid() || !control.IsValid()) {
86  return false;
87  }
88  GetProcTable().ASurfaceTransaction_setColor(transaction_.get().tx, //
89  control.GetHandle(), //
90  color.red, //
91  color.green, //
92  color.blue, //
93  color.alpha, //
94  ADATASPACE_SRGB_LINEAR //
95  );
96  return true;
97 }
98 
100  const SurfaceControl* new_parent) {
101  if (!IsValid() || !control.IsValid()) {
102  return false;
103  }
104  if (new_parent && !new_parent->IsValid()) {
105  return false;
106  }
107  GetProcTable().ASurfaceTransaction_reparent(
108  transaction_.get().tx, //
109  control.GetHandle(), //
110  new_parent == nullptr ? nullptr : new_parent->GetHandle() //
111  );
112  return true;
113 }
114 
116  return GetProcTable().IsValid() &&
117  GetProcTable().ASurfaceTransaction_create.IsAvailable();
118 }
119 
120 } // namespace impeller::android
A wrapper for AHardwareBuffer https://developer.android.com/ndk/reference/group/a-hardware-buffer.
AHardwareBuffer * GetHandle() const
A wrapper for ASurfaceControl. https://developer.android.com/ndk/reference/group/native-activity#asur...
ASurfaceControl * GetHandle() 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....
std::function< void(ASurfaceTransactionStats *)> OnCompleteCallback
bool Apply(OnCompleteCallback callback=nullptr)
Applies the updated encoded in the transaction and invokes the callback when the updated are complete...
bool SetBackgroundColor(const SurfaceControl &control, const Color &color)
Encodes the updated background color of the surface control. The update will not be committed till th...
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 co...
const ProcTable & GetProcTable()
Definition: proc_table.cc:12
Scalar blue
Definition: color.h:138
Scalar alpha
Definition: color.h:143
Scalar red
Definition: color.h:128
Scalar green
Definition: color.h:133
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
SurfaceTransaction::OnCompleteCallback callback
A wrapper class that indicates whether a SurfaceTransaction was created by the flutter engine or was ...
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:68
#define VALIDATION_LOG
Definition: validation.h:91