summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hwc3/ComposerClient.cpp10
-rw-r--r--hwc3/impl/HalImpl.cpp7
-rw-r--r--hwc3/impl/HalImpl.h2
-rw-r--r--hwc3/include/IComposerHal.h3
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp5
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h3
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.cpp11
-rw-r--r--libhwc2.1/libhwcService/ExynosHWCService.h3
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.cpp21
-rw-r--r--libhwc2.1/libhwcService/IExynosHWC.h2
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp2
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()