diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp index 9115425ccbeb5c56d0576df8c32f1a73ad09b5b7..d9e6cf00a9b7f8793a0c61b18913eaa14313e6d5 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -1233,6 +1233,14 @@ status_t Surface::lock( ALOGE("Surface::lock failed, already locked"); return INVALID_OPERATION; } + + uint32_t lockUsage; + if (inOutDirtyBounds) { + lockUsage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN; + } else { + lockUsage = GRALLOC_USAGE_SW_WRITE_OFTEN; + } + if (!mConnectedToCpu) { int err = Surface::connect(NATIVE_WINDOW_API_CPU); @@ -1240,7 +1248,7 @@ status_t Surface::lock( return err; } // we're intending to do software rendering from this point - setUsage(GRALLOC_USAGE_SW_WRITE_OFTEN); + setUsage(lockUsage); } ANativeWindowBuffer* out; @@ -1300,8 +1308,7 @@ status_t Surface::lock( void* vaddr; status_t res = backBuffer->lockAsync( - GRALLOC_USAGE_SW_WRITE_OFTEN, - newDirtyRegion.bounds(), &vaddr, fenceFd); + lockUsage, newDirtyRegion.bounds(), &vaddr, fenceFd); ALOGW_IF(res, "failed locking buffer (handle = %p)", backBuffer->handle);