@@ -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
0 commit comments