diff options
9 files changed, 94 insertions, 79 deletions
diff --git a/libs/vr/libvrflinger/Android.bp b/libs/vr/libvrflinger/Android.bp index 2053344bf0..04493f0cd3 100644 --- a/libs/vr/libvrflinger/Android.bp +++ b/libs/vr/libvrflinger/Android.bp @@ -40,6 +40,7 @@ sharedLibraries = [ "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", "android.hardware.graphics.composer@2.3", + "android.hardware.graphics.composer@2.4", "libbinder", "libbase", "libbufferhubqueue", diff --git a/services/surfaceflinger/Android.bp b/services/surfaceflinger/Android.bp index b404836d99..213a62e11c 100644 --- a/services/surfaceflinger/Android.bp +++ b/services/surfaceflinger/Android.bp @@ -29,6 +29,7 @@ cc_defaults { "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", "android.hardware.graphics.composer@2.3", + "android.hardware.graphics.composer@2.4", "android.hardware.power@1.0", "android.hardware.power@1.3", "libbase", @@ -92,6 +93,7 @@ cc_defaults { "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", "android.hardware.graphics.composer@2.3", + "android.hardware.graphics.composer@2.4", "android.hardware.power@1.3", "libhidlbase", ], diff --git a/services/surfaceflinger/CompositionEngine/Android.bp b/services/surfaceflinger/CompositionEngine/Android.bp index 1407ef7de6..738a2a47ab 100644 --- a/services/surfaceflinger/CompositionEngine/Android.bp +++ b/services/surfaceflinger/CompositionEngine/Android.bp @@ -11,6 +11,7 @@ cc_defaults { "android.hardware.graphics.composer@2.1", "android.hardware.graphics.composer@2.2", "android.hardware.graphics.composer@2.3", + "android.hardware.graphics.composer@2.4", "android.hardware.power@1.0", "android.hardware.power@1.3", "libbase", diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp index e53d09949c..acddc42601 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.cpp +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.cpp @@ -17,9 +17,11 @@ #undef LOG_TAG #define LOG_TAG "HwcComposer" -#include <inttypes.h> #include <log/log.h> +#include <algorithm> +#include <cinttypes> + #include "ComposerHal.h" #include <composer-command-buffer/2.2/ComposerCommandBuffer.h> @@ -173,7 +175,16 @@ Composer::Composer(const std::string& serviceName) LOG_ALWAYS_FATAL("failed to get hwcomposer service"); } - if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) { + if (sp<IComposer> composer_2_4 = IComposer::castFrom(mComposer)) { + composer_2_4->createClient_2_4([&](const auto& tmpError, const auto& tmpClient) { + if (tmpError == Error::NONE) { + mClient = tmpClient; + mClient_2_2 = tmpClient; + mClient_2_3 = tmpClient; + mClient_2_4 = tmpClient; + } + }); + } else if (sp<V2_3::IComposer> composer_2_3 = V2_3::IComposer::castFrom(mComposer)) { composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) { if (tmpError == Error::NONE) { mClient = tmpClient; @@ -456,23 +467,6 @@ Error Composer::getDisplayRequests(Display display, return Error::NONE; } -Error Composer::getDisplayType(Display display, - IComposerClient::DisplayType* outType) -{ - Error error = kDefaultError; - mClient->getDisplayType(display, - [&](const auto& tmpError, const auto& tmpType) { - error = tmpError; - if (error != Error::NONE) { - return; - } - - *outType = tmpType; - }); - - return error; -} - Error Composer::getDozeSupport(Display display, bool* outSupport) { Error error = kDefaultError; @@ -1113,23 +1107,6 @@ Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelForm return error; } -Error Composer::getDisplayCapabilities(Display display, - std::vector<DisplayCapability>* outCapabilities) { - if (!mClient_2_3) { - return Error::UNSUPPORTED; - } - Error error = kDefaultError; - mClient_2_3->getDisplayCapabilities(display, - [&](const auto& tmpError, const auto& tmpCapabilities) { - error = tmpError; - if (error != Error::NONE) { - return; - } - *outCapabilities = tmpCapabilities; - }); - return error; -} - Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled, uint8_t componentMask, uint64_t maxFrames) { if (!mClient_2_3) { @@ -1187,6 +1164,60 @@ Error Composer::setDisplayBrightness(Display display, float brightness) { return mClient_2_3->setDisplayBrightness(display, brightness); } +// Composer HAL 2.4 + +Error Composer::getDisplayCapabilities(Display display, + std::vector<DisplayCapability>* outCapabilities) { + if (!mClient_2_3) { + return Error::UNSUPPORTED; + } + + Error error = kDefaultError; + if (mClient_2_4) { + mClient_2_4->getDisplayCapabilities_2_4(display, + [&](const auto& tmpError, const auto& tmpCaps) { + error = tmpError; + if (error != Error::NONE) { + return; + } + *outCapabilities = tmpCaps; + }); + } else { + mClient_2_3 + ->getDisplayCapabilities(display, [&](const auto& tmpError, const auto& tmpCaps) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + outCapabilities->resize(tmpCaps.size()); + std::transform(tmpCaps.begin(), tmpCaps.end(), outCapabilities->begin(), + [](auto cap) { return static_cast<DisplayCapability>(cap); }); + }); + } + + return error; +} + +Error Composer::getDisplayConnectionType(Display display, + IComposerClient::DisplayConnectionType* outType) { + if (!mClient_2_4) { + return Error::UNSUPPORTED; + } + + Error error = kDefaultError; + mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) { + error = tmpError; + if (error != Error::NONE) { + return; + } + + *outType = tmpType; + }); + + return error; +} + CommandReader::~CommandReader() { resetData(); diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h index 9f6cac22b7..e743e59bb6 100644 --- a/services/surfaceflinger/DisplayHardware/ComposerHal.h +++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h @@ -27,8 +27,8 @@ #include <android/frameworks/vr/composer/2.0/IVrComposerClient.h> #endif // defined(USE_VR_COMPOSER) && USE_VR_COMPOSER #include <android/hardware/graphics/common/1.1/types.h> -#include <android/hardware/graphics/composer/2.3/IComposer.h> -#include <android/hardware/graphics/composer/2.3/IComposerClient.h> +#include <android/hardware/graphics/composer/2.4/IComposer.h> +#include <android/hardware/graphics/composer/2.4/IComposerClient.h> #include <composer-command-buffer/2.3/ComposerCommandBuffer.h> #include <gui/HdrMetadata.h> #include <math/mat4.h> @@ -49,6 +49,7 @@ namespace types = hardware::graphics::common; namespace V2_1 = hardware::graphics::composer::V2_1; namespace V2_2 = hardware::graphics::composer::V2_2; namespace V2_3 = hardware::graphics::composer::V2_3; +namespace V2_4 = hardware::graphics::composer::V2_4; using types::V1_0::ColorTransform; using types::V1_0::Transform; @@ -65,8 +66,8 @@ using V2_1::IComposerCallback; using V2_1::Layer; using V2_3::CommandReaderBase; using V2_3::CommandWriterBase; -using V2_3::IComposer; -using V2_3::IComposerClient; +using V2_4::IComposer; +using V2_4::IComposerClient; using DisplayCapability = IComposerClient::DisplayCapability; using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; @@ -118,7 +119,6 @@ public: std::vector<Layer>* outLayers, std::vector<uint32_t>* outLayerRequestMasks) = 0; - virtual Error getDisplayType(Display display, IComposerClient::DisplayType* outType) = 0; virtual Error getDozeSupport(Display display, bool* outSupport) = 0; virtual Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance, float* outMaxAverageLuminance, @@ -203,11 +203,15 @@ public: uint8_t componentMask, uint64_t maxFrames) = 0; virtual Error getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp, DisplayedFrameStats* outStats) = 0; - virtual Error getDisplayCapabilities(Display display, - std::vector<DisplayCapability>* outCapabilities) = 0; virtual Error setLayerPerFrameMetadataBlobs( Display display, Layer layer, const std::vector<PerFrameMetadataBlob>& metadata) = 0; virtual Error setDisplayBrightness(Display display, float brightness) = 0; + + // Composer HAL 2.4 + virtual Error getDisplayCapabilities(Display display, + std::vector<DisplayCapability>* outCapabilities) = 0; + virtual Error getDisplayConnectionType(Display display, + IComposerClient::DisplayConnectionType* outType) = 0; }; namespace impl { @@ -334,7 +338,6 @@ public: std::vector<Layer>* outLayers, std::vector<uint32_t>* outLayerRequestMasks) override; - Error getDisplayType(Display display, IComposerClient::DisplayType* outType) override; Error getDozeSupport(Display display, bool* outSupport) override; Error getHdrCapabilities(Display display, std::vector<Hdr>* outTypes, float* outMaxLuminance, float* outMaxAverageLuminance, float* outMinLuminance) override; @@ -414,13 +417,17 @@ public: uint64_t maxFrames) override; Error getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp, DisplayedFrameStats* outStats) override; - Error getDisplayCapabilities(Display display, - std::vector<DisplayCapability>* outCapabilities) override; Error setLayerPerFrameMetadataBlobs( Display display, Layer layer, const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) override; Error setDisplayBrightness(Display display, float brightness) override; + // Composer HAL 2.4 + Error getDisplayCapabilities(Display display, + std::vector<DisplayCapability>* outCapabilities) override; + Error getDisplayConnectionType(Display display, + IComposerClient::DisplayConnectionType* outType) override; + private: #if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER class CommandWriter : public CommandWriterBase { @@ -455,7 +462,8 @@ private: sp<V2_1::IComposerClient> mClient; sp<V2_2::IComposerClient> mClient_2_2; - sp<IComposerClient> mClient_2_3; + sp<V2_3::IComposerClient> mClient_2_3; + sp<IComposerClient> mClient_2_4; // 64KiB minus a small space for metadata such as read/write pointers static constexpr size_t kWriterInitialSize = diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index c463c4e40a..6f7428a44a 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -169,20 +169,8 @@ void Device::onHotplug(hwc2_display_t displayId, Connection connection) { } mDisplays.erase(displayId); - DisplayType displayType; - auto intError = mComposer->getDisplayType(displayId, - reinterpret_cast<Hwc2::IComposerClient::DisplayType *>( - &displayType)); - auto error = static_cast<Error>(intError); - if (error != Error::None) { - ALOGE("getDisplayType(%" PRIu64 ") failed: %s (%d). " - "Aborting hotplug attempt.", - displayId, to_string(error).c_str(), intError); - return; - } - auto newDisplay = std::make_unique<impl::Display>(*mComposer.get(), mCapabilities, - displayId, displayType); + displayId, DisplayType::Physical); newDisplay->setConnected(true); mDisplays.emplace(displayId, std::move(newDisplay)); } else if (connection == Connection::Disconnected) { diff --git a/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp b/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp index c949d7c1a9..67faa57195 100644 --- a/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp +++ b/services/surfaceflinger/tests/fakehwc/SFFakeHwc_test.cpp @@ -127,7 +127,6 @@ class DisplayTest : public ::testing::Test { public: class MockComposerClient : public FakeComposerClient { public: - MOCK_METHOD2(getDisplayType, Error(Display display, ComposerClient::DisplayType* outType)); MOCK_METHOD4(getDisplayAttribute, Error(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue)); @@ -176,9 +175,6 @@ void DisplayTest::SetUp() { android::hardware::ProcessState::self()->startThreadPool(); android::ProcessState::self()->startThreadPool(); - EXPECT_CALL(*mMockComposer, getDisplayType(PRIMARY_DISPLAY, _)) - .WillOnce(DoAll(SetArgPointee<1>(IComposerClient::DisplayType::PHYSICAL), - Return(Error::NONE))); // Primary display will be queried twice for all 5 attributes. One // set of queries comes from the SurfaceFlinger proper an the // other set from the VR composer. @@ -270,10 +266,6 @@ bool DisplayTest::waitForHotplugEvent(PhysicalDisplayId displayId, bool connecte TEST_F(DisplayTest, Hotplug) { ALOGD("DisplayTest::Hotplug"); - EXPECT_CALL(*mMockComposer, getDisplayType(EXTERNAL_DISPLAY, _)) - .Times(2) - .WillRepeatedly(DoAll(SetArgPointee<1>(IComposerClient::DisplayType::PHYSICAL), - Return(Error::NONE))); // The attribute queries will get done twice. This is for defaults EXPECT_CALL(*mMockComposer, getDisplayAttribute(EXTERNAL_DISPLAY, 1, _, _)) .Times(2 * 3) @@ -381,10 +373,6 @@ TEST_F(DisplayTest, HotplugPrimaryDisplay) { mMockComposer->clearFrames(); - EXPECT_CALL(*mMockComposer, getDisplayType(PRIMARY_DISPLAY, _)) - .Times(2) - .WillRepeatedly(DoAll(SetArgPointee<1>(IComposerClient::DisplayType::PHYSICAL), - Return(Error::NONE))); // The attribute queries will get done twice. This is for defaults EXPECT_CALL(*mMockComposer, getDisplayAttribute(PRIMARY_DISPLAY, 1, _, _)) .Times(2 * 3) diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index fcce57b382..ee1f3aab94 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -445,10 +445,6 @@ struct HwcDisplayVariant { } static void setupHwcHotplugCallExpectations(DisplayTransactionTest* test) { - EXPECT_CALL(*test->mComposer, getDisplayType(HWC_DISPLAY_ID, _)) - .WillOnce(DoAll(SetArgPointee<1>(static_cast<IComposerClient::DisplayType>( - HWC_DISPLAY_TYPE)), - Return(Error::NONE))); EXPECT_CALL(*test->mComposer, setClientTargetSlotCount(_)).WillOnce(Return(Error::NONE)); EXPECT_CALL(*test->mComposer, getDisplayConfigs(HWC_DISPLAY_ID, _)) .WillOnce(DoAll(SetArgPointee<1>(std::vector<unsigned>{HWC_ACTIVE_CONFIG_ID}), diff --git a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h index 3c7e1da334..98c6aa0236 100644 --- a/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h +++ b/services/surfaceflinger/tests/unittests/mock/DisplayHardware/MockComposer.h @@ -41,7 +41,7 @@ using android::hardware::graphics::composer::V2_1::Error; using android::hardware::graphics::composer::V2_1::IComposer; using android::hardware::graphics::composer::V2_1::IComposerCallback; using android::hardware::graphics::composer::V2_1::Layer; -using android::hardware::graphics::composer::V2_3::IComposerClient; +using android::hardware::graphics::composer::V2_4::IComposerClient; class Composer : public Hwc2::Composer { public: @@ -71,7 +71,6 @@ public: MOCK_METHOD2(getDisplayName, Error(Display, std::string*)); MOCK_METHOD4(getDisplayRequests, Error(Display, uint32_t*, std::vector<Layer>*, std::vector<uint32_t>*)); - MOCK_METHOD2(getDisplayType, Error(Display, IComposerClient::DisplayType*)); MOCK_METHOD2(getDozeSupport, Error(Display, bool*)); MOCK_METHOD5(getHdrCapabilities, Error(Display, std::vector<Hdr>*, float*, float*, float*)); MOCK_METHOD1(getPerFrameMetadataKeys, @@ -118,10 +117,11 @@ public: MOCK_METHOD4(setDisplayContentSamplingEnabled, Error(Display, bool, uint8_t, uint64_t)); MOCK_METHOD4(getDisplayedContentSample, Error(Display, uint64_t, uint64_t, DisplayedFrameStats*)); - MOCK_METHOD2(getDisplayCapabilities, Error(Display, std::vector<DisplayCapability>*)); MOCK_METHOD3(setLayerPerFrameMetadataBlobs, Error(Display, Layer, const std::vector<IComposerClient::PerFrameMetadataBlob>&)); MOCK_METHOD2(setDisplayBrightness, Error(Display, float)); + MOCK_METHOD2(getDisplayCapabilities, Error(Display, std::vector<DisplayCapability>*)); + MOCK_METHOD2(getDisplayConnectionType, Error(Display, IComposerClient::DisplayConnectionType*)); }; } // namespace mock |