BufferMapper* DisplayPlane::mapBuffer(DataBuffer *buffer) { BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); // invalidate buffer cache if cache is full if ((int)mDataBuffers.size() >= mCacheCapacity) { invalidateBufferCache(); } BufferMapper *mapper = bm->map(*buffer); if (!mapper) { ELOGTRACE("failed to map buffer"); return NULL; } // add it to data buffers ssize_t index = mDataBuffers.add(buffer->getKey(), mapper); if (index < 0) { ELOGTRACE("failed to add mapper"); bm->unmap(mapper); return NULL; } return mapper; }
void DisplayPlane::invalidateBufferCache() { BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); BufferMapper* mapper; RETURN_VOID_IF_NOT_INIT(); for (size_t i = 0; i < mDataBuffers.size(); i++) { mapper = mDataBuffers.valueAt(i); bm->unmap(mapper); } mDataBuffers.clear(); // reset current buffer mCurrentDataBuffer = 0; }
void DisplayPlane::updateActiveBuffers(BufferMapper *mapper) { BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); // unmap the first entry (oldest buffer) if (mActiveBuffers.size() >= MIN_DATA_BUFFER_COUNT) { BufferMapper *oldest = mActiveBuffers.itemAt(0); bm->unmap(oldest); mActiveBuffers.removeAt(0); } // queue it to active buffers if (!isActiveBuffer(mapper)) { mapper->incRef(); mActiveBuffers.push_back(mapper); } }
void DisplayPlane::invalidateActiveBuffers() { BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); BufferMapper* mapper; RETURN_VOID_IF_NOT_INIT(); VLOGTRACE("invalidating active buffers"); for (size_t i = 0; i < mActiveBuffers.size(); i++) { mapper = mActiveBuffers.itemAt(i); // unmap it bm->unmap(mapper); } // clear recorded data buffers mActiveBuffers.clear(); }