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

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

Merge "Fixing client composition setup on non-SRGB color mode displays"

parents 8c6e305f 37edd052
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -55,11 +55,23 @@ std::string ReadbackHelper::getDataspaceString(Dataspace dataspace) {
            return std::string("V0_SRGB");
        case Dataspace::DISPLAY_P3:
            return std::string("DISPLAY_P3");
        case Dataspace::UNKNOWN:
            return std::string("UNKNOWN");
        default:
            return std::string("Unsupported dataspace for readback");
    }
}

Dataspace ReadbackHelper::getDataspaceForColorMode(ColorMode mode) {
    switch (mode) {
        case ColorMode::DISPLAY_P3:
            return Dataspace::DISPLAY_P3;
        case ColorMode::SRGB:
        default:
            return Dataspace::UNKNOWN;
    }
}

LayerSettings TestLayer::toRenderEngineLayerSettings() {
    LayerSettings layerSettings;

+2 −0
Original line number Diff line number Diff line
@@ -146,6 +146,8 @@ class ReadbackHelper : public ::testing::VtsHalHidlTargetTestBase {

    static std::string getDataspaceString(Dataspace dataspace);

    static Dataspace getDataspaceForColorMode(ColorMode mode);

    static int32_t GetBytesPerPixel(PixelFormat pixelFormat);

    static void fillBuffer(int32_t width, int32_t height, uint32_t stride, void* bufferData,
+54 −20
Original line number Diff line number Diff line
@@ -413,12 +413,28 @@ TEST_F(GraphicsComposerReadbackTest, ClientComposition) {
            ASSERT_EQ(1, mReader->mCompositionChanges.size());
            ASSERT_EQ(1, mReader->mCompositionChanges[0].second);

            // create client target buffer
            uint32_t clientStride;
            PixelFormat clientFormat = PixelFormat::RGBA_8888;
            uint64_t clientUsage = static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN |
                                                         BufferUsage::CPU_WRITE_OFTEN |
                                                         BufferUsage::COMPOSER_CLIENT_TARGET);
            Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
            IComposerClient::Rect damage{0, 0, mDisplayWidth, mDisplayHeight};

            bool clientTargetSupported = mComposerClient->getClientTargetSupport_2_2(
                    mPrimaryDisplay, layer->mWidth, layer->mHeight, clientFormat, clientDataspace);
            // if the client target format is not supported, skip this
            // configuration
            if (!clientTargetSupported) {
                std::cout << "Client target configuration width: " << layer->mWidth
                          << " height: " << layer->mHeight
                          << " pixel format: PixelFormat::RGBA_8888 dataspace: "
                          << ReadbackHelper::getDataspaceString(clientDataspace)
                          << " unsupported for display" << std::endl;
                continue;
            }

            // create client target buffer
            uint32_t clientStride;
            const native_handle_t* clientBufferHandle =
                    mGralloc->allocate(layer->mWidth, layer->mHeight, layer->mLayerCount,
                                       clientFormat, clientUsage, /*import*/ true, &clientStride);
@@ -436,8 +452,7 @@ TEST_F(GraphicsComposerReadbackTest, ClientComposition) {
                close(clientFence);
            }

            IComposerClient::Rect damage{0, 0, mDisplayWidth, mDisplayHeight};
            mWriter->setClientTarget(0, clientBufferHandle, clientFence, Dataspace::UNKNOWN,
            mWriter->setClientTarget(0, clientBufferHandle, clientFence, clientDataspace,
                                     std::vector<IComposerClient::Rect>(1, damage));

            layer->setToClientComposition(mWriter);
@@ -507,22 +522,46 @@ TEST_F(GraphicsComposerReadbackTest, DeviceAndClientComposition) {
        ASSERT_NO_FATAL_FAILURE(deviceLayer->setBuffer(deviceColors));
        deviceLayer->write(mWriter);

        PixelFormat clientFormat = PixelFormat::RGBA_8888;
        uint64_t clientUsage =
                static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
                                      BufferUsage::COMPOSER_CLIENT_TARGET);
        Dataspace clientDataspace = ReadbackHelper::getDataspaceForColorMode(mode);
        int32_t clientWidth = mDisplayWidth;
        int32_t clientHeight = mDisplayHeight / 2;

        bool clientTargetSupported = mComposerClient->getClientTargetSupport_2_2(
                mPrimaryDisplay, clientWidth, clientHeight, clientFormat, clientDataspace);
        // if the client target format is not supported, skip this
        // configuration
        if (!clientTargetSupported) {
            std::cout << "Client target configuration width: " << clientWidth
                      << " height: " << clientHeight
                      << " pixel format: PixelFormat::RGBA_8888 dataspace: "
                      << ReadbackHelper::getDataspaceString(clientDataspace)
                      << " unsupported for display" << std::endl;
            continue;
        }

        auto clientLayer = std::make_shared<TestBufferLayer>(
                mComposerClient, mGralloc, mPrimaryDisplay, mDisplayWidth, mDisplayHeight / 2,
                PixelFormat::RGBA_8888, IComposerClient::Composition::CLIENT);
                mComposerClient, mGralloc, mPrimaryDisplay, clientWidth, clientHeight,
                PixelFormat::RGBA_FP16, IComposerClient::Composition::DEVICE);
        IComposerClient::Rect clientFrame = {0, mDisplayHeight / 2, mDisplayWidth, mDisplayHeight};
        clientLayer->setDisplayFrame(clientFrame);
        clientLayer->setZOrder(0);
        clientLayer->write(mWriter);
        mWriter->validateDisplay();
        execute();
        ASSERT_EQ(0, mReader->mErrors.size());

        if (mReader->mCompositionChanges.size() != 1) {
            std::cout << "HWC asked for none or more than 1 composition change, skipping"
                      << std::endl;
            mReader->mCompositionChanges.clear();
            continue;
        }
        // create client target buffer
        ASSERT_EQ(1, mReader->mCompositionChanges[0].second);
        uint32_t clientStride;
        PixelFormat clientFormat = PixelFormat::RGBA_8888;
        uint64_t clientUsage =
                static_cast<uint64_t>(BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
                                      BufferUsage::COMPOSER_CLIENT_TARGET);
        const native_handle_t* clientBufferHandle =
                mGralloc->allocate(mDisplayWidth, mDisplayHeight, clientLayer->mLayerCount,
                                   clientFormat, clientUsage, /*import*/ true, &clientStride);
@@ -542,19 +581,14 @@ TEST_F(GraphicsComposerReadbackTest, DeviceAndClientComposition) {
            close(clientFence);
        }

        mWriter->setClientTarget(0, clientBufferHandle, clientFence, Dataspace::UNKNOWN,
        mWriter->setClientTarget(0, clientBufferHandle, clientFence, clientDataspace,
                                 std::vector<IComposerClient::Rect>(1, clientFrame));
        execute();
        ASSERT_EQ(0, mReader->mErrors.size());
        clientLayer->setToClientComposition(mWriter);
        mWriter->validateDisplay();
        execute();
        if (mReader->mCompositionChanges.size() != 0) {
            clearCommandReaderState();
            std::cout << "Composition change requested, skipping test" << std::endl;
            GTEST_SUCCEED() << "Composition change requested, skipping test";
            return;
        }
        ASSERT_EQ(0, mReader->mCompositionChanges.size());
        ASSERT_EQ(0, mReader->mErrors.size());

        mWriter->presentDisplay();
        execute();
        ASSERT_EQ(0, mReader->mErrors.size());