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

Commit a5ba7b54 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Implement allocateBuffer for BufferHubService"

parents 8893de4d 93c94907
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