Merge "HWC/Copybit :: Add swap rect feature in HAL for MDP3"
diff --git a/libgralloc/gr.h b/libgralloc/gr.h
index d88db9d..fbde8c2 100644
--- a/libgralloc/gr.h
+++ b/libgralloc/gr.h
@@ -74,6 +74,7 @@
class Locker {
pthread_mutex_t mutex;
+ pthread_cond_t cond;
public:
class Autolock {
Locker& locker;
@@ -81,10 +82,18 @@
inline Autolock(Locker& locker) : locker(locker) { locker.lock(); }
inline ~Autolock() { locker.unlock(); }
};
- inline Locker() { pthread_mutex_init(&mutex, 0); }
- inline ~Locker() { pthread_mutex_destroy(&mutex); }
+ inline Locker() {
+ pthread_mutex_init(&mutex, 0);
+ pthread_cond_init(&cond, 0);
+ }
+ inline ~Locker() {
+ pthread_mutex_destroy(&mutex);
+ pthread_cond_destroy(&cond);
+ }
inline void lock() { pthread_mutex_lock(&mutex); }
+ inline void wait() { pthread_cond_wait(&cond, &mutex); }
inline void unlock() { pthread_mutex_unlock(&mutex); }
+ inline void signal() { pthread_cond_signal(&cond); }
};
diff --git a/libhwcomposer/hwc.cpp b/libhwcomposer/hwc.cpp
index 48937c8..cbc42b2 100644
--- a/libhwcomposer/hwc.cpp
+++ b/libhwcomposer/hwc.cpp
@@ -101,12 +101,102 @@
init_vsync_thread(ctx);
}
-//Helper
+static void setPaddingRound(hwc_context_t *ctx, int numDisplays,
+ hwc_display_contents_1_t** displays) {
+ ctx->isPaddingRound = false;
+ for(int i = 0; i < numDisplays; i++) {
+ hwc_display_contents_1_t *list = displays[i];
+ if (LIKELY(list && list->numHwLayers > 0)) {
+ if((ctx->mPrevHwLayerCount[i] == 1 or
+ ctx->mPrevHwLayerCount[i] == 0) and
+ (list->numHwLayers > 1)) {
+ /* If the previous cycle for dpy 'i' has 0 AppLayers and the
+ * current cycle has atleast 1 AppLayer, padding round needs
+ * to be invoked in current cycle on all the active displays
+ * to free up the resources.
+ */
+ ctx->isPaddingRound = true;
+ }
+ ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
+ } else {
+ ctx->mPrevHwLayerCount[i] = 0;
+ }
+ }
+}
+
+/* Based on certain conditions, isPaddingRound will be set
+ * to make this function self-contained */
+static void setDMAState(hwc_context_t *ctx, int numDisplays,
+ hwc_display_contents_1_t** displays) {
+
+ if(ctx->mRotMgr->getNumActiveSessions() == 0)
+ Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
+
+ for(int i = 0; i < numDisplays; i++) {
+ hwc_display_contents_1_t *list = displays[i];
+ if (LIKELY(list && list->numHwLayers > 0)) {
+ for(size_t j = 0; j < list->numHwLayers; j++) {
+ if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET)
+ {
+ hwc_layer_1_t const* layer = &list->hwLayers[i];
+ private_handle_t *hnd = (private_handle_t *)layer->handle;
+
+ /* If a video layer requires rotation, set the DMA state
+ * to BLOCK_MODE */
+
+ if (UNLIKELY(isYuvBuffer(hnd)) && canUseRotator(ctx,i) &&
+ (layer->transform & HWC_TRANSFORM_ROT_90)) {
+ if(not qdutils::MDPVersion::getInstance().is8x26()) {
+ if(ctx->mOverlay->isPipeTypeAttached(
+ overlay::utils::OV_MDP_PIPE_DMA))
+ ctx->isPaddingRound = true;
+ }
+ Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
+ }
+ }
+ }
+ if(i) {
+ /* Uncomment the below code for testing purpose.
+ Assuming the orientation value is in terms of HAL_TRANSFORM,
+ this needs mapping to HAL, if its in different convention */
+
+ /* char value[PROPERTY_VALUE_MAX];
+ property_get("sys.ext_orientation", value, "0");
+ ctx->mExtOrientation = atoi(value);*/
+
+ if(ctx->mExtOrientation || ctx->mBufferMirrorMode) {
+ if(ctx->mOverlay->isPipeTypeAttached(
+ overlay::utils::OV_MDP_PIPE_DMA)) {
+ ctx->isPaddingRound = true;
+ }
+ Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
+ }
+ }
+ }
+ }
+}
+
+static void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays,
+ hwc_display_contents_1_t** displays) {
+
+ ctx->numActiveDisplays = 0;
+ for(int i = 0; i < numDisplays; i++) {
+ hwc_display_contents_1_t *list = displays[i];
+ if (LIKELY(list && list->numHwLayers > 0)) {
+ /* For display devices like SSD and screenrecord, we cannot
+ * rely on isActive and connected attributes of dpyAttr to
+ * determine if the displaydevice is active. Hence in case if
+ * the layer-list is non-null and numHwLayers > 0, we assume
+ * the display device to be active.
+ */
+ ctx->numActiveDisplays += 1;
+ }
+ }
+}
+
static void reset(hwc_context_t *ctx, int numDisplays,
hwc_display_contents_1_t** displays) {
- ctx->numActiveDisplays = 0;
- ctx->isPaddingRound = false;
for(int i = 0; i < numDisplays; i++) {
hwc_display_contents_1_t *list = displays[i];
@@ -120,24 +210,6 @@
list->hwLayers[j].compositionType = HWC_FRAMEBUFFER;
}
- /* For display devices like SSD and screenrecord, we cannot
- * rely on isActive and connected attributes of dpyAttr to
- * determine if the displaydevice is active. Hence in case if
- * the layer-list is non-null and numHwLayers > 0, we assume
- * the display device to be active.
- */
- ctx->numActiveDisplays += 1;
-
- if((ctx->mPrevHwLayerCount[i] == 1) and (list->numHwLayers > 1)) {
- /* If the previous cycle for dpy 'i' has 0 AppLayers and the
- * current cycle has atleast 1 AppLayer, padding round needs
- * to be invoked on current cycle to free up the resources.
- */
- ctx->isPaddingRound = true;
- }
- ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers;
- } else {
- ctx->mPrevHwLayerCount[i] = 0;
}
if(ctx->mFBUpdate[i])
@@ -263,6 +335,9 @@
//Will be unlocked at the end of set
ctx->mDrawLock.lock();
+ setPaddingRound(ctx,numDisplays,displays);
+ setDMAState(ctx,numDisplays,displays);
+ setNumActiveDisplays(ctx,numDisplays,displays);
reset(ctx, (int)numDisplays, displays);
ctx->mOverlay->configBegin();
@@ -630,8 +705,6 @@
CALC_FPS();
MDPComp::resetIdleFallBack();
ctx->mVideoTransFlag = false;
- if(ctx->mRotMgr->getNumActiveSessions() == 0)
- Overlay::setDMAMode(Overlay::DMA_LINE_MODE);
//Was locked at the beginning of prepare
ctx->mDrawLock.unlock();
return ret;
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 5f4d592..8599392 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -815,6 +815,7 @@
int numAppLayers = ctx->listStats[mDpy].numAppLayers;
mCurrentFrame.reset(numAppLayers);
+ mCurrentFrame.fbCount -= mCurrentFrame.dropCount;
updateYUV(ctx, list, secureOnly);
int mdpCount = mCurrentFrame.mdpCount;
diff --git a/libhwcomposer/hwc_qclient.cpp b/libhwcomposer/hwc_qclient.cpp
index 5313795..976b23d 100644
--- a/libhwcomposer/hwc_qclient.cpp
+++ b/libhwcomposer/hwc_qclient.cpp
@@ -157,6 +157,9 @@
}
static void pauseWFD(hwc_context_t *ctx, uint32_t pause) {
+ /* TODO: Will remove pauseWFD once all the clients start using
+ * setWfdStatus to indicate the status of WFD display
+ */
int dpy = HWC_DISPLAY_VIRTUAL;
if(pause) {
//WFD Pause
@@ -167,6 +170,24 @@
}
}
+static void setWfdStatus(hwc_context_t *ctx, uint32_t wfdStatus) {
+
+ ALOGD_IF(HWC_WFDDISPSYNC_LOG,
+ "%s: Received a binder call that WFD state is %s",
+ __FUNCTION__,getExternalDisplayState(wfdStatus));
+ int dpy = HWC_DISPLAY_VIRTUAL;
+
+ if(wfdStatus == EXTERNAL_OFFLINE) {
+ ctx->mWfdSyncLock.lock();
+ ctx->mWfdSyncLock.signal();
+ ctx->mWfdSyncLock.unlock();
+ } else if(wfdStatus == EXTERNAL_PAUSE) {
+ handle_pause(ctx, dpy);
+ } else if(wfdStatus == EXTERNAL_RESUME) {
+ handle_resume(ctx, dpy);
+ }
+}
+
status_t QClient::notifyCallback(uint32_t command, const Parcel* inParcel,
Parcel* outParcel) {
status_t ret = NO_ERROR;
@@ -199,15 +220,17 @@
break;
case IQService::SET_HSIC_DATA:
setHSIC(inParcel);
+ break;
case IQService::PAUSE_WFD:
pauseWFD(mHwcContext, inParcel->readInt32());
break;
+ case IQService::SET_WFD_STATUS:
+ setWfdStatus(mHwcContext,inParcel->readInt32());
+ break;
default:
ret = NO_ERROR;
}
return ret;
}
-
-
}
diff --git a/libhwcomposer/hwc_uevents.cpp b/libhwcomposer/hwc_uevents.cpp
index e1f7827..fed6f3c 100644
--- a/libhwcomposer/hwc_uevents.cpp
+++ b/libhwcomposer/hwc_uevents.cpp
@@ -39,14 +39,6 @@
#define HWC_UEVENT_SWITCH_STR "change@/devices/virtual/switch/"
#define HWC_UEVENT_THREAD_NAME "hwcUeventThread"
-/* External Display states */
-enum {
- EXTERNAL_OFFLINE = 0,
- EXTERNAL_ONLINE,
- EXTERNAL_PAUSE,
- EXTERNAL_RESUME
-};
-
static void setup(hwc_context_t* ctx, int dpy)
{
ctx->mFBUpdate[dpy] = IFBUpdate::getObject(ctx, dpy);
@@ -145,9 +137,24 @@
ctx->mVirtualonExtActive = false;
}
}
- /* Wait for few frames for SF to tear down the WFD session. */
- usleep(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period
- * 2 / 1000);
+
+ if(ctx->mVDSEnabled) {
+ ctx->mWfdSyncLock.lock();
+ ALOGD_IF(HWC_WFDDISPSYNC_LOG,
+ "%s: Waiting for wfd-teardown to be signalled",__FUNCTION__);
+ ctx->mWfdSyncLock.wait();
+ ALOGD_IF(HWC_WFDDISPSYNC_LOG,
+ "%s: Teardown signalled. Completed waiting in uevent thread",
+ __FUNCTION__);
+ ctx->mWfdSyncLock.unlock();
+ } else {
+ /*TODO: Remove this else block and have wait rather than usleep
+ once wfd module issues binder call on teardown.*/
+
+ /* For now, Wait for few frames for SF to tear down the WFD session.*/
+ usleep(ctx->dpyAttr[HWC_DISPLAY_PRIMARY].vsync_period
+ * 2 / 1000);
+ }
}
static void handle_uevent(hwc_context_t* ctx, const char* udata, int len)
@@ -166,7 +173,7 @@
int switch_state = getConnectedState(udata, len);
- ALOGE_IF(UEVENT_DEBUG,"%s: uevent recieved: %s switch state: %d",
+ ALOGE_IF(UEVENT_DEBUG,"%s: uevent received: %s switch state: %d",
__FUNCTION__,udata, switch_state);
switch(switch_state) {
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 1670803..e0162ca 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -184,6 +184,7 @@
void initContext(hwc_context_t *ctx)
{
openFramebufferDevice(ctx);
+ char value[PROPERTY_VALUE_MAX];
ctx->mMDP.version = qdutils::MDPVersion::getInstance().getMDPVersion();
ctx->mMDP.hasOverlay = qdutils::MDPVersion::getInstance().hasOverlay();
ctx->mMDP.panel = qdutils::MDPVersion::getInstance().getPanelType();
@@ -225,7 +226,14 @@
ctx->mMDPComp[HWC_DISPLAY_PRIMARY] =
MDPComp::getObject(ctx, HWC_DISPLAY_PRIMARY);
ctx->dpyAttr[HWC_DISPLAY_PRIMARY].connected = true;
- ctx->mHWCVirtual = HWCVirtualBase::getObject();
+
+ ctx->mVDSEnabled = false;
+ if((property_get("persist.hwc.enable_vds", value, NULL) > 0)) {
+ if(atoi(value) != 0) {
+ ctx->mVDSEnabled = true;
+ }
+ }
+ ctx->mHWCVirtual = HWCVirtualBase::getObject(ctx->mVDSEnabled);
for (uint32_t i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
ctx->mHwcDebug[i] = new HwcDebug(i);
@@ -262,7 +270,6 @@
// Read the system property to determine if downscale feature is enabled.
ctx->mMDPDownscaleEnabled = false;
- char value[PROPERTY_VALUE_MAX];
if(property_get("sys.hwc.mdp_downscale_enabled", value, "false")
&& !strcmp(value, "true")) {
ctx->mMDPDownscaleEnabled = true;
@@ -642,6 +649,21 @@
return extOrientation;
}
+/* Get External State names */
+const char* getExternalDisplayState(uint32_t external_state) {
+ static const char* externalStates[EXTERNAL_MAXSTATES] = {0};
+ externalStates[EXTERNAL_OFFLINE] = STR(EXTERNAL_OFFLINE);
+ externalStates[EXTERNAL_ONLINE] = STR(EXTERNAL_ONLINE);
+ externalStates[EXTERNAL_PAUSE] = STR(EXTERNAL_PAUSE);
+ externalStates[EXTERNAL_RESUME] = STR(EXTERNAL_RESUME);
+
+ if(external_state >= EXTERNAL_MAXSTATES) {
+ return "EXTERNAL_INVALID";
+ }
+
+ return externalStates[external_state];
+}
+
bool isDownscaleRequired(hwc_layer_1_t const* layer) {
hwc_rect_t displayFrame = layer->displayFrame;
hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
@@ -865,13 +887,6 @@
ctx->listStats[dpy].yuv4k2kIndices[yuv4k2kCount] = (int)i;
yuv4k2kCount++;
}
-
- if((layer->transform & HWC_TRANSFORM_ROT_90) &&
- canUseRotator(ctx, dpy)) {
- if(ctx->mOverlay->isPipeTypeAttached(OV_MDP_PIPE_DMA))
- ctx->isPaddingRound = true;
- Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
- }
}
if(layer->blending == HWC_BLENDING_PREMULT)
ctx->listStats[dpy].preMultipliedAlpha = true;
@@ -894,25 +909,6 @@
}
}
}
- if(dpy) {
- //uncomment the below code for testing purpose.
- /* char value[PROPERTY_VALUE_MAX];
- property_get("sys.ext_orientation", value, "0");
- // Assuming the orientation value is in terms of HAL_TRANSFORM,
- // This needs mapping to HAL, if its in different convention
- ctx->mExtOrientation = atoi(value); */
- // Assuming the orientation value is in terms of HAL_TRANSFORM,
- // This needs mapping to HAL, if its in different convention
- if(ctx->mExtOrientation || ctx->mBufferMirrorMode) {
- ALOGD_IF(HWC_UTILS_DEBUG, "%s: ext orientation = %d"
- "BufferMirrorMode = %d", __FUNCTION__,
- ctx->mExtOrientation, ctx->mBufferMirrorMode);
- if(ctx->mOverlay->isPipeTypeAttached(OV_MDP_PIPE_DMA)) {
- ctx->isPaddingRound = true;
- }
- Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE);
- }
- }
//The marking of video begin/end is useful on some targets where we need
//to have a padding round to be able to shift pipes across mixers.
diff --git a/libhwcomposer/hwc_utils.h b/libhwcomposer/hwc_utils.h
index a33df8d..6fe993a 100644
--- a/libhwcomposer/hwc_utils.h
+++ b/libhwcomposer/hwc_utils.h
@@ -39,6 +39,8 @@
#define MAX_NUM_APP_LAYERS 32
#define MIN_DISPLAY_XRES 200
#define MIN_DISPLAY_YRES 200
+#define HWC_WFDDISPSYNC_LOG 0
+#define STR(f) #f;
//Fwrd decls
struct hwc_context_t;
@@ -154,6 +156,15 @@
HWC_FORMAT_RB_SWAP = 0x00000040,
};
+/* External Display states */
+enum {
+ EXTERNAL_OFFLINE = 0,
+ EXTERNAL_ONLINE,
+ EXTERNAL_PAUSE,
+ EXTERNAL_RESUME,
+ EXTERNAL_MAXSTATES
+};
+
class LayerRotMap {
public:
LayerRotMap() { reset(); }
@@ -281,6 +292,9 @@
// BufferMirrirMode(Sidesync)
int getMirrorModeOrientation(hwc_context_t *ctx);
+/* Get External State names */
+const char* getExternalDisplayState(uint32_t external_state);
+
// Handles wfd Pause and resume events
void handle_pause(hwc_context_t *ctx, int dpy);
void handle_resume(hwc_context_t *ctx, int dpy);
@@ -517,14 +531,21 @@
//Used for SideSync feature
//which overrides the mExtOrientation
bool mBufferMirrorMode;
+ // Used to synchronize between WFD and Display modules
+ mutable Locker mWfdSyncLock;
+
qhwc::LayerRotMap *mLayerRotMap[HWC_NUM_DISPLAY_TYPES];
// Panel reset flag will be set if BTA check fails
bool mPanelResetStatus;
// number of active Displays
int numActiveDisplays;
- // Downscale feature switch, set via system the property
+ // Downscale feature switch, set via system property
// sys.hwc.mdp_downscale_enabled
bool mMDPDownscaleEnabled;
+ // Is WFD enabled through VDS solution ?
+ // This can be set via system property
+ // persist.hwc.enable_vds
+ bool mVDSEnabled;
struct gpu_hint_info mGPUHintInfo;
};
diff --git a/libhwcomposer/hwc_virtual.cpp b/libhwcomposer/hwc_virtual.cpp
index f68d08f..10ed9d1 100644
--- a/libhwcomposer/hwc_virtual.cpp
+++ b/libhwcomposer/hwc_virtual.cpp
@@ -35,19 +35,17 @@
using namespace qhwc;
using namespace overlay;
-HWCVirtualBase* HWCVirtualBase::getObject() {
- char property[PROPERTY_VALUE_MAX];
+HWCVirtualBase* HWCVirtualBase::getObject(bool isVDSEnabled) {
- if((property_get("persist.hwc.enable_vds", property, NULL) > 0)) {
- if(atoi(property) != 0) {
- ALOGD_IF(HWCVIRTUAL_LOG, "%s: VDS is enabled for Virtual display",
- __FUNCTION__);
- return new HWCVirtualVDS();
- }
+ if(isVDSEnabled) {
+ ALOGD_IF(HWCVIRTUAL_LOG, "%s: VDS is enabled for Virtual display",
+ __FUNCTION__);
+ return new HWCVirtualVDS();
+ } else {
+ ALOGD_IF(HWCVIRTUAL_LOG, "%s: V4L2 is enabled for Virtual display",
+ __FUNCTION__);
+ return new HWCVirtualV4L2();
}
- ALOGD_IF(HWCVIRTUAL_LOG, "%s: V4L2 is enabled for Virtual display",
- __FUNCTION__);
- return new HWCVirtualV4L2();
}
void HWCVirtualVDS::init(hwc_context_t *ctx) {
@@ -84,6 +82,9 @@
if(!Writeback::getInstance()->setSecure(false)) {
ALOGE("Failure while attempting to reset WB session.");
}
+ ctx->mWfdSyncLock.lock();
+ ctx->mWfdSyncLock.signal();
+ ctx->mWfdSyncLock.unlock();
}
}
diff --git a/libhwcomposer/hwc_virtual.h b/libhwcomposer/hwc_virtual.h
index 6bc3898..87004c3 100644
--- a/libhwcomposer/hwc_virtual.h
+++ b/libhwcomposer/hwc_virtual.h
@@ -33,7 +33,7 @@
explicit HWCVirtualBase(){};
virtual ~HWCVirtualBase(){};
// instantiates and returns the pointer to VDS or V4L2 object.
- static HWCVirtualBase* getObject();
+ static HWCVirtualBase* getObject(bool isVDSEnabled);
virtual int prepare(hwc_composer_device_1 *dev,
hwc_display_contents_1_t* list) = 0;
virtual int set(hwc_context_t *ctx, hwc_display_contents_1_t *list) = 0;
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index c1757ad..f4b0ecc 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -279,9 +279,9 @@
uint8_t pipe1Prio = mPipeBook[(int)pipe1Index].mPipe->getPriority();
uint8_t pipe2Prio = mPipeBook[(int)pipe2Index].mPipe->getPriority();
if(pipe1Prio > pipe2Prio)
- return 1;
- if(pipe1Prio < pipe2Prio)
return -1;
+ if(pipe1Prio < pipe2Prio)
+ return 1;
return 0;
}
diff --git a/libqdutils/mdp_version.cpp b/libqdutils/mdp_version.cpp
index 485d04b..16505ba 100644
--- a/libqdutils/mdp_version.cpp
+++ b/libqdutils/mdp_version.cpp
@@ -176,7 +176,7 @@
mPanelInfo.mPartialUpdateEnable? "Enabled" :
"Disabled");
}
- if(!strncmp(tokens[0], "xalign", strlen("xalign"))) {
+ if(!strncmp(tokens[0], "xstart", strlen("xstart"))) {
mPanelInfo.mLeftAlign = atoi(tokens[1]);
ALOGI("Left Align: %d", mPanelInfo.mLeftAlign);
}
@@ -192,6 +192,14 @@
mPanelInfo.mHeightAlign = atoi(tokens[1]);
ALOGI("Height Align: %d", mPanelInfo.mHeightAlign);
}
+ if(!strncmp(tokens[0], "min_w", strlen("min_w"))) {
+ mPanelInfo.mMinROIWidth = atoi(tokens[1]);
+ ALOGI("Min ROI Width: %d", mPanelInfo.mMinROIWidth);
+ }
+ if(!strncmp(tokens[0], "min_h", strlen("min_h"))) {
+ mPanelInfo.mMinROIHeight = atoi(tokens[1]);
+ ALOGI("Min ROI Height: %d", mPanelInfo.mMinROIHeight);
+ }
}
}
fclose(panelInfoNodeFP);
diff --git a/libqdutils/mdp_version.h b/libqdutils/mdp_version.h
index aab8643..1a779cc 100644
--- a/libqdutils/mdp_version.h
+++ b/libqdutils/mdp_version.h
@@ -99,8 +99,11 @@
int mWidthAlign; // ROI width alignment restriction
int mTopAlign; // ROI top alignment restriction
int mHeightAlign; // ROI height alignment restriction
+ int mMinROIWidth; // Min width needed for ROI
+ int mMinROIHeight; // Min height needed for ROI
PanelInfo() : mType(NO_PANEL), mPartialUpdateEnable(0),
- mLeftAlign(0), mWidthAlign(0), mTopAlign(0), mHeightAlign(0){}
+ mLeftAlign(0), mWidthAlign(0), mTopAlign(0), mHeightAlign(0),
+ mMinROIWidth(0), mMinROIHeight(0){}
friend class MDPVersion;
};
@@ -130,6 +133,8 @@
int getWidthAlign() { return mPanelInfo.mWidthAlign; }
int getTopAlign() { return mPanelInfo.mTopAlign; }
int getHeightAlign() { return mPanelInfo.mHeightAlign; }
+ int getMinROIWidth() { return mPanelInfo.mMinROIWidth; }
+ int getMinROIHeight() { return mPanelInfo.mMinROIHeight; }
unsigned long getLowBw() { return mLowBw; }
unsigned long getHighBw() { return mHighBw; }
bool isSrcSplit() const;
diff --git a/libqservice/IQService.h b/libqservice/IQService.h
index 6c1bba6..02f7341 100644
--- a/libqservice/IQService.h
+++ b/libqservice/IQService.h
@@ -50,6 +50,7 @@
SET_HSIC_DATA, // Set HSIC on dspp
GET_DISPLAY_VISIBLE_REGION, // Get the visibleRegion for dpy
PAUSE_WFD, // Pause/Resume WFD
+ SET_WFD_STATUS, // Set if wfd connection is on/off
COMMAND_LIST_END = 400,
};
diff --git a/libqservice/QServiceUtils.h b/libqservice/QServiceUtils.h
index 699164d..08cab31 100644
--- a/libqservice/QServiceUtils.h
+++ b/libqservice/QServiceUtils.h
@@ -87,4 +87,7 @@
return sendSingleParam(qService::IQService::PAUSE_WFD, pause);
}
+inline android::status_t setWfdStatus(uint32_t wfdStatus) {
+ return sendSingleParam(qService::IQService::SET_WFD_STATUS, wfdStatus);
+}
#endif /* end of include guard: QSERVICEUTILS_H */