Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c1d4e74

Browse files
committed
Wire up utils for lock/unlock.
1 parent ce94871 commit c1d4e74

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

impeller/toolkit/android/hardware_buffer.cc

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,27 @@ static AHardwareBuffer_Desc ToAHardwareBufferDesc(
2525
ahb_desc.format = ToAHardwareBufferFormat(desc.format);
2626
ahb_desc.layers = 1u;
2727
if (desc.usage & HardwareBufferUsageFlags::kFrameBufferAttachment) {
28-
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
28+
ahb_desc.usage |= (AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER |
29+
AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT);
2930
}
3031
if (desc.usage & HardwareBufferUsageFlags::kCompositorOverlay) {
3132
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY;
3233
}
3334
if (desc.usage & HardwareBufferUsageFlags::kSampledImage) {
3435
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
3536
}
37+
if (desc.usage & HardwareBufferUsageFlags::kCPUReadRarely) {
38+
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_READ_RARELY;
39+
}
40+
if (desc.usage & HardwareBufferUsageFlags::kCPUReadOften) {
41+
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN;
42+
}
43+
if (desc.usage & HardwareBufferUsageFlags::kCPUWriteRarely) {
44+
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
45+
}
46+
if (desc.usage & HardwareBufferUsageFlags::kCPUWriteOften) {
47+
ahb_desc.usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
48+
}
3649
return ahb_desc;
3750
}
3851

@@ -121,4 +134,37 @@ std::optional<AHardwareBuffer_Desc> HardwareBuffer::Describe(
121134
return desc;
122135
}
123136

137+
void* HardwareBuffer::Lock(CPUAccessType type) const {
138+
if (!is_valid_ || !GetProcTable().AHardwareBuffer_lock) {
139+
return nullptr;
140+
}
141+
uint64_t usage = 0;
142+
switch (type) {
143+
case CPUAccessType::kRead:
144+
usage |= AHARDWAREBUFFER_USAGE_CPU_READ_MASK;
145+
break;
146+
case CPUAccessType::kWrite:
147+
usage |= AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK;
148+
break;
149+
}
150+
void* buffer = nullptr;
151+
const auto result = GetProcTable().AHardwareBuffer_lock( //
152+
buffer_.get(), // buffer
153+
usage, // usage
154+
-1, // fence
155+
nullptr, // rect
156+
&buffer // out-addr
157+
);
158+
return result == 0 ? buffer : nullptr;
159+
}
160+
161+
bool HardwareBuffer::Unlock() const {
162+
if (!is_valid_ || !GetProcTable().AHardwareBuffer_unlock) {
163+
return false;
164+
}
165+
const auto result =
166+
GetProcTable().AHardwareBuffer_unlock(buffer_.get(), nullptr);
167+
return result == 0;
168+
}
169+
124170
} // namespace impeller::android

impeller/toolkit/android/hardware_buffer.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <optional>
99

10+
#include "flutter/fml/unique_fd.h"
1011
#include "flutter/fml/unique_object.h"
1112
#include "impeller/base/mask.h"
1213
#include "impeller/geometry/size.h"
@@ -32,6 +33,10 @@ enum class HardwareBufferUsageFlags {
3233
kFrameBufferAttachment = 1u << 0u,
3334
kCompositorOverlay = 1u << 1u,
3435
kSampledImage = 1u << 2u,
36+
kCPUReadRarely = 1u << 3u,
37+
kCPUReadOften = 1u << 4u,
38+
kCPUWriteRarely = 1u << 5u,
39+
kCPUWriteOften = 1u << 6u,
3540
};
3641

3742
using HardwareBufferUsage = Mask<HardwareBufferUsageFlags>;
@@ -127,6 +132,29 @@ class HardwareBuffer {
127132
///
128133
static std::optional<uint64_t> GetSystemUniqueID(AHardwareBuffer* buffer);
129134

135+
enum class CPUAccessType {
136+
kRead,
137+
kWrite,
138+
};
139+
//----------------------------------------------------------------------------
140+
/// @brief Lock the buffer for CPU access. This call may fail if the
141+
/// buffer was not created with one the usages that allow for CPU
142+
/// access.
143+
///
144+
/// @param[in] type The type
145+
///
146+
/// @return A host-accessible buffer if there was no error related to
147+
/// usage or buffer validity.
148+
///
149+
void* Lock(CPUAccessType type) const;
150+
151+
//----------------------------------------------------------------------------
152+
/// @brief Unlock a mapping previously locked for CPU access.
153+
///
154+
/// @return If the unlock was successful.
155+
///
156+
bool Unlock() const;
157+
130158
private:
131159
struct UniqueAHardwareBufferTraits {
132160
static AHardwareBuffer* InvalidValue() { return nullptr; }

impeller/toolkit/android/proc_table.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ namespace impeller::android {
4444
INVOKE(AHardwareBuffer_fromHardwareBuffer, 26) \
4545
INVOKE(AHardwareBuffer_getId, 31) \
4646
INVOKE(AHardwareBuffer_isSupported, 29) \
47+
INVOKE(AHardwareBuffer_lock, 26) \
4748
INVOKE(AHardwareBuffer_release, 26) \
49+
INVOKE(AHardwareBuffer_unlock, 26) \
4850
INVOKE(ANativeWindow_acquire, 0) \
4951
INVOKE(ANativeWindow_getHeight, 0) \
5052
INVOKE(ANativeWindow_getWidth, 0) \

0 commit comments

Comments
 (0)