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

Commit cb483852 authored by Ram Indani's avatar Ram Indani Committed by Android (Google) Code Review
Browse files

Merge "[SF] Implements composer3 version 3 interface" into main

parents 22b1af44 0cd1d8db
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -244,14 +244,13 @@ AidlComposer::AidlComposer(const std::string& serviceName) {
    addReader(translate<Display>(kSingleReaderKey));

    // If unable to read interface version, then become backwards compatible.
    int32_t version = 1;
    const auto status = mAidlComposerClient->getInterfaceVersion(&version);
    const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion);
    if (!status.isOk()) {
        ALOGE("getInterfaceVersion for AidlComposer constructor failed %s",
              status.getDescription().c_str());
    }
    mSupportsBufferSlotsToClear = version > 1;
    if (!mSupportsBufferSlotsToClear) {

    if (mComposerInterfaceVersion <= 1) {
        if (sysprop::clear_slots_with_set_layer_buffer(false)) {
            mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888,
                                                       GraphicBuffer::USAGE_HW_COMPOSER |
@@ -281,6 +280,10 @@ bool AidlComposer::isSupported(OptionalFeature feature) const {
    }
}

bool AidlComposer::getDisplayConfigurationsSupported() const {
    return mComposerInterfaceVersion >= 3;
}

std::vector<Capability> AidlComposer::getCapabilities() {
    std::vector<Capability> capabilities;
    const auto status = mAidlComposer->getCapabilities(&capabilities);
@@ -489,6 +492,18 @@ Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outC
    return Error::NONE;
}

Error AidlComposer::getDisplayConfigurations(Display display,
                                             std::vector<DisplayConfiguration>* outConfigs) {
    const auto status =
            mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display), outConfigs);
    if (!status.isOk()) {
        ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str());
        return static_cast<Error>(status.getServiceSpecificError());
    }

    return Error::NONE;
}

Error AidlComposer::getDisplayName(Display display, std::string* outName) {
    const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName);
    if (!status.isOk()) {
@@ -848,7 +863,7 @@ Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer,
    Error error = Error::NONE;
    mMutex.lock_shared();
    if (auto writer = getWriter(display)) {
        if (mSupportsBufferSlotsToClear) {
        if (mComposerInterfaceVersion > 1) {
            writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display),
                                                     translate<int64_t>(layer), slotsToClear);
            // Backwards compatible way of clearing buffer slots is to set the layer buffer with a
+4 −2
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public:
    ~AidlComposer() override;

    bool isSupported(OptionalFeature) const;
    bool getDisplayConfigurationsSupported() const;

    std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities()
            override;
@@ -95,6 +96,7 @@ public:
    Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute,
                              int32_t* outValue) override;
    Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs);
    Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*);
    Error getDisplayName(Display display, std::string* outName) override;

    Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
@@ -285,8 +287,8 @@ private:
    // threading annotations.
    ftl::SharedMutex mMutex;

    // Whether or not explicitly clearing buffer slots is supported.
    bool mSupportsBufferSlotsToClear;
    int32_t mComposerInterfaceVersion = 1;

    // Buffer slots for layers are cleared by setting the slot buffer to this buffer.
    sp<GraphicBuffer> mClearSlotBuffer;

+6 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
#include <aidl/android/hardware/graphics/composer3/Color.h>
#include <aidl/android/hardware/graphics/composer3/Composition.h>
#include <aidl/android/hardware/graphics/composer3/DisplayCapability.h>
#include <aidl/android/hardware/graphics/composer3/DisplayConfiguration.h>
#include <aidl/android/hardware/graphics/composer3/IComposerCallback.h>
#include <aidl/android/hardware/graphics/composer3/OverlayProperties.h>

@@ -85,6 +86,7 @@ using PerFrameMetadata = IComposerClient::PerFrameMetadata;
using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey;
using PerFrameMetadataBlob = IComposerClient::PerFrameMetadataBlob;
using AidlTransform = ::aidl::android::hardware::graphics::common::Transform;
using DisplayConfiguration = V3_0::DisplayConfiguration;
using aidl::android::hardware::graphics::common::Hdr;

class Composer {
@@ -103,6 +105,7 @@ public:
    };

    virtual bool isSupported(OptionalFeature) const = 0;
    virtual bool getDisplayConfigurationsSupported() const = 0;

    virtual std::vector<aidl::android::hardware::graphics::composer3::Capability>
    getCapabilities() = 0;
@@ -130,6 +133,9 @@ public:
    virtual Error getDisplayAttribute(Display display, Config config,
                                      IComposerClient::Attribute attribute, int32_t* outValue) = 0;
    virtual Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs) = 0;

    virtual Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*) = 0;

    virtual Error getDisplayName(Display display, std::string* outName) = 0;

    virtual Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask,
+6 −6
Original line number Diff line number Diff line
@@ -80,20 +80,20 @@ public:
            return *this;
        }

        Builder& setDpiX(int32_t dpiX) {
            if (dpiX == -1) {
        Builder& setDpiX(float dpiX) {
            if (dpiX == -1.f) {
                mDisplayMode->mDpi.x = getDefaultDensity();
            } else {
                mDisplayMode->mDpi.x = dpiX / 1000.f;
                mDisplayMode->mDpi.x = dpiX;
            }
            return *this;
        }

        Builder& setDpiY(int32_t dpiY) {
            if (dpiY == -1) {
        Builder& setDpiY(float dpiY) {
            if (dpiY == -1.f) {
                mDisplayMode->mDpi.y = getDefaultDensity();
            } else {
                mDisplayMode->mDpi.y = dpiY / 1000.f;
                mDisplayMode->mDpi.y = dpiY;
            }
            return *this;
        }
+53 −5
Original line number Diff line number Diff line
@@ -265,6 +265,46 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d
    RETURN_IF_INVALID_DISPLAY(displayId, {});

    const auto hwcDisplayId = mDisplayData.at(displayId).hwcDisplay->getId();

    if (mComposer->getDisplayConfigurationsSupported()) {
        return getModesFromDisplayConfigurations(hwcDisplayId);
    }

    return getModesFromLegacyDisplayConfigs(hwcDisplayId);
}

std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromDisplayConfigurations(
        uint64_t hwcDisplayId) const {
    std::vector<hal::DisplayConfiguration> configs;
    auto error =
            static_cast<hal::Error>(mComposer->getDisplayConfigurations(hwcDisplayId, &configs));
    RETURN_IF_HWC_ERROR_FOR("getDisplayConfigurations", error, *toPhysicalDisplayId(hwcDisplayId),
                            {});

    std::vector<HWCDisplayMode> modes;
    modes.reserve(configs.size());
    for (auto config : configs) {
        auto hwcMode = HWCDisplayMode{
                .hwcId = static_cast<hal::HWConfigId>(config.configId),
                .width = config.width,
                .height = config.height,
                .vsyncPeriod = config.vsyncPeriod,
                .configGroup = config.configGroup,
        };

        if (config.dpi) {
            hwcMode.dpiX = config.dpi->x;
            hwcMode.dpiY = config.dpi->y;
        }

        modes.push_back(hwcMode);
    }

    return modes;
}

std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromLegacyDisplayConfigs(
        uint64_t hwcDisplayId) const {
    std::vector<hal::HWConfigId> configIds;
    auto error = static_cast<hal::Error>(mComposer->getDisplayConfigs(hwcDisplayId, &configIds));
    RETURN_IF_HWC_ERROR_FOR("getDisplayConfigs", error, *toPhysicalDisplayId(hwcDisplayId), {});
@@ -272,17 +312,25 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d
    std::vector<HWCDisplayMode> modes;
    modes.reserve(configIds.size());
    for (auto configId : configIds) {
        modes.push_back(HWCDisplayMode{
        auto hwcMode = HWCDisplayMode{
                .hwcId = configId,
                .width = getAttribute(hwcDisplayId, configId, hal::Attribute::WIDTH),
                .height = getAttribute(hwcDisplayId, configId, hal::Attribute::HEIGHT),
                .vsyncPeriod = getAttribute(hwcDisplayId, configId, hal::Attribute::VSYNC_PERIOD),
                .dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X),
                .dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y),
                .configGroup = getAttribute(hwcDisplayId, configId, hal::Attribute::CONFIG_GROUP),
        });
        };

        const int32_t dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X);
        const int32_t dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y);
        if (dpiX != -1) {
            hwcMode.dpiX = static_cast<float>(dpiX) / 1000.f;
        }
        if (dpiY != -1) {
            hwcMode.dpiY = static_cast<float>(dpiY) / 1000.f;
        }

        modes.push_back(hwcMode);
    }
    return modes;
}

Loading