diff options
-rw-r--r-- | hwc3/ComposerClient.cpp | 10 | ||||
-rw-r--r-- | hwc3/impl/HalImpl.cpp | 7 | ||||
-rw-r--r-- | hwc3/impl/HalImpl.h | 2 | ||||
-rw-r--r-- | hwc3/include/IComposerHal.h | 3 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 5 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 3 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.cpp | 11 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/ExynosHWCService.h | 3 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.cpp | 21 | ||||
-rw-r--r-- | libhwc2.1/libhwcService/IExynosHWC.h | 2 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 2 |
11 files changed, 68 insertions, 1 deletions
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp index 7a3c72a..bb73686 100644 --- a/hwc3/ComposerClient.cpp +++ b/hwc3/ComposerClient.cpp @@ -170,6 +170,16 @@ ndk::ScopedAStatus ComposerClient::getDisplayCapabilities(int64_t display, caps->push_back(DisplayCapability::DISPLAY_IDLE_TIMER); } + err = mHal->getDisplayMultiThreadedPresentSupport(display, support); + if (err != ::android::OK) { + LOG(ERROR) << "failed to getDisplayMultiThreadedPresentSupport: " << err; + return TO_BINDER_STATUS(err); + } + + if (support) { + caps->push_back(DisplayCapability::MULTI_THREADED_PRESENT); + } + return TO_BINDER_STATUS(err); } diff --git a/hwc3/impl/HalImpl.cpp b/hwc3/impl/HalImpl.cpp index a5d229d..3a277af 100644 --- a/hwc3/impl/HalImpl.cpp +++ b/hwc3/impl/HalImpl.cpp @@ -1050,4 +1050,11 @@ int32_t HalImpl::getDisplayIdleTimerSupport(int64_t display, bool& outSupport) { return halDisplay->getDisplayIdleTimerSupport(outSupport); } +int32_t HalImpl::getDisplayMultiThreadedPresentSupport(const int64_t& display, bool& outSupport) { + ExynosDisplay* halDisplay; + RET_IF_ERR(getHalDisplay(display, halDisplay)); + + return halDisplay->getDisplayMultiThreadedPresentSupport(outSupport); +} + } // namespace aidl::android::hardware::graphics::composer3::impl diff --git a/hwc3/impl/HalImpl.h b/hwc3/impl/HalImpl.h index 21af64e..0f4b182 100644 --- a/hwc3/impl/HalImpl.h +++ b/hwc3/impl/HalImpl.h @@ -137,6 +137,8 @@ class HalImpl : public IComposerHal { const ndk::ScopedFileDescriptor& releaseFence) override; int32_t setVsyncEnabled(int64_t display, bool enabled) override; int32_t getDisplayIdleTimerSupport(int64_t display, bool& outSupport) override; + int32_t getDisplayMultiThreadedPresentSupport(const int64_t& display, + bool& outSupport) override; int32_t setIdleTimerEnabled(int64_t display, int32_t timeout) override; int32_t getRCDLayerSupport(int64_t display, bool& outSupport) override; int32_t setLayerBlockingRegion( diff --git a/hwc3/include/IComposerHal.h b/hwc3/include/IComposerHal.h index 7183dec..8e336dd 100644 --- a/hwc3/include/IComposerHal.h +++ b/hwc3/include/IComposerHal.h @@ -122,7 +122,8 @@ class IComposerHal { DisplayAttribute attribute, int32_t* outValue) = 0; virtual int32_t getDisplayBrightnessSupport(int64_t display, bool& outSupport) = 0; virtual int32_t getDisplayIdleTimerSupport(int64_t display, bool& outSupport) = 0; - + virtual int32_t getDisplayMultiThreadedPresentSupport(const int64_t& display, + bool& outSupport) = 0; virtual int32_t getDisplayCapabilities(int64_t display, std::vector<DisplayCapability>* caps) = 0; virtual int32_t getDisplayConfigs(int64_t display, std::vector<int32_t>* configs) = 0; diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index 2a13687..3b358ff 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -6048,6 +6048,11 @@ int32_t ExynosDisplay::getDisplayIdleTimerSupport(bool &outSupport) { return mDisplayInterface->getDisplayIdleTimerSupport(outSupport); } +int32_t ExynosDisplay::getDisplayMultiThreadedPresentSupport(bool &outSupport) { + outSupport = mDisplayControl.multiThreadedPresent; + return NO_ERROR; +} + bool ExynosDisplay::isMixedComposition() { for (size_t i = 0; i < mLayers.size(); i++) { if (mLayers[i]->mBrightness < 1.0) { diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index a7a07de..8cff490 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -384,6 +384,8 @@ struct DisplayControl { bool forceReserveMPP = false; /** Skip M2MMPP processing **/ bool skipM2mProcessing = true; + /** Enable multi-thread present **/ + bool multiThreadedPresent = false; }; class ExynosDisplay { @@ -1218,6 +1220,7 @@ class ExynosDisplay { virtual uint64_t getPendingExpectedPresentTime() { return 0; } virtual void applyExpectedPresentTime() {} virtual int32_t getDisplayIdleTimerSupport(bool& outSupport); + virtual int32_t getDisplayMultiThreadedPresentSupport(bool& outSupport); virtual int32_t setDisplayIdleTimer(const int32_t __unused timeoutMs) { return HWC2_ERROR_UNSUPPORTED; } diff --git a/libhwc2.1/libhwcService/ExynosHWCService.cpp b/libhwc2.1/libhwcService/ExynosHWCService.cpp index aac4916..01503a5 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.cpp +++ b/libhwc2.1/libhwcService/ExynosHWCService.cpp @@ -515,4 +515,15 @@ int32_t ExynosHWCService::setDisplayDbm(int32_t display_id, uint32_t on) { return NO_ERROR; } +int32_t ExynosHWCService::setDisplayMultiThreadedPresent(const int32_t& displayId, + const bool& enable) { + auto display = mHWCCtx->device->getDisplay(displayId); + + if (display == nullptr) return -EINVAL; + + display->mDisplayControl.multiThreadedPresent = enable; + ALOGD("ExynosHWCService::%s() display(%u) enable=%d", __func__, displayId, enable); + return NO_ERROR; +} + } //namespace android diff --git a/libhwc2.1/libhwcService/ExynosHWCService.h b/libhwc2.1/libhwcService/ExynosHWCService.h index 586e335..effc0b1 100644 --- a/libhwc2.1/libhwcService/ExynosHWCService.h +++ b/libhwc2.1/libhwcService/ExynosHWCService.h @@ -83,6 +83,9 @@ public: int32_t setDisplayRCDLayerEnabled(uint32_t displayIndex, bool enable) override; int32_t triggerDisplayIdleEnter(uint32_t displayIndex, uint32_t idleTeRefreshRate) override; + virtual int32_t setDisplayMultiThreadedPresent(const int32_t& display_id, + const bool& enable) override; + private: friend class Singleton<ExynosHWCService>; ExynosHWCService(); diff --git a/libhwc2.1/libhwcService/IExynosHWC.cpp b/libhwc2.1/libhwcService/IExynosHWC.cpp index 9833e64..3bcfa1c 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.cpp +++ b/libhwc2.1/libhwcService/IExynosHWC.cpp @@ -67,6 +67,7 @@ enum { SET_DISPLAY_RCDLAYER_ENABLED = 1007, TRIGGER_DISPLAY_IDLE_ENTER = 1008, SET_DISPLAY_DBM = 1009, + SET_DISPLAY_MULTI_THREADED_PRESENT = 1010, }; class BpExynosHWCService : public BpInterface<IExynosHWCService> { @@ -470,6 +471,17 @@ public: if (result) ALOGE("SET_DISPLAY_DBM transact error(%d)", result); return result; } + + virtual int32_t setDisplayMultiThreadedPresent(const int32_t& displayId, + const bool& enable) { + Parcel data, reply; + data.writeInterfaceToken(IExynosHWCService::getInterfaceDescriptor()); + data.writeInt32(displayId); + data.writeBool(enable); + int result = remote()->transact(SET_DISPLAY_MULTI_THREADED_PRESENT, data, &reply); + if (result) ALOGE("SET_DISPLAY_MULTI_THREADED_PRESENT transact error(%d)", result); + return result; + } }; IMPLEMENT_META_INTERFACE(ExynosHWCService, "android.hal.ExynosHWCService"); @@ -761,6 +773,15 @@ status_t BnExynosHWCService::onTransact( return NO_ERROR; } break; + case SET_DISPLAY_MULTI_THREADED_PRESENT: { + CHECK_INTERFACE(IExynosHWCService, data, reply); + int32_t displayId = data.readInt32(); + bool enable = data.readBool(); + int32_t error = setDisplayMultiThreadedPresent(displayId, enable); + reply->writeInt32(error); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/libhwc2.1/libhwcService/IExynosHWC.h b/libhwc2.1/libhwcService/IExynosHWC.h index 640ca7d..79292f4 100644 --- a/libhwc2.1/libhwcService/IExynosHWC.h +++ b/libhwc2.1/libhwcService/IExynosHWC.h @@ -77,6 +77,8 @@ public: virtual int32_t setDisplayRCDLayerEnabled(uint32_t displayIndex, bool enable) = 0; virtual int32_t triggerDisplayIdleEnter(uint32_t displayIndex, uint32_t idleTeRefreshRate) = 0; virtual int32_t setDisplayDbm(int32_t display_id, uint32_t on) = 0; + virtual int32_t setDisplayMultiThreadedPresent(const int32_t& displayId, + const bool& enable) = 0; }; /* Native Interface */ diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index 504f065..5300f51 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -123,6 +123,8 @@ ExynosPrimaryDisplay::ExynosPrimaryDisplay(uint32_t index, ExynosDevice *device) mBrightnessController = std::make_unique<BrightnessController>( mIndex, [this]() { mDevice->onRefresh(); }, [this]() { updatePresentColorConversionInfo(); }); + + mDisplayControl.multiThreadedPresent = true; } ExynosPrimaryDisplay::~ExynosPrimaryDisplay() |