Cleanup type offsets which cannot be calculated for flexible YUV.
Support flexible YUV
bug 10567550
Change-Id: I4f6e5a8d86eeee635605460f1751208f3320969b
(cherry picked from commit a75372759e288be3fb8835735a830b1f7d1a4c42)
diff --git a/driver/rsdAllocation.cpp b/driver/rsdAllocation.cpp
index 66eddeb..9f217e8 100644
--- a/driver/rsdAllocation.cpp
+++ b/driver/rsdAllocation.cpp
@@ -243,8 +243,9 @@
return;
}
RSD_CALL_GL(glBindBuffer, drv->glTarget, drv->bufferID);
- RSD_CALL_GL(glBufferData, drv->glTarget, alloc->mHal.state.type->getSizeBytes(),
- alloc->mHal.drvState.lod[0].mallocPtr, GL_DYNAMIC_DRAW);
+ RSD_CALL_GL(glBufferData, drv->glTarget,
+ alloc->mHal.state.type->getPackedSizeBytes(),
+ alloc->mHal.drvState.lod[0].mallocPtr, GL_DYNAMIC_DRAW);
RSD_CALL_GL(glBindBuffer, drv->glTarget, 0);
rsdGLCheckError(rsc, "UploadToBufferObject");
#endif
@@ -255,34 +256,42 @@
// YUV only supports basic 2d
// so we can stash the plane pointers in the mipmap levels.
size_t uvSize = 0;
+ state->lod[1].dimX = state->lod[0].dimX / 2;
+ state->lod[1].dimY = state->lod[0].dimY / 2;
+ state->lod[2].dimX = state->lod[0].dimX / 2;
+ state->lod[2].dimY = state->lod[0].dimY / 2;
+ state->yuv.shift = 1;
+ state->yuv.step = 1;
+ state->lodCount = 3;
+
#ifndef RS_SERVER
switch(yuv) {
case HAL_PIXEL_FORMAT_YV12:
- state->lod[2].dimX = state->lod[0].dimX / 2;
- state->lod[2].dimY = state->lod[0].dimY / 2;
state->lod[2].stride = rsRound(state->lod[0].stride >> 1, 16);
state->lod[2].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
(state->lod[0].stride * state->lod[0].dimY);
uvSize += state->lod[2].stride * state->lod[2].dimY;
- state->lod[1].dimX = state->lod[2].dimX;
- state->lod[1].dimY = state->lod[2].dimY;
state->lod[1].stride = state->lod[2].stride;
state->lod[1].mallocPtr = ((uint8_t *)state->lod[2].mallocPtr) +
(state->lod[2].stride * state->lod[2].dimY);
uvSize += state->lod[1].stride * state->lod[2].dimY;
-
- state->lodCount = 3;
break;
case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
- state->lod[1].dimX = state->lod[0].dimX;
- state->lod[1].dimY = state->lod[0].dimY / 2;
+ //state->lod[1].dimX = state->lod[0].dimX;
state->lod[1].stride = state->lod[0].stride;
- state->lod[1].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
+ state->lod[2].stride = state->lod[0].stride;
+ state->lod[2].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
(state->lod[0].stride * state->lod[0].dimY);
+ state->lod[1].mallocPtr = ((uint8_t *)state->lod[2].mallocPtr) + 1;
uvSize += state->lod[1].stride * state->lod[1].dimY;
- state->lodCount = 2;
+ state->yuv.step = 2;
break;
+#ifndef RS_COMPATIBILITY_LIB
+ case HAL_PIXEL_FORMAT_YCbCr_420_888:
+ // This will be filled in by ioReceive()
+ break;
+#endif
default:
rsAssert(0);
}
@@ -766,7 +775,6 @@
const size_t eSize = alloc->mHal.state.type->getElementSizeBytes();
uint8_t * ptr = GetOffsetPtr(alloc, xoff, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X);
size_t size = count * eSize;
-
if (ptr != data) {
// Skip the copy if we are the same allocation. This can arise from
// our Bitmap optimization, where we share the same storage.
@@ -811,13 +819,20 @@
}
if (alloc->mHal.state.yuv) {
int lod = 1;
- while (alloc->mHal.drvState.lod[lod].mallocPtr) {
- size_t lineSize = alloc->mHal.drvState.lod[lod].dimX;
+ int maxLod = 2;
+ if (alloc->mHal.state.yuv == HAL_PIXEL_FORMAT_YV12) {
+ maxLod = 3;
+ } else if (alloc->mHal.state.yuv == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
+ lod = 2;
+ maxLod = 3;
+ }
+
+ while (lod < maxLod) {
uint8_t *dst = GetOffsetPtr(alloc, xoff, yoff, 0, lod, face);
for (uint32_t line=(yoff >> 1); line < ((yoff+h)>>1); line++) {
memcpy(dst, src, lineSize);
- src += lineSize;
+ src += alloc->mHal.drvState.lod[lod].stride;
dst += alloc->mHal.drvState.lod[lod].stride;
}
lod++;