summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
author Jesse Hall <jessehall@google.com> 2012-06-29 15:21:18 -0700
committer Jesse Hall <jessehall@google.com> 2012-06-30 21:38:51 -0700
commitdc5b485f74edf2d2f31c62054eb6c180421a3ade (patch)
treef33c9322cadc2895f0e0f28c1968d796c423c8c6 /services/surfaceflinger/Layer.cpp
parentb42b1ac1587aebda5e2f334d95b620271fafba4e (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.cpp25
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.