author | Sky Zhou <sky.zhou@amlogic.com> | 2017-01-13 13:48:03 (GMT) |
---|---|---|
committer | Tellen Yu <tellen.yu@amlogic.com> | 2017-01-17 09:25:15 (GMT) |
commit | 50aa1bae08dcfa76d5d80ce9cc145c951112cdf2 (patch) | |
tree | 3f36e92252939fb3eec484bee3fc113cd569398f | |
parent | 463bfa06241858b7f87916ea150c74730de3e6b1 (diff) | |
download | hwcomposer-50aa1bae08dcfa76d5d80ce9cc145c951112cdf2.zip hwcomposer-50aa1bae08dcfa76d5d80ce9cc145c951112cdf2.tar.gz hwcomposer-50aa1bae08dcfa76d5d80ce9cc145c951112cdf2.tar.bz2 |
PD #137587: fix virtual display function in hwc2.0.
Need refactor will hwc 2.0 revsion.
Change-Id: I496f5e1b44359bd4e230748a6286970650004779
-rw-r--r-- | hwc2/common/devices/VirtualDevice.cpp | 182 | ||||
-rw-r--r-- | hwc2/include/VirtualDevice.h | 2 |
2 files changed, 110 insertions, 74 deletions
diff --git a/hwc2/common/devices/VirtualDevice.cpp b/hwc2/common/devices/VirtualDevice.cpp index a141582..c298b5e 100644 --- a/hwc2/common/devices/VirtualDevice.cpp +++ b/hwc2/common/devices/VirtualDevice.cpp @@ -17,7 +17,8 @@ VirtualDevice::VirtualDevice(Hwcomposer& hwc) mInitialized(false), mWidth(0), mHeight(0), - mFormat(0) + mFormat(0), + mRetireFence(-1) { CTRACE(); mName = "Virtual"; @@ -37,12 +38,10 @@ bool VirtualDevice::initialize() { mInitialized = true; return true; - } void VirtualDevice::deinitialize() { CTRACE(); - mInitialized = false; } @@ -84,7 +83,6 @@ bool VirtualDevice::createLayer(hwc2_layer_t* outLayer) { hwc2_layer_t layerId = reinterpret_cast<hwc2_layer_t>(layer); mHwcLayers.add(layerId, layer); *outLayer = layerId; - return true; } @@ -175,16 +173,16 @@ int32_t VirtualDevice::getDisplayAttribute( ETRACE("refresh period: %d", *outValue); break; case HWC2_ATTRIBUTE_WIDTH: - *outValue = 1280; + *outValue = mWidth; break; case HWC2_ATTRIBUTE_HEIGHT: - *outValue = 720; + *outValue = mHeight; break; case HWC2_ATTRIBUTE_DPI_X: - *outValue = 0; + *outValue = 160; break; case HWC2_ATTRIBUTE_DPI_Y: - *outValue = 0; + *outValue = 160; break; default: ETRACE("unknown display attribute %u", attribute); @@ -254,61 +252,60 @@ int32_t VirtualDevice::getReleaseFences( uint32_t* outNumElements, hwc2_layer_t* outLayers, int32_t* outFences) { - HwcLayer* layer = NULL; - uint32_t num_layer = 0; - if (NULL == outLayers || NULL == outFences) { - for (uint32_t i=0; i<mHwcLayers.size(); i++) { - hwc2_layer_t layerId = mHwcLayers.keyAt(i); - layer = mHwcLayers.valueAt(i); - if (layer) num_layer++; - } - } else { - for (uint32_t i=0; i<mHwcLayers.size(); i++) { - hwc2_layer_t layerId = mHwcLayers.keyAt(i); - layer = mHwcLayers.valueAt(i); - if (layer) { - outLayers[num_layer] = layerId; - outFences[num_layer++] = layer->getAcquireFence(); - // TODO: ? - layer->resetAcquireFence(); - } - } + //No hw compose for virtual display. + *outNumElements= 0; + return HWC2_ERROR_NONE; +} + +int32_t VirtualDevice::presentDisplay( + int32_t* outRetireFence) { + if (!mIsConnected) + return HWC2_ERROR_BAD_DISPLAY; + + if (!mVirtualHnd) { + ETRACE("virtual display handle is null."); + return HWC2_ERROR_NO_RESOURCES; } - if (num_layer > 0) { - DTRACE("There are %d layer requests.", num_layer); - *outNumElements = num_layer; + if (private_handle_t::validate(mVirtualHnd) < 0) + return HWC2_ERROR_NO_RESOURCES; + + if (mTargetAcquireFence > -1 && mVirtualReleaseFence > -1) { + mRetireFence = sync_merge("VirtualDevice-2", mTargetAcquireFence, mVirtualReleaseFence); + } else if (mTargetAcquireFence > -1) { + mRetireFence = sync_merge("VirtualDevice-0", mTargetAcquireFence, mTargetAcquireFence); + } else if (mVirtualReleaseFence > -1) { + mRetireFence = sync_merge("VirtualDevice-1", mVirtualReleaseFence, mVirtualReleaseFence); } else { - DTRACE("No layer have set buffer yet."); + mRetireFence = -1; } - return HWC2_ERROR_NONE; -} + *outRetireFence = mRetireFence; -int32_t VirtualDevice::presentDisplay( - int32_t* outRetireFence) { - int32_t err = HWC2_ERROR_NONE; + DTRACE("VirtualDevice::presentDisplay retire fence %d", mRetireFence); - // deal virtual display. - if (mIsConnected) { - if (!mVirtualHnd) { - ETRACE("virtual display handle is null."); - *outRetireFence = -1; - return HWC2_ERROR_NO_RESOURCES; - } - if (private_handle_t::validate(mVirtualHnd) < 0) - return HWC2_ERROR_NO_RESOURCES; + if (mTargetAcquireFence > -1) { + close(mTargetAcquireFence); + mTargetAcquireFence = -1; + } + if (mVirtualReleaseFence > -1) { + close(mVirtualReleaseFence); + mVirtualReleaseFence = -1; + } - if (mTargetAcquireFence > -1) { - sync_wait(mTargetAcquireFence, 500); - close(mTargetAcquireFence); - mTargetAcquireFence = -1; + //reset layers' acquire fence. + HwcLayer * layer = NULL; + for (uint32_t i=0; i<mHwcLayers.size(); i++) { + hwc2_layer_t layerId = mHwcLayers.keyAt(i); + layer = mHwcLayers.valueAt(i); + if (layer != NULL) { + close(layer->getAcquireFence()); + layer->resetAcquireFence(); } - *outRetireFence = mVirtualReleaseFence; } - return err; + return HWC2_ERROR_NONE; } int32_t VirtualDevice::setActiveConfig( @@ -322,17 +319,24 @@ int32_t VirtualDevice::setClientTarget( int32_t /*android_dataspace_t*/ dataspace, hwc_region_t damage) { - if (target && private_handle_t::validate(target) < 0) { - return HWC2_ERROR_BAD_PARAMETER; - } + DTRACE("VirtualDevice::setClientTarget %p, %d", target, acquireFence); + + if (mTargetAcquireFence > -1) { + close(mTargetAcquireFence); + mTargetAcquireFence = -1; + } + + if (!mIsConnected) + return HWC2_ERROR_BAD_DISPLAY; + + if (target && private_handle_t::validate(target) < 0) { + return HWC2_ERROR_BAD_PARAMETER; + } if (NULL != target) { mClientTargetHnd = target; mClientTargetDamageRegion = damage; - if (-1 != acquireFence) { - mTargetAcquireFence = acquireFence; - } - // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage. + mTargetAcquireFence = acquireFence; } else { DTRACE("client target is null!, no need to update this frame."); } @@ -419,6 +423,8 @@ int32_t VirtualDevice::createVirtualDisplay( mHeight = height; mFormat = *format; mVirtualReleaseFence= -1; + mRetireFence = -1; + mTargetAcquireFence = -1; *outDisplay = HWC_DISPLAY_VIRTUAL; return HWC2_ERROR_NONE; @@ -433,35 +439,63 @@ int32_t VirtualDevice::destroyVirtualDisplay( mWidth = 0; mHeight = 0; mFormat = 0; - mVirtualReleaseFence = -1; - // TODO: + //release fence. + if (mRetireFence > -1) { + close(mRetireFence); + mRetireFence = -1; + } + if (mVirtualReleaseFence > -1) { + close(mVirtualReleaseFence); + mVirtualReleaseFence = -1; + } + if (mTargetAcquireFence > -1) { + close(mTargetAcquireFence); + mTargetAcquireFence = -1; + } + + //release layers. + if (!mHwcLayers.isEmpty()) { + int i = 0; + HwcLayer* layer = NULL; + for (i = 0; i < mHwcLayers.size(); i++) { + layer = mHwcLayers[i]; + DEINIT_AND_DELETE_OBJ(layer); + } + mHwcLayers.clear(); + } + return HWC2_ERROR_NONE; } int32_t VirtualDevice::setOutputBuffer( buffer_handle_t buffer, int32_t releaseFence) { - if (mIsConnected) { - if (buffer && private_handle_t::validate(buffer) < 0) { - ETRACE("buffer handle is invalid"); - return HWC2_ERROR_BAD_PARAMETER; - } + DTRACE("VirtualDevice::setOutputBuffer"); - if (NULL != buffer) { - /*mVirtualHnd = buffer; - mVirtualReleaseFence= releaseFence; - } else {*/ - DTRACE("Virtual Display output buffer target is null!, no need to update this frame."); - } + if (mVirtualReleaseFence > -1) { + close(mVirtualReleaseFence); + mVirtualReleaseFence = -1; + } + + if (!mIsConnected) + return HWC2_ERROR_BAD_DISPLAY; + + if (NULL == buffer) { + ETRACE("Virtual Display output buffer target is null!, no need to update this frame."); + return HWC2_ERROR_BAD_PARAMETER; + } + + if (buffer && private_handle_t::validate(buffer) < 0) { + ETRACE("buffer handle is invalid"); + return HWC2_ERROR_BAD_PARAMETER; } mVirtualHnd = buffer; - mVirtualReleaseFence= releaseFence; - // TODO: do something? + mVirtualReleaseFence = releaseFence; + DTRACE("VirtualDevice setOutputBuffer %d, %p ", releaseFence, buffer); return HWC2_ERROR_NONE; } - void VirtualDevice::dump(Dump& d) { Mutex::Autolock _l(mLock); d.append("----------------------------------------------------------" diff --git a/hwc2/include/VirtualDevice.h b/hwc2/include/VirtualDevice.h index 6bae7ad..fc2b085 100644 --- a/hwc2/include/VirtualDevice.h +++ b/hwc2/include/VirtualDevice.h @@ -104,6 +104,8 @@ private: buffer_handle_t mVirtualHnd; int32_t mVirtualReleaseFence; + int32_t mRetireFence; + // num of composition type changed layer. uint32_t mNumLayersChangetype; uint32_t mNumLayerChangerequest; |