28 #ifndef __HardwareBuffer__
29 #define __HardwareBuffer__
108 HBU_STATIC_WRITE_ONLY = 5,
114 HBU_DYNAMIC_WRITE_ONLY = 6,
116 HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE = 14
155 virtual void* lockImpl(
size_t offset,
size_t length,
LockOptions options) = 0;
157 virtual void unlockImpl(
void) = 0;
162 : mUsage(usage), mIsLocked(false), mSystemMemory(systemMemory),
163 mUseShadowBuffer(useShadowBuffer), mShadowBuffer(NULL), mShadowUpdated(false),
164 mSuppressHardwareUpdate(false)
167 if (useShadowBuffer && usage == HBU_DYNAMIC)
169 mUsage = HBU_DYNAMIC_WRITE_ONLY;
171 else if (useShadowBuffer && usage == HBU_STATIC)
173 mUsage = HBU_STATIC_WRITE_ONLY;
185 assert(!isLocked() &&
"Cannot lock this buffer, it is already locked!");
188 if ((length + offset) > mSizeInBytes)
191 "Lock request out of bounds.",
192 "HardwareBuffer::lock");
194 else if (mUseShadowBuffer)
196 if (options != HBL_READ_ONLY)
200 mShadowUpdated =
true;
203 ret = mShadowBuffer->lock(offset, length, options);
208 ret = lockImpl(offset, length, options);
222 return this->lock(0, mSizeInBytes, options);
238 assert(isLocked() &&
"Cannot unlock this buffer, it is not locked!");
241 if (mUseShadowBuffer && mShadowBuffer->isLocked())
243 mShadowBuffer->unlock();
262 virtual void readData(
size_t offset,
size_t length,
void* pDest) = 0;
271 virtual void writeData(
size_t offset,
size_t length,
const void* pSource,
272 bool discardWholeBuffer =
false) = 0;
285 size_t dstOffset,
size_t length,
bool discardWholeBuffer =
false)
287 const void *srcData = srcBuffer.
lock(
288 srcOffset, length, HBL_READ_ONLY);
289 this->writeData(dstOffset, length, srcData, discardWholeBuffer);
300 size_t sz = std::min(getSizeInBytes(), srcBuffer.
getSizeInBytes());
301 copyData(srcBuffer, 0, 0, sz,
true);
307 if (mUseShadowBuffer && mShadowUpdated && !mSuppressHardwareUpdate)
310 const void *srcData = mShadowBuffer->lockImpl(
311 mLockStart, mLockSize, HBL_READ_ONLY);
314 if (mLockStart == 0 && mLockSize == mSizeInBytes)
315 lockOpt = HBL_DISCARD;
317 lockOpt = HBL_NORMAL;
319 void *destData = this->lockImpl(
320 mLockStart, mLockSize, lockOpt);
322 memcpy(destData, srcData, mLockSize);
324 mShadowBuffer->unlockImpl();
325 mShadowUpdated =
false;
339 return mIsLocked || (mUseShadowBuffer && mShadowBuffer->isLocked());
343 mSuppressHardwareUpdate = suppress;
367 pData =
pBuf->lock(offset, length, options);