-rw-r--r-- | hwc1.4/Android.mk | 5 | ||||
-rw-r--r-- | hwc2/common/devices/PhysicalDevice.cpp | 111 | ||||
-rw-r--r-- | hwc2/platforms/Android.mk | 6 |
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 |