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

Commit c51fbec4 authored by Valerie Hau's avatar Valerie Hau Committed by Android (Google) Code Review
Browse files

Merge "Add setColor, setColorAlpha, and setColorDataspace to ASurfaceControl"

parents f879268e 5bbfd517
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -231,6 +231,7 @@ LIBANDROID {
    ASurfaceTransaction_setBuffer; # introduced=29
    ASurfaceTransaction_setBufferAlpha; # introduced=29
    ASurfaceTransaction_setBufferTransparency; # introduced=29
    ASurfaceTransaction_setColor; # introduced=29
    ASurfaceTransaction_setDamageRegion; # introduced=29
    ASurfaceTransaction_setDesiredPresentTime; # introduced=29
    ASurfaceTransaction_setGeometry; # introduced=29
+91 −0
Original line number Diff line number Diff line
@@ -44,6 +44,76 @@ using Transaction = SurfaceComposerClient::Transaction;
    LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
                        "invalid arg passed as " #name " argument");

static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
    sp<SurfaceComposerClient> client = surfaceControl->getClient();
    sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));

    Vector<ui::ColorMode> colorModes;
    status_t err = client->getDisplayColorModes(display, &colorModes);
    if (err) {
        ALOGE("unable to get wide color support");
        return false;
    }

    bool wideColorBoardConfig =
        getBool<ISurfaceFlingerConfigs,
                &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);

    for (android::ui::ColorMode colorMode : colorModes) {
        switch (colorMode) {
            case ui::ColorMode::DISPLAY_P3:
            case ui::ColorMode::ADOBE_RGB:
            case ui::ColorMode::DCI_P3:
                if (wideColorBoardConfig) {
                    return true;
                }
                break;
            default:
                break;
        }
    }
    return false;
}

static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
    sp<SurfaceComposerClient> client = surfaceControl->getClient();
    sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));

    HdrCapabilities hdrCapabilities;
    status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
    if (err) {
        ALOGE("unable to get hdr capabilities");
        return false;
    }

    return !hdrCapabilities.getSupportedHdrTypes().empty();
}

static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
    static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
    static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
    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));
    static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));

    switch (static_cast<android_dataspace_t>(dataSpace)) {
        case HAL_DATASPACE_UNKNOWN:
        case HAL_DATASPACE_V0_SRGB:
            return true;
        // These data space need wide gamut support.
        case HAL_DATASPACE_V0_SCRGB_LINEAR:
        case HAL_DATASPACE_V0_SCRGB:
        case HAL_DATASPACE_DISPLAY_P3:
            return getWideColorSupport(surfaceControl);
        // These data space need HDR support.
        case HAL_DATASPACE_BT2020_PQ:
            return getHdrSupport(surfaceControl);
        default:
            return false;
    }
}

Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
    return reinterpret_cast<Transaction*>(aSurfaceTransaction);
}
@@ -431,3 +501,24 @@ void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTr

    transaction->setHdrMetadata(surfaceControl, hdrMetadata);
}

void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
                                  ASurfaceControl* aSurfaceControl,
                                  float r, float g, float b, float alpha,
                                  ADataSpace dataspace) {
    CHECK_NOT_NULL(aSurfaceTransaction);
    CHECK_NOT_NULL(aSurfaceControl);

    sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
    LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace");
    Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);

    half3 color;
    color.r = r;
    color.g = g;
    color.b = b;

    transaction->setColor(surfaceControl, color)
                .setColorAlpha(surfaceControl, alpha)
                .setColorDataspace(surfaceControl, static_cast<ui::Dataspace>(dataspace));
}