Loading include/gui/BufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,9 @@ public: // mBuf is the slot index of this buffer int mBuf; // mFence is a fence that will signal when the buffer is idle. sp<Fence> mFence; }; // The following public functions is the consumer facing interface Loading libs/gui/BufferQueue.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -885,11 +885,13 @@ status_t BufferQueue::acquireBuffer(BufferItem *buffer) { buffer->mFrameNumber = mSlots[buf].mFrameNumber; buffer->mTimestamp = mSlots[buf].mTimestamp; buffer->mBuf = buf; buffer->mFence = mSlots[buf].mFence; mSlots[buf].mAcquireCalled = true; mSlots[buf].mBufferState = BufferSlot::ACQUIRED; mQueue.erase(front); mDequeueCondition.broadcast(); mSlots[buf].mFence.clear(); ATRACE_INT(mConsumerName.string(), mQueue.size()); } else { Loading libs/gui/CpuConsumer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,15 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { mBufferSlot[buf] = b.mGraphicBuffer; } if (b.mFence.get()) { err = b.mFence->wait(Fence::TIMEOUT_NEVER); if (err != OK) { CC_LOGE("Failed to wait for fence of acquired buffer: %s (%d)", strerror(-err), err); return err; } } err = mBufferSlot[buf]->lock( GraphicBuffer::USAGE_SW_READ_OFTEN, b.mCrop, Loading libs/gui/SurfaceTexture.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -236,8 +236,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { // not accept this buffer. this is used by SurfaceFlinger to // reject buffers which have the wrong size if (rejecter && rejecter->reject(mEGLSlots[buf].mGraphicBuffer, item)) { mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, Fence::NO_FENCE); mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence); glBindTexture(mTexTarget, mTexName); return NO_ERROR; } Loading @@ -261,6 +260,14 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { } } // Temporary; fence will be provided to clients soon if (item.mFence.get()) { err = item.mFence->wait(Fence::TIMEOUT_NEVER); if (err != OK) { ST_LOGE("updateTexImage: failure waiting for fence: %d", err); } } if (err == NO_ERROR) { GLint error; while ((error = glGetError()) != GL_NO_ERROR) { Loading @@ -284,8 +291,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { if (err != NO_ERROR) { // Release the buffer we just acquired. It's not safe to // release the old buffer, so instead we just drop the new frame. mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, Fence::NO_FENCE); mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence); return err; } Loading services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,16 @@ void FramebufferSurface::onFirstRef() { if (item.mGraphicBuffer != 0) { self->mBuffers[item.mBuf] = item.mGraphicBuffer; } if (item.mFence.get()) { err = item.mFence->wait(Fence::TIMEOUT_NEVER); if (err) { ALOGE("failed waiting for buffer's fence: %d", err); self->mBufferQueue->releaseBuffer(item.mBuf, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, item.mFence); return; } } self->fbDev->post(self->fbDev, self->mBuffers[item.mBuf]->handle); if (self->mCurrentBufferIndex >= 0) { self->mBufferQueue->releaseBuffer(self->mCurrentBufferIndex, Loading Loading
include/gui/BufferQueue.h +3 −0 Original line number Diff line number Diff line Loading @@ -202,6 +202,9 @@ public: // mBuf is the slot index of this buffer int mBuf; // mFence is a fence that will signal when the buffer is idle. sp<Fence> mFence; }; // The following public functions is the consumer facing interface Loading
libs/gui/BufferQueue.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -885,11 +885,13 @@ status_t BufferQueue::acquireBuffer(BufferItem *buffer) { buffer->mFrameNumber = mSlots[buf].mFrameNumber; buffer->mTimestamp = mSlots[buf].mTimestamp; buffer->mBuf = buf; buffer->mFence = mSlots[buf].mFence; mSlots[buf].mAcquireCalled = true; mSlots[buf].mBufferState = BufferSlot::ACQUIRED; mQueue.erase(front); mDequeueCondition.broadcast(); mSlots[buf].mFence.clear(); ATRACE_INT(mConsumerName.string(), mQueue.size()); } else { Loading
libs/gui/CpuConsumer.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -114,6 +114,15 @@ status_t CpuConsumer::lockNextBuffer(LockedBuffer *nativeBuffer) { mBufferSlot[buf] = b.mGraphicBuffer; } if (b.mFence.get()) { err = b.mFence->wait(Fence::TIMEOUT_NEVER); if (err != OK) { CC_LOGE("Failed to wait for fence of acquired buffer: %s (%d)", strerror(-err), err); return err; } } err = mBufferSlot[buf]->lock( GraphicBuffer::USAGE_SW_READ_OFTEN, b.mCrop, Loading
libs/gui/SurfaceTexture.cpp +10 −4 Original line number Diff line number Diff line Loading @@ -236,8 +236,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { // not accept this buffer. this is used by SurfaceFlinger to // reject buffers which have the wrong size if (rejecter && rejecter->reject(mEGLSlots[buf].mGraphicBuffer, item)) { mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, Fence::NO_FENCE); mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence); glBindTexture(mTexTarget, mTexName); return NO_ERROR; } Loading @@ -261,6 +260,14 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { } } // Temporary; fence will be provided to clients soon if (item.mFence.get()) { err = item.mFence->wait(Fence::TIMEOUT_NEVER); if (err != OK) { ST_LOGE("updateTexImage: failure waiting for fence: %d", err); } } if (err == NO_ERROR) { GLint error; while ((error = glGetError()) != GL_NO_ERROR) { Loading @@ -284,8 +291,7 @@ status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter) { if (err != NO_ERROR) { // Release the buffer we just acquired. It's not safe to // release the old buffer, so instead we just drop the new frame. mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, Fence::NO_FENCE); mBufferQueue->releaseBuffer(buf, dpy, EGL_NO_SYNC_KHR, item.mFence); return err; } Loading
services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -106,6 +106,16 @@ void FramebufferSurface::onFirstRef() { if (item.mGraphicBuffer != 0) { self->mBuffers[item.mBuf] = item.mGraphicBuffer; } if (item.mFence.get()) { err = item.mFence->wait(Fence::TIMEOUT_NEVER); if (err) { ALOGE("failed waiting for buffer's fence: %d", err); self->mBufferQueue->releaseBuffer(item.mBuf, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, item.mFence); return; } } self->fbDev->post(self->fbDev, self->mBuffers[item.mBuf]->handle); if (self->mCurrentBufferIndex >= 0) { self->mBufferQueue->releaseBuffer(self->mCurrentBufferIndex, Loading