hwc: vpuclient: vpuClient implementation
Vpuclient is the client side for VFM in hwc. It follows the
similar pattern of prepare and draw. It has 2 step prepare
including: setVpuSession and prepare. The setVpuSession function
passes all the layers from the SF list to VFM, which marks
the layers that it can support. After this, the layer
allocation/configuration is done, and finally in prepare the
allocated pipes are passed down to VFM. The draw function
passes the handle to the VFM to draw the video layer.
Change-Id: I5d8795de35ed98716f7fa4cd48506b488cb3cb5d
diff --git a/libhwcomposer/hwc_utils.cpp b/libhwcomposer/hwc_utils.cpp
index ececa70..f6476f5 100644
--- a/libhwcomposer/hwc_utils.cpp
+++ b/libhwcomposer/hwc_utils.cpp
@@ -232,8 +232,11 @@
// Initialize device orientation to its default orientation
ctx->deviceOrientation = 0;
ctx->mBufferMirrorMode = false;
+ ctx->mVPUClient = NULL;
+
#ifdef VPU_TARGET
- ctx->mVPUClient = new VPUClient();
+ if(qdutils::MDPVersion::getInstance().is8092())
+ ctx->mVPUClient = new VPUClient(ctx);
#endif
ALOGI("Initializing Qualcomm Hardware Composer");
@@ -270,9 +273,8 @@
}
#ifdef VPU_TARGET
- if(ctx->mVPUClient) {
+ if(ctx->mVPUClient != NULL)
delete ctx->mVPUClient;
- }
#endif
for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) {
@@ -1302,6 +1304,7 @@
dpy, list->numHwLayers);
}
+ LayerProp *layerProp = ctx->layerProp[dpy];
for(uint32_t i = 0; i < list->numHwLayers; i++) {
if(list->hwLayers[i].compositionType == HWC_OVERLAY ||
list->hwLayers[i].compositionType == HWC_BLIT ||
@@ -1313,8 +1316,10 @@
// Release all the app layer fds immediately,
// if animation is in progress.
list->hwLayers[i].releaseFenceFd = -1;
- } else if(list->hwLayers[i].releaseFenceFd < 0) {
- //If rotator has not already populated this field.
+ } else if(list->hwLayers[i].releaseFenceFd < 0 &&
+ !(layerProp[i].mFlags & HWC_VPUCOMP)) {
+ //If rotator has not already populated this field
+ // & if it's a not VPU layer
list->hwLayers[i].releaseFenceFd = dup(releaseFd);
}
}
@@ -1361,8 +1366,10 @@
ovutils::setMdpFlags(mdpFlags,
ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
}
+ // in mpq, deinterlacing is done in vpu
if(metadata && (metadata->operation & PP_PARAM_INTERLACED) &&
- metadata->interlaced) {
+ metadata->interlaced &&
+ (!qdutils::MDPVersion::getInstance().is8092())) {
ovutils::setMdpFlags(mdpFlags,
ovutils::OV_MDP_DEINTERLACE);
}
@@ -1549,6 +1556,17 @@
int rotFlags = ovutils::ROT_FLAGS_NONE;
uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd));
Whf whf(getWidth(hnd), getHeight(hnd), format, hnd->size);
+ LayerProp *layerProp = ctx->layerProp[dpy];
+
+#ifdef VPU_TARGET
+ if(ctx->mVPUClient != NULL &&
+ ctx->mVPUClient->supportedVPULayer(dpy, layer)) {
+ whf.format = getMdpFormat(
+ ctx->mVPUClient->getLayerFormat(dpy, layer));
+ whf.w = ctx->mVPUClient->getWidth(dpy, layer);
+ whf.h = ctx->mVPUClient->getHeight(dpy, layer);
+ }
+#endif
// Handle R/B swap
if (layer->flags & HWC_FORMAT_RB_SWAP) {
@@ -1656,6 +1674,17 @@
int rotFlags = ROT_FLAGS_NONE;
uint32_t format = ovutils::getMdpFormat(hnd->format, isTileRendered(hnd));
Whf whf(getWidth(hnd), getHeight(hnd), format, hnd->size);
+ LayerProp *layerProp = ctx->layerProp[dpy];
+
+#ifdef VPU_TARGET
+ if(ctx->mVPUClient != NULL &&
+ ctx->mVPUClient->supportedVPULayer(dpy, layer)) {
+ whf.format = getMdpFormat(
+ ctx->mVPUClient->getLayerFormat(dpy, layer));
+ whf.w = ctx->mVPUClient->getWidth(dpy, layer);
+ whf.h = ctx->mVPUClient->getHeight(dpy, layer);
+ }
+#endif
// Handle R/B swap
if (layer->flags & HWC_FORMAT_RB_SWAP) {