Move BufferNode off ionbuffer
Because ionbuffer will be deprecated, and BufferNode is the server-side
memory management class for a BufferHubBuffer, we actually only need a
native_handle_t and AHardwareBuffer_Desc to keep the data.
Updated the test to check if buffer_handle_ is functioning correctly.
Test: atest buffer_node-test, buffer_hub-test
Fix: 117790952
Change-Id: Ie2c6814169d89e9c1ed5528442f2712abaf2ec8f
diff --git a/services/vr/bufferhubd/Android.bp b/services/vr/bufferhubd/Android.bp
index ea9bb1f..5debd3d 100644
--- a/services/vr/bufferhubd/Android.bp
+++ b/services/vr/bufferhubd/Android.bp
@@ -45,7 +45,10 @@
"-DATRACE_TAG=ATRACE_TAG_GRAPHICS",
],
export_include_dirs: ["include"],
- header_libs: ["libdvr_headers"],
+ header_libs: [
+ "libdvr_headers",
+ "libnativewindow_headers",
+ ],
shared_libs: sharedLibraries,
static_libs: [
"libbufferhub",
diff --git a/services/vr/bufferhubd/buffer_channel.cpp b/services/vr/bufferhubd/buffer_channel.cpp
index a2fa0f1..589b31a 100644
--- a/services/vr/bufferhubd/buffer_channel.cpp
+++ b/services/vr/bufferhubd/buffer_channel.cpp
@@ -49,9 +49,9 @@
BufferHubChannel::BufferInfo BufferChannel::GetBufferInfo() const {
return BufferInfo(
- buffer_id(), /*consumer_count=*/0, buffer_node_->buffer().width(),
- buffer_node_->buffer().height(), buffer_node_->buffer().layer_count(),
- buffer_node_->buffer().format(), buffer_node_->buffer().usage(),
+ buffer_id(), /*consumer_count=*/0, buffer_node_->buffer_desc().width,
+ buffer_node_->buffer_desc().height, buffer_node_->buffer_desc().layers,
+ buffer_node_->buffer_desc().format, buffer_node_->buffer_desc().usage,
/*pending_count=*/0, /*state=*/0, /*signaled_mask=*/0,
/*index=*/0);
}
@@ -85,17 +85,17 @@
// TODO(b/112057680) Move away from the GraphicBuffer-based IonBuffer.
return BufferTraits<BorrowedHandle>{
- /*buffer_handle=*/buffer_node_->buffer().handle(),
+ /*buffer_handle=*/buffer_node_->buffer_handle(),
/*metadata_handle=*/buffer_node_->metadata().ashmem_handle().Borrow(),
/*id=*/buffer_id(),
/*client_state_mask=*/client_state_mask_,
/*metadata_size=*/buffer_node_->metadata().metadata_size(),
- /*width=*/buffer_node_->buffer().width(),
- /*height=*/buffer_node_->buffer().height(),
- /*layer_count=*/buffer_node_->buffer().layer_count(),
- /*format=*/buffer_node_->buffer().format(),
- /*usage=*/buffer_node_->buffer().usage(),
- /*stride=*/buffer_node_->buffer().stride(),
+ /*width=*/buffer_node_->buffer_desc().width,
+ /*height=*/buffer_node_->buffer_desc().height,
+ /*layer_count=*/buffer_node_->buffer_desc().layers,
+ /*format=*/buffer_node_->buffer_desc().format,
+ /*usage=*/buffer_node_->buffer_desc().usage,
+ /*stride=*/buffer_node_->buffer_desc().stride,
/*acquire_fence_fd=*/BorrowedHandle{},
/*released_fence_fd=*/BorrowedHandle{}};
}
diff --git a/services/vr/bufferhubd/buffer_node.cpp b/services/vr/bufferhubd/buffer_node.cpp
index 1eba4ae..31c6ef0 100644
--- a/services/vr/bufferhubd/buffer_node.cpp
+++ b/services/vr/bufferhubd/buffer_node.cpp
@@ -1,6 +1,9 @@
#include <errno.h>
+
+#include <private/dvr/IBufferHub.h>
#include <private/dvr/buffer_hub_defs.h>
#include <private/dvr/buffer_node.h>
+#include <ui/GraphicBufferAllocator.h>
namespace android {
namespace dvr {
@@ -19,14 +22,26 @@
BufferNode::BufferNode(uint32_t width, uint32_t height, uint32_t layer_count,
uint32_t format, uint64_t usage,
size_t user_metadata_size) {
- if (int ret = buffer_.Alloc(width, height, layer_count, format, usage)) {
- ALOGE(
- "DetachedBufferChannel::DetachedBufferChannel: Failed to allocate "
- "buffer: %s",
- strerror(-ret));
+ uint32_t out_stride = 0;
+ // graphicBufferId is not used in GraphicBufferAllocator::allocate
+ int ret = GraphicBufferAllocator::get().allocate(
+ width, height, format, layer_count, usage,
+ const_cast<const native_handle_t**>(&buffer_handle_), &out_stride,
+ /*graphicBufferId=*/0, IBufferHub::getServiceName());
+
+ if (ret != OK || buffer_handle_ == nullptr) {
+ ALOGE("BufferNode::BufferNode: Failed to allocate buffer: %s",
+ strerror(-ret));
return;
}
+ buffer_desc_.width = width;
+ buffer_desc_.height = height;
+ buffer_desc_.layers = layer_count;
+ buffer_desc_.format = format;
+ buffer_desc_.usage = usage;
+ buffer_desc_.stride = out_stride;
+
metadata_ = BufferHubMetadata::Create(user_metadata_size);
if (!metadata_.IsValid()) {
ALOGE("BufferNode::BufferNode: Failed to allocate metadata.");
@@ -35,6 +50,17 @@
InitializeMetadata();
}
+// Free the handle
+BufferNode::~BufferNode() {
+ if (buffer_handle_ != nullptr) {
+ status_t ret = GraphicBufferAllocator::get().free(buffer_handle_);
+ if (ret != OK) {
+ ALOGE("BufferNode::~BufferNode: Failed to free handle; Got error: %d",
+ ret);
+ }
+ }
+}
+
uint64_t BufferNode::GetActiveClientsBitMask() const {
return active_clients_bit_mask_->load(std::memory_order_acquire);
}
diff --git a/services/vr/bufferhubd/include/private/dvr/buffer_node.h b/services/vr/bufferhubd/include/private/dvr/buffer_node.h
index 4f356f0..bc0a34e 100644
--- a/services/vr/bufferhubd/include/private/dvr/buffer_node.h
+++ b/services/vr/bufferhubd/include/private/dvr/buffer_node.h
@@ -1,6 +1,7 @@
#ifndef ANDROID_DVR_BUFFERHUBD_BUFFER_NODE_H_
#define ANDROID_DVR_BUFFERHUBD_BUFFER_NODE_H_
+#include <android/hardware_buffer.h>
#include <private/dvr/ion_buffer.h>
#include <ui/BufferHubMetadata.h>
@@ -13,14 +14,16 @@
BufferNode(uint32_t width, uint32_t height, uint32_t layer_count,
uint32_t format, uint64_t usage, size_t user_metadata_size);
- // Returns whether the object holds a valid graphic buffer.
- bool IsValid() const { return buffer_.IsValid() && metadata_.IsValid(); }
+ ~BufferNode();
+
+ // Returns whether the object holds a valid metadata.
+ bool IsValid() const { return metadata_.IsValid(); }
size_t user_metadata_size() const { return metadata_.user_metadata_size(); }
- // Accessors of the IonBuffer.
- IonBuffer& buffer() { return buffer_; }
- const IonBuffer& buffer() const { return buffer_; }
+ // Accessors of the buffer description and handle
+ const native_handle_t* buffer_handle() const { return buffer_handle_; }
+ const AHardwareBuffer_Desc& buffer_desc() const { return buffer_desc_; }
// Accessors of metadata.
const BufferHubMetadata& metadata() const { return metadata_; }
@@ -48,7 +51,8 @@
void InitializeMetadata();
// Gralloc buffer handles.
- IonBuffer buffer_;
+ native_handle_t* buffer_handle_;
+ AHardwareBuffer_Desc buffer_desc_;
// Metadata in shared memory.
BufferHubMetadata metadata_;
diff --git a/services/vr/bufferhubd/tests/Android.bp b/services/vr/bufferhubd/tests/Android.bp
index a80691f..c77d2d2 100644
--- a/services/vr/bufferhubd/tests/Android.bp
+++ b/services/vr/bufferhubd/tests/Android.bp
@@ -33,7 +33,10 @@
"-DTRACE=0",
"-DATRACE_TAG=ATRACE_TAG_GRAPHICS",
],
- header_libs: ["libdvr_headers"],
+ header_libs: [
+ "libdvr_headers",
+ "libnativewindow_headers",
+ ],
static_libs: [
"libbufferhub",
"libbufferhubd",
diff --git a/services/vr/bufferhubd/tests/buffer_node-test.cpp b/services/vr/bufferhubd/tests/buffer_node-test.cpp
index 6671e97..30ecbec 100644
--- a/services/vr/bufferhubd/tests/buffer_node-test.cpp
+++ b/services/vr/bufferhubd/tests/buffer_node-test.cpp
@@ -2,12 +2,15 @@
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <private/dvr/buffer_node.h>
+#include <ui/GraphicBufferMapper.h>
namespace android {
namespace dvr {
namespace {
+using testing::NotNull;
+
const uint32_t kWidth = 640;
const uint32_t kHeight = 480;
const uint32_t kLayerCount = 1;
@@ -35,6 +38,16 @@
TEST_F(BufferNodeTest, TestCreateBufferNode) {
EXPECT_EQ(buffer_node->user_metadata_size(), kUserMetadataSize);
+ // Test the handle just allocated is good (i.e. able to be imported)
+ GraphicBufferMapper& mapper = GraphicBufferMapper::get();
+ const native_handle_t* outHandle;
+ status_t ret = mapper.importBuffer(
+ buffer_node->buffer_handle(), buffer_node->buffer_desc().width,
+ buffer_node->buffer_desc().height, buffer_node->buffer_desc().layers,
+ buffer_node->buffer_desc().format, buffer_node->buffer_desc().usage,
+ buffer_node->buffer_desc().stride, &outHandle);
+ EXPECT_EQ(ret, OK);
+ EXPECT_THAT(outHandle, NotNull());
}
TEST_F(BufferNodeTest, TestAddNewActiveClientsBitToMask_twoNewClients) {