diff options
| author | 2012-06-29 15:21:18 -0700 | |
|---|---|---|
| committer | 2012-06-30 21:38:51 -0700 | |
| commit | dc5b485f74edf2d2f31c62054eb6c180421a3ade (patch) | |
| tree | f33c9322cadc2895f0e0f28c1968d796c423c8c6 /services/surfaceflinger/Layer.cpp | |
| parent | b42b1ac1587aebda5e2f334d95b620271fafba4e (diff) | |
Pass fence to HWC on first use of buffer
Also do a CPU-wait on the fence before using it for GL composition.
Change-Id: I0f645a42a44803276cae11b904e5a26d65871562
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 6aba16a5c6..5b9327dd61 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -60,6 +60,7 @@ Layer::Layer(SurfaceFlinger* flinger, mCurrentOpacity(true), mRefreshPending(false), mFrameLatencyNeeded(false), + mNeedHwcFence(false), mFrameLatencyOffset(0), mFormat(PIXEL_FORMAT_NONE), mGLExtensions(GLExtensions::getInstance()), @@ -299,6 +300,20 @@ void Layer::setPerFrameData(HWComposer::HWCLayerInterface& layer) { // NOTE: buffer can be NULL if the client never drew into this // layer yet, or if we ran out of memory layer.setBuffer(buffer); + + if (mNeedHwcFence) { + sp<Fence> fence = mSurfaceTexture->getCurrentFence(); + if (fence.get()) { + int fenceFd = fence->dup(); + if (fenceFd == -1) { + ALOGW("failed to dup layer fence, skipping sync: %d", errno); + } + layer.setAcquireFenceFd(fenceFd); + } + mNeedHwcFence = false; + } else { + layer.setAcquireFenceFd(-1); + } } void Layer::onDraw(const DisplayHardware& hw, const Region& clip) const @@ -333,6 +348,15 @@ void Layer::onDraw(const DisplayHardware& hw, const Region& clip) const return; } + // TODO: replace this with a server-side wait + sp<Fence> fence = mSurfaceTexture->getCurrentFence(); + if (fence.get()) { + status_t err = fence->wait(Fence::TIMEOUT_NEVER); + ALOGW_IF(err != OK, "Layer::onDraw: failed waiting for fence: %d", err); + // Go ahead and draw the buffer anyway; no matter what we do the screen + // is probably going to have something visibly wrong. + } + if (!isProtected()) { // TODO: we could be more subtle with isFixedSize() const bool useFiltering = getFiltering() || needsFiltering() || isFixedSize(); @@ -627,6 +651,7 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) mRefreshPending = true; mFrameLatencyNeeded = true; + mNeedHwcFence = true; if (oldActiveBuffer == NULL) { // the first time we receive a buffer, we need to trigger a // geometry invalidation. |