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

Commit 75bfd16d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SF: Abstract and mock HWC2::Layer"

parents 79e0f7f4 35d58247
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -91,6 +91,7 @@ cc_test {
        "tests/DisplayTest.cpp",
        "tests/DisplayTest.cpp",
        "tests/HwcBufferCacheTest.cpp",
        "tests/HwcBufferCacheTest.cpp",
        "tests/LayerTest.cpp",
        "tests/LayerTest.cpp",
        "tests/MockHWC2.cpp",
        "tests/MockHWComposer.cpp",
        "tests/MockHWComposer.cpp",
        "tests/OutputTest.cpp",
        "tests/OutputTest.cpp",
        "tests/OutputLayerTest.cpp",
        "tests/OutputLayerTest.cpp",
+32 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "MockHWC2.h"

namespace HWC2 {

// This will go away once HWC2::Layer is moved into the "backend" library
Layer::~Layer() = default;

namespace mock {

// The Google Mock documentation recommends explicit non-header instantiations
// for better compile time performance.
Layer::Layer() = default;
Layer::~Layer() = default;

} // namespace mock
} // namespace HWC2
+63 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <gmock/gmock.h>
#include <ui/Fence.h>
#include <ui/FloatRect.h>
#include <ui/GraphicBuffer.h>
#include <ui/GraphicTypes.h>
#include <ui/Rect.h>
#include <ui/Region.h>
#include <ui/Transform.h>

#include "DisplayHardware/HWC2.h"

namespace HWC2 {
namespace mock {

class Layer : public HWC2::Layer {
public:
    Layer();
    ~Layer() override;

    MOCK_CONST_METHOD0(getId, hwc2_layer_t());

    MOCK_METHOD2(setCursorPosition, Error(int32_t, int32_t));
    MOCK_METHOD3(setBuffer,
                 Error(uint32_t, const android::sp<android::GraphicBuffer>&,
                       const android::sp<android::Fence>&));
    MOCK_METHOD1(setSurfaceDamage, Error(const android::Region&));
    MOCK_METHOD1(setBlendMode, Error(BlendMode));
    MOCK_METHOD1(setColor, Error(hwc_color_t));
    MOCK_METHOD1(setCompositionType, Error(Composition));
    MOCK_METHOD1(setDataspace, Error(android::ui::Dataspace));
    MOCK_METHOD2(setPerFrameMetadata, Error(const int32_t, const android::HdrMetadata&));
    MOCK_METHOD1(setDisplayFrame, Error(const android::Rect&));
    MOCK_METHOD1(setPlaneAlpha, Error(float));
    MOCK_METHOD1(setSidebandStream, Error(const native_handle_t*));
    MOCK_METHOD1(setSourceCrop, Error(const android::FloatRect&));
    MOCK_METHOD1(setTransform, Error(Transform));
    MOCK_METHOD1(setVisibleRegion, Error(const android::Region&));
    MOCK_METHOD1(setZOrder, Error(uint32_t));
    MOCK_METHOD2(setInfo, Error(uint32_t, uint32_t));

    MOCK_METHOD1(setColorTransform, Error(const android::mat4&));
};

} // namespace mock
} // namespace HWC2
+14 −26
Original line number Original line Diff line number Diff line
@@ -308,8 +308,7 @@ Error Display::acceptChanges()
    return static_cast<Error>(intError);
    return static_cast<Error>(intError);
}
}


Error Display::createLayer(Layer** outLayer)
Error Display::createLayer(HWC2::Layer** outLayer) {
{
    if (!outLayer) {
    if (!outLayer) {
        return Error::BadParameter;
        return Error::BadParameter;
    }
    }
@@ -320,15 +319,13 @@ Error Display::createLayer(Layer** outLayer)
        return error;
        return error;
    }
    }


    auto layer = std::make_unique<Layer>(
    auto layer = std::make_unique<impl::Layer>(mComposer, mCapabilities, mId, layerId);
            mComposer, mCapabilities, mId, layerId);
    *outLayer = layer.get();
    *outLayer = layer.get();
    mLayers.emplace(layerId, std::move(layer));
    mLayers.emplace(layerId, std::move(layer));
    return Error::None;
    return Error::None;
}
}


Error Display::destroyLayer(Layer* layer)
Error Display::destroyLayer(HWC2::Layer* layer) {
{
    if (!layer) {
    if (!layer) {
        return Error::BadParameter;
        return Error::BadParameter;
    }
    }
@@ -388,9 +385,7 @@ Error Display::getActiveConfigIndex(int* outIndex) const {
    return Error::None;
    return Error::None;
}
}


Error Display::getChangedCompositionTypes(
Error Display::getChangedCompositionTypes(std::unordered_map<HWC2::Layer*, Composition>* outTypes) {
        std::unordered_map<Layer*, Composition>* outTypes)
{
    std::vector<Hwc2::Layer> layerIds;
    std::vector<Hwc2::Layer> layerIds;
    std::vector<Hwc2::IComposerClient::Composition> types;
    std::vector<Hwc2::IComposerClient::Composition> types;
    auto intError = mComposer.getChangedCompositionTypes(
    auto intError = mComposer.getChangedCompositionTypes(
@@ -492,8 +487,7 @@ Error Display::getName(std::string* outName) const
}
}


Error Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
Error Display::getRequests(HWC2::DisplayRequest* outDisplayRequests,
        std::unordered_map<Layer*, LayerRequest>* outLayerRequests)
                           std::unordered_map<HWC2::Layer*, LayerRequest>* outLayerRequests) {
{
    uint32_t intDisplayRequests;
    uint32_t intDisplayRequests;
    std::vector<Hwc2::Layer> layerIds;
    std::vector<Hwc2::Layer> layerIds;
    std::vector<uint32_t> layerRequests;
    std::vector<uint32_t> layerRequests;
@@ -574,9 +568,7 @@ Error Display::getDisplayedContentSample(uint64_t maxFrames, uint64_t timestamp,
    return static_cast<Error>(intError);
    return static_cast<Error>(intError);
}
}


Error Display::getReleaseFences(
Error Display::getReleaseFences(std::unordered_map<HWC2::Layer*, sp<Fence>>* outFences) const {
        std::unordered_map<Layer*, sp<Fence>>* outFences) const
{
    std::vector<Hwc2::Layer> layerIds;
    std::vector<Hwc2::Layer> layerIds;
    std::vector<int> fenceFds;
    std::vector<int> fenceFds;
    auto intError = mComposer.getReleaseFences(mId, &layerIds, &fenceFds);
    auto intError = mComposer.getReleaseFences(mId, &layerIds, &fenceFds);
@@ -586,7 +578,7 @@ Error Display::getReleaseFences(
        return error;
        return error;
    }
    }


    std::unordered_map<Layer*, sp<Fence>> releaseFences;
    std::unordered_map<HWC2::Layer*, sp<Fence>> releaseFences;
    releaseFences.reserve(numElements);
    releaseFences.reserve(numElements);
    for (uint32_t element = 0; element < numElements; ++element) {
    for (uint32_t element = 0; element < numElements; ++element) {
        auto layer = getLayerById(layerIds[element]);
        auto layer = getLayerById(layerIds[element]);
@@ -787,8 +779,7 @@ void Display::loadConfigs()


// Other Display methods
// Other Display methods


Layer* Display::getLayerById(hwc2_layer_t id) const
HWC2::Layer* Display::getLayerById(hwc2_layer_t id) const {
{
    if (mLayers.count(id) == 0) {
    if (mLayers.count(id) == 0) {
        return nullptr;
        return nullptr;
    }
    }
@@ -799,6 +790,10 @@ Layer* Display::getLayerById(hwc2_layer_t id) const


// Layer methods
// Layer methods


Layer::~Layer() = default;

namespace impl {

Layer::Layer(android::Hwc2::Composer& composer, const std::unordered_set<Capability>& capabilities,
Layer::Layer(android::Hwc2::Composer& composer, const std::unordered_set<Capability>& capabilities,
             hwc2_display_t displayId, hwc2_layer_t layerId)
             hwc2_display_t displayId, hwc2_layer_t layerId)
  : mComposer(composer),
  : mComposer(composer),
@@ -817,15 +812,6 @@ Layer::~Layer()
    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
    ALOGE_IF(error != Error::None, "destroyLayer(%" PRIu64 ", %" PRIu64 ")"
            " failed: %s (%d)", mDisplayId, mId, to_string(error).c_str(),
            " failed: %s (%d)", mDisplayId, mId, to_string(error).c_str(),
            intError);
            intError);
    if (mLayerDestroyedListener) {
        mLayerDestroyedListener(this);
    }
}

void Layer::setLayerDestroyedListener(std::function<void(Layer*)> listener) {
    LOG_ALWAYS_FATAL_IF(mLayerDestroyedListener && listener,
            "Attempt to set layer destroyed listener multiple times");
    mLayerDestroyedListener = listener;
}
}


Error Layer::setCursorPosition(int32_t x, int32_t y)
Error Layer::setCursorPosition(int32_t x, int32_t y)
@@ -1033,4 +1019,6 @@ Error Layer::setColorTransform(const android::mat4& matrix) {
    auto intError = mComposer.setLayerColorTransform(mDisplayId, mId, matrix.asArray());
    auto intError = mComposer.setLayerColorTransform(mDisplayId, mId, matrix.asArray());
    return static_cast<Error>(intError);
    return static_cast<Error>(intError);
}
}

} // namespace impl
} // namespace HWC2
} // namespace HWC2
+62 −40
Original line number Original line Diff line number Diff line
@@ -364,52 +364,73 @@ private:
};
};
} // namespace impl
} // namespace impl


class Layer {
public:
    virtual ~Layer();

    virtual hwc2_layer_t getId() const = 0;

    [[clang::warn_unused_result]] virtual Error setCursorPosition(int32_t x, int32_t y) = 0;
    [[clang::warn_unused_result]] virtual Error setBuffer(
            uint32_t slot, const android::sp<android::GraphicBuffer>& buffer,
            const android::sp<android::Fence>& acquireFence) = 0;
    [[clang::warn_unused_result]] virtual Error setSurfaceDamage(const android::Region& damage) = 0;

    [[clang::warn_unused_result]] virtual Error setBlendMode(BlendMode mode) = 0;
    [[clang::warn_unused_result]] virtual Error setColor(hwc_color_t color) = 0;
    [[clang::warn_unused_result]] virtual Error setCompositionType(Composition type) = 0;
    [[clang::warn_unused_result]] virtual Error setDataspace(android::ui::Dataspace dataspace) = 0;
    [[clang::warn_unused_result]] virtual Error setPerFrameMetadata(
            const int32_t supportedPerFrameMetadata, const android::HdrMetadata& metadata) = 0;
    [[clang::warn_unused_result]] virtual Error setDisplayFrame(const android::Rect& frame) = 0;
    [[clang::warn_unused_result]] virtual Error setPlaneAlpha(float alpha) = 0;
    [[clang::warn_unused_result]] virtual Error setSidebandStream(
            const native_handle_t* stream) = 0;
    [[clang::warn_unused_result]] virtual Error setSourceCrop(const android::FloatRect& crop) = 0;
    [[clang::warn_unused_result]] virtual Error setTransform(Transform transform) = 0;
    [[clang::warn_unused_result]] virtual Error setVisibleRegion(const android::Region& region) = 0;
    [[clang::warn_unused_result]] virtual Error setZOrder(uint32_t z) = 0;
    [[clang::warn_unused_result]] virtual Error setInfo(uint32_t type, uint32_t appId) = 0;

    // Composer HAL 2.3
    [[clang::warn_unused_result]] virtual Error setColorTransform(const android::mat4& matrix) = 0;
};

namespace impl {

// Convenience C++ class to access hwc2_device_t Layer functions directly.
// Convenience C++ class to access hwc2_device_t Layer functions directly.
class Layer

{
class Layer : public HWC2::Layer {
public:
public:
    Layer(android::Hwc2::Composer& composer,
    Layer(android::Hwc2::Composer& composer,
          const std::unordered_set<Capability>& capabilities,
          const std::unordered_set<Capability>& capabilities,
          hwc2_display_t displayId, hwc2_layer_t layerId);
          hwc2_display_t displayId, hwc2_layer_t layerId);
    ~Layer();
    ~Layer() override;


    hwc2_layer_t getId() const { return mId; }
    hwc2_layer_t getId() const override { return mId; }


    // Register a listener to be notified when the layer is destroyed. When the
    Error setCursorPosition(int32_t x, int32_t y) override;
    // listener function is called, the Layer will be in the process of being
    Error setBuffer(uint32_t slot, const android::sp<android::GraphicBuffer>& buffer,
    // destroyed, so it's not safe to call methods on it.
                    const android::sp<android::Fence>& acquireFence) override;
    void setLayerDestroyedListener(std::function<void(Layer*)> listener);
    Error setSurfaceDamage(const android::Region& damage) override;


    [[clang::warn_unused_result]] Error setCursorPosition(int32_t x, int32_t y);
    Error setBlendMode(BlendMode mode) override;
    [[clang::warn_unused_result]] Error setBuffer(uint32_t slot,
    Error setColor(hwc_color_t color) override;
            const android::sp<android::GraphicBuffer>& buffer,
    Error setCompositionType(Composition type) override;
            const android::sp<android::Fence>& acquireFence);
    Error setDataspace(android::ui::Dataspace dataspace) override;
    [[clang::warn_unused_result]] Error setSurfaceDamage(
    Error setPerFrameMetadata(const int32_t supportedPerFrameMetadata,
            const android::Region& damage);
                              const android::HdrMetadata& metadata) override;

    Error setDisplayFrame(const android::Rect& frame) override;
    [[clang::warn_unused_result]] Error setBlendMode(BlendMode mode);
    Error setPlaneAlpha(float alpha) override;
    [[clang::warn_unused_result]] Error setColor(hwc_color_t color);
    Error setSidebandStream(const native_handle_t* stream) override;
    [[clang::warn_unused_result]] Error setCompositionType(Composition type);
    Error setSourceCrop(const android::FloatRect& crop) override;
    [[clang::warn_unused_result]] Error setDataspace(
    Error setTransform(Transform transform) override;
            android::ui::Dataspace dataspace);
    Error setVisibleRegion(const android::Region& region) override;
    [[clang::warn_unused_result]] Error setPerFrameMetadata(
    Error setZOrder(uint32_t z) override;
            const int32_t supportedPerFrameMetadata,
    Error setInfo(uint32_t type, uint32_t appId) override;
            const android::HdrMetadata& metadata);
    [[clang::warn_unused_result]] Error setDisplayFrame(
            const android::Rect& frame);
    [[clang::warn_unused_result]] Error setPlaneAlpha(float alpha);
    [[clang::warn_unused_result]] Error setSidebandStream(
            const native_handle_t* stream);
    [[clang::warn_unused_result]] Error setSourceCrop(
            const android::FloatRect& crop);
    [[clang::warn_unused_result]] Error setTransform(Transform transform);
    [[clang::warn_unused_result]] Error setVisibleRegion(
            const android::Region& region);
    [[clang::warn_unused_result]] Error setZOrder(uint32_t z);
    [[clang::warn_unused_result]] Error setInfo(uint32_t type, uint32_t appId);


    // Composer HAL 2.3
    // Composer HAL 2.3
    [[clang::warn_unused_result]] Error setColorTransform(const android::mat4& matrix);
    Error setColorTransform(const android::mat4& matrix) override;


private:
private:
    // These are references to data owned by HWC2::Device, which will outlive
    // These are references to data owned by HWC2::Device, which will outlive
@@ -422,10 +443,11 @@ private:
    hwc2_layer_t mId;
    hwc2_layer_t mId;
    android::ui::Dataspace mDataSpace = android::ui::Dataspace::UNKNOWN;
    android::ui::Dataspace mDataSpace = android::ui::Dataspace::UNKNOWN;
    android::HdrMetadata mHdrMetadata;
    android::HdrMetadata mHdrMetadata;
    std::function<void(Layer*)> mLayerDestroyedListener;
    android::mat4 mColorMatrix;
    android::mat4 mColorMatrix;
};
};


} // namespace impl

} // namespace HWC2
} // namespace HWC2


#endif // ANDROID_SF_HWC2_H
#endif // ANDROID_SF_HWC2_H