Loading libs/vr/libvrflinger/hardware_composer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -1201,6 +1201,20 @@ Return<void> HardwareComposer::ComposerCallback::onVsync(Hwc2::Display display, return Void(); } Return<void> HardwareComposer::ComposerCallback::onVsync_2_4( Hwc2::Display /*display*/, int64_t /*timestamp*/, Hwc2::VsyncPeriodNanos /*vsyncPeriodNanos*/) { LOG_ALWAYS_FATAL("Unexpected onVsync_2_4 callback"); return Void(); } Return<void> HardwareComposer::ComposerCallback::onVsyncPeriodTimingChanged( Hwc2::Display /*display*/, const Hwc2::VsyncPeriodChangeTimeline& /*updatedTimeline*/) { LOG_ALWAYS_FATAL("Unexpected onVsyncPeriodTimingChanged callback"); return Void(); } void HardwareComposer::ComposerCallback::SetVsyncService( const sp<VsyncService>& vsync_service) { std::lock_guard<std::mutex> lock(mutex_); Loading libs/vr/libvrflinger/hardware_composer.h +6 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,12 @@ class HardwareComposer { hardware::Return<void> onRefresh(Hwc2::Display display) override; hardware::Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override; hardware::Return<void> onVsync_2_4( Hwc2::Display display, int64_t timestamp, Hwc2::VsyncPeriodNanos vsyncPeriodNanos) override; hardware::Return<void> onVsyncPeriodTimingChanged( Hwc2::Display display, const Hwc2::VsyncPeriodChangeTimeline& updatedTimeline) override; bool GotFirstHotplug() { return got_first_hotplug_; } void SetVsyncService(const sp<VsyncService>& vsync_service); Loading services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +5 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,11 @@ public: MOCK_CONST_METHOD1(getColorModes, std::vector<ui::ColorMode>(DisplayId)); MOCK_METHOD3(setActiveColorMode, status_t(DisplayId, ui::ColorMode, ui::RenderIntent)); MOCK_CONST_METHOD0(isUsingVrComposer, bool()); MOCK_CONST_METHOD1(isVsyncPeriodSwitchSupported, bool(DisplayId)); MOCK_CONST_METHOD1(getDisplayVsyncPeriod, nsecs_t(DisplayId)); MOCK_METHOD4(setActiveConfigWithConstraints, status_t(DisplayId, size_t, const HWC2::VsyncPeriodChangeConstraints&, HWC2::VsyncPeriodChangeTimeline*)); MOCK_CONST_METHOD1(dump, void(std::string&)); MOCK_CONST_METHOD0(getComposer, android::Hwc2::Composer*()); Loading services/surfaceflinger/DisplayHardware/ComposerHal.cpp +76 −14 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ private: // assume NO_RESOURCES when Status::isOk returns false constexpr Error kDefaultError = Error::NO_RESOURCES; constexpr V2_4::Error kDefaultError_2_4 = V2_4::Error::NO_RESOURCES; constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError); template<typename T, typename U> T unwrapRet(Return<T>& ret, const U& default_val) Loading Loading @@ -247,7 +247,12 @@ std::string Composer::dumpDebugInfo() void Composer::registerCallback(const sp<IComposerCallback>& callback) { android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2); auto ret = mClient->registerCallback(callback); auto ret = [&]() { if (mClient_2_4) { return mClient_2_4->registerCallback_2_4(callback); } return mClient->registerCallback(callback); }(); if (!ret.isOk()) { ALOGE("failed to register IComposerCallback"); } Loading Loading @@ -413,7 +418,19 @@ Error Composer::getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) { Error error = kDefaultError; mClient->getDisplayAttribute(display, config, attribute, if (mClient_2_4) { mClient_2_4->getDisplayAttribute_2_4(display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) { error = static_cast<Error>(tmpError); if (error != Error::NONE) { return; } *outValue = tmpValue; }); } else { mClient->getDisplayAttribute(display, config, static_cast<V2_1::IComposerClient::Attribute>(attribute), [&](const auto& tmpError, const auto& tmpValue) { error = tmpError; if (error != Error::NONE) { Loading @@ -422,6 +439,7 @@ Error Composer::getDisplayAttribute(Display display, Config config, *outValue = tmpValue; }); } return error; } Loading Loading @@ -1200,13 +1218,14 @@ Error Composer::getDisplayCapabilities(Display display, return static_cast<Error>(error); } Error Composer::getDisplayConnectionType(Display display, V2_4::Error Composer::getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } V2_4::Error error = kDefaultError_2_4; Error error = kDefaultError_2_4; mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) { error = tmpError; if (error != V2_4::Error::NONE) { Loading @@ -1216,7 +1235,50 @@ Error Composer::getDisplayConnectionType(Display display, *outType = tmpType; }); return static_cast<V2_1::Error>(error); return error; } V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } Error error = kDefaultError_2_4; mClient_2_4->getDisplayVsyncPeriod(display, [&](const auto& tmpError, const auto& tmpVsyncPeriod) { error = tmpError; if (error != Error::NONE) { return; } *outVsyncPeriod = tmpVsyncPeriod; }); return error; } V2_4::Error Composer::setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } Error error = kDefaultError_2_4; mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints, [&](const auto& tmpError, const auto& tmpTimeline) { error = tmpError; if (error != Error::NONE) { return; } *outTimeline = tmpTimeline; }); return error; } CommandReader::~CommandReader() Loading services/surfaceflinger/DisplayHardware/ComposerHal.h +20 −5 Original line number Diff line number Diff line Loading @@ -62,12 +62,14 @@ using types::V1_2::PixelFormat; using V2_1::Config; using V2_1::Display; using V2_1::Error; using V2_1::IComposerCallback; using V2_1::Layer; using V2_3::CommandReaderBase; using V2_3::CommandWriterBase; using V2_4::IComposer; using V2_4::IComposerCallback; using V2_4::IComposerClient; using V2_4::VsyncPeriodChangeTimeline; using V2_4::VsyncPeriodNanos; using DisplayCapability = IComposerClient::DisplayCapability; using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; Loading Loading @@ -208,10 +210,17 @@ public: virtual Error setDisplayBrightness(Display display, float brightness) = 0; // Composer HAL 2.4 virtual bool isVsyncPeriodSwitchSupported() = 0; virtual Error getDisplayCapabilities(Display display, std::vector<DisplayCapability>* outCapabilities) = 0; virtual Error getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) = 0; virtual V2_4::Error getDisplayConnectionType( Display display, IComposerClient::DisplayConnectionType* outType) = 0; virtual V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) = 0; virtual V2_4::Error setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) = 0; }; namespace impl { Loading Loading @@ -423,10 +432,16 @@ public: Error setDisplayBrightness(Display display, float brightness) override; // Composer HAL 2.4 bool isVsyncPeriodSwitchSupported() override { return mClient_2_4 != nullptr; } Error getDisplayCapabilities(Display display, std::vector<DisplayCapability>* outCapabilities) override; Error getDisplayConnectionType(Display display, V2_4::Error getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) override; V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) override; V2_4::Error setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) override; private: #if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Loading Loading
libs/vr/libvrflinger/hardware_composer.cpp +14 −0 Original line number Diff line number Diff line Loading @@ -1201,6 +1201,20 @@ Return<void> HardwareComposer::ComposerCallback::onVsync(Hwc2::Display display, return Void(); } Return<void> HardwareComposer::ComposerCallback::onVsync_2_4( Hwc2::Display /*display*/, int64_t /*timestamp*/, Hwc2::VsyncPeriodNanos /*vsyncPeriodNanos*/) { LOG_ALWAYS_FATAL("Unexpected onVsync_2_4 callback"); return Void(); } Return<void> HardwareComposer::ComposerCallback::onVsyncPeriodTimingChanged( Hwc2::Display /*display*/, const Hwc2::VsyncPeriodChangeTimeline& /*updatedTimeline*/) { LOG_ALWAYS_FATAL("Unexpected onVsyncPeriodTimingChanged callback"); return Void(); } void HardwareComposer::ComposerCallback::SetVsyncService( const sp<VsyncService>& vsync_service) { std::lock_guard<std::mutex> lock(mutex_); Loading
libs/vr/libvrflinger/hardware_composer.h +6 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,12 @@ class HardwareComposer { hardware::Return<void> onRefresh(Hwc2::Display display) override; hardware::Return<void> onVsync(Hwc2::Display display, int64_t timestamp) override; hardware::Return<void> onVsync_2_4( Hwc2::Display display, int64_t timestamp, Hwc2::VsyncPeriodNanos vsyncPeriodNanos) override; hardware::Return<void> onVsyncPeriodTimingChanged( Hwc2::Display display, const Hwc2::VsyncPeriodChangeTimeline& updatedTimeline) override; bool GotFirstHotplug() { return got_first_hotplug_; } void SetVsyncService(const sp<VsyncService>& vsync_service); Loading
services/surfaceflinger/CompositionEngine/tests/MockHWComposer.h +5 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,11 @@ public: MOCK_CONST_METHOD1(getColorModes, std::vector<ui::ColorMode>(DisplayId)); MOCK_METHOD3(setActiveColorMode, status_t(DisplayId, ui::ColorMode, ui::RenderIntent)); MOCK_CONST_METHOD0(isUsingVrComposer, bool()); MOCK_CONST_METHOD1(isVsyncPeriodSwitchSupported, bool(DisplayId)); MOCK_CONST_METHOD1(getDisplayVsyncPeriod, nsecs_t(DisplayId)); MOCK_METHOD4(setActiveConfigWithConstraints, status_t(DisplayId, size_t, const HWC2::VsyncPeriodChangeConstraints&, HWC2::VsyncPeriodChangeTimeline*)); MOCK_CONST_METHOD1(dump, void(std::string&)); MOCK_CONST_METHOD0(getComposer, android::Hwc2::Composer*()); Loading
services/surfaceflinger/DisplayHardware/ComposerHal.cpp +76 −14 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ private: // assume NO_RESOURCES when Status::isOk returns false constexpr Error kDefaultError = Error::NO_RESOURCES; constexpr V2_4::Error kDefaultError_2_4 = V2_4::Error::NO_RESOURCES; constexpr V2_4::Error kDefaultError_2_4 = static_cast<V2_4::Error>(kDefaultError); template<typename T, typename U> T unwrapRet(Return<T>& ret, const U& default_val) Loading Loading @@ -247,7 +247,12 @@ std::string Composer::dumpDebugInfo() void Composer::registerCallback(const sp<IComposerCallback>& callback) { android::hardware::setMinSchedulerPolicy(callback, SCHED_FIFO, 2); auto ret = mClient->registerCallback(callback); auto ret = [&]() { if (mClient_2_4) { return mClient_2_4->registerCallback_2_4(callback); } return mClient->registerCallback(callback); }(); if (!ret.isOk()) { ALOGE("failed to register IComposerCallback"); } Loading Loading @@ -413,7 +418,19 @@ Error Composer::getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) { Error error = kDefaultError; mClient->getDisplayAttribute(display, config, attribute, if (mClient_2_4) { mClient_2_4->getDisplayAttribute_2_4(display, config, attribute, [&](const auto& tmpError, const auto& tmpValue) { error = static_cast<Error>(tmpError); if (error != Error::NONE) { return; } *outValue = tmpValue; }); } else { mClient->getDisplayAttribute(display, config, static_cast<V2_1::IComposerClient::Attribute>(attribute), [&](const auto& tmpError, const auto& tmpValue) { error = tmpError; if (error != Error::NONE) { Loading @@ -422,6 +439,7 @@ Error Composer::getDisplayAttribute(Display display, Config config, *outValue = tmpValue; }); } return error; } Loading Loading @@ -1200,13 +1218,14 @@ Error Composer::getDisplayCapabilities(Display display, return static_cast<Error>(error); } Error Composer::getDisplayConnectionType(Display display, V2_4::Error Composer::getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } V2_4::Error error = kDefaultError_2_4; Error error = kDefaultError_2_4; mClient_2_4->getDisplayConnectionType(display, [&](const auto& tmpError, const auto& tmpType) { error = tmpError; if (error != V2_4::Error::NONE) { Loading @@ -1216,7 +1235,50 @@ Error Composer::getDisplayConnectionType(Display display, *outType = tmpType; }); return static_cast<V2_1::Error>(error); return error; } V2_4::Error Composer::getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } Error error = kDefaultError_2_4; mClient_2_4->getDisplayVsyncPeriod(display, [&](const auto& tmpError, const auto& tmpVsyncPeriod) { error = tmpError; if (error != Error::NONE) { return; } *outVsyncPeriod = tmpVsyncPeriod; }); return error; } V2_4::Error Composer::setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) { using Error = V2_4::Error; if (!mClient_2_4) { return Error::UNSUPPORTED; } Error error = kDefaultError_2_4; mClient_2_4->setActiveConfigWithConstraints(display, config, vsyncPeriodChangeConstraints, [&](const auto& tmpError, const auto& tmpTimeline) { error = tmpError; if (error != Error::NONE) { return; } *outTimeline = tmpTimeline; }); return error; } CommandReader::~CommandReader() Loading
services/surfaceflinger/DisplayHardware/ComposerHal.h +20 −5 Original line number Diff line number Diff line Loading @@ -62,12 +62,14 @@ using types::V1_2::PixelFormat; using V2_1::Config; using V2_1::Display; using V2_1::Error; using V2_1::IComposerCallback; using V2_1::Layer; using V2_3::CommandReaderBase; using V2_3::CommandWriterBase; using V2_4::IComposer; using V2_4::IComposerCallback; using V2_4::IComposerClient; using V2_4::VsyncPeriodChangeTimeline; using V2_4::VsyncPeriodNanos; using DisplayCapability = IComposerClient::DisplayCapability; using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; Loading Loading @@ -208,10 +210,17 @@ public: virtual Error setDisplayBrightness(Display display, float brightness) = 0; // Composer HAL 2.4 virtual bool isVsyncPeriodSwitchSupported() = 0; virtual Error getDisplayCapabilities(Display display, std::vector<DisplayCapability>* outCapabilities) = 0; virtual Error getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) = 0; virtual V2_4::Error getDisplayConnectionType( Display display, IComposerClient::DisplayConnectionType* outType) = 0; virtual V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) = 0; virtual V2_4::Error setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) = 0; }; namespace impl { Loading Loading @@ -423,10 +432,16 @@ public: Error setDisplayBrightness(Display display, float brightness) override; // Composer HAL 2.4 bool isVsyncPeriodSwitchSupported() override { return mClient_2_4 != nullptr; } Error getDisplayCapabilities(Display display, std::vector<DisplayCapability>* outCapabilities) override; Error getDisplayConnectionType(Display display, V2_4::Error getDisplayConnectionType(Display display, IComposerClient::DisplayConnectionType* outType) override; V2_4::Error getDisplayVsyncPeriod(Display display, VsyncPeriodNanos* outVsyncPeriod) override; V2_4::Error setActiveConfigWithConstraints( Display display, Config config, const IComposerClient::VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, VsyncPeriodChangeTimeline* outTimeline) override; private: #if defined(USE_VR_COMPOSER) && USE_VR_COMPOSER Loading