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

Commit d727e9c7 authored by John Reck's avatar John Reck
Browse files

Add AHB_allocate2 + get/setDataSpace

Also fix that some ADataSpace enum values were not prefixed
with ADATASPACE_*

Test: atest AHardwareBufferTest
Bug: 315475131
Change-Id: Ie92f416a209501fa8fdc9b3593ea6d3bb68eaa48
parent 1fcaffe2
Loading
Loading
Loading
Loading
+86 −5
Original line number Diff line number Diff line
@@ -113,6 +113,22 @@ static_assert(
                AHARDWAREBUFFER_FORMAT_R10G10B10A10_UNORM,
        "HAL and AHardwareBuffer pixel format don't match");

static enum AHardwareBufferStatus filterStatus(status_t status) {
    switch (status) {
        case STATUS_OK:
            return AHARDWAREBUFFER_STATUS_OK;
        case STATUS_NO_MEMORY:
            return AHARDWAREBUFFER_STATUS_NO_MEMORY;
        case STATUS_BAD_VALUE:
            return AHARDWAREBUFFER_STATUS_BAD_VALUE;
        case STATUS_UNKNOWN_TRANSACTION:
        case STATUS_INVALID_OPERATION:
            return AHARDWAREBUFFER_STATUS_UNSUPPORTED;
        default:
            return AHARDWAREBUFFER_STATUS_UNKNOWN_ERROR;
    }
}

// ----------------------------------------------------------------------------
// Public functions
// ----------------------------------------------------------------------------
@@ -511,6 +527,24 @@ binder_status_t AHardwareBuffer_writeToParcel(const AHardwareBuffer* _Nonnull bu
    return AParcel_viewPlatformParcel(parcel)->write(*gb);
}

ADataSpace AHardwareBuffer_getDataSpace(const AHardwareBuffer* _Nonnull buffer) {
    const GraphicBuffer* gb = AHardwareBuffer_to_GraphicBuffer(buffer);
    if (!gb) return ADATASPACE_UNKNOWN;
    ui::Dataspace dataspace = ui::Dataspace::UNKNOWN;
    status_t status = gb->getDataspace(&dataspace);
    if (status != OK) {
        return ADATASPACE_UNKNOWN;
    }
    return static_cast<ADataSpace>(dataspace);
}

enum AHardwareBufferStatus AHardwareBuffer_setDataSpace(AHardwareBuffer* buffer,
                                                        ADataSpace dataspace) {
    GraphicBuffer* gb = AHardwareBuffer_to_GraphicBuffer(buffer);
    auto& mapper = GraphicBufferMapper::get();
    return filterStatus(mapper.setDataspace(gb->handle, static_cast<ui::Dataspace>(dataspace)));
}

// ----------------------------------------------------------------------------
// VNDK functions
// ----------------------------------------------------------------------------
@@ -552,6 +586,56 @@ int AHardwareBuffer_createFromHandle(const AHardwareBuffer_Desc* desc,
    return NO_ERROR;
}

enum AHardwareBufferStatus AHardwareBuffer_allocate2(
        const AHardwareBuffer_Desc* desc, const AHardwareBufferLongOptions* additionalOptions,
        size_t additionalOptionsSize, AHardwareBuffer** outBuffer) {
    (void)additionalOptions;
    (void)additionalOptionsSize;
    if (!outBuffer || !desc) return AHARDWAREBUFFER_STATUS_BAD_VALUE;
    if (!AHardwareBuffer_isValidDescription(desc, /*log=*/true)) {
        return AHARDWAREBUFFER_STATUS_BAD_VALUE;
    }

    int format = AHardwareBuffer_convertToPixelFormat(desc->format);
    uint64_t usage = AHardwareBuffer_convertToGrallocUsageBits(desc->usage);

    std::vector<GraphicBufferAllocator::AdditionalOptions> extras;
    extras.reserve(additionalOptionsSize);
    for (size_t i = 0; i < additionalOptionsSize; i++) {
        extras.push_back(GraphicBufferAllocator::AdditionalOptions{additionalOptions[i].name,
                                                                   additionalOptions[i].value});
    }

    const auto extrasCount = extras.size();
    auto gbuffer = sp<GraphicBuffer>::make(GraphicBufferAllocator::AllocationRequest{
            .importBuffer = true,
            .width = desc->width,
            .height = desc->height,
            .format = format,
            .layerCount = desc->layers,
            .usage = usage,
            .requestorName = std::string("AHardwareBuffer pid [") + std::to_string(getpid()) + "]",
            .extras = std::move(extras),
    });

    status_t err = gbuffer->initCheck();
    if (err != 0 || gbuffer->handle == nullptr) {
        if (err == NO_MEMORY) {
        GraphicBuffer::dumpAllocationsToSystemLog();
        }
        ALOGE("GraphicBuffer(w=%u, h=%u, lc=%u, extrasCount=%zd) failed (%s), handle=%p",
              desc->width, desc->height, desc->layers, extrasCount, strerror(-err),
              gbuffer->handle);
        return filterStatus(err == 0 ? UNKNOWN_ERROR : err);
    }

    *outBuffer = AHardwareBuffer_from_GraphicBuffer(gbuffer.get());

    // Ensure the buffer doesn't get destroyed when the sp<> goes away.
    AHardwareBuffer_acquire(*outBuffer);
    return AHARDWAREBUFFER_STATUS_OK;
}

// ----------------------------------------------------------------------------
// Helpers implementation
// ----------------------------------------------------------------------------
@@ -652,12 +736,9 @@ uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t ahardwarebuffer_format) {
    return ahardwarebuffer_format;
}

// TODO: Remove, this is just to make an overly aggressive ABI checker happy
int32_t AHardwareBuffer_getDataSpace(AHardwareBuffer* buffer) {
    GraphicBuffer* gb = AHardwareBuffer_to_GraphicBuffer(buffer);
    auto& mapper = GraphicBufferMapper::get();
    ui::Dataspace dataspace = ui::Dataspace::UNKNOWN;
    mapper.getDataspace(gb->handle, &dataspace);
    return static_cast<int32_t>(dataspace);
    return ::AHardwareBuffer_getDataSpace(buffer);
}

uint64_t AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage) {
+50 −25
Original line number Diff line number Diff line
@@ -152,31 +152,56 @@ int32_t ANativeWindow_setBuffersTransform(ANativeWindow* window, int32_t transfo

int32_t ANativeWindow_setBuffersDataSpace(ANativeWindow* window, int32_t dataSpace) {
    static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
    static_assert(static_cast<int>(STANDARD_MASK) == static_cast<int>(HAL_DATASPACE_STANDARD_MASK));
    static_assert(static_cast<int>(STANDARD_UNSPECIFIED) == static_cast<int>(HAL_DATASPACE_STANDARD_UNSPECIFIED));
    static_assert(static_cast<int>(STANDARD_BT709) == static_cast<int>(HAL_DATASPACE_STANDARD_BT709));
    static_assert(static_cast<int>(STANDARD_BT601_625) == static_cast<int>(HAL_DATASPACE_STANDARD_BT601_625));
    static_assert(static_cast<int>(STANDARD_BT601_625_UNADJUSTED) == static_cast<int>(HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED));
    static_assert(static_cast<int>(STANDARD_BT601_525) == static_cast<int>(HAL_DATASPACE_STANDARD_BT601_525));
    static_assert(static_cast<int>(STANDARD_BT601_525_UNADJUSTED) == static_cast<int>(HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED));
    static_assert(static_cast<int>(STANDARD_BT470M) == static_cast<int>(HAL_DATASPACE_STANDARD_BT470M));
    static_assert(static_cast<int>(STANDARD_FILM) == static_cast<int>(HAL_DATASPACE_STANDARD_FILM));
    static_assert(static_cast<int>(STANDARD_DCI_P3) == static_cast<int>(HAL_DATASPACE_STANDARD_DCI_P3));
    static_assert(static_cast<int>(STANDARD_ADOBE_RGB) == static_cast<int>(HAL_DATASPACE_STANDARD_ADOBE_RGB));
    static_assert(static_cast<int>(TRANSFER_MASK) == static_cast<int>(HAL_DATASPACE_TRANSFER_MASK));
    static_assert(static_cast<int>(TRANSFER_UNSPECIFIED) == static_cast<int>(HAL_DATASPACE_TRANSFER_UNSPECIFIED));
    static_assert(static_cast<int>(TRANSFER_LINEAR) == static_cast<int>(HAL_DATASPACE_TRANSFER_LINEAR));
    static_assert(static_cast<int>(TRANSFER_SMPTE_170M) == static_cast<int>(HAL_DATASPACE_TRANSFER_SMPTE_170M));
    static_assert(static_cast<int>(TRANSFER_GAMMA2_2) == static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_2));
    static_assert(static_cast<int>(TRANSFER_GAMMA2_6) == static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_6));
    static_assert(static_cast<int>(TRANSFER_GAMMA2_8) == static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_8));
    static_assert(static_cast<int>(TRANSFER_ST2084) == static_cast<int>(HAL_DATASPACE_TRANSFER_ST2084));
    static_assert(static_cast<int>(TRANSFER_HLG) == static_cast<int>(HAL_DATASPACE_TRANSFER_HLG));
    static_assert(static_cast<int>(RANGE_MASK) == static_cast<int>(HAL_DATASPACE_RANGE_MASK));
    static_assert(static_cast<int>(RANGE_UNSPECIFIED) == static_cast<int>(HAL_DATASPACE_RANGE_UNSPECIFIED));
    static_assert(static_cast<int>(RANGE_FULL) == static_cast<int>(HAL_DATASPACE_RANGE_FULL));
    static_assert(static_cast<int>(RANGE_LIMITED) == static_cast<int>(HAL_DATASPACE_RANGE_LIMITED));
    static_assert(static_cast<int>(RANGE_EXTENDED) == static_cast<int>(HAL_DATASPACE_RANGE_EXTENDED));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_MASK) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_MASK));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_UNSPECIFIED) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_UNSPECIFIED));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT709) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT709));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT601_625) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT601_625));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT601_625_UNADJUSTED) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT601_525) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT601_525));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT601_525_UNADJUSTED) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_BT470M) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_BT470M));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_FILM) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_FILM));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_DCI_P3) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_DCI_P3));
    static_assert(static_cast<int>(ADATASPACE_STANDARD_ADOBE_RGB) ==
                  static_cast<int>(HAL_DATASPACE_STANDARD_ADOBE_RGB));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_MASK) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_MASK));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_UNSPECIFIED) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_UNSPECIFIED));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_LINEAR) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_LINEAR));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_SMPTE_170M) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_SMPTE_170M));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_GAMMA2_2) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_2));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_GAMMA2_6) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_6));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_GAMMA2_8) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_GAMMA2_8));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_ST2084) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_ST2084));
    static_assert(static_cast<int>(ADATASPACE_TRANSFER_HLG) ==
                  static_cast<int>(HAL_DATASPACE_TRANSFER_HLG));
    static_assert(static_cast<int>(ADATASPACE_RANGE_MASK) ==
                  static_cast<int>(HAL_DATASPACE_RANGE_MASK));
    static_assert(static_cast<int>(ADATASPACE_RANGE_UNSPECIFIED) ==
                  static_cast<int>(HAL_DATASPACE_RANGE_UNSPECIFIED));
    static_assert(static_cast<int>(ADATASPACE_RANGE_FULL) ==
                  static_cast<int>(HAL_DATASPACE_RANGE_FULL));
    static_assert(static_cast<int>(ADATASPACE_RANGE_LIMITED) ==
                  static_cast<int>(HAL_DATASPACE_RANGE_LIMITED));
    static_assert(static_cast<int>(ADATASPACE_RANGE_EXTENDED) ==
                  static_cast<int>(HAL_DATASPACE_RANGE_EXTENDED));
    static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
    static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
    static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
+2 −7
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@

#include <stdint.h>

struct AHardwareBuffer;
struct AHardwareBuffer_Desc;
#include <vndk/hardware_buffer.h>

struct ANativeWindowBuffer;

namespace android {
@@ -46,11 +46,6 @@ uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format);
// convert HAL format to AHardwareBuffer format (note: this is a no-op)
uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format);

// retrieves a dataspace from the AHardwareBuffer metadata, if the device
// support gralloc metadata. Returns UNKNOWN if gralloc metadata is not
// supported.
int32_t AHardwareBuffer_getDataSpace(AHardwareBuffer* buffer);

// convert AHardwareBuffer usage bits to HAL usage bits (note: this is a no-op)
uint64_t AHardwareBuffer_convertFromGrallocUsageBits(uint64_t usage);

+94 −48

File changed.

Preview size limit exceeded, changes collapsed.

+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,9 @@
#define ANDROID_HARDWARE_BUFFER_H

#include <android/rect.h>
#define ADATASPACE_SKIP_LEGACY_DEFINES
#include <android/data_space.h>
#undef ADATASPACE_SKIP_LEGACY_DEFINES
#include <inttypes.h>
#include <sys/cdefs.h>

Loading