// Copyright (C) 2023 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Wrapper around the HardwareBuffer use nativewindow::*; use super::{buffer_owner::NoBufferOwner, BufferOwner}; /// A wrapper for a hardware buffer. /// /// This buffer may be associated with a buffer pool to which it will be returned to it when dropped. pub struct Buffer { buffer_owner: Box, hardware_buffer: HardwareBuffer, } impl Buffer { /// Create new buffer with a custom [BufferOwner]. pub fn new(buffer_owner: Box, hardware_buffer: HardwareBuffer) -> Self { Self { buffer_owner, hardware_buffer } } /// Create a new buffer with no association to any buffer pool. pub fn new_unowned(hardware_buffer: HardwareBuffer) -> Self { Self { buffer_owner: Box::new(NoBufferOwner), hardware_buffer } } /// Get the id of the underlying buffer. pub fn id(&self) -> u64 { self.hardware_buffer.id() } /// Get a reference to the underlying hardware buffer. pub fn buffer(&self) -> &HardwareBuffer { &self.hardware_buffer } } impl Drop for Buffer { fn drop(&mut self) { self.buffer_owner.on_return(self); } } #[cfg(test)] mod test { use super::*; use crate::StreamConfig; const STREAM_CONFIG: StreamConfig = StreamConfig { width: 1, height: 1, layers: 1, format: AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM, usage: AHardwareBuffer_UsageFlags::AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, stride: 0, }; #[test] fn test_get_buffer_id() { let hardware_buffer = STREAM_CONFIG.create_hardware_buffer().unwrap(); let buffer_id = hardware_buffer.id(); let buffer = Buffer::new_unowned(hardware_buffer); assert_eq!(buffer_id, buffer.id()); } }