fix [2122448] android_native_window_t::setUsage() only reallocates the first buffer

Take 2. We needed to check that the usage flags are "good enough" as opposed to "the same".

This reverts commit 8f17a762fe9e9f31e4e86cb60ff2bfb6b10fdee6.
This commit is contained in:
Mathias Agopian 2009-09-15 19:10:47 -07:00
parent 70cc9e16be
commit 68a6afeb26
2 changed files with 11 additions and 21 deletions

View File

@ -212,7 +212,7 @@ private:
void setUsage(uint32_t reqUsage);
bool getUsage(uint32_t* usage);
uint32_t getUsage() const;
// constants
sp<SurfaceComposerClient> mClient;
@ -227,7 +227,6 @@ private:
// protected by mSurfaceLock
Rect mSwapRectangle;
uint32_t mUsage;
int32_t mUsageChanged;
// protected by mSurfaceLock. These are also used from lock/unlock
// but in that case, they must be called form the same thread.

View File

@ -361,7 +361,6 @@ void Surface::init()
const_cast<uint32_t&>(android_native_window_t::flags) = 0;
// be default we request a hardware surface
mUsage = GRALLOC_USAGE_HW_RENDER;
mUsageChanged = true;
mNeedFullUpdate = false;
}
@ -498,14 +497,14 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer)
LOGE("error dequeuing a buffer (%s)", strerror(bufIdx));
return bufIdx;
}
// FIXME: in case of failure below, we need to undo the dequeue
uint32_t usage;
const bool usageChanged = getUsage(&usage);
// below we make sure we AT LEAST have the usage flags we want
const uint32_t usage(getUsage());
const sp<SurfaceBuffer>& backBuffer(mBuffers[bufIdx]);
if ((backBuffer == 0) || usageChanged ||
mSharedBufferClient->needNewBuffer(bufIdx)) {
if (backBuffer == 0 ||
((uint32_t(backBuffer->usage) & usage) != usage) ||
mSharedBufferClient->needNewBuffer(bufIdx))
{
err = getBufferLocked(bufIdx, usage);
LOGE_IF(err, "getBufferLocked(%ld, %08x) failed (%s)",
bufIdx, usage, strerror(-err));
@ -600,21 +599,13 @@ int Surface::perform(int operation, va_list args)
void Surface::setUsage(uint32_t reqUsage)
{
Mutex::Autolock _l(mSurfaceLock);
if (mUsage != reqUsage) {
mUsageChanged = true;
mUsage = reqUsage;
}
mUsage = reqUsage;
}
bool Surface::getUsage(uint32_t* usage)
uint32_t Surface::getUsage() const
{
Mutex::Autolock _l(mSurfaceLock);
*usage = mUsage;
if (mUsageChanged) {
mUsageChanged = false;
return true;
}
return false;
return mUsage;
}
// ----------------------------------------------------------------------------