Merge "Display and wfd synchronization during teardown"
diff --git a/Android.mk b/Android.mk
index 609d1e1..3fd19c1 100644
--- a/Android.mk
+++ b/Android.mk
@@ -4,8 +4,7 @@
ifeq ($(call is-vendor-board-platform,QCOM),true)
include $(call all-named-subdir-makefiles,$(display-hals))
else
-ifneq ($(filter msm8960,$(TARGET_BOARD_PLATFORM)),)
- #This is for mako since it doesn't have the QCOM make functions
+ifneq ($(filter msm% apq%,$(TARGET_BOARD_PLATFORM)),)
include $(call all-named-subdir-makefiles,$(display-hals))
endif
endif
diff --git a/common.mk b/common.mk
index 64f60e4..01cdd3f 100644
--- a/common.mk
+++ b/common.mk
@@ -1,12 +1,12 @@
#Common headers
-common_includes := hardware/qcom/display/libgralloc
-common_includes += hardware/qcom/display/liboverlay
-common_includes += hardware/qcom/display/libcopybit
-common_includes += hardware/qcom/display/libqdutils
-common_includes += hardware/qcom/display/libhwcomposer
-common_includes += hardware/qcom/display/libexternal
-common_includes += hardware/qcom/display/libqservice
-common_includes += hardware/qcom/display/libvirtual
+common_includes := $(LOCAL_PATH)/../libgralloc
+common_includes += $(LOCAL_PATH)/../liboverlay
+common_includes += $(LOCAL_PATH)/../libcopybit
+common_includes += $(LOCAL_PATH)/../libqdutils
+common_includes += $(LOCAL_PATH)/../libhwcomposer
+common_includes += $(LOCAL_PATH)/../libexternal
+common_includes += $(LOCAL_PATH)/../libqservice
+common_includes += $(LOCAL_PATH)/../libvirtual
ifeq ($(TARGET_USES_POST_PROCESSING),true)
common_flags += -DUSES_POST_PROCESSING
diff --git a/libgralloc/gpu.cpp b/libgralloc/gpu.cpp
index 19e948a..7a1efa4 100644
--- a/libgralloc/gpu.cpp
+++ b/libgralloc/gpu.cpp
@@ -175,9 +175,6 @@
{
*bufferType = BUFFER_TYPE_VIDEO;
- if (inputFormat == HAL_PIXEL_FORMAT_RGB_888)
- return;
-
if (inputFormat <= HAL_PIXEL_FORMAT_sRGB_X_8888) {
// RGB formats
*bufferType = BUFFER_TYPE_UI;
diff --git a/libgralloc/gralloc.cpp b/libgralloc/gralloc.cpp
index fd4d208..6b41ce6 100644
--- a/libgralloc/gralloc.cpp
+++ b/libgralloc/gralloc.cpp
@@ -24,8 +24,6 @@
#include <sys/ioctl.h>
#include <cutils/properties.h>
-#include <linux/android_pmem.h>
-
#include "gr.h"
#include "gpu.h"
#include "memalloc.h"
diff --git a/libgralloc/ionalloc.cpp b/libgralloc/ionalloc.cpp
index 3acf06e..e657610 100644
--- a/libgralloc/ionalloc.cpp
+++ b/libgralloc/ionalloc.cpp
@@ -73,7 +73,11 @@
ionAllocData.len = data.size;
ionAllocData.align = data.align;
+#ifdef QCOM_BSP
ionAllocData.heap_mask = data.flags & ~ION_SECURE;
+#else
+ ionAllocData.heap_id_mask = data.flags & ~ION_SECURE;
+#endif
ionAllocData.flags = data.uncached ? 0 : ION_FLAG_CACHED;
// ToDo: replace usage of alloc data structure with
// ionallocdata structure.
diff --git a/libgralloc/mapper.cpp b/libgralloc/mapper.cpp
index e415b3c..c419da6 100644
--- a/libgralloc/mapper.cpp
+++ b/libgralloc/mapper.cpp
@@ -34,7 +34,6 @@
#include <hardware/hardware.h>
#include <hardware/gralloc.h>
-#include <linux/android_pmem.h>
#include "gralloc_priv.h"
#include "gr.h"
diff --git a/libhwcomposer/Android.mk b/libhwcomposer/Android.mk
index 68da8a0..7dadfe4 100644
--- a/libhwcomposer/Android.mk
+++ b/libhwcomposer/Android.mk
@@ -11,7 +11,12 @@
LOCAL_SHARED_LIBRARIES := $(common_libs) libEGL liboverlay \
libexternal libqdutils libhardware_legacy \
libdl libmemalloc libqservice libsync \
- libbinder libmedia libskia libvirtual
+ libbinder libmedia libvirtual
+
+ifeq ($(TARGET_USES_QCOM_BSP),true)
+LOCAL_SHARED_LIBRARIES += libskia
+endif #TARGET_USES_QCOM_BSP
+
LOCAL_CFLAGS := $(common_flags) -DLOG_TAG=\"qdhwcomposer\"
LOCAL_ADDITIONAL_DEPENDENCIES := $(common_deps)
LOCAL_SRC_FILES := hwc.cpp \
diff --git a/libhwcomposer/hwc_ad.cpp b/libhwcomposer/hwc_ad.cpp
index be3793a..fdf6e67 100644
--- a/libhwcomposer/hwc_ad.cpp
+++ b/libhwcomposer/hwc_ad.cpp
@@ -182,8 +182,12 @@
return false;
}
- ovutils::eDest dest = ctx->mOverlay->nextPipe(ovutils::OV_MDP_PIPE_VG,
- overlay::Overlay::DPY_WRITEBACK, Overlay::MIXER_DEFAULT);
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = Overlay::FORMAT_YUV;
+ pipeSpecs.dpy = overlay::Overlay::DPY_WRITEBACK;
+ pipeSpecs.fb = false;
+
+ ovutils::eDest dest = ctx->mOverlay->getPipe(pipeSpecs);
if(dest == OV_INVALID) {
ALOGE("%s failed: No VG pipe available", __func__);
mDoable = false;
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index dc9a813..92aeca2 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -27,6 +27,8 @@
#include "cb_utils.h"
#include "cb_swap_rect.h"
#include "math.h"
+#include "sync/sync.h"
+
using namespace qdutils;
namespace qhwc {
@@ -230,9 +232,11 @@
// Mark all layers to be drawn by copybit
for (int i = ctx->listStats[dpy].numAppLayers-1; i >= 0 ; i--) {
layerProp[i].mFlags |= HWC_COPYBIT;
+#ifdef QCOM_BSP
if (ctx->mMDP.version == qdutils::MDP_V3_0_4)
list->hwLayers[i].compositionType = HWC_BLIT;
else
+#endif
list->hwLayers[i].compositionType = HWC_OVERLAY;
}
}
diff --git a/libhwcomposer/hwc_dump_layers.cpp b/libhwcomposer/hwc_dump_layers.cpp
index 6d084f3..c8ebac9 100644
--- a/libhwcomposer/hwc_dump_layers.cpp
+++ b/libhwcomposer/hwc_dump_layers.cpp
@@ -36,8 +36,10 @@
#include <cutils/log.h>
#include <sys/stat.h>
#include <comptype.h>
+#ifdef QCOM_BSP
#include <SkBitmap.h>
#include <SkImageEncoder.h>
+#endif
#ifdef STDC_FORMAT_MACROS
#include <inttypes.h>
#endif
@@ -308,7 +310,7 @@
}
getHalPixelFormatStr(hnd->format, pixFormatStr);
-
+#ifdef QCOM_BSP
if (needDumpPng && hnd->base) {
bool bResult = false;
char dumpFilename[PATH_MAX];
@@ -347,7 +349,7 @@
}
delete tempSkBmp; // Calls SkBitmap::freePixels() internally.
}
-
+#endif
if (needDumpRaw && hnd->base) {
char dumpFilename[PATH_MAX];
bool bResult = false;
diff --git a/libhwcomposer/hwc_fbupdate.cpp b/libhwcomposer/hwc_fbupdate.cpp
index d69d68e..74e6da4 100644
--- a/libhwcomposer/hwc_fbupdate.cpp
+++ b/libhwcomposer/hwc_fbupdate.cpp
@@ -139,14 +139,14 @@
ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888,
mTileEnabled));
- //Request a pipe
- ovutils::eMdpPipeType type = ovutils::OV_MDP_PIPE_ANY;
- if((qdutils::MDPVersion::getInstance().is8x26() ||
- qdutils::MDPVersion::getInstance().is8x16()) && mDpy) {
- //For 8x26 external always use DMA pipe
- type = ovutils::OV_MDP_PIPE_DMA;
- }
- ovutils::eDest dest = ov.nextPipe(type, mDpy, Overlay::MIXER_DEFAULT);
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScaling(layer);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.mixer = Overlay::MIXER_DEFAULT;
+ pipeSpecs.fb = true;
+
+ ovutils::eDest dest = ov.getPipe(pipeSpecs);
if(dest == ovutils::OV_INVALID) { //None available
ALOGE("%s: No pipes available to configure fb for dpy %d",
__FUNCTION__, mDpy);
@@ -308,10 +308,16 @@
hwc_rect_t displayFrame = fbUpdatingRect;
ret = true;
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScaling(layer);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.fb = true;
+
/* Configure left pipe */
if(displayFrame.left < lSplit) {
- ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
- Overlay::MIXER_LEFT);
+ pipeSpecs.mixer = Overlay::MIXER_LEFT;
+ ovutils::eDest destL = ov.getPipe(pipeSpecs);
if(destL == ovutils::OV_INVALID) { //None available
ALOGE("%s: No pipes available to configure fb for dpy %d's left"
" mixer", __FUNCTION__, mDpy);
@@ -344,8 +350,8 @@
/* Configure right pipe */
if(displayFrame.right > lSplit) {
- ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
- Overlay::MIXER_RIGHT);
+ pipeSpecs.mixer = Overlay::MIXER_RIGHT;
+ ovutils::eDest destR = ov.getPipe(pipeSpecs);
if(destR == ovutils::OV_INVALID) { //None available
ALOGE("%s: No pipes available to configure fb for dpy %d's"
" right mixer", __FUNCTION__, mDpy);
@@ -455,8 +461,13 @@
hwc_rect_t cropR = fbUpdatingRect;
//Request left pipe (or 1 by default)
- ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
- Overlay::MIXER_DEFAULT);
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScaling(layer);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.mixer = Overlay::MIXER_DEFAULT;
+ pipeSpecs.fb = true;
+ ovutils::eDest destL = ov.getPipe(pipeSpecs);
if(destL == ovutils::OV_INVALID) {
ALOGE("%s: No pipes available to configure fb for dpy %d's left"
" mixer", __FUNCTION__, mDpy);
@@ -468,8 +479,7 @@
//Request right pipe (2 pipes needed only if dim > 2048)
if((fbUpdatingRect.right - fbUpdatingRect.left) >
qdutils::MAX_DISPLAY_DIM) {
- destR = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
- Overlay::MIXER_DEFAULT);
+ destR = ov.getPipe(pipeSpecs);
if(destR == ovutils::OV_INVALID) {
ALOGE("%s: No pipes available to configure fb for dpy %d's right"
" mixer", __FUNCTION__, mDpy);
diff --git a/libhwcomposer/hwc_mdpcomp.cpp b/libhwcomposer/hwc_mdpcomp.cpp
index 1222dcf..5f4d592 100644
--- a/libhwcomposer/hwc_mdpcomp.cpp
+++ b/libhwcomposer/hwc_mdpcomp.cpp
@@ -393,37 +393,6 @@
return true;
}
-ovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type,
- int mixer) {
- overlay::Overlay& ov = *ctx->mOverlay;
- ovutils::eDest mdp_pipe = ovutils::OV_INVALID;
-
- switch(type) {
- case MDPCOMP_OV_DMA:
- mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy, mixer);
- if(mdp_pipe != ovutils::OV_INVALID) {
- return mdp_pipe;
- }
- case MDPCOMP_OV_ANY:
- case MDPCOMP_OV_RGB:
- mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy, mixer);
- if(mdp_pipe != ovutils::OV_INVALID) {
- return mdp_pipe;
- }
-
- if(type == MDPCOMP_OV_RGB) {
- //Requested only for RGB pipe
- break;
- }
- case MDPCOMP_OV_VG:
- return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy, mixer);
- default:
- ALOGE("%s: Invalid pipe type",__FUNCTION__);
- return ovutils::OV_INVALID;
- };
- return ovutils::OV_INVALID;
-}
-
bool MDPComp::isFrameDoable(hwc_context_t *ctx) {
bool ret = true;
@@ -1342,18 +1311,23 @@
info.pipeInfo = new MdpYUVPipeInfo;
info.rot = NULL;
MdpYUVPipeInfo& pipe_info = *(MdpYUVPipeInfo*)info.pipeInfo;
- ePipeType type = MDPCOMP_OV_VG;
pipe_info.lIndex = ovutils::OV_INVALID;
pipe_info.rIndex = ovutils::OV_INVALID;
- pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = Overlay::FORMAT_YUV;
+ pipeSpecs.needsScaling = true;
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.fb = false;
+
+ pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.lIndex == ovutils::OV_INVALID){
bRet = false;
ALOGD_IF(isDebug(),"%s: allocating first VG pipe failed",
__FUNCTION__);
}
- pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
+ pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.rIndex == ovutils::OV_INVALID){
bRet = false;
ALOGD_IF(isDebug(),"%s: allocating second VG pipe failed",
@@ -1423,28 +1397,20 @@
info.pipeInfo = new MdpPipeInfoNonSplit;
info.rot = NULL;
MdpPipeInfoNonSplit& pipe_info = *(MdpPipeInfoNonSplit*)info.pipeInfo;
- ePipeType type = MDPCOMP_OV_ANY;
- if(isYuvBuffer(hnd)) {
- type = MDPCOMP_OV_VG;
- } else if(qdutils::MDPVersion::getInstance().is8x26() &&
- (ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024)) {
- if(qhwc::needsScaling(layer))
- type = MDPCOMP_OV_RGB;
- } else if(!qhwc::needsScaling(layer)
- && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
- && ctx->mMDP.version >= qdutils::MDSS_V5) {
- type = MDPCOMP_OV_DMA;
- } else if(qhwc::needsScaling(layer) &&
- !(ctx->listStats[mDpy].yuvCount) &&
- ! qdutils::MDPVersion::getInstance().isRGBScalarSupported()){
- type = MDPCOMP_OV_VG;
- }
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = isYuvBuffer(hnd) ?
+ Overlay::FORMAT_YUV : Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScaling(layer) or
+ (qdutils::MDPVersion::getInstance().is8x26() and
+ ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres > 1024);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.fb = false;
- pipe_info.index = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
+ pipe_info.index = ctx->mOverlay->getPipe(pipeSpecs);
+
if(pipe_info.index == ovutils::OV_INVALID) {
- ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d",
- __FUNCTION__, (int) type);
+ ALOGD_IF(isDebug(), "%s: Unable to get pipe", __FUNCTION__);
return false;
}
}
@@ -1607,22 +1573,31 @@
}
bool MDPCompSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
- MdpPipeInfoSplit& pipe_info,
- ePipeType type) {
- const int lSplit = getLeftSplit(ctx, mDpy);
+ MdpPipeInfoSplit& pipe_info) {
+ const int lSplit = getLeftSplit(ctx, mDpy);
+ private_handle_t *hnd = (private_handle_t *)layer->handle;
hwc_rect_t dst = layer->displayFrame;
pipe_info.lIndex = ovutils::OV_INVALID;
pipe_info.rIndex = ovutils::OV_INVALID;
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = isYuvBuffer(hnd) ?
+ Overlay::FORMAT_YUV : Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScalingWithSplit(ctx, layer, mDpy);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.mixer = Overlay::MIXER_LEFT;
+ pipeSpecs.fb = false;
+
if (dst.left < lSplit) {
- pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_LEFT);
+ pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.lIndex == ovutils::OV_INVALID)
return false;
}
if(dst.right > lSplit) {
- pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_RIGHT);
+ pipeSpecs.mixer = Overlay::MIXER_RIGHT;
+ pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.rIndex == ovutils::OV_INVALID)
return false;
}
@@ -1652,19 +1627,10 @@
info.pipeInfo = new MdpPipeInfoSplit;
info.rot = NULL;
MdpPipeInfoSplit& pipe_info = *(MdpPipeInfoSplit*)info.pipeInfo;
- ePipeType type = MDPCOMP_OV_ANY;
- if(isYuvBuffer(hnd)) {
- type = MDPCOMP_OV_VG;
- } else if(!qhwc::needsScalingWithSplit(ctx, layer, mDpy)
- && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE
- && ctx->mMDP.version >= qdutils::MDSS_V5) {
- type = MDPCOMP_OV_DMA;
- }
-
- if(!acquireMDPPipes(ctx, layer, pipe_info, type)) {
- ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d",
- __FUNCTION__, (int) type);
+ if(!acquireMDPPipes(ctx, layer, pipe_info)) {
+ ALOGD_IF(isDebug(), "%s: Unable to get pipe for type",
+ __FUNCTION__);
return false;
}
}
@@ -1848,7 +1814,7 @@
//================MDPCompSrcSplit==============================================
bool MDPCompSrcSplit::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
- MdpPipeInfoSplit& pipe_info, ePipeType type) {
+ MdpPipeInfoSplit& pipe_info) {
private_handle_t *hnd = (private_handle_t *)layer->handle;
hwc_rect_t dst = layer->displayFrame;
hwc_rect_t crop = integerizeSourceCrop(layer->sourceCropf);
@@ -1859,32 +1825,25 @@
//should have a higher priority than the right one. Pipe priorities are
//starting with VG0, VG1 ... , RGB0 ..., DMA1
+ Overlay::PipeSpecs pipeSpecs;
+ pipeSpecs.formatClass = isYuvBuffer(hnd) ?
+ Overlay::FORMAT_YUV : Overlay::FORMAT_RGB;
+ pipeSpecs.needsScaling = qhwc::needsScaling(layer);
+ pipeSpecs.dpy = mDpy;
+ pipeSpecs.fb = false;
+
//1 pipe by default for a layer
- pipe_info.lIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
+ pipe_info.lIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.lIndex == ovutils::OV_INVALID) {
- if(isYuvBuffer(hnd)) {
- return false;
- }
- pipe_info.lIndex = getMdpPipe(ctx, MDPCOMP_OV_ANY,
- Overlay::MIXER_DEFAULT);
- if(pipe_info.lIndex == ovutils::OV_INVALID) {
- return false;
- }
+ return false;
}
//If layer's crop width or dest width > 2048, use 2 pipes
if((dst.right - dst.left) > qdutils::MAX_DISPLAY_DIM or
(crop.right - crop.left) > qdutils::MAX_DISPLAY_DIM) {
- pipe_info.rIndex = getMdpPipe(ctx, type, Overlay::MIXER_DEFAULT);
+ pipe_info.rIndex = ctx->mOverlay->getPipe(pipeSpecs);
if(pipe_info.rIndex == ovutils::OV_INVALID) {
- if(isYuvBuffer(hnd)) {
- return false;
- }
- pipe_info.rIndex = getMdpPipe(ctx, MDPCOMP_OV_ANY,
- Overlay::MIXER_DEFAULT);
- if(pipe_info.rIndex == ovutils::OV_INVALID) {
- return false;
- }
+ return false;
}
// Return values
@@ -1935,13 +1894,12 @@
whf.format = getMdpFormat(HAL_PIXEL_FORMAT_BGRX_8888);
}
- eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION;
- setMdpFlags(layer, mdpFlagsL, 0, transform);
- eMdpFlags mdpFlagsR = mdpFlagsL;
+ eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION;
+ setMdpFlags(layer, mdpFlags, 0, transform);
if(lDest != OV_INVALID && rDest != OV_INVALID) {
//Enable overfetch
- setMdpFlags(mdpFlagsL, OV_MDSS_MDP_DUAL_PIPE);
+ setMdpFlags(mdpFlags, OV_MDSS_MDP_DUAL_PIPE);
}
if(isYuvBuffer(hnd) && (transform & HWC_TRANSFORM_ROT_90)) {
@@ -1949,7 +1907,7 @@
if((*rot) == NULL) return -1;
ctx->mLayerRotMap[mDpy]->add(layer, *rot);
//Configure rotator for pre-rotation
- if(configRotator(*rot, whf, crop, mdpFlagsL, orient, downscale) < 0) {
+ if(configRotator(*rot, whf, crop, mdpFlags, orient, downscale) < 0) {
ALOGE("%s: configRotator failed!", __FUNCTION__);
return -1;
}
@@ -1985,7 +1943,7 @@
//configure left pipe
if(lDest != OV_INVALID) {
- PipeArgs pargL(mdpFlagsL, whf, z, isFg,
+ PipeArgs pargL(mdpFlags, whf, z, isFg,
static_cast<eRotFlags>(rotFlags), layer->planeAlpha,
(ovutils::eBlending) getBlending(layer->blending));
@@ -1998,7 +1956,7 @@
//configure right pipe
if(rDest != OV_INVALID) {
- PipeArgs pargR(mdpFlagsR, whf, z, isFg,
+ PipeArgs pargR(mdpFlags, whf, z, isFg,
static_cast<eRotFlags>(rotFlags),
layer->planeAlpha,
(ovutils::eBlending) getBlending(layer->blending));
diff --git a/libhwcomposer/hwc_mdpcomp.h b/libhwcomposer/hwc_mdpcomp.h
index 470ce12..beb858b 100644
--- a/libhwcomposer/hwc_mdpcomp.h
+++ b/libhwcomposer/hwc_mdpcomp.h
@@ -132,8 +132,6 @@
/* allocates pipe from pipe book */
virtual bool allocLayerPipes(hwc_context_t *ctx,
hwc_display_contents_1_t* list) = 0;
- /* allocate MDP pipes from overlay */
- ovutils::eDest getMdpPipe(hwc_context_t *ctx, ePipeType type, int mixer);
/* configures MPD pipes */
virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
PipeLayerPair& pipeLayerPair) = 0;
@@ -279,7 +277,7 @@
};
virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
- MdpPipeInfoSplit& pipe_info, ePipeType type);
+ MdpPipeInfoSplit& pipe_info);
/* configure's overlay pipes for the frame */
virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
@@ -306,7 +304,7 @@
virtual ~MDPCompSrcSplit(){};
private:
virtual bool acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer,
- MdpPipeInfoSplit& pipe_info, ePipeType type);
+ MdpPipeInfoSplit& pipe_info);
virtual int configure(hwc_context_t *ctx, hwc_layer_1_t *layer,
PipeLayerPair& pipeLayerPair);
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index 54445aa..19978ad 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -52,6 +52,7 @@
using namespace overlay::utils;
namespace ovutils = overlay::utils;
+#ifdef QCOM_BSP
#ifdef __cplusplus
extern "C" {
#endif
@@ -71,6 +72,7 @@
#ifdef __cplusplus
}
#endif
+#endif
namespace qhwc {
@@ -275,13 +277,14 @@
// Initialize gpu perfomance hint related parameters
property_get("sys.hwc.gpu_perf_mode", value, "0");
+#ifdef QCOM_BSP
ctx->mGPUHintInfo.mGpuPerfModeEnable = atoi(value)? true : false;
ctx->mGPUHintInfo.mEGLDisplay = NULL;
ctx->mGPUHintInfo.mEGLContext = NULL;
ctx->mGPUHintInfo.mPrevCompositionGLES = false;
ctx->mGPUHintInfo.mCurrGPUPerfMode = EGL_GPU_LEVEL_0;
-
+#endif
ALOGI("Initializing Qualcomm Hardware Composer");
ALOGI("MDP version: %d", ctx->mMDP.version);
}
@@ -839,13 +842,13 @@
ctx->mViewFrame[dpy] = (hwc_rect_t){0, 0, 0, 0};
ctx->dpyAttr[dpy].mActionSafePresent = isActionSafePresent(ctx, dpy);
- trimList(ctx, list, dpy);
- optimizeLayerRects(list);
-
// Calculate view frame of ext display from primary resolution
// and primary device orientation.
ctx->mViewFrame[dpy] = calculateDisplayViewFrame(ctx, dpy);
+ trimList(ctx, list, dpy);
+ optimizeLayerRects(list);
+
for (size_t i = 0; i < (size_t)ctx->listStats[dpy].numAppLayers; i++) {
hwc_layer_1_t const* layer = &list->hwLayers[i];
private_handle_t *hnd = (private_handle_t *)layer->handle;
@@ -1353,7 +1356,9 @@
for(uint32_t i = 0; i < list->numHwLayers; i++) {
if(list->hwLayers[i].compositionType == HWC_OVERLAY ||
+#ifdef QCOM_BSP
list->hwLayers[i].compositionType == HWC_BLIT ||
+#endif
list->hwLayers[i].compositionType == HWC_FRAMEBUFFER_TARGET) {
//Populate releaseFenceFds.
if(UNLIKELY(swapzero)) {
@@ -1363,12 +1368,15 @@
// if animation is in progress.
list->hwLayers[i].releaseFenceFd = -1;
} else if(list->hwLayers[i].releaseFenceFd < 0 ) {
+#ifdef QCOM_BSP
//If rotator has not already populated this field
if(list->hwLayers[i].compositionType == HWC_BLIT) {
//For Blit, the app layers should be released when the Blit is
//complete. This fd was passed from copybit->draw
list->hwLayers[i].releaseFenceFd = dup(fd);
- } else {
+ } else
+#endif
+ {
list->hwLayers[i].releaseFenceFd = dup(releaseFd);
}
}
@@ -2039,8 +2047,10 @@
void setGPUHint(hwc_context_t* ctx, hwc_display_contents_1_t* list) {
struct gpu_hint_info *gpuHint = &ctx->mGPUHintInfo;
- if(!gpuHint->mGpuPerfModeEnable)
+ if(!gpuHint->mGpuPerfModeEnable || !ctx || !list)
return;
+
+#ifdef QCOM_BSP
/* Set the GPU hint flag to high for MIXED/GPU composition only for
first frame after MDP -> GPU/MIXED mode transition. Set the GPU
hint to default if the previous composition is GPU or current GPU
@@ -2096,6 +2106,7 @@
}
gpuHint->mPrevCompositionGLES = false;
}
+#endif
}
void BwcPM::setBwc(const hwc_rect_t& crop,
diff --git a/liboverlay/overlay.cpp b/liboverlay/overlay.cpp
index 7e7f275..c1757ad 100644
--- a/liboverlay/overlay.cpp
+++ b/liboverlay/overlay.cpp
@@ -42,7 +42,7 @@
namespace overlay {
using namespace utils;
-
+using namespace qdutils;
Overlay::Overlay() {
int numPipes = qdutils::MDPVersion::getInstance().getTotalPipes();
@@ -158,6 +158,103 @@
return dest;
}
+utils::eDest Overlay::getPipe(const PipeSpecs& pipeSpecs) {
+ if(MDPVersion::getInstance().is8x26()) {
+ return getPipe_8x26(pipeSpecs);
+ } else if(MDPVersion::getInstance().is8x16()) {
+ return getPipe_8x16(pipeSpecs);
+ }
+
+ eDest dest = OV_INVALID;
+
+ //The default behavior is to assume RGB and VG pipes have scalars
+ if(pipeSpecs.formatClass == FORMAT_YUV) {
+ return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ } else if(pipeSpecs.fb == false) { //RGB App layers
+ if(not pipeSpecs.needsScaling) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ } else { //FB layer
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ //Some features can cause FB to have scaling as well.
+ //If we ever come to this block with FB needing scaling,
+ //the screen will be black for a frame, since the FB won't get a pipe
+ //but atleast this will prevent a hang
+ if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ }
+ return dest;
+}
+
+utils::eDest Overlay::getPipe_8x26(const PipeSpecs& pipeSpecs) {
+ //Use this to hide all the 8x26 requirements that cannot be humanly
+ //described in a generic way
+ eDest dest = OV_INVALID;
+ if(pipeSpecs.formatClass == FORMAT_YUV) { //video
+ return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ } else if(pipeSpecs.fb == false) { //RGB app layers
+ if(not pipeSpecs.needsScaling) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ } else { //FB layer
+ //For 8x26 Secondary we use DMA always for FB for inline rotation
+ if(pipeSpecs.dpy == DPY_PRIMARY) {
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ }
+ if(dest == OV_INVALID and (not pipeSpecs.needsScaling)) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ }
+ return dest;
+}
+
+utils::eDest Overlay::getPipe_8x16(const PipeSpecs& pipeSpecs) {
+ //Having such functions help keeping the interface generic but code specific
+ //and rife with assumptions
+ eDest dest = OV_INVALID;
+ if(pipeSpecs.formatClass == FORMAT_YUV or pipeSpecs.needsScaling) {
+ return nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ } else if(pipeSpecs.fb == false) { //RGB app layers
+ //Since this is a specific func, we can assume stuff like RGB pipe not
+ //having scalar blocks
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ } else {
+ //For 8x16 Secondary we use DMA always for FB for inline rotation
+ if(pipeSpecs.dpy == DPY_PRIMARY) {
+ dest = nextPipe(OV_MDP_PIPE_RGB, pipeSpecs.dpy, pipeSpecs.mixer);
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_VG, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ }
+ if(dest == OV_INVALID) {
+ dest = nextPipe(OV_MDP_PIPE_DMA, pipeSpecs.dpy, pipeSpecs.mixer);
+ }
+ }
+ return dest;
+}
+
void Overlay::endAllSessions() {
for(int i = 0; i < PipeBook::NUM_PIPES; i++) {
if(mPipeBook[i].valid() && mPipeBook[i].mSession==PipeBook::START)
diff --git a/liboverlay/overlay.h b/liboverlay/overlay.h
index 44193be..fa19dc3 100644
--- a/liboverlay/overlay.h
+++ b/liboverlay/overlay.h
@@ -53,6 +53,17 @@
enum { MIXER_LEFT, MIXER_RIGHT, MIXER_UNUSED };
enum { MIXER_DEFAULT = MIXER_LEFT, MIXER_MAX = MIXER_UNUSED };
enum { MAX_FB_DEVICES = DPY_MAX };
+ enum { FORMAT_YUV, FORMAT_RGB };
+
+ struct PipeSpecs {
+ PipeSpecs() : formatClass(FORMAT_RGB), needsScaling(false), fb(false),
+ dpy(DPY_PRIMARY), mixer(MIXER_DEFAULT) {}
+ int formatClass;
+ bool needsScaling;
+ bool fb;
+ int dpy;
+ int mixer;
+ };
/* dtor close */
~Overlay();
@@ -69,14 +80,10 @@
*/
void configDone();
- /* Returns an available pipe based on the type of pipe requested. When ANY
- * is requested, the first available VG or RGB is returned. If no pipe is
- * available for the display "dpy" then INV is returned. Note: If a pipe is
- * assigned to a certain display, then it cannot be assigned to another
- * display without being garbage-collected once. To add if a pipe is
- * asisgned to a mixer within a display it cannot be reused for another
- * mixer without being UNSET once*/
- utils::eDest nextPipe(utils::eMdpPipeType, int dpy, int mixer);
+ /* Get a pipe that supported the specified format class (yuv, rgb) and has
+ * scaling capabilities.
+ */
+ utils::eDest getPipe(const PipeSpecs& pipeSpecs);
/* Returns the eDest corresponding to an already allocated pipeid.
* Useful for the reservation case, when libvpu reserves the pipe at its
* end, and expect the overlay to allocate a given pipe for a layer.
@@ -147,6 +154,18 @@
void validate(int index);
static void setDMAMultiplexingSupported();
void dump() const;
+ /* Returns an available pipe based on the type of pipe requested. When ANY
+ * is requested, the first available VG or RGB is returned. If no pipe is
+ * available for the display "dpy" then INV is returned. Note: If a pipe is
+ * assigned to a certain display, then it cannot be assigned to another
+ * display without being garbage-collected once. To add if a pipe is
+ * asisgned to a mixer within a display it cannot be reused for another
+ * mixer without being UNSET once*/
+ utils::eDest nextPipe(utils::eMdpPipeType, int dpy, int mixer);
+ /* Helpers that enfore target specific policies while returning pipes */
+ utils::eDest getPipe_8x26(const PipeSpecs& pipeSpecs);
+ utils::eDest getPipe_8x16(const PipeSpecs& pipeSpecs);
+
/* Returns the scalar object */
static scale::Scale *getScalar();
/* Creates a scalar object using libscale.so */
diff --git a/liboverlay/overlayMdp.cpp b/liboverlay/overlayMdp.cpp
index d36c975..3af9eaa 100644
--- a/liboverlay/overlayMdp.cpp
+++ b/liboverlay/overlayMdp.cpp
@@ -35,13 +35,6 @@
return ((int)(f1*100) == (int)(f2*100)) ? true : false;
}
-#ifdef ANDROID_JELLYBEAN_MR1
-//Since this is unavailable on Android 4.2.2, defining it in terms of base 10
-static inline float log2f(const float& x) {
- return log(x) / log(2);
-}
-#endif
-
namespace ovutils = overlay::utils;
namespace overlay {
diff --git a/liboverlay/overlayRotator.h b/liboverlay/overlayRotator.h
index be0c8bd..53c54e6 100644
--- a/liboverlay/overlayRotator.h
+++ b/liboverlay/overlayRotator.h
@@ -35,6 +35,7 @@
#include "mdpWrapper.h"
#include "overlayUtils.h"
#include "overlayMem.h"
+#include "sync/sync.h"
namespace overlay {
diff --git a/liboverlay/overlayUtils.cpp b/liboverlay/overlayUtils.cpp
index ddba868..0b78e4d 100644
--- a/liboverlay/overlayUtils.cpp
+++ b/liboverlay/overlayUtils.cpp
@@ -284,11 +284,6 @@
return dscale_factor;
}
-//Since this is unavailable on Android, defining it in terms of base 10
-static inline float log2f(const float& x) {
- return log(x) / log(2);
-}
-
void getDecimationFactor(const int& src_w, const int& src_h,
const int& dst_w, const int& dst_h, float& horDscale,
float& verDscale) {
diff --git a/libqdutils/mdp_version.cpp b/libqdutils/mdp_version.cpp
index a757e69..16505ba 100644
--- a/libqdutils/mdp_version.cpp
+++ b/libqdutils/mdp_version.cpp
@@ -37,24 +37,35 @@
#define TOKEN_PARAMS_DELIM "="
-#ifndef MDSS_MDP_REV
-enum mdp_rev {
- MDSS_MDP_HW_REV_100 = 0x10000000, //8974 v1
- MDSS_MDP_HW_REV_101 = 0x10010000, //8x26
- MDSS_MDP_HW_REV_102 = 0x10020000, //8974 v2
- MDSS_MDP_HW_REV_103 = 0x10030000, //8084
- MDSS_MDP_HW_REV_104 = 0x10040000, //Next version
- MDSS_MDP_HW_REV_105 = 0x10050000, //Next version
- MDSS_MDP_HW_REV_106 = 0x10060000, //8x16
- MDSS_MDP_HW_REV_200 = 0x20000000, //8092
- MDSS_MDP_HW_REV_206 = 0x20060000, //Future
-};
-#else
-enum mdp_rev {
- MDSS_MDP_HW_REV_104 = 0x10040000, //Next version
- MDSS_MDP_HW_REV_206 = 0x20060000, //Future
- MDSS_MDP_HW_REV_107 = 0x10070000, //Next version
-};
+#ifndef MDSS_MDP_HW_REV_100
+#define MDSS_MDP_HW_REV_100 0x10000000 //8974 v1
+#endif
+#ifndef MDSS_MDP_HW_REV_101
+#define MDSS_MDP_HW_REV_101 0x10010000 //8x26
+#endif
+#ifndef MDSS_MDP_HW_REV_102
+#define MDSS_MDP_HW_REV_102 0x10020000 //8974 v2
+#endif
+#ifndef MDSS_MDP_HW_REV_103
+#define MDSS_MDP_HW_REV_103 0x10030000 //8084
+#endif
+#ifndef MDSS_MDP_HW_REV_104
+#define MDSS_MDP_HW_REV_104 0x10040000 //Next version
+#endif
+#ifndef MDSS_MDP_HW_REV_105
+#define MDSS_MDP_HW_REV_105 0x10050000 //Next version
+#endif
+#ifndef MDSS_MDP_HW_REV_106
+#define MDSS_MDP_HW_REV_106 0x10060000 //8x16
+#endif
+#ifndef MDSS_MDP_HW_REV_107
+#define MDSS_MDP_HW_REV_107 0x10070000 //Next version
+#endif
+#ifndef MDSS_MDP_HW_REV_200
+#define MDSS_MDP_HW_REV_200 0x20000000 //8092
+#endif
+#ifndef MDSS_MDP_HW_REV_206
+#define MDSS_MDP_HW_REV_206 0x20060000 //Future
#endif
MDPVersion::MDPVersion()
@@ -165,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);
}
@@ -181,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/libqdutils/qdMetaData.cpp b/libqdutils/qdMetaData.cpp
index 0390599..dbd6f10 100644
--- a/libqdutils/qdMetaData.cpp
+++ b/libqdutils/qdMetaData.cpp
@@ -27,6 +27,7 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <errno.h>
#include <string.h>
#include <sys/mman.h>
#include <cutils/log.h>
@@ -52,8 +53,8 @@
unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
handle->fd_metadata, 0);
- if (!base) {
- ALOGE("%s: mmap() failed: Base addr is NULL!", __func__);
+ if (base == reinterpret_cast<void*>(MAP_FAILED)) {
+ ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
return -1;
}
MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
diff --git a/libvirtual/virtual.cpp b/libvirtual/virtual.cpp
index 5453e3a..bed5e4c 100644
--- a/libvirtual/virtual.cpp
+++ b/libvirtual/virtual.cpp
@@ -177,12 +177,12 @@
uint32_t priW = mHwcContext->dpyAttr[HWC_DISPLAY_PRIMARY].xres;
uint32_t priH = mHwcContext->dpyAttr[HWC_DISPLAY_PRIMARY].yres;
- initResolution(extW, extH);
-
// Dynamic Resolution Change depends on MDP downscaling.
// MDP downscale property will be ignored to exercise DRC use case.
// If DRC is in progress, ext WxH will have non-zero values.
- bool isDRC = (extW > 0) && (extH > 0);
+ bool isDRC = (extW > mVInfo.xres) && (extH > mVInfo.yres);
+
+ initResolution(extW, extH);
if(!qdutils::MDPVersion::getInstance().is8x26()
&& (mHwcContext->mMDPDownscaleEnabled || isDRC)) {