Bug 1163681 - Fix fence handling. r=mwu, a=jocheng
--- a/widget/gonk/libdisplay/GonkDisplayJB.cpp
+++ b/widget/gonk/libdisplay/GonkDisplayJB.cpp
@@ -310,26 +310,34 @@ GonkDisplayJB::Post(buffer_handle_t buf,
close(mList->retireFenceFd);
return !err;
}
ANativeWindowBuffer*
GonkDisplayJB::DequeueBuffer()
{
ANativeWindowBuffer *buf;
- mSTClient->dequeueBuffer(mSTClient.get(), &buf, &mFence);
+ int fenceFd = -1;
+ mSTClient->dequeueBuffer(mSTClient.get(), &buf, &fenceFd);
+ sp<Fence> fence(new Fence(fenceFd));
+#if ANDROID_VERSION == 17
+ fence->waitForever(1000, "GonkDisplayJB_DequeueBuffer");
+ // 1000 is what Android uses. It is a warning timeout in ms.
+ // This timeout was removed in ANDROID_VERSION 18.
+#else
+ fence->waitForever("GonkDisplayJB_DequeueBuffer");
+#endif
return buf;
}
bool
GonkDisplayJB::QueueBuffer(ANativeWindowBuffer* buf)
{
- bool success = Post(buf->handle, -1);
- int error = mSTClient->queueBuffer(mSTClient.get(), buf, mFence);
-
+ int error = mSTClient->queueBuffer(mSTClient.get(), buf, -1);
+ bool success = Post(mFBSurface->lastHandle, mFBSurface->GetPrevFBAcquireFd());
return error == 0 && success;
}
void
GonkDisplayJB::UpdateFBSurface(EGLDisplay dpy, EGLSurface sur)
{
eglSwapBuffers(dpy, sur);
}
--- a/widget/gonk/libdisplay/GonkDisplayJB.h
+++ b/widget/gonk/libdisplay/GonkDisplayJB.h
@@ -58,17 +58,16 @@ private:
hw_module_t const* mModule;
hw_module_t const* mFBModule;
hwc_composer_device_1_t* mHwc;
framebuffer_device_t* mFBDevice;
power_module_t* mPowerModule;
android::sp<android::FramebufferSurface> mFBSurface;
android::sp<ANativeWindow> mSTClient;
android::sp<android::IGraphicBufferAlloc> mAlloc;
- int mFence;
hwc_display_contents_1_t* mList;
uint32_t mWidth;
uint32_t mHeight;
OnEnabledCallbackType mEnabledCallback;
};
}