Loading services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -244,14 +244,13 @@ AidlComposer::AidlComposer(const std::string& serviceName) { addReader(translate<Display>(kSingleReaderKey)); // If unable to read interface version, then become backwards compatible. int32_t version = 1; const auto status = mAidlComposerClient->getInterfaceVersion(&version); const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion); if (!status.isOk()) { ALOGE("getInterfaceVersion for AidlComposer constructor failed %s", status.getDescription().c_str()); } mSupportsBufferSlotsToClear = version > 1; if (!mSupportsBufferSlotsToClear) { if (mComposerInterfaceVersion <= 1) { if (sysprop::clear_slots_with_set_layer_buffer(false)) { mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888, GraphicBuffer::USAGE_HW_COMPOSER | Loading Loading @@ -281,6 +280,10 @@ bool AidlComposer::isSupported(OptionalFeature feature) const { } } bool AidlComposer::getDisplayConfigurationsSupported() const { return mComposerInterfaceVersion >= 3; } std::vector<Capability> AidlComposer::getCapabilities() { std::vector<Capability> capabilities; const auto status = mAidlComposer->getCapabilities(&capabilities); Loading Loading @@ -489,6 +492,18 @@ Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outC return Error::NONE; } Error AidlComposer::getDisplayConfigurations(Display display, std::vector<DisplayConfiguration>* outConfigs) { const auto status = mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display), outConfigs); if (!status.isOk()) { ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str()); return static_cast<Error>(status.getServiceSpecificError()); } return Error::NONE; } Error AidlComposer::getDisplayName(Display display, std::string* outName) { const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName); if (!status.isOk()) { Loading Loading @@ -848,7 +863,7 @@ Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer, Error error = Error::NONE; mMutex.lock_shared(); if (auto writer = getWriter(display)) { if (mSupportsBufferSlotsToClear) { if (mComposerInterfaceVersion > 1) { writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display), translate<int64_t>(layer), slotsToClear); // Backwards compatible way of clearing buffer slots is to set the layer buffer with a Loading services/surfaceflinger/DisplayHardware/AidlComposerHal.h +4 −2 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public: ~AidlComposer() override; bool isSupported(OptionalFeature) const; bool getDisplayConfigurationsSupported() const; std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities() override; Loading Loading @@ -95,6 +96,7 @@ public: Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) override; Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs); Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*); Error getDisplayName(Display display, std::string* outName) override; Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask, Loading Loading @@ -285,8 +287,8 @@ private: // threading annotations. ftl::SharedMutex mMutex; // Whether or not explicitly clearing buffer slots is supported. bool mSupportsBufferSlotsToClear; int32_t mComposerInterfaceVersion = 1; // Buffer slots for layers are cleared by setting the slot buffer to this buffer. sp<GraphicBuffer> mClearSlotBuffer; Loading services/surfaceflinger/DisplayHardware/ComposerHal.h +6 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ #include <aidl/android/hardware/graphics/composer3/Color.h> #include <aidl/android/hardware/graphics/composer3/Composition.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> #include <aidl/android/hardware/graphics/composer3/DisplayConfiguration.h> #include <aidl/android/hardware/graphics/composer3/IComposerCallback.h> #include <aidl/android/hardware/graphics/composer3/OverlayProperties.h> Loading Loading @@ -85,6 +86,7 @@ using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; using PerFrameMetadataBlob = IComposerClient::PerFrameMetadataBlob; using AidlTransform = ::aidl::android::hardware::graphics::common::Transform; using DisplayConfiguration = V3_0::DisplayConfiguration; using aidl::android::hardware::graphics::common::Hdr; class Composer { Loading @@ -103,6 +105,7 @@ public: }; virtual bool isSupported(OptionalFeature) const = 0; virtual bool getDisplayConfigurationsSupported() const = 0; virtual std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities() = 0; Loading Loading @@ -130,6 +133,9 @@ public: virtual Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) = 0; virtual Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs) = 0; virtual Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*) = 0; virtual Error getDisplayName(Display display, std::string* outName) = 0; virtual Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask, Loading services/surfaceflinger/DisplayHardware/DisplayMode.h +6 −6 Original line number Diff line number Diff line Loading @@ -80,20 +80,20 @@ public: return *this; } Builder& setDpiX(int32_t dpiX) { if (dpiX == -1) { Builder& setDpiX(float dpiX) { if (dpiX == -1.f) { mDisplayMode->mDpi.x = getDefaultDensity(); } else { mDisplayMode->mDpi.x = dpiX / 1000.f; mDisplayMode->mDpi.x = dpiX; } return *this; } Builder& setDpiY(int32_t dpiY) { if (dpiY == -1) { Builder& setDpiY(float dpiY) { if (dpiY == -1.f) { mDisplayMode->mDpi.y = getDefaultDensity(); } else { mDisplayMode->mDpi.y = dpiY / 1000.f; mDisplayMode->mDpi.y = dpiY; } return *this; } Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp +53 −5 Original line number Diff line number Diff line Loading @@ -265,6 +265,46 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d RETURN_IF_INVALID_DISPLAY(displayId, {}); const auto hwcDisplayId = mDisplayData.at(displayId).hwcDisplay->getId(); if (mComposer->getDisplayConfigurationsSupported()) { return getModesFromDisplayConfigurations(hwcDisplayId); } return getModesFromLegacyDisplayConfigs(hwcDisplayId); } std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromDisplayConfigurations( uint64_t hwcDisplayId) const { std::vector<hal::DisplayConfiguration> configs; auto error = static_cast<hal::Error>(mComposer->getDisplayConfigurations(hwcDisplayId, &configs)); RETURN_IF_HWC_ERROR_FOR("getDisplayConfigurations", error, *toPhysicalDisplayId(hwcDisplayId), {}); std::vector<HWCDisplayMode> modes; modes.reserve(configs.size()); for (auto config : configs) { auto hwcMode = HWCDisplayMode{ .hwcId = static_cast<hal::HWConfigId>(config.configId), .width = config.width, .height = config.height, .vsyncPeriod = config.vsyncPeriod, .configGroup = config.configGroup, }; if (config.dpi) { hwcMode.dpiX = config.dpi->x; hwcMode.dpiY = config.dpi->y; } modes.push_back(hwcMode); } return modes; } std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromLegacyDisplayConfigs( uint64_t hwcDisplayId) const { std::vector<hal::HWConfigId> configIds; auto error = static_cast<hal::Error>(mComposer->getDisplayConfigs(hwcDisplayId, &configIds)); RETURN_IF_HWC_ERROR_FOR("getDisplayConfigs", error, *toPhysicalDisplayId(hwcDisplayId), {}); Loading @@ -272,17 +312,25 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d std::vector<HWCDisplayMode> modes; modes.reserve(configIds.size()); for (auto configId : configIds) { modes.push_back(HWCDisplayMode{ auto hwcMode = HWCDisplayMode{ .hwcId = configId, .width = getAttribute(hwcDisplayId, configId, hal::Attribute::WIDTH), .height = getAttribute(hwcDisplayId, configId, hal::Attribute::HEIGHT), .vsyncPeriod = getAttribute(hwcDisplayId, configId, hal::Attribute::VSYNC_PERIOD), .dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X), .dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y), .configGroup = getAttribute(hwcDisplayId, configId, hal::Attribute::CONFIG_GROUP), }); }; const int32_t dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X); const int32_t dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y); if (dpiX != -1) { hwcMode.dpiX = static_cast<float>(dpiX) / 1000.f; } if (dpiY != -1) { hwcMode.dpiY = static_cast<float>(dpiY) / 1000.f; } modes.push_back(hwcMode); } return modes; } Loading Loading
services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp +20 −5 Original line number Diff line number Diff line Loading @@ -244,14 +244,13 @@ AidlComposer::AidlComposer(const std::string& serviceName) { addReader(translate<Display>(kSingleReaderKey)); // If unable to read interface version, then become backwards compatible. int32_t version = 1; const auto status = mAidlComposerClient->getInterfaceVersion(&version); const auto status = mAidlComposerClient->getInterfaceVersion(&mComposerInterfaceVersion); if (!status.isOk()) { ALOGE("getInterfaceVersion for AidlComposer constructor failed %s", status.getDescription().c_str()); } mSupportsBufferSlotsToClear = version > 1; if (!mSupportsBufferSlotsToClear) { if (mComposerInterfaceVersion <= 1) { if (sysprop::clear_slots_with_set_layer_buffer(false)) { mClearSlotBuffer = sp<GraphicBuffer>::make(1, 1, PIXEL_FORMAT_RGBX_8888, GraphicBuffer::USAGE_HW_COMPOSER | Loading Loading @@ -281,6 +280,10 @@ bool AidlComposer::isSupported(OptionalFeature feature) const { } } bool AidlComposer::getDisplayConfigurationsSupported() const { return mComposerInterfaceVersion >= 3; } std::vector<Capability> AidlComposer::getCapabilities() { std::vector<Capability> capabilities; const auto status = mAidlComposer->getCapabilities(&capabilities); Loading Loading @@ -489,6 +492,18 @@ Error AidlComposer::getDisplayConfigs(Display display, std::vector<Config>* outC return Error::NONE; } Error AidlComposer::getDisplayConfigurations(Display display, std::vector<DisplayConfiguration>* outConfigs) { const auto status = mAidlComposerClient->getDisplayConfigurations(translate<int64_t>(display), outConfigs); if (!status.isOk()) { ALOGE("getDisplayConfigurations failed %s", status.getDescription().c_str()); return static_cast<Error>(status.getServiceSpecificError()); } return Error::NONE; } Error AidlComposer::getDisplayName(Display display, std::string* outName) { const auto status = mAidlComposerClient->getDisplayName(translate<int64_t>(display), outName); if (!status.isOk()) { Loading Loading @@ -848,7 +863,7 @@ Error AidlComposer::setLayerBufferSlotsToClear(Display display, Layer layer, Error error = Error::NONE; mMutex.lock_shared(); if (auto writer = getWriter(display)) { if (mSupportsBufferSlotsToClear) { if (mComposerInterfaceVersion > 1) { writer->get().setLayerBufferSlotsToClear(translate<int64_t>(display), translate<int64_t>(layer), slotsToClear); // Backwards compatible way of clearing buffer slots is to set the layer buffer with a Loading
services/surfaceflinger/DisplayHardware/AidlComposerHal.h +4 −2 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ public: ~AidlComposer() override; bool isSupported(OptionalFeature) const; bool getDisplayConfigurationsSupported() const; std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities() override; Loading Loading @@ -95,6 +96,7 @@ public: Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) override; Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs); Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*); Error getDisplayName(Display display, std::string* outName) override; Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask, Loading Loading @@ -285,8 +287,8 @@ private: // threading annotations. ftl::SharedMutex mMutex; // Whether or not explicitly clearing buffer slots is supported. bool mSupportsBufferSlotsToClear; int32_t mComposerInterfaceVersion = 1; // Buffer slots for layers are cleared by setting the slot buffer to this buffer. sp<GraphicBuffer> mClearSlotBuffer; Loading
services/surfaceflinger/DisplayHardware/ComposerHal.h +6 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ #include <aidl/android/hardware/graphics/composer3/Color.h> #include <aidl/android/hardware/graphics/composer3/Composition.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> #include <aidl/android/hardware/graphics/composer3/DisplayConfiguration.h> #include <aidl/android/hardware/graphics/composer3/IComposerCallback.h> #include <aidl/android/hardware/graphics/composer3/OverlayProperties.h> Loading Loading @@ -85,6 +86,7 @@ using PerFrameMetadata = IComposerClient::PerFrameMetadata; using PerFrameMetadataKey = IComposerClient::PerFrameMetadataKey; using PerFrameMetadataBlob = IComposerClient::PerFrameMetadataBlob; using AidlTransform = ::aidl::android::hardware::graphics::common::Transform; using DisplayConfiguration = V3_0::DisplayConfiguration; using aidl::android::hardware::graphics::common::Hdr; class Composer { Loading @@ -103,6 +105,7 @@ public: }; virtual bool isSupported(OptionalFeature) const = 0; virtual bool getDisplayConfigurationsSupported() const = 0; virtual std::vector<aidl::android::hardware::graphics::composer3::Capability> getCapabilities() = 0; Loading Loading @@ -130,6 +133,9 @@ public: virtual Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, int32_t* outValue) = 0; virtual Error getDisplayConfigs(Display display, std::vector<Config>* outConfigs) = 0; virtual Error getDisplayConfigurations(Display, std::vector<DisplayConfiguration>*) = 0; virtual Error getDisplayName(Display display, std::string* outName) = 0; virtual Error getDisplayRequests(Display display, uint32_t* outDisplayRequestMask, Loading
services/surfaceflinger/DisplayHardware/DisplayMode.h +6 −6 Original line number Diff line number Diff line Loading @@ -80,20 +80,20 @@ public: return *this; } Builder& setDpiX(int32_t dpiX) { if (dpiX == -1) { Builder& setDpiX(float dpiX) { if (dpiX == -1.f) { mDisplayMode->mDpi.x = getDefaultDensity(); } else { mDisplayMode->mDpi.x = dpiX / 1000.f; mDisplayMode->mDpi.x = dpiX; } return *this; } Builder& setDpiY(int32_t dpiY) { if (dpiY == -1) { Builder& setDpiY(float dpiY) { if (dpiY == -1.f) { mDisplayMode->mDpi.y = getDefaultDensity(); } else { mDisplayMode->mDpi.y = dpiY / 1000.f; mDisplayMode->mDpi.y = dpiY; } return *this; } Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp +53 −5 Original line number Diff line number Diff line Loading @@ -265,6 +265,46 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d RETURN_IF_INVALID_DISPLAY(displayId, {}); const auto hwcDisplayId = mDisplayData.at(displayId).hwcDisplay->getId(); if (mComposer->getDisplayConfigurationsSupported()) { return getModesFromDisplayConfigurations(hwcDisplayId); } return getModesFromLegacyDisplayConfigs(hwcDisplayId); } std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromDisplayConfigurations( uint64_t hwcDisplayId) const { std::vector<hal::DisplayConfiguration> configs; auto error = static_cast<hal::Error>(mComposer->getDisplayConfigurations(hwcDisplayId, &configs)); RETURN_IF_HWC_ERROR_FOR("getDisplayConfigurations", error, *toPhysicalDisplayId(hwcDisplayId), {}); std::vector<HWCDisplayMode> modes; modes.reserve(configs.size()); for (auto config : configs) { auto hwcMode = HWCDisplayMode{ .hwcId = static_cast<hal::HWConfigId>(config.configId), .width = config.width, .height = config.height, .vsyncPeriod = config.vsyncPeriod, .configGroup = config.configGroup, }; if (config.dpi) { hwcMode.dpiX = config.dpi->x; hwcMode.dpiY = config.dpi->y; } modes.push_back(hwcMode); } return modes; } std::vector<HWComposer::HWCDisplayMode> HWComposer::getModesFromLegacyDisplayConfigs( uint64_t hwcDisplayId) const { std::vector<hal::HWConfigId> configIds; auto error = static_cast<hal::Error>(mComposer->getDisplayConfigs(hwcDisplayId, &configIds)); RETURN_IF_HWC_ERROR_FOR("getDisplayConfigs", error, *toPhysicalDisplayId(hwcDisplayId), {}); Loading @@ -272,17 +312,25 @@ std::vector<HWComposer::HWCDisplayMode> HWComposer::getModes(PhysicalDisplayId d std::vector<HWCDisplayMode> modes; modes.reserve(configIds.size()); for (auto configId : configIds) { modes.push_back(HWCDisplayMode{ auto hwcMode = HWCDisplayMode{ .hwcId = configId, .width = getAttribute(hwcDisplayId, configId, hal::Attribute::WIDTH), .height = getAttribute(hwcDisplayId, configId, hal::Attribute::HEIGHT), .vsyncPeriod = getAttribute(hwcDisplayId, configId, hal::Attribute::VSYNC_PERIOD), .dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X), .dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y), .configGroup = getAttribute(hwcDisplayId, configId, hal::Attribute::CONFIG_GROUP), }); }; const int32_t dpiX = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_X); const int32_t dpiY = getAttribute(hwcDisplayId, configId, hal::Attribute::DPI_Y); if (dpiX != -1) { hwcMode.dpiX = static_cast<float>(dpiX) / 1000.f; } if (dpiY != -1) { hwcMode.dpiY = static_cast<float>(dpiY) / 1000.f; } modes.push_back(hwcMode); } return modes; } Loading