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

Commit 0e7a791d authored by Peiyong Lin's avatar Peiyong Lin
Browse files

[SurfaceFlinger] Plumb HAL to hardware composer.

Previously we introduced HIDL interfaces for Auto Color support. This patch
implements HAL interfaces in DisplayHardware/.

BUG: 73824924
BUG: 73825729
Test: Build
Change-Id: I4f2011bfa9306552d50a88fe0f065932be3efd0c
parent 89238e94
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@

using android::base::StringPrintf;
using android::ui::ColorMode;
using android::ui::RenderIntent;

std::string decodeStandard(android_dataspace dataspace) {
    const uint32_t dataspaceSelect = (dataspace & HAL_DATASPACE_STANDARD_MASK);
@@ -229,6 +230,15 @@ std::string decodeColorMode(ColorMode colorMode) {

        case ColorMode::DISPLAY_P3:
            return std::string("ColorMode::DISPLAY_P3");

        case ColorMode::BT2020:
            return std::string("ColorMode::BT2020");

        case ColorMode::BT2100_PQ:
            return std::string("ColorMode::BT2100_PQ");

        case ColorMode::BT2100_HLG:
            return std::string("ColorMode::BT2100_HLG");
    }

    return android::base::StringPrintf("Unknown color mode %d", colorMode);
@@ -294,6 +304,20 @@ std::string decodePixelFormat(android::PixelFormat format) {
    }
}

std::string decodeRenderIntent(RenderIntent renderIntent) {
    switch(renderIntent) {
      case RenderIntent::COLORIMETRIC:
          return std::string("RenderIntent::COLORIMETRIC");
      case RenderIntent::ENHANCE:
          return std::string("RenderIntent::ENHANCE");
      case RenderIntent::TONE_MAP_COLORIMETRIC:
          return std::string("RenderIntent::TONE_MAP_COLORIMETRIC");
      case RenderIntent::TONE_MAP_ENHANCE:
          return std::string("RenderIntent::TONE_MAP_ENHANCE");
    }
    return std::string("Unknown RenderIntent");
}

std::string to_string(const android::Rect& rect) {
    return StringPrintf("(%4d,%4d,%4d,%4d)", rect.left, rect.top, rect.right, rect.bottom);
}
+1 −0
Original line number Diff line number Diff line
@@ -32,4 +32,5 @@ std::string dataspaceDetails(android_dataspace dataspace);
std::string decodeColorMode(android::ui::ColorMode colormode);
std::string decodeColorTransform(android_color_transform colorTransform);
std::string decodePixelFormat(android::PixelFormat format);
std::string decodeRenderIntent(android::ui::RenderIntent renderIntent);
std::string to_string(const android::Rect& rect);
+2 −1
Original line number Diff line number Diff line
@@ -24,9 +24,10 @@
namespace android {
namespace ui {

using android::hardware::graphics::common::V1_0::ColorMode;
using android::hardware::graphics::common::V1_1::ColorMode;
using android::hardware::graphics::common::V1_1::Dataspace;
using android::hardware::graphics::common::V1_1::PixelFormat;
using android::hardware::graphics::common::V1_1::RenderIntent;

}  // namespace ui
}  // namespace android
+131 −62
Original line number Diff line number Diff line
@@ -350,7 +350,9 @@ Error Composer::getColorModes(Display display,
        std::vector<ColorMode>* outModes)
{
    Error error = kDefaultError;
    mClient->getColorModes(display,

    if (mClient_2_2) {
        mClient_2_2->getColorModes_2_2(display,
                [&](const auto& tmpError, const auto& tmpModes) {
                    error = tmpError;
                    if (error != Error::NONE) {
@@ -359,6 +361,18 @@ Error Composer::getColorModes(Display display,

                    *outModes = tmpModes;
                });
    } else {
        mClient->getColorModes(display,
                [&](const auto& tmpError, const auto& tmpModes) {
                    error = tmpError;
                    if (error != Error::NONE) {
                        return;
                    }
                    for (V1_0::ColorMode colorMode : tmpModes) {
                        outModes->push_back(static_cast<ColorMode>(colorMode));
                    }
                });
    }

    return error;
}
@@ -479,25 +493,6 @@ Error Composer::getHdrCapabilities(Display display,
    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,
        std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences)
{
@@ -553,9 +548,16 @@ Error Composer::setClientTarget(Display display, uint32_t slot,
    return Error::NONE;
}

Error Composer::setColorMode(Display display, ColorMode mode)
Error Composer::setColorMode(Display display, ColorMode mode,
        RenderIntent renderIntent)
{
    auto ret = mClient->setColorMode(display, mode);
    hardware::Return<Error> ret(kDefaultError);
    if (mClient_2_2) {
        ret = mClient_2_2->setColorMode_2_2(display, mode, renderIntent);
    } else {
        ret = mClient->setColorMode(display,
                static_cast<V1_0::ColorMode>(mode));
    }
    return unwrapRet(ret);
}

@@ -862,8 +864,8 @@ Error Composer::execute()
    }

    Error error = kDefaultError;
    auto ret = mClient->executeCommands(commandLength, commandHandles,
            [&](const auto& tmpError, const auto& tmpOutChanged,
    hardware::Return<void> ret;
    auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged,
                             const auto& tmpOutLength, const auto& tmpOutHandles)
                         {
                             error = tmpError;
@@ -894,7 +896,12 @@ Error Composer::execute()
                             } else {
                                 error = Error::NO_RESOURCES;
                             }
            });
                         };
    if (mClient_2_2) {
        ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback);
    } else {
        ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback);
    }
    // executeCommands can fail because of out-of-fd and we do not want to
    // abort() in that case
    if (!ret.isOk()) {
@@ -925,6 +932,68 @@ Error Composer::execute()
    return error;
}

// Composer HAL 2.2

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::getRenderIntents(Display display, ColorMode colorMode,
        std::vector<RenderIntent>* outRenderIntents) {
    if (!mClient_2_2) {
        outRenderIntents->push_back(RenderIntent::COLORIMETRIC);
        return Error::NONE;
    }

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

        *outRenderIntents = tmpKeys;
    });

    return error;
}

Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix)
{
    if (!mClient_2_2) {
        *outMatrix = mat4();
        return Error::NONE;
    }

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

        *outMatrix = mat4(tmpMatrix.data());
    });

    return error;
}

CommandReader::~CommandReader()
{
    resetData();
+19 −9
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <android/hardware/graphics/composer/2.2/IComposerClient.h>
#include <composer-command-buffer/2.2/ComposerCommandBuffer.h>
#include <gui/HdrMetadata.h>
#include <math/mat4.h>
#include <ui/GraphicBuffer.h>
#include <utils/StrongPointer.h>

@@ -38,12 +39,13 @@ namespace Hwc2 {

using android::frameworks::vr::composer::V1_0::IVrComposerClient;

using android::hardware::graphics::common::V1_0::ColorMode;
using android::hardware::graphics::common::V1_0::ColorTransform;
using android::hardware::graphics::common::V1_0::Hdr;
using android::hardware::graphics::common::V1_0::Transform;
using android::hardware::graphics::common::V1_1::ColorMode;
using android::hardware::graphics::common::V1_1::Dataspace;
using android::hardware::graphics::common::V1_1::PixelFormat;
using android::hardware::graphics::common::V1_1::RenderIntent;

using android::hardware::graphics::composer::V2_1::Config;
using android::hardware::graphics::composer::V2_1::Display;
@@ -114,9 +116,6 @@ public:
                                     float* outMaxLuminance, float* outMaxAverageLuminance,
                                     float* outMinLuminance) = 0;

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

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

@@ -132,7 +131,7 @@ public:
    virtual Error setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
                                  int acquireFence, Dataspace dataspace,
                                  const std::vector<IComposerClient::Rect>& damage) = 0;
    virtual Error setColorMode(Display display, ColorMode mode) = 0;
    virtual Error setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) = 0;
    virtual Error setColorTransform(Display display, const float* matrix, ColorTransform hint) = 0;
    virtual Error setOutputBuffer(Display display, const native_handle_t* buffer,
                                  int releaseFence) = 0;
@@ -175,6 +174,13 @@ public:
                                        const std::vector<IComposerClient::Rect>& visible) = 0;
    virtual Error setLayerZOrder(Display display, Layer layer, uint32_t z) = 0;
    virtual Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) = 0;

    // Composer HAL 2.2
    virtual Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) = 0;
    virtual Error getRenderIntents(Display display, ColorMode colorMode,
            std::vector<RenderIntent>* outRenderIntents) = 0;
    virtual Error getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) = 0;
};

namespace impl {
@@ -306,9 +312,6 @@ public:
    Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance,
                             float* outMaxAverageLuminance, float* outMinLuminance) override;

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

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

@@ -324,7 +327,7 @@ public:
    Error setClientTarget(Display display, uint32_t slot, const sp<GraphicBuffer>& target,
                          int acquireFence, Dataspace dataspace,
                          const std::vector<IComposerClient::Rect>& damage) override;
    Error setColorMode(Display display, ColorMode mode) override;
    Error setColorMode(Display display, ColorMode mode, RenderIntent renderIntent) override;
    Error setColorTransform(Display display, const float* matrix, ColorTransform hint) override;
    Error setOutputBuffer(Display display, const native_handle_t* buffer,
                          int releaseFence) override;
@@ -364,6 +367,13 @@ public:
    Error setLayerZOrder(Display display, Layer layer, uint32_t z) override;
    Error setLayerInfo(Display display, Layer layer, uint32_t type, uint32_t appId) override;

    // Composer HAL 2.2
    Error getPerFrameMetadataKeys(
            Display display, std::vector<IComposerClient::PerFrameMetadataKey>* outKeys) override;
    Error getRenderIntents(Display display, ColorMode colorMode,
            std::vector<RenderIntent>* outRenderIntents) override;
    Error getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) override;

private:
    class CommandWriter : public CommandWriterBase {
    public:
Loading