summaryrefslogtreecommitdiff
authorSky 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)
commit50aa1bae08dcfa76d5d80ce9cc145c951112cdf2 (patch)
tree3f36e92252939fb3eec484bee3fc113cd569398f
parent463bfa06241858b7f87916ea150c74730de3e6b1 (diff)
downloadhwcomposer-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
Diffstat
-rw-r--r--hwc2/common/devices/VirtualDevice.cpp182
-rw-r--r--hwc2/include/VirtualDevice.h2
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;