summaryrefslogtreecommitdiff
Diffstat
-rw-r--r--hwc1.4/Android.mk5
-rw-r--r--hwc2/common/devices/PhysicalDevice.cpp111
-rw-r--r--hwc2/platforms/Android.mk6
3 files changed, 55 insertions, 67 deletions
diff --git a/hwc1.4/Android.mk b/hwc1.4/Android.mk
index 1d7cc85..13f18e3 100644
--- a/hwc1.4/Android.mk
+++ b/hwc1.4/Android.mk
@@ -3,7 +3,7 @@
#
LOCAL_PATH := $(call my-dir)
-
+include $(TOP)/hardware/amlogic/media/media_base_config.mk
# HAL module implemenation, not prelinked and stored in
# /system/lib/hw/hwcomposer.amlogic.so
include $(CLEAR_VARS)
@@ -36,9 +36,8 @@ LOCAL_C_INCLUDES += system/core/libion/include/ \
ifneq ($(WITH_LIBPLAYER_MODULE),false)
LOCAL_SHARED_LIBRARIES += libamavutils_alsa
-AMPLAYER_APK_DIR=$(TOP)/vendor/amlogic/frameworks/av/LibPlayer/
LOCAL_C_INCLUDES += \
- $(AMPLAYER_APK_DIR)/amavutils/include
+ $(AMAVUTILS_PATH)/include
LOCAL_CFLAGS += -DWITH_LIBPLAYER_MODULE=1
endif
diff --git a/hwc2/common/devices/PhysicalDevice.cpp b/hwc2/common/devices/PhysicalDevice.cpp
index c1563e4..0afbb54 100644
--- a/hwc2/common/devices/PhysicalDevice.cpp
+++ b/hwc2/common/devices/PhysicalDevice.cpp
@@ -75,12 +75,12 @@ PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc, DeviceControl
initDisplay();
// set capacity of layers, layer's changed type, layer's changed request.
- mHwcLayersChangeType.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
- mHwcLayersChangeRequest.setCapacity(LAYER_MAX_NUM_CHANGE_REQUEST);
- mHwcGlesLayers.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
- mHwcLayers.setCapacity(LAYER_MAX_NUM_SUPPORT);
+ // mHwcLayersChangeType.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
+ // mHwcLayersChangeRequest.setCapacity(LAYER_MAX_NUM_CHANGE_REQUEST);
+ // mHwcGlesLayers.setCapacity(LAYER_MAX_NUM_CHANGE_TYPE);
+ // mHwcLayers.setCapacity(LAYER_MAX_NUM_SUPPORT);
#ifdef HWC_ENABLE_SECURE_LAYER
- mHwcSecureLayers.setCapacity(LAYER_MAX_NUM_SECURE_PROTECTED);
+ // mHwcSecureLayers.setCapacity(LAYER_MAX_NUM_SECURE_PROTECTED);
mHwcSecureLayers.clear();
#endif
@@ -90,7 +90,7 @@ PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc, DeviceControl
mHwcGlesLayers.clear();
mHwcLayers.clear();
- mGE2DRenderSortedLayerIds.setCapacity(HWC2_MAX_LAYERS);
+ // mGE2DRenderSortedLayerIds.setCapacity(HWC2_MAX_LAYERS);
mGE2DRenderSortedLayerIds.clear();
mHwcCurReleaseFences = mHwcPriorReleaseFences = NULL;
@@ -238,13 +238,14 @@ bool PhysicalDevice::createLayer(hwc2_layer_t* outLayer) {
hwc2_layer_t layerId = reinterpret_cast<hwc2_layer_t>(layer);
mHwcLayers.add(layerId, layer);
*outLayer = layerId;
- ETRACE("layerId %lld.\n", layerId);
+ DTRACE("::createLayer layerId %lld, size: [%d].\n", layerId, mHwcLayers.size());
return true;
}
bool PhysicalDevice::destroyLayer(hwc2_layer_t layerId) {
HwcLayer* layer = mHwcLayers.valueFor(layerId);
+ DTRACE("::destroyLayer layerId %lld, size: [%d].\n", layerId, mHwcLayers.size());
if (layer == NULL) {
ETRACE("destroyLayer: no Hwclayer found (%d)", layerId);
@@ -685,7 +686,10 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence, bool hasVideoOv
}
if (mRenderMode == GLES_COMPOSE_MODE) {
-
+ //if no layers to compose, post blank op to osd.
+ if (mHwcGlesLayers.size() == 0) {
+ mClientTargetHnd = NULL;
+ }
} else if (mRenderMode == DIRECT_COMPOSE_MODE) { // if only one layer exists, let hwc do her work.
directCompose(&fbInfo);
}
@@ -694,18 +698,19 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence, bool hasVideoOv
ge2dCompose(&fbInfo, hasVideoOverlay);
}
#endif
- // fbInfo.renderMode = mRenderMode;
mFbSyncRequest.type = mRenderMode;
bool needBlankFb0 = false;
uint32_t layerNum = mHwcLayers.size();
- if (hasVideoOverlay && (layerNum == 1 || (layerNum == 2 && haveCursorLayer))) needBlankFb0 = true;
+ if (hasVideoOverlay && (layerNum == 1 || (layerNum == 2 && haveCursorLayer)))
+ needBlankFb0 = true;
if (mIsContinuousBuf) {
// bit 0 is osd blank flag.
- mFbSyncRequest.op &= ~0x00000001;
if (needBlankFb0) {
- mFbSyncRequest.op |= 0x00000001;
+ mFbSyncRequest.op |= OSD_BLANK_OP_BIT;
+ } else {
+ mFbSyncRequest.op &= ~(OSD_BLANK_OP_BIT);
}
mFramebufferContext->setStatus(needBlankFb0);
} else {
@@ -713,16 +718,19 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence, bool hasVideoOv
}
if (!mClientTargetHnd || private_handle_t::validate(mClientTargetHnd) < 0 || mPowerMode == HWC2_POWER_MODE_OFF) {
- DTRACE("mClientTargetHnd is null or Enter suspend state, mTargetAcquireFence: %d", mTargetAcquireFence);
- *outRetireFence = HwcFenceControl::merge(String8("Layer"), mPriorFrameRetireFence, mTargetAcquireFence);
+ ETRACE("Post blank to screen, mClientTargetHnd(%p, %d), mTargetAcquireFence(%d)",
+ mClientTargetHnd, private_handle_t::validate(mClientTargetHnd), mTargetAcquireFence);
+ *outRetireFence = HwcFenceControl::merge(String8("ScreenBlank"), mPriorFrameRetireFence, mPriorFrameRetireFence);
HwcFenceControl::closeFd(mTargetAcquireFence);
mTargetAcquireFence = -1;
HwcFenceControl::closeFd(mPriorFrameRetireFence);
mPriorFrameRetireFence = -1;
- if (private_handle_t::validate(mClientTargetHnd) < 0) {
- ETRACE("mClientTargetHnd is not validate!");
- }
- } else {
+ //for nothing to display, post blank to osd which will signal the last retire fence.
+ mFbSyncRequest.type = DIRECT_COMPOSE_MODE;
+ mFbSyncRequest.op |= OSD_BLANK_OP_BIT;
+ mFramebufferContext->setStatus(true);
+ mPriorFrameRetireFence = hwc_fb_post_with_fence_locked(&fbInfo, &mFbSyncRequest, NULL);
+ } else {
*outRetireFence = HwcFenceControl::dupFence(mPriorFrameRetireFence);
if (*outRetireFence >= 0) {
DTRACE("Get prior frame's retire fence %d", *outRetireFence);
@@ -785,8 +793,7 @@ int32_t PhysicalDevice::setOSD0Blank(bool blank) {
return HWC2_ERROR_NONE;
}
-int32_t PhysicalDevice::presentDisplay(
- int32_t* outRetireFence) {
+int32_t PhysicalDevice::presentDisplay(int32_t* outRetireFence) {
int32_t err = HWC2_ERROR_NONE;
HwcLayer* layer = NULL;
bool hasVideoOverlay = false;
@@ -809,8 +816,6 @@ int32_t PhysicalDevice::presentDisplay(
}
#endif
err = postFramebuffer(outRetireFence, hasVideoOverlay);
-
- mIsValidated = false;
} else { // display not validate yet.
err = HWC2_ERROR_NOT_VALIDATED;
}
@@ -824,6 +829,8 @@ int32_t PhysicalDevice::presentDisplay(
}
}
+ mClientTargetHnd = NULL;
+
return err;
}
@@ -1012,6 +1019,12 @@ bool PhysicalDevice::layersStateCheck(int32_t renderMode,
}
}
#endif
+ if (HWC2_TWO_LAYERS == layerNum
+ && (!Utils::compareSize(sourceCrop[0], sourceCrop[1])
+ || !Utils::compareSize(displayFrame[0], displayFrame[1]))) {
+ DTRACE("when 2 layer's size is difference, ge2d compose can not process!");
+ return false;
+ }
}
#endif
@@ -1032,7 +1045,6 @@ bool PhysicalDevice::layersStateCheck(int32_t renderMode,
**************************************************************/
int32_t PhysicalDevice::composersFilter(
KeyedVector<hwc2_layer_t, HwcLayer*> & composeLayers) {
- memset(&mFbSyncRequest, 0, sizeof(mFbSyncRequest));
// direct Composer.
if (composeLayers.size() == HWC2_ONE_LAYER) {
@@ -1098,30 +1110,20 @@ int32_t PhysicalDevice::composersFilter(
return GLES_COMPOSE_MODE;
}
-void PhysicalDevice::clearFramebuffer() {
- hwc_rect_t clipRect;
- framebuffer_info_t* fbInfo = mFramebufferContext->getInfo();
- uint32_t offset = 0;
- clipRect.left = 0;
- clipRect.top = 0;
- clipRect.right = fbInfo->info.xres;
- clipRect.bottom = fbInfo->info.yres_virtual;
- mComposer->fillRectangle(clipRect, 0, offset, mFramebufferHnd->share_fd);
-
- DTRACE("Composer mode: %d, %d layers", mRenderMode, mHwcLayers.size());
-}
-
int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
uint32_t* outNumRequests) {
HwcLayer* layer = NULL;
bool istvp = false;
- bool glesCompose = false;
- bool zeroLayer = false;
+ KeyedVector<hwc2_layer_t, HwcLayer*> composeLayers;
+ composeLayers.clear();
mRenderMode = GLES_COMPOSE_MODE;
mVideoOverlayLayerId = 0;
mIsContinuousBuf = true;
swapReleaseFence();
+ memset(&mFbSyncRequest, 0, sizeof(mFbSyncRequest));
+ mHwcGlesLayers.clear();
+ mIsValidated = false;
for (uint32_t i=0; i<mHwcLayers.size(); i++) {
hwc2_layer_t layerId = mHwcLayers.keyAt(i);
@@ -1161,7 +1163,7 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
continue;
}
- mHwcGlesLayers.add(layerId, layer);
+ composeLayers.add(layerId, layer);
continue;
}
}
@@ -1184,18 +1186,18 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
continue;
}
- // TODO: solid color.
+ // solid color.
if (layer->getCompositionType() == HWC2_COMPOSITION_SOLID_COLOR) {
DTRACE("This is a Solid Color layer!");
// mHwcLayersChangeRequest.add(layerId, layer);
// mHwcLayersChangeType.add(layerId, layer);
- mHwcGlesLayers.add(layerId, layer);
+ composeLayers.add(layerId, layer);
continue;
}
if (layer->getCompositionType() == HWC2_COMPOSITION_CLIENT) {
+ mHwcGlesLayers.add(layerId, layer);
DTRACE("Meet a client layer!");
- glesCompose = true;
}
}
}
@@ -1208,26 +1210,20 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
#endif
if (mHwcLayers.size() == 0) {
- zeroLayer = true;
mIsContinuousBuf = false;
}
// dumpLayers(mHwcLayers);
- if (mIsContinuousBuf && !glesCompose && !noDevComp) {
- mRenderMode = composersFilter(mHwcGlesLayers);
+ if (mIsContinuousBuf && !noDevComp && (mHwcGlesLayers.size() == 0)) {
+ mRenderMode = composersFilter(composeLayers);
} else {
mDirectComposeFrameCount = 0;
}
- if (mComposer && zeroLayer) {
- clearFramebuffer();
- }
-
- if (mHwcGlesLayers.size() > 0) {
- for (int i=0;i<mHwcGlesLayers.size(); i++) {
- mHwcLayersChangeType.add(mHwcGlesLayers.keyAt(i), mHwcGlesLayers.valueAt(i));
- }
- mHwcGlesLayers.clear();
+ //DEVICE_COMPOSE layers set to CLIENT_COMPOSE layers.
+ for (int i=0; i<composeLayers.size(); i++) {
+ mHwcLayersChangeType.add(composeLayers.keyAt(i), composeLayers.valueAt(i));
+ mHwcGlesLayers.add(composeLayers.keyAt(i), composeLayers.valueAt(i));
}
if (istvp == false && Amvideo_Handle!=0) {
@@ -1240,12 +1236,7 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
*outNumRequests = mHwcLayersChangeRequest.size();
}
- // mark the validate function is called.(???)
- if (zeroLayer) {
- mIsValidated = false;
- } else {
- mIsValidated = true;
- }
+ mIsValidated = true;
if (mHwcLayersChangeType.size() > 0) {
DTRACE("there are %d layer types has changed.", mHwcLayersChangeType.size());
diff --git a/hwc2/platforms/Android.mk b/hwc2/platforms/Android.mk
index 079f7ac..fe6ab7a 100644
--- a/hwc2/platforms/Android.mk
+++ b/hwc2/platforms/Android.mk
@@ -3,7 +3,7 @@
#
LOCAL_PATH := $(call my-dir)
-
+include $(TOP)/hardware/amlogic/media/media_base_config.mk
# HAL module implemenation, not prelinked and stored in
# hw/<OVERLAY_HARDWARE_MODULE_ID>.<ro.product.board>.so
include $(CLEAR_VARS)
@@ -102,9 +102,7 @@ endif
# WITH_LIBPLAYER_MODULE := true
ifneq ($(WITH_LIBPLAYER_MODULE),false)
LOCAL_SHARED_LIBRARIES += libamavutils_alsa
-AMPLAYER_APK_DIR := vendor/amlogic/frameworks/av/LibPlayer
-LOCAL_C_INCLUDES += $(AMPLAYER_APK_DIR)/amavutils/include
-$(info Libplayer is $(AMPLAYER_APK_DIR))
+LOCAL_C_INCLUDES += $(AMAVUTILS_PATH)/include
LOCAL_CFLAGS += -DWITH_LIBPLAYER_MODULE=1
endif