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:
parent
70cc9e16be
commit
68a6afeb26
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user