Implement async data/subData. Implement TriangleMeshBuilder in SimpleMesh which replaces TriangleMesh. Update Film to use new builder.
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index 3cb76bc..1f49ca1 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -115,9 +115,14 @@
}
-void Allocation::data(const void *data)
+void Allocation::data(const void *data, uint32_t sizeBytes)
{
- memcpy(mPtr, data, mType->getSizeBytes());
+ uint32_t size = mType->getSizeBytes();
+ if (size != sizeBytes) {
+ LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes);
+ return;
+ }
+ memcpy(mPtr, data, size);
}
void Allocation::read(void *data)
@@ -125,16 +130,22 @@
memcpy(data, mPtr, mType->getSizeBytes());
}
-void Allocation::subData(uint32_t xoff, uint32_t count, const void *data)
+void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes)
{
uint32_t eSize = mType->getElementSizeBytes();
uint8_t * ptr = static_cast<uint8_t *>(mPtr);
ptr += eSize * xoff;
- memcpy(ptr, data, count * eSize);
+ uint32_t size = count * eSize;
+
+ if (size != sizeBytes) {
+ LOGE("Allocation::subData called with mismatched size expected %i, got %i", size, sizeBytes);
+ return;
+ }
+ memcpy(ptr, data, size);
}
void Allocation::subData(uint32_t xoff, uint32_t yoff,
- uint32_t w, uint32_t h, const void *data)
+ uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes)
{
uint32_t eSize = mType->getElementSizeBytes();
uint32_t lineSize = eSize * w;
@@ -143,6 +154,12 @@
const uint8_t *src = static_cast<const uint8_t *>(data);
uint8_t *dst = static_cast<uint8_t *>(mPtr);
dst += eSize * (xoff + yoff * destW);
+
+ if ((lineSize * eSize * h) != sizeBytes) {
+ rsAssert(!"Allocation::subData called with mismatched size");
+ return;
+ }
+
for (uint32_t line=yoff; line < (yoff+h); line++) {
uint8_t * ptr = static_cast<uint8_t *>(mPtr);
memcpy(dst, src, lineSize);
@@ -152,7 +169,7 @@
}
void Allocation::subData(uint32_t xoff, uint32_t yoff, uint32_t zoff,
- uint32_t w, uint32_t h, uint32_t d, const void *data)
+ uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes)
{
}
@@ -170,7 +187,7 @@
const Type * type = static_cast<const Type *>(vtype);
Allocation * alloc = new Allocation(type);
- alloc->incRef();
+ alloc->incUserRef();
return alloc;
}
@@ -340,7 +357,7 @@
LOGE("Memory allocation failure");
return NULL;
}
- texAlloc->incRef();
+ texAlloc->incUserRef();
ElementConverter_t cvt = pickConverter(dstFmt, srcFmt);
cvt(texAlloc->getPtr(), data, w * h);
@@ -451,7 +468,7 @@
RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, type);
Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
- texAlloc->incRef();
+ texAlloc->incUserRef();
if (texAlloc == NULL) {
LOGE("Memory allocation failure");
fclose(f);
@@ -503,24 +520,24 @@
return texAlloc;
}
-void rsi_AllocationData(Context *rsc, RsAllocation va, const void *data)
+void rsi_AllocationData(Context *rsc, RsAllocation va, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
- a->data(data);
+ a->data(data, sizeBytes);
rsc->allocationCheck(a);
}
-void rsi_Allocation1DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t count, const void *data)
+void rsi_Allocation1DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
- a->subData(xoff, count, data);
+ a->subData(xoff, count, data, sizeBytes);
rsc->allocationCheck(a);
}
-void rsi_Allocation2DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data)
+void rsi_Allocation2DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes)
{
Allocation *a = static_cast<Allocation *>(va);
- a->subData(xoff, yoff, w, h, data);
+ a->subData(xoff, yoff, w, h, data, sizeBytes);
rsc->allocationCheck(a);
}