Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb094a5d authored by Fan Xu's avatar Fan Xu
Browse files

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
parent a5517d71
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -45,7 +45,10 @@ cc_library_static {
        "-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",
+10 −10
Original line number Diff line number Diff line
@@ -49,9 +49,9 @@ BufferChannel::~BufferChannel() {

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 @@ Status<BufferTraits<BorrowedHandle>> BufferChannel::OnImport(

  // 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{}};
}
+31 −5
Original line number Diff line number Diff line
#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 @@ void BufferNode::InitializeMetadata() {
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",
  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 @@ BufferNode::BufferNode(uint32_t width, uint32_t height, uint32_t layer_count,
  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);
}
+10 −6
Original line number Diff line number Diff line
#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 @@ class BufferNode {
  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 @@ class BufferNode {
  void InitializeMetadata();

  // Gralloc buffer handles.
  IonBuffer buffer_;
  native_handle_t* buffer_handle_;
  AHardwareBuffer_Desc buffer_desc_;

  // Metadata in shared memory.
  BufferHubMetadata metadata_;
+4 −1
Original line number Diff line number Diff line
@@ -33,7 +33,10 @@ cc_test {
        "-DTRACE=0",
        "-DATRACE_TAG=ATRACE_TAG_GRAPHICS",
    ],
    header_libs: ["libdvr_headers"],
    header_libs: [
        "libdvr_headers",
        "libnativewindow_headers",
    ],
    static_libs: [
        "libbufferhub",
        "libbufferhubd",
Loading