hwcomposer : Fix copybit render buffer fence usage.
Fixing array size to hold fence fd to count of render
buffers used in copybit and use it to store
fence of corresponding render buffer at the index.
Change-Id: Ic5e7f264c2a81ded2a0f61ef138e59a093b0023a
diff --git a/libhwcomposer/hwc_copybit.cpp b/libhwcomposer/hwc_copybit.cpp
index 2068732..7fbe6d6 100644
--- a/libhwcomposer/hwc_copybit.cpp
+++ b/libhwcomposer/hwc_copybit.cpp
@@ -270,10 +270,10 @@
if (ctx->mMDP.version >= qdutils::MDP_V4_0) {
//Wait for the previous frame to complete before rendering onto it
- if(mRelFd[0] >=0) {
- sync_wait(mRelFd[0], 1000);
- close(mRelFd[0]);
- mRelFd[0] = -1;
+ if(mRelFd[mCurRenderBufferIndex] >=0) {
+ sync_wait(mRelFd[mCurRenderBufferIndex], 1000);
+ close(mRelFd[mCurRenderBufferIndex]);
+ mRelFd[mCurRenderBufferIndex] = -1;
}
//Clear the visible region on the render buffer
@@ -282,9 +282,9 @@
getNonWormholeRegion(list, clearRegion);
clear(renderBuffer, clearRegion);
} else {
- if(mRelFd[0] >=0) {
+ if(mRelFd[mCurRenderBufferIndex] >=0) {
copybit_device_t *copybit = getCopyBitDevice();
- copybit->set_sync(copybit, mRelFd[0]);
+ copybit->set_sync(copybit, mRelFd[mCurRenderBufferIndex]);
}
}
// numAppLayers-1, as we iterate from 0th layer index with HWC_COPYBIT flag
@@ -630,6 +630,11 @@
{
for (int i = 0; i < NUM_RENDER_BUFFERS; i++) {
if(mRenderBuffer[i]) {
+ //Since we are freeing buffer close the fence if it has a valid one.
+ if(mRelFd[i] >= 0) {
+ close(mRelFd[i]);
+ mRelFd[i] = -1;
+ }
free_buffer(mRenderBuffer[i]);
mRenderBuffer[i] = NULL;
}
@@ -641,10 +646,9 @@
}
void CopyBit::setReleaseFd(int fd) {
- if(mRelFd[0] >=0)
- close(mRelFd[0]);
- mRelFd[0] = mRelFd[1];
- mRelFd[1] = dup(fd);
+ if(mRelFd[mCurRenderBufferIndex] >=0)
+ close(mRelFd[mCurRenderBufferIndex]);
+ mRelFd[mCurRenderBufferIndex] = dup(fd);
}
struct copybit_device_t* CopyBit::getCopyBitDevice() {
@@ -654,10 +658,10 @@
CopyBit::CopyBit():mIsModeOn(false), mCopyBitDraw(false),
mCurRenderBufferIndex(0){
hw_module_t const *module;
- for (int i = 0; i < NUM_RENDER_BUFFERS; i++)
+ for (int i = 0; i < NUM_RENDER_BUFFERS; i++) {
mRenderBuffer[i] = NULL;
- mRelFd[0] = -1;
- mRelFd[1] = -1;
+ mRelFd[i] = -1;
+ }
char value[PROPERTY_VALUE_MAX];
property_get("debug.hwc.dynThreshold", value, "2");
@@ -675,10 +679,6 @@
CopyBit::~CopyBit()
{
freeRenderBuffers();
- if(mRelFd[0] >=0)
- close(mRelFd[0]);
- if(mRelFd[1] >=0)
- close(mRelFd[1]);
if(mEngine)
{
copybit_close(mEngine);