Loading include/gui/Surface.h +5 −1 Original line number Diff line number Diff line Loading @@ -158,7 +158,6 @@ protected: virtual int lockBuffer_DEPRECATED(ANativeWindowBuffer* buffer); virtual int connect(int api, const sp<IProducerListener>& listener); virtual int connect(int api); virtual int disconnect(int api); virtual int setBufferCount(int bufferCount); Loading @@ -177,6 +176,11 @@ public: virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); virtual int unlockAndPost(); virtual int connect(int api, const sp<IProducerListener>& listener); virtual int detachNextBuffer(ANativeWindowBuffer** outBuffer, sp<Fence>* outFence); virtual int attachBuffer(ANativeWindowBuffer*); protected: enum { NUM_BUFFER_SLOTS = BufferQueue::NUM_BUFFER_SLOTS }; enum { DEFAULT_FORMAT = PIXEL_FORMAT_RGBA_8888 }; Loading libs/gui/Surface.cpp +49 −0 Original line number Diff line number Diff line Loading @@ -610,6 +610,55 @@ int Surface::disconnect(int api) { return err; } int Surface::detachNextBuffer(ANativeWindowBuffer** outBuffer, sp<Fence>* outFence) { ATRACE_CALL(); ALOGV("Surface::detachNextBuffer"); if (outBuffer == NULL || outFence == NULL) { return BAD_VALUE; } Mutex::Autolock lock(mMutex); sp<GraphicBuffer> buffer(NULL); sp<Fence> fence(NULL); status_t result = mGraphicBufferProducer->detachNextBuffer( &buffer, &fence); if (result != NO_ERROR) { return result; } *outBuffer = buffer.get(); if (fence != NULL && fence->isValid()) { *outFence = fence; } else { *outFence = Fence::NO_FENCE; } return NO_ERROR; } int Surface::attachBuffer(ANativeWindowBuffer* buffer) { ATRACE_CALL(); ALOGV("Surface::attachBuffer"); Mutex::Autolock lock(mMutex); sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer)); int32_t attachedSlot = -1; status_t result = mGraphicBufferProducer->attachBuffer( &attachedSlot, graphicBuffer); if (result != NO_ERROR) { ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result); return result; } mSlots[attachedSlot].buffer = graphicBuffer; return NO_ERROR; } int Surface::setUsage(uint32_t reqUsage) { ALOGV("Surface::setUsage"); Loading Loading
include/gui/Surface.h +5 −1 Original line number Diff line number Diff line Loading @@ -158,7 +158,6 @@ protected: virtual int lockBuffer_DEPRECATED(ANativeWindowBuffer* buffer); virtual int connect(int api, const sp<IProducerListener>& listener); virtual int connect(int api); virtual int disconnect(int api); virtual int setBufferCount(int bufferCount); Loading @@ -177,6 +176,11 @@ public: virtual int lock(ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds); virtual int unlockAndPost(); virtual int connect(int api, const sp<IProducerListener>& listener); virtual int detachNextBuffer(ANativeWindowBuffer** outBuffer, sp<Fence>* outFence); virtual int attachBuffer(ANativeWindowBuffer*); protected: enum { NUM_BUFFER_SLOTS = BufferQueue::NUM_BUFFER_SLOTS }; enum { DEFAULT_FORMAT = PIXEL_FORMAT_RGBA_8888 }; Loading
libs/gui/Surface.cpp +49 −0 Original line number Diff line number Diff line Loading @@ -610,6 +610,55 @@ int Surface::disconnect(int api) { return err; } int Surface::detachNextBuffer(ANativeWindowBuffer** outBuffer, sp<Fence>* outFence) { ATRACE_CALL(); ALOGV("Surface::detachNextBuffer"); if (outBuffer == NULL || outFence == NULL) { return BAD_VALUE; } Mutex::Autolock lock(mMutex); sp<GraphicBuffer> buffer(NULL); sp<Fence> fence(NULL); status_t result = mGraphicBufferProducer->detachNextBuffer( &buffer, &fence); if (result != NO_ERROR) { return result; } *outBuffer = buffer.get(); if (fence != NULL && fence->isValid()) { *outFence = fence; } else { *outFence = Fence::NO_FENCE; } return NO_ERROR; } int Surface::attachBuffer(ANativeWindowBuffer* buffer) { ATRACE_CALL(); ALOGV("Surface::attachBuffer"); Mutex::Autolock lock(mMutex); sp<GraphicBuffer> graphicBuffer(static_cast<GraphicBuffer*>(buffer)); int32_t attachedSlot = -1; status_t result = mGraphicBufferProducer->attachBuffer( &attachedSlot, graphicBuffer); if (result != NO_ERROR) { ALOGE("attachBuffer: IGraphicBufferProducer call failed (%d)", result); return result; } mSlots[attachedSlot].buffer = graphicBuffer; return NO_ERROR; } int Surface::setUsage(uint32_t reqUsage) { ALOGV("Surface::setUsage"); Loading