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

Commit 93c94907 authored by Fan Xu's avatar Fan Xu
Browse files

Implement allocateBuffer for BufferHubService

Return ALLOCATION_FAILED when failed to create BufferNode, NO_ERROR on
success.

Allocation and memory management logics are in BufferNode, and enforced
via the shared_ptr and clientList. Memcpy is used to convert between
AHardwareBuffer_Desc and HardwareBufferDescription (i.e. hidl_vec).

Test: BufferHubBuffer_test (passed)
Change-Id: I5e17aa7330c5f94656e62dc4bea8ab6c705ab7a4
Fix: 118614333
parent e0b91f35
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -32,7 +32,8 @@ cc_test {
    name: "BufferHubBuffer_test",
    header_libs: [
        "libbufferhub_headers",
        "libdvr_headers"
        "libdvr_headers",
        "libnativewindow_headers",
    ],
    shared_libs: [
        "android.frameworks.bufferhub@1.0",
+18 −13
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <android/frameworks/bufferhub/1.0/IBufferClient.h>
#include <android/frameworks/bufferhub/1.0/IBufferHub.h>
#include <android/hardware_buffer.h>
#include <gtest/gtest.h>
#include <hidl/ServiceManagement.h>
#include <hwbinder/IPCThreadState.h>
@@ -41,6 +42,7 @@ using frameworks::bufferhub::V1_0::BufferHubStatus;
using frameworks::bufferhub::V1_0::IBufferClient;
using frameworks::bufferhub::V1_0::IBufferHub;
using hardware::hidl_handle;
using hardware::graphics::common::V1_2::HardwareBufferDescription;
using hidl::base::V1_0::IBase;
using pdx::LocalChannelHandle;

@@ -124,19 +126,22 @@ TEST_F(BufferHubBufferTest, DuplicateBufferHubBuffer) {
    return;
}

TEST_F(BufferHubBufferTest, ConnectHidlServer) {
    sp<IBufferHub> bufferhub = IBufferHub::getService();
    ASSERT_NE(nullptr, bufferhub.get());

    // TODO(b/116681016): Fill in real test once the interface gets implemented..
    hidl_handle handle;
    EXPECT_TRUE(bufferhub
                        ->importBuffer(handle,
                                       [](const auto& client, const auto& ret) {
                                           EXPECT_EQ(client, nullptr);
                                           EXPECT_EQ(ret, BufferHubStatus::NO_ERROR);
                                       })
                        .isOk());
TEST_F(BufferHubBufferTest, AllocateBuffer) {
    // TODO(b/116681016): directly test on BufferHubBuffer instead of the service.
    sp<IBufferHub> bufferHub = IBufferHub::getService();
    ASSERT_NE(nullptr, bufferHub.get());

    // Stride is an output, rfu0 and rfu1 are reserved data slot for future use.
    AHardwareBuffer_Desc aDesc = {kWidth, kHeight,        kLayerCount,  kFormat,
                                  kUsage, /*stride=*/0UL, /*rfu0=*/0UL, /*rfu1=*/0ULL};
    HardwareBufferDescription desc;
    memcpy(&desc, &aDesc, sizeof(HardwareBufferDescription));

    IBufferHub::allocateBuffer_cb callback = [](const auto& client, const auto& status) {
        EXPECT_EQ(status, BufferHubStatus::NO_ERROR);
        EXPECT_NE(nullptr, client.get());
    };
    EXPECT_TRUE(bufferHub->allocateBuffer(desc, kUserMetadataSize, callback).isOk());
}

} // namespace
+6 −0
Original line number Diff line number Diff line
@@ -52,6 +52,12 @@ cc_binary {
    srcs: [
        "main_bufferhub.cpp"
    ],
    header_libs: [
        "libbufferhub_headers",
        "libdvr_headers",
        "libnativewindow_headers",
        "libpdx_headers",
    ],
    shared_libs: [
        "android.frameworks.bufferhub@1.0",
        "libbufferhubservice",
+22 −4
Original line number Diff line number Diff line
@@ -14,7 +14,9 @@
 * limitations under the License.
 */

#include <android/hardware_buffer.h>
#include <bufferhub/BufferHubService.h>
#include <log/log.h>

namespace android {
namespace frameworks {
@@ -24,11 +26,27 @@ namespace implementation {

using hardware::Void;

Return<void> BufferHubService::allocateBuffer(const HardwareBufferDescription& /*description*/,
                                              const uint32_t /*userMetadataSize*/,
Return<void> BufferHubService::allocateBuffer(const HardwareBufferDescription& description,
                                              const uint32_t userMetadataSize,
                                              allocateBuffer_cb _hidl_cb) {
    // TODO(b/118614333): implement buffer allocation
    _hidl_cb(/*bufferClient=*/nullptr, /*status=*/BufferHubStatus::NO_ERROR);
    AHardwareBuffer_Desc desc;
    memcpy(&desc, &description, sizeof(AHardwareBuffer_Desc));

    std::shared_ptr<BufferNode> node =
            std::make_shared<BufferNode>(desc.width, desc.height, desc.layers, desc.format,
                                         desc.usage, userMetadataSize);
    if (node == nullptr || !node->IsValid()) {
        ALOGE("%s: creating BufferNode failed.", __FUNCTION__);
        _hidl_cb(/*bufferClient=*/nullptr, /*status=*/BufferHubStatus::ALLOCATION_FAILED);
        return Void();
    }

    sp<BufferClient> client = new BufferClient(node);
    // Add it to list for bookkeeping and dumpsys.
    std::lock_guard<std::mutex> lock(mClientListMutex);
    mClientList.push_back(client);

    _hidl_cb(/*bufferClient=*/client, /*status=*/BufferHubStatus::NO_ERROR);
    return Void();
}

+11 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#define ANDROID_FRAMEWORKS_BUFFERHUB_V1_0_BUFFER_CLIENT_H

#include <android/frameworks/bufferhub/1.0/IBufferClient.h>
#include <bufferhub/BufferNode.h>

namespace android {
namespace frameworks {
@@ -27,9 +28,19 @@ namespace implementation {

using hardware::Return;

// Forward declaration to avoid circular dependency
class BufferHubService;

class BufferClient : public IBufferClient {
public:
    // Creates a server-side buffer client from an existing BufferNode. Note that
    // this funciton takes ownership of the shared_ptr.
    explicit BufferClient(const std::shared_ptr<BufferNode>& node) : mBufferNode(node){};

    Return<void> duplicate(duplicate_cb _hidl_cb) override;

private:
    std::shared_ptr<BufferNode> mBufferNode;
};

} // namespace implementation
Loading