diff options
author | Joen Chen <joenchen@google.com> | 2023-03-21 05:54:12 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-03-21 05:54:12 +0000 |
commit | 8fb86c4886735839181951cc5875a0d4972636da (patch) | |
tree | a76a27b32a6033008d9eadfaa6f4043c0bcd7965 | |
parent | 3cbddb096bff57077e48c9aff9cf750f2d723aeb (diff) | |
parent | 49dec5e3831532d6d23079dc741224425470091f (diff) | |
download | zuma-8fb86c4886735839181951cc5875a0d4972636da.tar.gz |
Merge "libhwc2.1: add WCG constraints into TDM" into udc-d1-dev
-rw-r--r-- | libhwc2.1/ExynosHWCModule.h | 119 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp | 17 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libresource/ExynosResourceManagerModule.cpp | 41 | ||||
-rw-r--r-- | libhwc2.1/libresource/ExynosResourceManagerModule.h | 6 |
5 files changed, 126 insertions, 58 deletions
diff --git a/libhwc2.1/ExynosHWCModule.h b/libhwc2.1/ExynosHWCModule.h index 0f0280a..c020a44 100644 --- a/libhwc2.1/ExynosHWCModule.h +++ b/libhwc2.1/ExynosHWCModule.h @@ -48,6 +48,12 @@ typedef enum AXIPortId { AXI_PORT_CNT, } AXIPortId_t; +typedef enum ConstraintRev { + CONSTRAINT_NONE = 0, // don't care + CONSTRAINT_A0, + CONSTRAINT_B0 +} ConstraintRev_t; + static const dpp_channel_map_t idma_channel_map[] = { /* GF physical index is switched to change assign order */ /* DECON_IDMA is not used */ @@ -132,10 +138,15 @@ class HWResourceIndexes { tdm_attr_t attr; DPUblockId_t DPUBlockNo; int displayId; + ConstraintRev_t constraintRev; public: - HWResourceIndexes(tdm_attr_t _attr, DPUblockId_t _DPUBlockNo, int _displayId) - : attr(_attr), DPUBlockNo(_DPUBlockNo), displayId(_displayId) {} + HWResourceIndexes(tdm_attr_t _attr, DPUblockId_t _DPUBlockNo, int _displayId, + ConstraintRev_t _constraintRev) + : attr(_attr), + DPUBlockNo(_DPUBlockNo), + displayId(_displayId), + constraintRev(_constraintRev) {} bool operator<(const HWResourceIndexes& rhs) const { if (attr != rhs.attr) return attr < rhs.attr; @@ -143,6 +154,8 @@ class HWResourceIndexes { if (displayId != rhs.displayId) return displayId < rhs.displayId; + if (constraintRev != CONSTRAINT_NONE) return constraintRev < rhs.constraintRev; + return false; } }; @@ -157,47 +170,67 @@ typedef struct HWResourceAmounts { * Primary amount = total - others */ const std::map<HWResourceIndexes, HWResourceAmounts_t> HWResourceTables = { - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_PRIMARY), {80, 80}}, - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 80}}, - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 80}}, - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_PRIMARY), {0, 80}}, - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_EXTERNAL), {80, 80}}, - {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_VIRTUAL), {80, 80}}, - - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_PRIMARY), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_PRIMARY), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_EXTERNAL), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_VIRTUAL), {2, 2}}, - - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_PRIMARY), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_PRIMARY), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_EXTERNAL), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_VIRTUAL), {2, 2}}, - - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_PRIMARY), {4, 4}}, - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_PRIMARY), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_EXTERNAL), {4, 4}}, - {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_VIRTUAL), {4, 4}}, - - {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_PRIMARY), {4, 4}}, - {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_PRIMARY), {0, 4}}, - {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_EXTERNAL), {4, 4}}, - {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_VIRTUAL), {4, 4}}, - - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_PRIMARY), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_EXTERNAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_VIRTUAL), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_PRIMARY), {0, 2}}, - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_EXTERNAL), {2, 2}}, - {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_VIRTUAL), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), + {80, 80}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), + {0, 80}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), + {0, 80}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), + {0, 80}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), + {80, 80}}, + {HWResourceIndexes(TDM_ATTR_SRAM_AMOUNT, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), + {80, 80}}, + + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_SCALE, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {2, 2}}, + + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_SBWC, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {2, 2}}, + + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_AFBC, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {4, 4}}, + + {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_ITP, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_ITP, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {4, 4}}, + + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_NONE), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_NONE), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_ROT_90, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_NONE), {2, 2}}, + + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_A0), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_A0), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_A0), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_A0), {2, 2}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_A0), {0, 2}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_A0), {0, 2}}, + + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF0, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_PRIMARY, CONSTRAINT_B0), {4, 4}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_EXTERNAL, CONSTRAINT_B0), {0, 4}}, + {HWResourceIndexes(TDM_ATTR_WCG, DPUF1, HWC_DISPLAY_VIRTUAL, CONSTRAINT_B0), {0, 4}}, }; typedef enum lbWidthIndex { diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index 587b94c..b77aa46 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -222,3 +222,20 @@ int32_t ExynosPrimaryDisplayModule::OperationRateManager::updateOperationRateLoc mDisplayLastDbv, mDisplayNsMinDbv); return ret; } + +void ExynosPrimaryDisplayModule::checkPreblendingRequirement() { + String8 log; + int count = 0; + for (size_t i = 0; i < mLayers.size(); ++i) { + auto& dpp = getDppForLayer(mLayers[i]); + mLayers[i]->mNeedPreblending = + dpp.EotfLut().enable | dpp.Gm().enable | dpp.Dtm().enable | dpp.OetfLut().enable; + count += mLayers[i]->mNeedPreblending; + if (hwcCheckDebugMessages(eDebugTDM)) { + log.appendFormat(" i=%zu,pb(%d-%d,%d,%d,%d)", i, mLayers[i]->mNeedPreblending, + dpp.EotfLut().enable, dpp.Gm().enable, dpp.Dtm().enable, + dpp.OetfLut().enable); + } + } + DISPLAY_LOGD(eDebugTDM, "%s: disp(%d),cnt=%d%s", __func__, mDisplayId, count, log.string()); +} diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h index 717964f..faf6d8f 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h @@ -29,6 +29,7 @@ class ExynosPrimaryDisplayModule : public gs201::ExynosPrimaryDisplayModule { const std::string& displayName); ~ExynosPrimaryDisplayModule(); virtual int32_t validateWinConfigData(); + void checkPreblendingRequirement() override; protected: class OperationRateManager diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp index 9f9bba3..5cc11c7 100644 --- a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp +++ b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp @@ -16,7 +16,10 @@ #include "ExynosResourceManagerModule.h" +#include <cutils/properties.h> + #include <list> +#include <utility> #include "ExynosLayer.h" @@ -37,6 +40,12 @@ ExynosResourceManagerModule::ExynosResourceManagerModule(ExynosDevice *device) { // HW Resource Table for TDM based allocation mHWResourceTables = &HWResourceTables; + + char value[PROPERTY_VALUE_MAX]; + property_get("ro.boot.hw.soc.rev", value, "2"); + const int socRev = atoi(value); + mConstraintRev = socRev < 2 ? CONSTRAINT_A0 : CONSTRAINT_B0; + ALOGD("%s(): ro.boot.hw.soc.rev=%s ConstraintRev=%d", __func__, value, mConstraintRev); // TODO (b/266048745): Revert once G2D HDR code for zuma is merged mM2mMPPs.clear(); } @@ -154,13 +163,14 @@ uint32_t ExynosResourceManagerModule::setDisplaysTDMInfo() ExynosDisplay *primaryDisplay = getDisplay(getDisplayId(HWC_DISPLAY_PRIMARY, 0)); for (auto attr = HWAttrs.begin(); attr != HWAttrs.end(); attr++) { for (auto blockId = DPUBlocks.begin(); blockId != DPUBlocks.end(); blockId++) { - if (mHWResourceTables->find( - HWResourceIndexes(attr->first, blockId->first, primaryDisplay->mType)) != + if (mHWResourceTables->find(HWResourceIndexes(attr->first, blockId->first, + primaryDisplay->mType, mConstraintRev)) != mHWResourceTables->end()) { - uint32_t total = mHWResourceTables - ->at(HWResourceIndexes(attr->first, blockId->first, - primaryDisplay->mType)) - .totalAmount; + uint32_t total = + mHWResourceTables + ->at(HWResourceIndexes(attr->first, blockId->first, + primaryDisplay->mType, mConstraintRev)) + .totalAmount; if (addedDisplay != nullptr) { total = total - @@ -176,6 +186,9 @@ uint32_t ExynosResourceManagerModule::setDisplaysTDMInfo() primaryDisplay->mDisplayTDMInfo[blockId->first].initTDMInfo(amount, attr->first); HDEBUGLOGD(eDebugTDM, "Primary display (block : %d) : %s amount is updated to %d", blockId->first, attr->second.string(), amount.totalAmount); + } else { + ALOGW("Primary display (block : %d) : cannot find resource for %s", blockId->first, + attr->second.string()); } } } @@ -209,20 +222,24 @@ uint32_t ExynosResourceManagerModule::initDisplaysTDMInfo() for (auto &display : mDisplays) { for (auto attr = HWAttrs.begin(); attr != HWAttrs.end(); attr++) { for (auto blockId = DPUBlocks.begin(); blockId != DPUBlocks.end(); blockId++) { - if (mHWResourceTables->find( - HWResourceIndexes(attr->first, blockId->first, display->mType)) != + if (mHWResourceTables->find(HWResourceIndexes(attr->first, blockId->first, + display->mType, mConstraintRev)) != mHWResourceTables->end()) { DisplayTDMInfo::ResourceAmount_t amount = { 0, }; - amount.totalAmount = mHWResourceTables - ->at(HWResourceIndexes(attr->first, blockId->first, - display->mType)) - .maxAssignedAmount; + amount.totalAmount = + mHWResourceTables + ->at(HWResourceIndexes(attr->first, blockId->first, + display->mType, mConstraintRev)) + .maxAssignedAmount; display->mDisplayTDMInfo[blockId->first].initTDMInfo(amount, attr->first); HDEBUGLOGD(eDebugTDM, "%s, [attr:%d] display : %d, block : %d, amount : %d", __func__, attr->first, display->mType, blockId->first, amount.totalAmount); + } else { + ALOGW("%s, [attr:%d] display : %d, block : %d no resource", __func__, + attr->first, display->mType, blockId->first); } } } diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.h b/libhwc2.1/libresource/ExynosResourceManagerModule.h index 4197005..29bcc80 100644 --- a/libhwc2.1/libresource/ExynosResourceManagerModule.h +++ b/libhwc2.1/libresource/ExynosResourceManagerModule.h @@ -26,7 +26,6 @@ class ExynosResourceManagerModule : public gs201::ExynosResourceManagerModule { ExynosResourceManagerModule(ExynosDevice *device); ~ExynosResourceManagerModule(); - public: /* TDM (Time-Division Multiplexing) based Resource Management */ virtual bool isHWResourceAvailable(ExynosDisplay *display, ExynosMPP *currentMPP, ExynosMPPSource *mppSrc); @@ -43,9 +42,10 @@ class ExynosResourceManagerModule : public gs201::ExynosResourceManagerModule { std::map<tdm_attr_t, uint32_t> &amounts); bool checkTDMResource(ExynosDisplay *display, ExynosMPP *currentMPP, ExynosMPPSource *mppSrc); - - public: const std::map<HWResourceIndexes, HWResourceAmounts_t> *mHWResourceTables = nullptr; + + private: + ConstraintRev_t mConstraintRev; }; } // namespace zuma |