summaryrefslogtreecommitdiff
authorStark Li <stark.li@amlogic.com>2017-01-19 05:10:51 (GMT)
committer Stark Li <stark.li@amlogic.com>2017-01-19 05:14:17 (GMT)
commite621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe (patch)
treebfbbda65a56db92c44e9716153729f2eadf71928
parent50aa1bae08dcfa76d5d80ce9cc145c951112cdf2 (diff)
downloadhwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.zip
hwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.tar.gz
hwcomposer-e621a17c2cb80c9b1a48c98ec9dc6a59b14fb9fe.tar.bz2
Revert "PD #137587: fix fence error (merged from hwc2.0 revison)."
This reverts commit 463bfa06241858b7f87916ea150c74730de3e6b1. Change-Id: I4692e3ccaab83fe4eda65084c9519f94341065f1
Diffstat
-rw-r--r--hwc2/common/devices/PhysicalDevice.cpp207
-rw-r--r--hwc2/include/PhysicalDevice.h11
2 files changed, 59 insertions, 159 deletions
diff --git a/hwc2/common/devices/PhysicalDevice.cpp b/hwc2/common/devices/PhysicalDevice.cpp
index 39d4820..e4f6ab2 100644
--- a/hwc2/common/devices/PhysicalDevice.cpp
+++ b/hwc2/common/devices/PhysicalDevice.cpp
@@ -53,15 +53,11 @@ PhysicalDevice::PhysicalDevice(hwc2_display_t id, Hwcomposer& hwc)
// set capacity of mDisplayConfigs
mDisplayConfigs.setCapacity(DEVICE_COUNT);
-
- mHwcCurReleaseFences = mHwcPriorReleaseFences = NULL;
}
PhysicalDevice::~PhysicalDevice()
{
WARN_IF_NOT_DEINIT();
- clearFenceList(mHwcCurReleaseFences);
- clearFenceList(mHwcPriorReleaseFences);
}
bool PhysicalDevice::initialize() {
@@ -144,18 +140,6 @@ bool PhysicalDevice::destroyLayer(hwc2_layer_t layerId) {
return false;
}
- for (int i = 0; i < 2; i++) {
- ssize_t idx = mLayerReleaseFences[i].indexOfKey(layerId);
- if (idx >= 0) {
- int releaseFence = mLayerReleaseFences[i].valueAt(idx);
- if (releaseFence > -1) {
- close(releaseFence);
- }
- mLayerReleaseFences[i].removeItemsAt(idx);
- DTRACE("destroyLayer remove layer %lld from cur release list %p\n", layerId, &(mLayerReleaseFences[i]));
- }
- }
-
mHwcLayers.removeItem(layerId);
DEINIT_AND_DELETE_OBJ(layer);
return true;
@@ -428,102 +412,47 @@ int32_t PhysicalDevice::getHdrCapabilities(
return HWC2_ERROR_NONE;
}
-void PhysicalDevice::swapReleaseFence() {
- //dumpFenceList(mHwcCurReleaseFences);
-
- if (mHwcCurReleaseFences == NULL || mHwcPriorReleaseFences == NULL) {
- if (mHwcCurReleaseFences) {
- clearFenceList(mHwcPriorReleaseFences);
- }
-
- if (mHwcPriorReleaseFences) {
- clearFenceList(mHwcPriorReleaseFences);
- }
-
- mHwcCurReleaseFences = &(mLayerReleaseFences[0]);
- mHwcPriorReleaseFences = &(mLayerReleaseFences[1]);
- } else {
- KeyedVector<hwc2_layer_t, int32_t> * tmp = mHwcCurReleaseFences;
- clearFenceList(mHwcPriorReleaseFences);
- mHwcCurReleaseFences = mHwcPriorReleaseFences;
- mHwcPriorReleaseFences = tmp;
- }
-}
-
-
-void PhysicalDevice::addReleaseFence(hwc2_layer_t layerId, int32_t fenceFd) {
- ssize_t idx = mHwcCurReleaseFences->indexOfKey(layerId);
- if (idx >= 0 && idx < mHwcCurReleaseFences->size()) {
- int32_t oldFence = mHwcCurReleaseFences->valueAt(idx);
- String8 mergeName("hwc-release");
- int32_t newFence = -1;
- if (oldFence > -1 && fenceFd > -1) {
- newFence = sync_merge(mergeName, oldFence, fenceFd);
- } else if (oldFence > -1) {
- newFence = sync_merge(mergeName, oldFence, oldFence);
- } else if (fenceFd > -1) {
- newFence = sync_merge(mergeName, fenceFd, fenceFd);
- }
- mHwcCurReleaseFences->replaceValueAt(idx, newFence);
- if (oldFence > -1)
- close(oldFence);
- if (fenceFd > -1)
- close(fenceFd);
- ETRACE("addReleaseFence:(%d, %d) + %d -> (%d,%d)\n", idx, oldFence, fenceFd, idx, newFence);
- dumpFenceList(mHwcCurReleaseFences);
- } else {
- mHwcCurReleaseFences->add(layerId, fenceFd);
- }
-}
-
-void PhysicalDevice::clearFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) {
- if (!fenceList || !fenceList->size())
- return;
-
- for (int i = 0; i < fenceList->size(); i++) {
- int32_t fenceFd = fenceList->valueAt(i);
- if (fenceFd > -1) {
- close(fenceFd);
- }
- DTRACE("clearFenceList close fd %d\n", fenceFd);
- fenceList->replaceValueAt(i, -1);
- }
- fenceList->clear();
-}
-
-void PhysicalDevice::dumpFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList) {
- if (!fenceList || fenceList->isEmpty())
- return;
-
- String8 resultStr("dumpFenceList: ");
- for (int i = 0; i < fenceList->size(); i++) {
- hwc2_layer_t layerId = fenceList->keyAt(i);
- int32_t fenceFd = fenceList->valueAt(i);
- resultStr.appendFormat("(%lld, %d), ", layerId, fenceFd);
- }
-
- ETRACE("%s", resultStr.string());
-}
-
int32_t PhysicalDevice::getReleaseFences(
uint32_t* outNumElements,
hwc2_layer_t* outLayers,
int32_t* outFences) {
- *outNumElements = mHwcPriorReleaseFences->size();
-
- if (outLayers && outFences) {
- for (uint32_t i=0; i<mHwcPriorReleaseFences->size(); i++) {
- outLayers[i] = mHwcPriorReleaseFences->keyAt(i);
+ HwcLayer* layer = NULL;
+ uint32_t num_layer = 0;
- int releaseFence = mHwcPriorReleaseFences->valueAt(i);
- if (releaseFence > -1) {
- outFences[i] = dup(releaseFence);
- } else {
- outFences[i] = -1;
+ 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) {
+ DTRACE("outFences: %d", layer->getAcquireFence());
+ /*if (layer->getAcquireFence() > -1) {
+ close(layer->getAcquireFence());
+ }*/
+ if (layer->getAcquireFence() > -1) {
+ outFences[num_layer] = layer->getAcquireFence();
+ } else {
+ outFences[num_layer] = -1;
+ }
+ outLayers[num_layer++] = layerId;
+ layer->resetAcquireFence();
+ // TODO: ?
}
}
}
+ if (num_layer > 0) {
+ DTRACE("There are %d layer requests.", num_layer);
+ *outNumElements = num_layer;
+ } else {
+ DTRACE("No layer have set buffer yet.");
+ }
+
return HWC2_ERROR_NONE;
}
@@ -563,36 +492,32 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) {
}
if (!mClientTargetHnd || private_handle_t::validate(mClientTargetHnd) < 0 || mPowerMode == HWC2_POWER_MODE_OFF) {
- if (mTargetAcquireFence > -1 && mPriorFrameRetireFence > -1) {
- *outRetireFence = sync_merge("Layer-2", mTargetAcquireFence, mPriorFrameRetireFence);
- } else if (mTargetAcquireFence > -1) {
- *outRetireFence = sync_merge("Layer-0", mTargetAcquireFence, mTargetAcquireFence);
- } else if (mPriorFrameRetireFence > -1) {
- *outRetireFence = sync_merge("Layer-1", mPriorFrameRetireFence, mPriorFrameRetireFence);
- } else {
- *outRetireFence = -1;
- }
-
- if (mTargetAcquireFence > -1)
+ DTRACE("mClientTargetHnd is null or Enter suspend state, mTargetAcquireFence: %d", mTargetAcquireFence);
+ if (mTargetAcquireFence > -1) {
+ sync_wait(mTargetAcquireFence, 5000);
close(mTargetAcquireFence);
- mTargetAcquireFence = -1;
- if (mPriorFrameRetireFence > -1)
- close(mPriorFrameRetireFence);
- mPriorFrameRetireFence = -1;
- } else {
- *outRetireFence = mPriorFrameRetireFence;
- if (*outRetireFence >= 0) {
- DTRACE("Get prior frame's retire fence %d", *outRetireFence);
- } else {
- ETRACE("No valid prior frame's retire returned. %d ", *outRetireFence);
- // -1 means no fence, less than -1 is some error
- *outRetireFence = -1;
+ mTargetAcquireFence = -1;
+ }
+ *outRetireFence = -1;
+ if (private_handle_t::validate(mClientTargetHnd) < 0) {
+ ETRACE("mClientTargetHnd is not validate!");
+ return HWC2_ERROR_NONE;
}
+ }
- mPriorFrameRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence);
- mTargetAcquireFence = -1;
+ *outRetireFence = mPriorFrameRetireFence;
+
+ if (*outRetireFence >= 0) {
+ DTRACE("Get prior frame's retire fence %d", *outRetireFence);
+ } else {
+ ETRACE("No valid prior frame's retire returned. %d ", *outRetireFence);
+ // -1 means no fence, less than -1 is some error
+ *outRetireFence = -1;
}
+ mPriorFrameRetireFence = fb_post_with_fence_locked(mFramebufferInfo, mClientTargetHnd, mTargetAcquireFence);
+ mTargetAcquireFence = -1;
+
// finally we need to update cursor's blank status
if (cbinfo->fd > 0 && cursorShow != mCursorContext->getCursorStatus()) {
mCursorContext->setCursorStatus(cursorShow);
@@ -600,7 +525,6 @@ int32_t PhysicalDevice::postFramebuffer(int32_t* outRetireFence) {
ioctl(cbinfo->fd, FBIOBLANK, !cursorShow);
}
-
return err;
}
@@ -629,16 +553,6 @@ int32_t PhysicalDevice::presentDisplay(
err = HWC2_ERROR_NOT_VALIDATED;
}
- // reset layers' acquire fence.
- 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();
- }
- }
-
return err;
}
@@ -657,17 +571,16 @@ int32_t PhysicalDevice::setClientTarget(
return HWC2_ERROR_BAD_PARAMETER;
}
- if (mTargetAcquireFence > -1) {
- close(mTargetAcquireFence);
- mTargetAcquireFence = -1;
- }
-
if (NULL != target) {
mClientTargetHnd = target;
mClientTargetDamageRegion = damage;
- mTargetAcquireFence = acquireFence;
+ if (-1 != acquireFence) {
+ mTargetAcquireFence = acquireFence;
+ //sync_wait(mTargetAcquireFence, 3000);
+ }
+ // TODO: HWC2_ERROR_BAD_PARAMETER && dataspace && damage.
} else {
- ETRACE("client target is null!, no need to update this frame.");
+ DTRACE("client target is null!, no need to update this frame.");
}
return HWC2_ERROR_NONE;
@@ -703,8 +616,6 @@ int32_t PhysicalDevice::validateDisplay(uint32_t* outNumTypes,
HwcLayer* layer = NULL;
bool istvp = false;
- swapReleaseFence();
-
for (uint32_t i=0; i<mHwcLayers.size(); i++) {
hwc2_layer_t layerId = mHwcLayers.keyAt(i);
layer = mHwcLayers.valueAt(i);
diff --git a/hwc2/include/PhysicalDevice.h b/hwc2/include/PhysicalDevice.h
index 0543e84..85419f6 100644
--- a/hwc2/include/PhysicalDevice.h
+++ b/hwc2/include/PhysicalDevice.h
@@ -123,12 +123,6 @@ public:
virtual void removeDisplayConfigs();
virtual bool updateDisplayConfigs();
- //this function will take contorl of fencefd, if you need use it also, please dup it before call.
- void swapReleaseFence();
- void addReleaseFence(hwc2_layer_t layerId, int32_t fenceFd);
- void clearFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList);
- void dumpFenceList(KeyedVector<hwc2_layer_t, int32_t> * fenceList);
-
//events
virtual void onVsync(int64_t timestamp);
virtual void dump(Dump& d);
@@ -182,11 +176,6 @@ private:
//HDR Capabilities
hdr_capabilities_t mHdrCapabilities;
- // record the release fence of layer.
- KeyedVector<hwc2_layer_t, int32_t> mLayerReleaseFences[2];
- KeyedVector<hwc2_layer_t, int32_t> * mHwcCurReleaseFences;
- KeyedVector<hwc2_layer_t, int32_t> * mHwcPriorReleaseFences;
-
// lock
Mutex mLock;
bool mInitialized;