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

Commit f9c98e55 authored by Courtney Goeltzenleuchter's avatar Courtney Goeltzenleuchter
Browse files

SF: Update to composer@2.2 implementation

Bug: 63710530
Test: adb -d shell am start -n \
      com.drawelements.deqp/android.app.NativeActivity \
      -e cmdLine '"deqp --deqp-case=dEQP-EGL.functional.hdr_metadata.* \
      --deqp-log-filename=/sdcard/dEQP-Log.qpa"'
Change-Id: I5412eae0a001406e058cd6687b02f3a37c82a7f1
parent 936799c1
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ sharedLibraries = [
    "android.frameworks.vr.composer@1.0",
    "android.frameworks.vr.composer@1.0",
    "android.hardware.graphics.allocator@2.0",
    "android.hardware.graphics.allocator@2.0",
    "android.hardware.graphics.composer@2.1",
    "android.hardware.graphics.composer@2.1",
    "android.hardware.graphics.composer@2.2",
    "libbinder",
    "libbinder",
    "libbase",
    "libbase",
    "libbufferhubqueue",
    "libbufferhubqueue",
@@ -62,6 +63,7 @@ sharedLibraries = [


headerLibraries = [
headerLibraries = [
    "android.hardware.graphics.composer@2.1-command-buffer",
    "android.hardware.graphics.composer@2.1-command-buffer",
    "android.hardware.graphics.composer@2.2-command-buffer",
    "libdvr_headers",
    "libdvr_headers",
    "libsurfaceflinger_headers",
    "libsurfaceflinger_headers",
]
]
+3 −0
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ cc_defaults {
        "android.hardware.configstore@1.0",
        "android.hardware.configstore@1.0",
        "android.hardware.graphics.allocator@2.0",
        "android.hardware.graphics.allocator@2.0",
        "android.hardware.graphics.composer@2.1",
        "android.hardware.graphics.composer@2.1",
        "android.hardware.graphics.composer@2.2",
        "android.hardware.power@1.0",
        "android.hardware.power@1.0",
        "libbase",
        "libbase",
        "libbinder",
        "libbinder",
@@ -57,6 +58,7 @@ cc_defaults {
    ],
    ],
    header_libs: [
    header_libs: [
        "android.hardware.graphics.composer@2.1-command-buffer",
        "android.hardware.graphics.composer@2.1-command-buffer",
        "android.hardware.graphics.composer@2.2-command-buffer",
    ],
    ],
    export_static_lib_headers: [
    export_static_lib_headers: [
        "libserviceutils",
        "libserviceutils",
@@ -64,6 +66,7 @@ cc_defaults {
    export_shared_lib_headers: [
    export_shared_lib_headers: [
        "android.hardware.graphics.allocator@2.0",
        "android.hardware.graphics.allocator@2.0",
        "android.hardware.graphics.composer@2.1",
        "android.hardware.graphics.composer@2.1",
        "android.hardware.graphics.composer@2.2",
        "libhidlbase",
        "libhidlbase",
        "libhidltransport",
        "libhidltransport",
        "libhwbinder",
        "libhwbinder",
+7 −0
Original line number Original line Diff line number Diff line
@@ -629,6 +629,13 @@ void BufferLayer::setPerFrameData(const sp<const DisplayDevice>& displayDevice)
              to_string(error).c_str(), static_cast<int32_t>(error));
              to_string(error).c_str(), static_cast<int32_t>(error));
    }
    }


    const HdrMetadata& metadata = mConsumer->getCurrentHdrMetadata();
    error = hwcLayer->setHdrMetadata(metadata);
    if (error != HWC2::Error::None) {
        ALOGE("[%s] Failed to set hdrMetadata: %s (%d)", mName.string(),
              to_string(error).c_str(), static_cast<int32_t>(error));
    }

    uint32_t hwcSlot = 0;
    uint32_t hwcSlot = 0;
    sp<GraphicBuffer> hwcBuffer;
    sp<GraphicBuffer> hwcBuffer;
    hwcInfo.bufferCache.getHwcBuffer(getBE().compositionInfo.mBufferSlot,
    hwcInfo.bufferCache.getHwcBuffer(getBE().compositionInfo.mBufferSlot,
+97 −16
Original line number Original line Diff line number Diff line
@@ -19,15 +19,23 @@


#include <inttypes.h>
#include <inttypes.h>
#include <log/log.h>
#include <log/log.h>
#include <gui/BufferQueue.h>


#include "ComposerHal.h"
#include "ComposerHal.h"


#include <android/hardware/graphics/composer/2.2/IComposer.h>
#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
#include <gui/BufferQueue.h>
#include <hidl/HidlTransportUtils.h>

namespace android {
namespace android {


using hardware::Return;
using hardware::Return;
using hardware::hidl_vec;
using hardware::hidl_vec;
using hardware::hidl_handle;
using hardware::hidl_handle;
using namespace hardware::graphics::composer;
using PerFrameMetadata = hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadata;
using PerFrameMetadataKey =
        hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey;


namespace Hwc2 {
namespace Hwc2 {


@@ -117,8 +125,7 @@ Composer::CommandWriter::~CommandWriter()
void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId)
{
{
    constexpr uint16_t kSetLayerInfoLength = 2;
    constexpr uint16_t kSetLayerInfoLength = 2;
    beginCommand(
    beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
        static_cast<IComposerClient::Command>(
                         IVrComposerClient::VrCommand::SET_LAYER_INFO),
                         IVrComposerClient::VrCommand::SET_LAYER_INFO),
                 kSetLayerInfoLength);
                 kSetLayerInfoLength);
    write(type);
    write(type);
@@ -130,8 +137,7 @@ void Composer::CommandWriter::setClientTargetMetadata(
        const IVrComposerClient::BufferMetadata& metadata)
        const IVrComposerClient::BufferMetadata& metadata)
{
{
    constexpr uint16_t kSetClientTargetMetadataLength = 7;
    constexpr uint16_t kSetClientTargetMetadataLength = 7;
    beginCommand(
    beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
        static_cast<IComposerClient::Command>(
                         IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
                         IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA),
                 kSetClientTargetMetadataLength);
                 kSetClientTargetMetadataLength);
    writeBufferMetadata(metadata);
    writeBufferMetadata(metadata);
@@ -142,8 +148,7 @@ void Composer::CommandWriter::setLayerBufferMetadata(
        const IVrComposerClient::BufferMetadata& metadata)
        const IVrComposerClient::BufferMetadata& metadata)
{
{
    constexpr uint16_t kSetLayerBufferMetadataLength = 7;
    constexpr uint16_t kSetLayerBufferMetadataLength = 7;
    beginCommand(
    beginCommand(static_cast<hardware::graphics::composer::V2_1::IComposerClient::Command>(
        static_cast<IComposerClient::Command>(
                         IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
                         IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA),
                 kSetLayerBufferMetadataLength);
                 kSetLayerBufferMetadataLength);
    writeBufferMetadata(metadata);
    writeBufferMetadata(metadata);
@@ -182,6 +187,13 @@ Composer::Composer(const std::string& serviceName)
        LOG_ALWAYS_FATAL("failed to create composer client");
        LOG_ALWAYS_FATAL("failed to create composer client");
    }
    }


    // 2.2 support is optional
    sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer);
    if (composer_2_2 != nullptr) {
        mClient_2_2 = IComposerClient::castFrom(mClient);
        LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, "IComposer 2.2 did not return IComposerClient 2.2");
    }

    if (mIsUsingVrComposer) {
    if (mIsUsingVrComposer) {
        sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
        sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient);
        if (vrClient == nullptr) {
        if (vrClient == nullptr) {
@@ -451,6 +463,25 @@ Error Composer::getHdrCapabilities(Display display,
    return error;
    return error;
}
}


Error Composer::getPerFrameMetadataKeys(
        Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) {
    if (!mClient_2_2) {
        return Error::UNSUPPORTED;
    }

    Error error = kDefaultError;
    mClient_2_2->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) {
        error = tmpError;
        if (error != Error::NONE) {
            return;
        }

        *outKeys = tmpKeys;
    });

    return error;
}

Error Composer::getReleaseFences(Display display,
Error Composer::getReleaseFences(Display display,
        std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
        std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
{
{
@@ -530,7 +561,15 @@ Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer,


Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode)
{
{
    auto ret = mClient->setPowerMode(display, mode);
    hardware::Return<Error> ret(Error::UNSUPPORTED);
    if (mClient_2_2) {
        ret = mClient_2_2->setPowerMode_2_2(display, mode);
    } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) {
        ret = mClient->setPowerMode(display,
                                    static_cast<hardware::graphics::composer::V2_1::
                                                        IComposerClient::PowerMode>(mode));
    }

    return unwrapRet(ret);
    return unwrapRet(ret);
}
}


@@ -666,6 +705,44 @@ Error Composer::setLayerDataspace(Display display, Layer layer,
    return Error::NONE;
    return Error::NONE;
}
}


Error Composer::setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) {

    mWriter.selectDisplay(display);
    mWriter.selectLayer(layer);

    std::vector<PerFrameMetadata> composerMetadata;
    if (metadata.validTypes & HdrMetadata::SMPTE2086) {
        composerMetadata
                .insert(composerMetadata.end(),
                        {{PerFrameMetadataKey::DISPLAY_RED_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryRed.x},
                         {PerFrameMetadataKey::DISPLAY_RED_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryRed.y},
                         {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryGreen.x},
                         {PerFrameMetadataKey::DISPLAY_GREEN_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryGreen.y},
                         {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_X,
                          metadata.smpte2086.displayPrimaryBlue.x},
                         {PerFrameMetadataKey::DISPLAY_BLUE_PRIMARY_Y,
                          metadata.smpte2086.displayPrimaryBlue.y},
                         {PerFrameMetadataKey::WHITE_POINT_X, metadata.smpte2086.whitePoint.x},
                         {PerFrameMetadataKey::WHITE_POINT_Y, metadata.smpte2086.whitePoint.y},
                         {PerFrameMetadataKey::MAX_LUMINANCE, metadata.smpte2086.maxLuminance},
                         {PerFrameMetadataKey::MIN_LUMINANCE, metadata.smpte2086.minLuminance}});
    }
    if (metadata.validTypes & HdrMetadata::CTA861_3) {
        composerMetadata.insert(composerMetadata.end(),
                                {{PerFrameMetadataKey::MAX_CONTENT_LIGHT_LEVEL,
                                  metadata.cta8613.maxContentLightLevel},
                                 {PerFrameMetadataKey::MAX_FRAME_AVERAGE_LIGHT_LEVEL,
                                  metadata.cta8613.maxFrameAverageLightLevel}});
    }

    mWriter.setPerFrameMetadata(composerMetadata);
    return Error::NONE;
}

Error Composer::setLayerDisplayFrame(Display display, Layer layer,
Error Composer::setLayerDisplayFrame(Display display, Layer layer,
        const IComposerClient::Rect& frame)
        const IComposerClient::Rect& frame)
{
{
@@ -810,7 +887,8 @@ Error Composer::execute()
            mReader.takeErrors();
            mReader.takeErrors();


        for (const auto& cmdErr : commandErrors) {
        for (const auto& cmdErr : commandErrors) {
            auto command = mWriter.getCommand(cmdErr.location);
            auto command =
                    static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location));


            if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
            if (command == IComposerClient::Command::VALIDATE_DISPLAY ||
                command == IComposerClient::Command::PRESENT_DISPLAY ||
                command == IComposerClient::Command::PRESENT_DISPLAY ||
@@ -841,7 +919,10 @@ Error CommandReader::parse()
    uint16_t length = 0;
    uint16_t length = 0;


    while (!isEmpty()) {
    while (!isEmpty()) {
        if (!beginCommand(&command, &length)) {
        auto command_2_1 =
                reinterpret_cast<hardware::graphics::composer::V2_1::IComposerClient::Command*>(
                        &command);
        if (!beginCommand(command_2_1, &length)) {
            break;
            break;
        }
        }


+21 −9
Original line number Original line Diff line number Diff line
@@ -24,8 +24,10 @@
#include <vector>
#include <vector>


#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
#include <android/frameworks/vr/composer/1.0/IVrComposerClient.h>
#include <android/hardware/graphics/composer/2.1/IComposer.h>
#include <android/hardware/graphics/composer/2.2/IComposer.h>
#include <composer-command-buffer/2.1/ComposerCommandBuffer.h>
#include <android/hardware/graphics/composer/2.2/IComposerClient.h>
#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
#include <gui/HdrMetadata.h>
#include <ui/GraphicBuffer.h>
#include <ui/GraphicBuffer.h>
#include <utils/StrongPointer.h>
#include <utils/StrongPointer.h>


@@ -42,16 +44,16 @@ using android::hardware::graphics::common::V1_0::Hdr;
using android::hardware::graphics::common::V1_0::PixelFormat;
using android::hardware::graphics::common::V1_0::PixelFormat;
using android::hardware::graphics::common::V1_0::Transform;
using android::hardware::graphics::common::V1_0::Transform;


using android::hardware::graphics::composer::V2_1::Config;
using android::hardware::graphics::composer::V2_1::Display;
using android::hardware::graphics::composer::V2_1::Error;
using android::hardware::graphics::composer::V2_1::IComposer;
using android::hardware::graphics::composer::V2_1::IComposer;
using android::hardware::graphics::composer::V2_1::IComposerCallback;
using android::hardware::graphics::composer::V2_1::IComposerCallback;
using android::hardware::graphics::composer::V2_1::IComposerClient;
using android::hardware::graphics::composer::V2_1::Error;
using android::hardware::graphics::composer::V2_1::Display;
using android::hardware::graphics::composer::V2_1::Layer;
using android::hardware::graphics::composer::V2_1::Layer;
using android::hardware::graphics::composer::V2_1::Config;
using android::hardware::graphics::composer::V2_2::IComposerClient;


using android::hardware::graphics::composer::V2_1::CommandWriterBase;
using android::hardware::graphics::composer::V2_2::CommandReaderBase;
using android::hardware::graphics::composer::V2_1::CommandReaderBase;
using android::hardware::graphics::composer::V2_2::CommandWriterBase;


using android::hardware::kSynchronizedReadWrite;
using android::hardware::kSynchronizedReadWrite;
using android::hardware::MessageQueue;
using android::hardware::MessageQueue;
@@ -111,6 +113,9 @@ public:
                                     float* outMaxLuminance, float* outMaxAverageLuminance,
                                     float* outMaxLuminance, float* outMaxAverageLuminance,
                                     float* outMinLuminance) = 0;
                                     float* outMinLuminance) = 0;


    virtual Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) = 0;

    virtual Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
    virtual Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
                                   std::vector<int>* outReleaseFences) = 0;
                                   std::vector<int>* outReleaseFences) = 0;


@@ -155,6 +160,8 @@ public:
    virtual Error setLayerCompositionType(Display display, Layer layer,
    virtual Error setLayerCompositionType(Display display, Layer layer,
                                          IComposerClient::Composition type) = 0;
                                          IComposerClient::Composition type) = 0;
    virtual Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) = 0;
    virtual Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) = 0;
    virtual Error setLayerHdrMetadata(Display display, Layer layer,
                                      const HdrMetadata& metadata) = 0;
    virtual Error setLayerDisplayFrame(Display display, Layer layer,
    virtual Error setLayerDisplayFrame(Display display, Layer layer,
                                       const IComposerClient::Rect& frame) = 0;
                                       const IComposerClient::Rect& frame) = 0;
    virtual Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) = 0;
    virtual Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) = 0;
@@ -298,6 +305,9 @@ public:
    Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
    Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
                             float* outMaxAverageLuminance, float* outMinLuminance) override;
                             float* outMaxAverageLuminance, float* outMinLuminance) override;


    Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) override;

    Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
    Error getReleaseFences(Display display, std::vector<Layer>* outLayers,
                           std::vector<int>* outReleaseFences) override;
                           std::vector<int>* outReleaseFences) override;


@@ -339,6 +349,7 @@ public:
    Error setLayerCompositionType(Display display, Layer layer,
    Error setLayerCompositionType(Display display, Layer layer,
                                  IComposerClient::Composition type) override;
                                  IComposerClient::Composition type) override;
    Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) override;
    Error setLayerDataspace(Display display, Layer layer, Dataspace dataspace) override;
    Error setLayerHdrMetadata(Display display, Layer layer, const HdrMetadata& metadata) override;
    Error setLayerDisplayFrame(Display display, Layer layer,
    Error setLayerDisplayFrame(Display display, Layer layer,
                               const IComposerClient::Rect& frame) override;
                               const IComposerClient::Rect& frame) override;
    Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
    Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override;
@@ -375,7 +386,8 @@ private:
    Error execute();
    Error execute();


    sp<IComposer> mComposer;
    sp<IComposer> mComposer;
    sp<IComposerClient> mClient;
    sp<hardware::graphics::composer::V2_1::IComposerClient> mClient;
    sp<IComposerClient> mClient_2_2;


    // 64KiB minus a small space for metadata such as read/write pointers
    // 64KiB minus a small space for metadata such as read/write pointers
    static constexpr size_t kWriterInitialSize =
    static constexpr size_t kWriterInitialSize =
Loading