USAGE_IO notifications for new buffers.

bug 8566866

Change-Id: I49767ee902400f09b9b1c174e0fecac5b41e5611
diff --git a/driver/rsdAllocation.cpp b/driver/rsdAllocation.cpp
index 231ce12..28b71ce 100644
--- a/driver/rsdAllocation.cpp
+++ b/driver/rsdAllocation.cpp
@@ -256,20 +256,20 @@
 #ifndef RS_SERVER
     switch(yuv) {
     case HAL_PIXEL_FORMAT_YV12:
-        state->lod[1].dimX = state->lod[0].dimX / 2;
-        state->lod[1].dimY = state->lod[0].dimY / 2;
-        state->lod[1].stride = rsRound(state->lod[0].stride >> 1, 16);
-        state->lod[1].mallocPtr = ((uint8_t *)state->lod[0].mallocPtr) +
+        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[1].stride * state->lod[1].dimY;
-
-        state->lod[2].dimX = state->lod[1].dimX;
-        state->lod[2].dimY = state->lod[1].dimY;
-        state->lod[2].stride = state->lod[1].stride;
-        state->lod[2].mallocPtr = ((uint8_t *)state->lod[1].mallocPtr) +
-                (state->lod[1].stride * state->lod[1].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
@@ -612,6 +612,13 @@
     drv->uploadDeferred = true;
 }
 
+#ifndef RS_COMPATIBILITY_LIB
+void DrvAllocation::NewBufferListener::onFrameAvailable() {
+    intptr_t ip = (intptr_t)alloc;
+    rsc->sendMessageToClient(NULL, RS_MESSAGE_TO_CLIENT_NEW_BUFFER, ip, 0, true);
+}
+#endif
+
 void* rsdAllocationGetSurface(const Context *rsc, const Allocation *alloc) {
 #ifndef RS_COMPATIBILITY_LIB
     DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
@@ -620,6 +627,13 @@
     drv->cpuConsumer = new CpuConsumer(2, false);
     sp<IGraphicBufferProducer> bp = drv->cpuConsumer->getProducerInterface();
     bp->incStrong(NULL);
+
+    drv->mBufferListener = new DrvAllocation::NewBufferListener();
+    drv->mBufferListener->rsc = rsc;
+    drv->mBufferListener->alloc = alloc;
+
+    drv->cpuConsumer->setFrameAvailableListener(drv->mBufferListener);
+
     return bp.get();
 #else
     return NULL;