Fix stale realloc pointers.
bug 6886608
Change-Id: Icc96f17e20be1023187efa075c001ad1c46792d0
diff --git a/driver/rsdAllocation.cpp b/driver/rsdAllocation.cpp
index a180348..8240b10 100644
--- a/driver/rsdAllocation.cpp
+++ b/driver/rsdAllocation.cpp
@@ -230,18 +230,17 @@
rsdGLCheckError(rsc, "UploadToBufferObject");
}
-bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) {
- DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation));
- if (!drv) {
- return false;
- }
+static size_t AllocationBuildPointerTable(const Context *rsc, const Allocation *alloc,
+ const Type *type, uint8_t *ptr) {
- drv->lod[0].dimX = alloc->getType()->getDimX();
- drv->lod[0].dimY = alloc->getType()->getDimY();
+ DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
+
+ drv->lod[0].dimX = type->getDimX();
+ drv->lod[0].dimY = type->getDimY();
drv->lod[0].mallocPtr = 0;
- drv->lod[0].stride = alloc->mHal.state.dimensionX * alloc->mHal.state.elementSizeBytes;
- drv->lodCount = alloc->getType()->getLODCount();
- drv->faceCount = alloc->getType()->getDimFaces();
+ drv->lod[0].stride = drv->lod[0].dimX * type->getElementSizeBytes();
+ drv->lodCount = type->getLODCount();
+ drv->faceCount = type->getDimFaces();
size_t offsets[Allocation::MAX_LOD];
memset(offsets, 0, sizeof(offsets));
@@ -255,7 +254,7 @@
drv->lod[lod].dimX = tx;
drv->lod[lod].dimY = ty;
drv->lod[lod].dimZ = tz;
- drv->lod[lod].stride = tx * alloc->mHal.state.elementSizeBytes;
+ drv->lod[lod].stride = tx * type->getElementSizeBytes();
offsets[lod] = o;
o += drv->lod[lod].stride * rsMax(ty, 1u) * rsMax(tz, 1u);
if (tx > 1) tx >>= 1;
@@ -265,13 +264,34 @@
}
drv->faceOffset = o;
+ drv->lod[0].mallocPtr = ptr;
+ for (uint32_t lod=1; lod < drv->lodCount; lod++) {
+ drv->lod[lod].mallocPtr = ptr + offsets[lod];
+ }
+ alloc->mHal.drvState.strideLOD0 = drv->lod[0].stride;
+ alloc->mHal.drvState.mallocPtrLOD0 = ptr;
+
+ size_t allocSize = drv->faceOffset;
+ if(drv->faceCount) {
+ allocSize *= 6;
+ }
+
+ return allocSize;
+}
+
+bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) {
+ DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation));
+ if (!drv) {
+ return false;
+ }
+ alloc->mHal.drv = drv;
+
+ // Calculate the object size.
+ size_t allocSize = AllocationBuildPointerTable(rsc, alloc, alloc->getType(), NULL);
+
uint8_t * ptr = NULL;
if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) {
} else {
- size_t allocSize = drv->faceOffset;
- if(drv->faceCount) {
- allocSize *= 6;
- }
ptr = (uint8_t *)malloc(allocSize);
if (!ptr) {
@@ -279,9 +299,10 @@
return false;
}
}
- drv->lod[0].mallocPtr = ptr;
- for (uint32_t lod=1; lod < drv->lodCount; lod++) {
- drv->lod[lod].mallocPtr = ptr + offsets[lod];
+ // Build the pointer tables
+ size_t verifySize = AllocationBuildPointerTable(rsc, alloc, alloc->getType(), ptr);
+ if(allocSize != verifySize) {
+ rsAssert(!"Size mismatch");
}
drv->glTarget = GL_NONE;
@@ -300,9 +321,6 @@
drv->glType = rsdTypeToGLType(alloc->mHal.state.type->getElement()->getComponent().getType());
drv->glFormat = rsdKindToGLFormat(alloc->mHal.state.type->getElement()->getComponent().getKind());
- alloc->mHal.drvState.strideLOD0 = drv->lod[0].stride;
- alloc->mHal.drvState.mallocPtrLOD0 = ptr;
- alloc->mHal.drv = drv;
if (forceZero && ptr) {
memset(ptr, 0, alloc->mHal.state.type->getSizeBytes());
}
@@ -351,15 +369,21 @@
const Type *newType, bool zeroNew) {
DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
- alloc->mHal.drvState.mallocPtrLOD0 = (uint8_t *)realloc(
- alloc->mHal.drvState.mallocPtrLOD0, newType->getSizeBytes());
+ void * oldPtr = drv->lod[0].mallocPtr;
+ // Calculate the object size
+ size_t s = AllocationBuildPointerTable(rsc, alloc, newType, NULL);
+ uint8_t *ptr = (uint8_t *)realloc(oldPtr, s);
+ // Build the relative pointer tables.
+ size_t verifySize = AllocationBuildPointerTable(rsc, alloc, newType, ptr);
+ if(s != verifySize) {
+ rsAssert(!"Size mismatch");
+ }
const uint32_t oldDimX = alloc->mHal.state.dimensionX;
const uint32_t dimX = newType->getDimX();
if (dimX > oldDimX) {
- const Element *e = alloc->mHal.state.type->getElement();
- uint32_t stride = e->getSizeBytes();
+ uint32_t stride = alloc->mHal.state.elementSizeBytes;
memset(((uint8_t *)alloc->mHal.drvState.mallocPtrLOD0) + stride * oldDimX,
0, stride * (dimX - oldDimX));
}