| 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
5 #include "flutter/impeller/toolkit/android/surface_transaction.h"
6
7 #include "flutter/impeller/toolkit/android/hardware_buffer.h"
8 #include "flutter/impeller/toolkit/android/surface_control.h"
9 #include "impeller/base/validation.h"
10
11 namespace impeller::android {
12
13 SurfaceTransaction::SurfaceTransaction()
14 : transaction_(GetProcTable().ASurfaceTransaction_create()) {}
15
16 SurfaceTransaction::~SurfaceTransaction() = default;
17
18 bool SurfaceTransaction::IsValid() const {
19 return transaction_.is_valid();
20 }
21
22 struct TransactionInFlightData {
23 SurfaceTransaction::OnCompleteCallback callback;
24 };
25
26 bool SurfaceTransaction::Apply(OnCompleteCallback callback) {
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 }
53
54 bool SurfaceTransaction::SetContents(const SurfaceControl* control,
55 const HardwareBuffer* buffer,
56 fml::UniqueFD acquire_fence) {
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 }
75
76 bool SurfaceTransaction::SetBackgroundColor(const SurfaceControl& control,
77 const Color& color) {
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 }
91
92 bool SurfaceTransaction::SetParent(const SurfaceControl& control,
93 const SurfaceControl* new_parent) {
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 }
107
108 bool SurfaceTransaction::IsAvailableOnPlatform() {
109 return GetProcTable().IsValid() &&
110 GetProcTable().ASurfaceTransaction_create.IsAvailable();
111 }
112
113 } // namespace impeller::android
hardware_buffer.h
impeller::android::SurfaceTransaction::SetParent
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...
Definition: surface_transaction.cc:92
impeller::android::TransactionInFlightData::callback
SurfaceTransaction::OnCompleteCallback callback
Definition: surface_transaction.cc:23
impeller::android::SurfaceTransaction::~SurfaceTransaction
~SurfaceTransaction()
impeller::android::SurfaceTransaction::OnCompleteCallback
std::function< void(ASurfaceTransactionStats *)> OnCompleteCallback
Definition: surface_transaction.h:87
surface_control.h
impeller::Color
Definition: color.h:124
data
std::shared_ptr< const fml::Mapping > data
Definition: texture_gles.cc:63
impeller::android::SurfaceControl
A wrapper for ASurfaceControl. https://developer.android.com/ndk/reference/group/native-activity#asur...
Definition: surface_control.h:22
impeller::android::SurfaceControl::IsValid
bool IsValid() const
Definition: surface_control.cc:32
impeller::android::SurfaceTransaction::SetBackgroundColor
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...
Definition: surface_transaction.cc:76
validation.h
impeller::android
Definition: choreographer.cc:9
impeller::android::HardwareBuffer
A wrapper for AHardwareBuffer https://developer.android.com/ndk/reference/group/a-hardware-buffer.
Definition: hardware_buffer.h:95
impeller::android::SurfaceTransaction::Apply
bool Apply(OnCompleteCallback callback=nullptr)
Applies the updated encoded in the transaction and invokes the callback when the updated are complete...
Definition: surface_transaction.cc:26
impeller::android::TransactionInFlightData
Definition: surface_transaction.cc:22
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
impeller::android::HardwareBuffer::GetHandle
AHardwareBuffer * GetHandle() const
Definition: hardware_buffer.cc:83
impeller::android::SurfaceControl::GetHandle
ASurfaceControl * GetHandle() const
Definition: surface_control.cc:36
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:73
surface_transaction.h
impeller::android::GetProcTable
const ProcTable & GetProcTable()
Definition: proc_table.cc:12
color
DlColor color
Definition: dl_golden_blur_unittests.cc:23
impeller::android::SurfaceTransaction::SurfaceTransaction
SurfaceTransaction()
Definition: surface_transaction.cc:13
impeller::android::SurfaceTransaction::IsAvailableOnPlatform
static bool IsAvailableOnPlatform()
Definition: surface_transaction.cc:108
impeller::android::SurfaceTransaction::SetContents
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....
Definition: surface_transaction.cc:54